diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..cdeadcc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,32 @@ +--- +name: Bug Report +about: Create a report to help us improve the project +title: "[Bug Report]: [Title]" +labels: bug +assignees: '' + +--- + +## Describe the Bug + + +## To Reproduce +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +## Expected Behavior + + +## Screenshots + + +## Desktop (please complete the following information): + - OS: [e.g. Windows, macOS, Linux] + - Terminal: [e.g. bash, zsh, cmd, powershell] + - Version [e.g. 0.1.2] + +## Additional Context + \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/enhancement_request.md b/.github/ISSUE_TEMPLATE/enhancement_request.md new file mode 100644 index 0000000..71e245e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/enhancement_request.md @@ -0,0 +1,23 @@ +--- +name: Enhancement Request +about: Suggest an improvement or optimization for this project +title: "[Enhancement]: [Title]" +labels: enhancement +assignees: '' + +--- + +## Summary + + +## Current Behavior + + +## Desired Behavior + + +## Suggested Solution + + +## Additional Context + \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..17331c4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,23 @@ +--- +name: Feature Request +about: Suggest a new feature or idea for this project +title: "[Feature Request]: [Title]" +labels: feature request +assignees: '' + +--- + +## Summary + + +## Motivation + + +## Detailed Description + + +## Alternatives + + +## Additional Context + \ No newline at end of file diff --git a/README.md b/README.md index 6f97d3b..58ff7d5 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,20 @@ -# 🤖 Droid +# 🤖 Dexor -Welcome to **Droid**, your trusty companion for automating and streamlining your development tasks. Droid is here to help you stay productive by automating repetitive tasks, identifying and fixing bugs, writing comprehensive test cases, and maintaining a consistent codebase. Checkout the [documentation](https://docs.droids.dev/) to get started! +Welcome to **Dexor**, your trusty companion for automating and streamlining your development tasks. Dexor is here to help you stay productive by automating repetitive tasks, identifying and fixing bugs, writing comprehensive test cases, and maintaining a consistent codebase. Checkout the [documentation](https://docs.dexors.dev/) to get started! Checkout the youtube video [here](https://youtu.be/oLmbafcHCKg)
- + ## Documentation -For full documentation, getting started guides, and advanced usage, please visit [docs.droids.dev](https://docs.droids.dev/). +For full documentation, getting started guides, and advanced usage, please visit [docs.dexors.dev](https://docs.dexors.dev/). ## License -Droid is an open-source software licensed under the GPL v3 license. +Dexor is an open-source software licensed under the GPL v3 license. diff --git a/app/Commands/DroidCommand.php b/app/Commands/DroidCommand.php index 7b8abe0..40c5f6f 100644 --- a/app/Commands/DroidCommand.php +++ b/app/Commands/DroidCommand.php @@ -3,18 +3,25 @@ namespace App\Commands; use App\Services\ChatAssistant; +use App\Tools\ExecuteCommand; use App\Utils\OnBoardingSteps; use Exception; use Illuminate\Console\Command; use function Termwind\ask; -use function Termwind\render; -class DroidCommand extends Command +class DexorCommand extends Command { - public $signature = 'droid'; + public $signature = 'dexor {--new : Create a new assistant}'; - public $description = 'Allows you to create/update a feature'; + public $description = 'Allows you to create/update a feature, run commands, and create a new assistant'; + + public function __construct( + private readonly ChatAssistant $chatAssistant, + private readonly ExecuteCommand $executeCommand + ) { + parent::__construct(); + } /** * @throws Exception @@ -26,12 +33,11 @@ public function handle(): int return self::FAILURE; } - $chatAssistant = new ChatAssistant; - $thread = $chatAssistant->createThread(); + if ($this->option('new')) { + $this->chatAssistant->createNewAssistant(); + } - render(view('assistant', [ - 'answer' => 'How can I help you today?', - ])); + $thread = $this->chatAssistant->createThread(); while (true) { $message = ask('🍻:'); @@ -40,7 +46,11 @@ public function handle(): int break; } - $chatAssistant->getAnswer($thread, $message); + if (str_starts_with($message, '/')) { + $this->executeCommand->handle(substr($message, 1)); + } else { + $this->chatAssistant->getAnswer($thread, $message); + } } return self::SUCCESS; diff --git a/app/Data/AIModelData.php b/app/Data/AIModelData.php new file mode 100644 index 0000000..bb25cdb --- /dev/null +++ b/app/Data/AIModelData.php @@ -0,0 +1,12 @@ + */ + public ?Collection $tool_calls + ) {} +} diff --git a/app/Data/ToolCallData.php b/app/Data/ToolCallData.php new file mode 100644 index 0000000..b75882d --- /dev/null +++ b/app/Data/ToolCallData.php @@ -0,0 +1,14 @@ + config('aiproviders.claude.api_key'), + 'anthropic-version' => '2023-06-01', + ]; + } +} diff --git a/app/Integrations/Claude/Requests/ChatRequest.php b/app/Integrations/Claude/Requests/ChatRequest.php new file mode 100644 index 0000000..b0825f5 --- /dev/null +++ b/app/Integrations/Claude/Requests/ChatRequest.php @@ -0,0 +1,145 @@ + $this->thread->assistant->model, + 'messages' => $this->formatMessages(), + 'system' => $this->thread->assistant->prompt, + 'tools' => $this->formatTools(), + 'max_tokens' => 4096, + ]; + } + + private function formatTools(): array + { + return array_values(array_map(function ($tool) { + $claudeTool = $tool['function']; + $claudeTool['input_schema'] = $claudeTool['parameters']; + unset($claudeTool['parameters']); + return $claudeTool; + }, $this->tools)); + } + + private function formatMessages(): array + { + return $this->thread->messages->map(function ($message) { + return match ($message->role) { + 'assistant' => $this->formatAssistantMessage($message), + 'tool' => $this->formatToolMessage($message), + default => [ + 'role' => $message->role, + 'content' => $message->content, + ], + }; + })->toArray(); + } + + private function formatAssistantMessage($message): array + { + $content = [['type' => 'text', 'text' => $message->content]]; + + if ($message->tool_calls !== null) { + $content = array_merge($content, array_map(function ($toolCall) { + return [ + 'type' => $toolCall['type'], + 'id' => $toolCall['id'], + 'name' => $toolCall['function']['name'], + 'input' => json_decode($toolCall['function']['arguments'], true), + ]; + }, $message->tool_calls)); + } + + return [ + 'role' => 'assistant', + 'content' => $content, + ]; + } + + private function formatToolMessage($message): array + { + $content = [ + [ + 'type' => 'tool_result', + 'tool_use_id' => $message->tool_call_id, + ] + ]; + + if ($message->content) { + $content[0]['content'] = $message->content; + } + + return [ + 'role' => 'user', + 'content' => $content, + ]; + } + + public function createDtoFromResponse(Response $response): MessageData + { + $data = $response->json(); + $message = null; + $tools = new Collection(); + + foreach ($data['content'] as $choice) { + if ($choice['type'] === 'text') { + $message = MessageData::from([ + 'role' => 'assistant', + 'content' => $choice['text'] + ]); + } else { + $tools->push(ToolCallData::from([ + 'id' => $choice['id'], + 'type' => $choice['type'], + 'function' => ToolFunctionData::from([ + 'name' => $choice['name'], + 'arguments' => json_encode($choice['input']) + ]) + ])); + } + } + + $message->tool_calls = $tools; + + return $message; + } +} diff --git a/app/Integrations/Ollama/OllamaConnector.php b/app/Integrations/Ollama/OllamaConnector.php new file mode 100644 index 0000000..ee1f07a --- /dev/null +++ b/app/Integrations/Ollama/OllamaConnector.php @@ -0,0 +1,25 @@ +thread->project->assistant; + + return [ + 'model' => $assistant->model, + 'messages' => $this->formatMessages($assistant), + 'stream' => false, + 'raw' => true, + 'tools' => array_values($this->tools), + ]; + } + + private function formatMessages($assistant): array + { + $systemMessage = [ + 'role' => 'system', + 'content' => sprintf( + '[INST]%s[/INST] [AVAILABLE_TOOLS]%s[/AVAILABLE_TOOLS]', + $assistant->prompt, + json_encode(array_values($this->tools)) + ), + ]; + + return [$systemMessage, ...$this->thread->messages->toArray()]; + } + + /** + * @throws JsonException + */ + public function createDtoFromResponse(Response $response): MessageData + { + $data = $response->json(); + return MessageData::from($data['message'] ?? []); + } +} \ No newline at end of file diff --git a/app/Integrations/Ollama/Requests/ListModelsRequest.php b/app/Integrations/Ollama/Requests/ListModelsRequest.php new file mode 100644 index 0000000..3da18b9 --- /dev/null +++ b/app/Integrations/Ollama/Requests/ListModelsRequest.php @@ -0,0 +1,29 @@ +json()['models']; + + return collect($data)->map(fn ($model) => AIModelData::from($model)); + } +} diff --git a/app/Services/AIConnector.php b/app/Integrations/OpenAI/OpenAIConnector.php similarity index 56% rename from app/Services/AIConnector.php rename to app/Integrations/OpenAI/OpenAIConnector.php index 943028a..d32f9aa 100644 --- a/app/Services/AIConnector.php +++ b/app/Integrations/OpenAI/OpenAIConnector.php @@ -1,14 +1,19 @@ 'Bearer '.config('droid.api_key'), + 'Authorization' => 'Bearer '.config('aiproviders.openai.api_key'), ]; } } diff --git a/app/Integrations/OpenAI/Requests/ChatRequest.php b/app/Integrations/OpenAI/Requests/ChatRequest.php new file mode 100644 index 0000000..19c507a --- /dev/null +++ b/app/Integrations/OpenAI/Requests/ChatRequest.php @@ -0,0 +1,57 @@ +thread->project->assistant; + + return [ + 'model' => $assistant->model, + 'messages' => $this->formatMessages($assistant), + 'tools' => array_values($this->tools), + ]; + } + + private function formatMessages($assistant): array + { + return [ + [ + 'role' => 'system', + 'content' => $assistant->prompt, + ], + ...$this->thread->messages->toArray(), + ]; + } + + public function createDtoFromResponse(Response $response): MessageData + { + $data = $response->json(); + $choice = $data['choices'][0] ?? []; + return MessageData::from($choice['message'] ?? []); + } +} \ No newline at end of file diff --git a/app/Integrations/OpenAI/Requests/ListModelsRequest.php b/app/Integrations/OpenAI/Requests/ListModelsRequest.php new file mode 100644 index 0000000..9c3a399 --- /dev/null +++ b/app/Integrations/OpenAI/Requests/ListModelsRequest.php @@ -0,0 +1,29 @@ +json()['data']; + + return collect($data)->map(fn ($model) => AIModelData::from(['name' => $model['id']])); + } +} diff --git a/app/Models/Assistant.php b/app/Models/Assistant.php index 0e168bc..125ab96 100644 --- a/app/Models/Assistant.php +++ b/app/Models/Assistant.php @@ -15,6 +15,7 @@ class Assistant extends Model 'description', 'prompt', 'tools', + 'service', ]; protected $casts = [ diff --git a/app/Services/ChatAssistant.php b/app/Services/ChatAssistant.php index 3ad9f06..debccc1 100644 --- a/app/Services/ChatAssistant.php +++ b/app/Services/ChatAssistant.php @@ -2,17 +2,21 @@ namespace App\Services; +use App\Data\AIModelData; use App\Models\Assistant; use App\Models\Project; -use App\Services\Request\ChatRequest; use App\Tools\ExecuteCommand; use App\Tools\ListFiles; use App\Tools\ReadFile; use App\Tools\UpdateFile; use App\Tools\WriteToFile; use App\Traits\HasTools; +use App\Utils\OnBoardingSteps; use Exception; +use Illuminate\Support\Collection; use ReflectionException; +use Saloon\Exceptions\Request\FatalRequestException; +use Saloon\Exceptions\Request\RequestException; use function Laravel\Prompts\form; use function Laravel\Prompts\select; @@ -23,12 +27,15 @@ class ChatAssistant { use HasTools; + private const DEFAULT_SERVICE = 'openai'; + private OnBoardingSteps $onBoardingSteps; + /** - * @throws Exception + * @throws ReflectionException */ - public function __construct() + public function __construct(OnBoardingSteps $onBoardingSteps) { - // register the tools + $this->onBoardingSteps = $onBoardingSteps; $this->register([ ExecuteCommand::class, WriteToFile::class, @@ -39,69 +46,65 @@ public function __construct() } /** - * @throws Exception + * @throws FatalRequestException + * @throws RequestException */ public function getCurrentProject(): Project { $projectPath = getcwd(); $project = Project::where('path', $projectPath)->first(); - if (! $project) { - $userChoice = select( - 'No existing project found. Would you like to create a new assistant or use an existing one?', - [ - 'create_new' => 'Create New Assistant', - 'use_existing' => 'Use Existing Assistant', - ] - ); + if ($project) { + return $project; + } - switch ($userChoice) { - case 'create_new': - $assistantId = $this->createNewAssistant()->id; - break; - case 'use_existing': - $assistants = Assistant::all(); - if ($assistants->isEmpty()) { - $assistantId = $this->createNewAssistant()->id; - } else { - $options = $assistants->pluck('name', 'id')->toArray(); - $assistantId = select('Select an assistant', $options); - } - break; - default: - throw new Exception('Invalid choice'); - } + $userChoice = select( + label: 'No existing project found. Would you like to create a new assistant or use an existing one?', + options: [ + 'create_new' => 'Create New Assistant', + 'use_existing' => 'Use Existing Assistant', + ] + ); - $project = Project::create([ - 'path' => $projectPath, - 'assistant_id' => $assistantId, - ]); - } + $assistantId = match ($userChoice) { + 'create_new' => $this->createNewAssistant()->id, + 'use_existing' => $this->selectExistingAssistant(), + default => throw new Exception('Invalid choice'), + }; - return $project; + return Project::create([ + 'path' => $projectPath, + 'assistant_id' => $assistantId, + ]); } - public function createNewAssistant() + /** + * @throws FatalRequestException + * @throws RequestException + * @throws Exception + */ + public function createNewAssistant(): Assistant { $path = getcwd(); - // get Folder name from path $folderName = basename($path); + $service = $this->selectService(); + $this->ensureAPIKey($service); + $models = $this->getModels($service); + $assistant = form() ->text(label: 'What is the name of the assistant?', default: ucfirst($folderName.' Project'), required: true, name: 'name') ->text(label: 'What is the description of the assistant? (optional)', name: 'description') - ->select( - label: '🤖 Choose the Model for the assistant', - options: ['gpt-4o', 'gpt-4-turbo', 'gpt-4-turbo-preview', 'gpt-3.5-turbo'], - default: 'gpt-3.5-turbo', - hint: 'The model to use for the assistant.', + ->search( + label: 'Choose the Model for the assistant', + options: fn (string $value) => $this->filterModels($models, $value), name: 'model' ) ->textarea( label: 'Customize the prompt for the assistant?', - default: config('droid.prompt') ?? '', + default: config('dexor.default_prompt', ''), required: true, - hint: 'Make sure to include any details of the project that the assistant should know about. For example, type of framework, language, etc.', + hint: 'Include any project details that the assistant should know about.', rows: 20, name: 'prompt' ) @@ -112,6 +115,7 @@ public function createNewAssistant() 'description' => $assistant['description'], 'model' => $assistant['model'], 'prompt' => $assistant['prompt'], + 'service' => $service, ]); } @@ -121,22 +125,31 @@ public function createNewAssistant() public function createThread() { $project = $this->getCurrentProject(); - $threadTitle = 'New Thread'; + $latestThread = $project->threads()->latest()->first(); - return spin( + if ($latestThread && $this->shouldUseExistingThread()) { + return $latestThread; + } + + $thread = spin( fn () => $project->threads()->create([ 'assistant_id' => $project->assistant_id, - 'title' => $threadTitle, + 'title' => 'New Thread', ]), 'Creating New Thread...' ); + + render(view('assistant', [ + 'answer' => 'How can I help you?', + ])); + + return $thread; } /** - * @throws ReflectionException * @throws Exception */ - public function getAnswer($thread, $message): string + public function getAnswer($thread, ?string $message): string { if ($message !== null) { $thread->messages()->create([ @@ -147,49 +160,144 @@ public function getAnswer($thread, $message): string $thread->load('messages'); - $connector = new AIConnector; - $chatRequest = new ChatRequest($thread, $this->registered_tools); - $response = $connector->send($chatRequest)->json(); + $service = $thread->assistant->service; + $connector = $this->getConnector($service); + $chatRequest = $this->getChatRequest($service, $thread); - $choice = $response['choices'][0]; + $message = spin( + fn () => $connector->send($chatRequest)->dto(), + "Getting response from {$thread->assistant->service}: {$thread->assistant->model}" + ); - return $this->handleTools($thread, $choice); + return $this->handleTools($thread, $message); } /** - * @throws ReflectionException * @throws Exception */ - public function handleTools($thread, $choice): string + private function handleTools($thread, $message): string { - $answer = $choice['message']['content']; + $answer = $message->content; - $thread->messages()->create($choice['message']); + $thread->messages()->create($message->toArray()); + if ($message->tool_calls !== null && $message->tool_calls->isNotEmpty()) { + $this->renderAnswer($answer); - if ($choice['finish_reason'] === 'tool_calls') { + foreach ($message->tool_calls as $toolCall) { + $this->executeToolCall($thread, $toolCall); + } + return $this->getAnswer($thread, null); + } - foreach ($choice['message']['tool_calls'] as $toolCall) { - try { - $toolResponse = $this->call($toolCall['function']['name'], json_decode($toolCall['function']['arguments'], true)); + $this->renderAnswer($answer); + return $answer; + } - $thread->messages()->create([ - 'role' => 'tool', - 'tool_call_id' => $toolCall['id'], - 'name' => $toolCall['function']['name'], - 'content' => $toolResponse, - ]); + private function selectService(): string + { + return select( + label: 'Choose the Service for the assistant', + options: array_keys(config('aiproviders')), + default: self::DEFAULT_SERVICE + ); + } - } catch (Exception $e) { - throw new Exception('Error calling tool: '.$e->getMessage()); - } - } + /** + * @throws Exception + */ + private function getModels(string $service): Collection + { + $connectorClass = config("aiproviders.{$service}.connector"); + $listModelsRequestClass = config("aiproviders.{$service}.listModelsRequest"); - // return the tool response to the AI to continue the conversation - return $this->getAnswer($thread, null); + if ($listModelsRequestClass !== null) { + $connector = new $connectorClass(); + return $connector->send(new $listModelsRequestClass())->dto(); + } + + return collect(config("aiproviders.{$service}.models")) + ->map(fn ($model) => AIModelData::from(['name' => $model])); + } + + private function filterModels(Collection $models, string $value): array + { + return strlen($value) > 0 + ? $models->filter(fn ($model) => str_contains($model->name, $value))->pluck('name')->toArray() + : $models->take(5)->pluck('name')->toArray(); + } + + /** + * @throws FatalRequestException + * @throws RequestException + */ + private function selectExistingAssistant(): int + { + $assistants = Assistant::all(); + if ($assistants->isEmpty()) { + return $this->createNewAssistant()->id; } - render(view('assistant', ['answer' => $answer])); + $options = $assistants->pluck('name', 'id')->toArray(); + return select(label: 'Select an assistant', options: $options); + } - return $answer; + private function shouldUseExistingThread(): bool + { + return select( + label: 'Found Existing thread, do you want to continue the conversation or start new?', + options: [ + 'use_existing' => 'Continue', + 'create_new' => 'Start New Thread', + ] + ) === 'use_existing'; + } + + private function getConnector(string $service): object + { + $connectorClass = config("aiproviders.{$service}.connector"); + return new $connectorClass(); + } + + private function getChatRequest(string $service, $thread): object + { + $chatRequestClass = config("aiproviders.{$service}.chatRequest"); + return new $chatRequestClass($thread, $this->registered_tools); + } + + private function renderAnswer(?string $answer): void + { + if ($answer) { + render(view('assistant', ['answer' => $answer])); + } + } + + /** + * @throws Exception + */ + private function executeToolCall($thread, $toolCall): void + { + try { + $toolResponse = $this->call( + $toolCall->function->name, + json_decode($toolCall->function->arguments, true, 512, JSON_THROW_ON_ERROR) + ); + + $thread->messages()->create([ + 'role' => 'tool', + 'tool_call_id' => $toolCall->id, + 'name' => $toolCall->function->name, + 'content' => $toolResponse, + ]); + } catch (Exception $e) { + throw new Exception("Error calling tool: {$e->getMessage()}"); + } + } + + private function ensureAPIKey(string $service): void + { + $apiKeyConfigName = strtoupper($service).'_API_KEY'; + if (!config("aiproviders.{$service}.api_key")) { + $this->onBoardingSteps->requestAPIKey($service); + } } } diff --git a/app/Tools/UpdateFile.php b/app/Tools/UpdateFile.php index d6044b6..866944a 100644 --- a/app/Tools/UpdateFile.php +++ b/app/Tools/UpdateFile.php @@ -14,7 +14,7 @@ public function handle( #[Description('File path to write content to')] string $file_path, - #[Description('Updated Content to overwrite the file')] + #[Description('Updated Content of the file to overwrite the existing one.')] string $content, ): string { diff --git a/app/Traits/HasTools.php b/app/Traits/HasTools.php index 7e6813b..830c558 100644 --- a/app/Traits/HasTools.php +++ b/app/Traits/HasTools.php @@ -75,8 +75,9 @@ public function call(string $tool_name, ?array $arguments = []): mixed $params = []; foreach ($handle_method->getParameters() as $parameter) { + $parameter_description = $this->getParameterDescription($parameter); if (! array_key_exists($parameter->name, $arguments) && ! $parameter->isOptional() && ! $parameter->isDefaultValueAvailable()) { - throw new RuntimeException(sprintf('Parameter %s is required', $parameter->name)); + return sprintf('Parameter %s(%s) is required for the tool %s', $parameter->name, $parameter_description, $tool_name); } // check if parameter type is an Enum and add fetch a valid value @@ -154,4 +155,13 @@ private function getToolParameterType(ReflectionParameter $parameter): string default => 'string', }; } -} + + private function getParameterDescription(ReflectionParameter $parameter): string + { + $descriptions = $parameter->getAttributes(Description::class); + if (!empty($descriptions)) { + return implode("\n", array_map(static fn ($pd) => $pd->newInstance()->value, $descriptions)); + } + return $this->getToolParameterType($parameter); + } +} \ No newline at end of file diff --git a/app/Utils/OnBoardingSteps.php b/app/Utils/OnBoardingSteps.php index 3161997..4ebb0fa 100644 --- a/app/Utils/OnBoardingSteps.php +++ b/app/Utils/OnBoardingSteps.php @@ -6,7 +6,7 @@ use Exception; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Config; -use Illuminate\Support\Facades\Storage; // Import Artisan facade to run commands +use Illuminate\Support\Facades\Storage; use function Laravel\Prompts\password; @@ -17,12 +17,11 @@ class OnBoardingSteps /** * @throws Exception */ - public function isCompleted($droidCommand): bool + public function isCompleted($dexorCommand): bool { return $this->configurationFileExists() && $this->viewsFolderExists() - && $this->APIKeyExists() - && $this->setupDatabase($droidCommand); + && $this->setupDatabase($dexorCommand); } private function viewsFolderExists(): bool @@ -56,31 +55,28 @@ private function configurationFileExists(): bool return true; } - /** - * @throws Exception - */ - private function APIKeyExists(): bool + public function requestAPIKey(string $service): string { - if (! config('droid.api_key')) { - $apiKey = password( - label: '🤖: Enter your OpenAI API key to continue', - placeholder: 'sk-xxxxxx-xxxxxx-xxxxxx-xxxxxx', - hint: 'You can find your API key in your OpenAI dashboard' - ); - $this->setConfigValue('DROID_API_KEY', $apiKey); - } + $apiKey = password( + label: "🤖: Enter your {$service} API key to continue", + placeholder: 'sk-xxxxxx-xxxxxx-xxxxxx-xxxxxx', + hint: "You can find your API key in your {$service} dashboard" + ); - return true; + $apiKeyConfigName = strtoupper($service).'_API_KEY'; + $this->setConfigValue($apiKeyConfigName, $apiKey); + + return $apiKey; } - protected function setupDatabase($droidCommand): bool + protected function setupDatabase($dexorCommand): bool { $databasePath = Storage::disk('home')->path('database.sqlite'); - if (!file_exists($databasePath)) { + if (! file_exists($databasePath)) { Storage::disk('home')->put('database.sqlite', ''); } - $droidCommand->call('migrate', ['--force' => true]); + $dexorCommand->call('migrate', ['--force' => true]); return true; } @@ -130,8 +126,8 @@ public function loadConfigFile(): bool $envValues = $dotenv->load(); foreach ($envValues as $key => $value) { - $parsedKey = strtolower(str_replace('DROID_', '', $key)); - Config::set('droid.'.$parsedKey, $value); + $parsedKey = strtolower(str_replace('_API_KEY', '', $key)); + Config::set('aiproviders.'.strtolower($parsedKey).'.api_key', $value); } return true; diff --git a/box.json b/box.json index 45d0e01..c6ba1f0 100644 --- a/box.json +++ b/box.json @@ -10,7 +10,7 @@ ], "files": [ "composer.json", - "droid_config" + "dexor_config" ], "exclude-composer-files": false, "exclude-dev-files": false, diff --git a/builds/dexor b/builds/dexor new file mode 100755 index 0000000..366b5ab Binary files /dev/null and b/builds/dexor differ diff --git a/builds/droid b/builds/droid index 8a1e704..2b0c06b 100755 Binary files a/builds/droid and b/builds/droid differ diff --git a/composer.json b/composer.json index 8ac8f37..93cc7f6 100644 --- a/composer.json +++ b/composer.json @@ -1,13 +1,13 @@ { - "name": "bootstrapguru/droid", + "name": "bootstrapguru/dexor", "description": "An AI Engineer that actually codes for you", - "keywords": ["ai", "droid", "developer", "console", "cli"], - "homepage": "https://droid.dev", + "keywords": ["ai", "dexor", "developer", "console", "cli"], + "homepage": "https://dexor.dev", "type": "project", "license": "MIT", "support": { - "issues": "https://github.com/bootstrapguru/droid/issues", - "source": "https://github.com/bootstrapguru/droid" + "issues": "https://github.com/bootstrapguru/dexor/issues", + "source": "https://github.com/bootstrapguru/dexor" }, "authors": [ { @@ -23,7 +23,8 @@ "illuminate/view": "^11.5", "laravel-zero/phar-updater": "^1.4", "openai-php/client": "^0.10.1", - "saloonphp/saloon": "^3.9" + "saloonphp/saloon": "^3.9", + "spatie/laravel-data": "^4.7" }, "require-dev": { "fakerphp/faker": "^1.23", @@ -54,5 +55,5 @@ }, "minimum-stability": "stable", "prefer-stable": true, - "bin": ["builds/droid"] + "bin": ["builds/dexor"] } diff --git a/composer.lock b/composer.lock index 2001118..dd70b26 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,867 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8044a6c96e197cff7b47614c502a6352", + "content-hash": "254ea33f5d0dad1488cfff88adde709b", "packages": [ + { + "name": "amphp/amp", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/amphp/amp.git", + "reference": "138801fb68cfc9c329da8a7b39d01ce7291ee4b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/amp/zipball/138801fb68cfc9c329da8a7b39d01ce7291ee4b0", + "reference": "138801fb68cfc9c329da8a7b39d01ce7291ee4b0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "5.23.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/Future/functions.php", + "src/Internal/functions.php" + ], + "psr-4": { + "Amp\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + } + ], + "description": "A non-blocking concurrency framework for PHP applications.", + "homepage": "https://amphp.org/amp", + "keywords": [ + "async", + "asynchronous", + "awaitable", + "concurrency", + "event", + "event-loop", + "future", + "non-blocking", + "promise" + ], + "support": { + "issues": "https://github.com/amphp/amp/issues", + "source": "https://github.com/amphp/amp/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-05-10T21:37:46+00:00" + }, + { + "name": "amphp/byte-stream", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/byte-stream.git", + "reference": "daa00f2efdbd71565bf64ffefa89e37542addf93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/daa00f2efdbd71565bf64ffefa89e37542addf93", + "reference": "daa00f2efdbd71565bf64ffefa89e37542addf93", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/parser": "^1.1", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2.3" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.22.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/Internal/functions.php" + ], + "psr-4": { + "Amp\\ByteStream\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A stream abstraction to make working with non-blocking I/O simple.", + "homepage": "https://amphp.org/byte-stream", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "non-blocking", + "stream" + ], + "support": { + "issues": "https://github.com/amphp/byte-stream/issues", + "source": "https://github.com/amphp/byte-stream/tree/v2.1.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-02-17T04:49:38+00:00" + }, + { + "name": "amphp/cache", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/cache.git", + "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c", + "reference": "46912e387e6aa94933b61ea1ead9cf7540b7797c", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/serialization": "^1", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Cache\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + } + ], + "description": "A fiber-aware cache API based on Amp and Revolt.", + "homepage": "https://amphp.org/cache", + "support": { + "issues": "https://github.com/amphp/cache/issues", + "source": "https://github.com/amphp/cache/tree/v2.0.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-19T03:38:06+00:00" + }, + { + "name": "amphp/dns", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/dns.git", + "reference": "758266b0ea7470e2e42cd098493bc6d6c7100cf7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/dns/zipball/758266b0ea7470e2e42cd098493bc6d6c7100cf7", + "reference": "758266b0ea7470e2e42cd098493bc6d6c7100cf7", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/cache": "^2", + "amphp/parser": "^1", + "amphp/windows-registry": "^1.0.1", + "daverandom/libdns": "^2.0.2", + "ext-filter": "*", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.20" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Dns\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Wright", + "email": "addr@daverandom.com" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@php.net" + }, + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + } + ], + "description": "Async DNS resolution for Amp.", + "homepage": "https://github.com/amphp/dns", + "keywords": [ + "amp", + "amphp", + "async", + "client", + "dns", + "resolve" + ], + "support": { + "issues": "https://github.com/amphp/dns/issues", + "source": "https://github.com/amphp/dns/tree/v2.2.0" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-06-02T19:54:12+00:00" + }, + { + "name": "amphp/parallel", + "version": "v2.2.9", + "source": { + "type": "git", + "url": "https://github.com/amphp/parallel.git", + "reference": "73d293f1fc4df1bebc3c4fce1432e82dd7032238" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/parallel/zipball/73d293f1fc4df1bebc3c4fce1432e82dd7032238", + "reference": "73d293f1fc4df1bebc3c4fce1432e82dd7032238", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/cache": "^2", + "amphp/parser": "^1", + "amphp/pipeline": "^1", + "amphp/process": "^2", + "amphp/serialization": "^1", + "amphp/socket": "^2", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.18" + }, + "type": "library", + "autoload": { + "files": [ + "src/Context/functions.php", + "src/Context/Internal/functions.php", + "src/Ipc/functions.php", + "src/Worker/functions.php" + ], + "psr-4": { + "Amp\\Parallel\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" + } + ], + "description": "Parallel processing component for Amp.", + "homepage": "https://github.com/amphp/parallel", + "keywords": [ + "async", + "asynchronous", + "concurrent", + "multi-processing", + "multi-threading" + ], + "support": { + "issues": "https://github.com/amphp/parallel/issues", + "source": "https://github.com/amphp/parallel/tree/v2.2.9" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-24T18:27:44+00:00" + }, + { + "name": "amphp/parser", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/parser.git", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Parser\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A generator parser to make streaming parsers simple.", + "homepage": "https://github.com/amphp/parser", + "keywords": [ + "async", + "non-blocking", + "parser", + "stream" + ], + "support": { + "issues": "https://github.com/amphp/parser/issues", + "source": "https://github.com/amphp/parser/tree/v1.1.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-21T19:16:53+00:00" + }, + { + "name": "amphp/pipeline", + "version": "v1.2.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/pipeline.git", + "reference": "66c095673aa5b6e689e63b52d19e577459129ab3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/pipeline/zipball/66c095673aa5b6e689e63b52d19e577459129ab3", + "reference": "66c095673aa5b6e689e63b52d19e577459129ab3", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "php": ">=8.1", + "revolt/event-loop": "^1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.18" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\Pipeline\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Asynchronous iterators and operators.", + "homepage": "https://amphp.org/pipeline", + "keywords": [ + "amp", + "amphp", + "async", + "io", + "iterator", + "non-blocking" + ], + "support": { + "issues": "https://github.com/amphp/pipeline/issues", + "source": "https://github.com/amphp/pipeline/tree/v1.2.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-07-04T00:56:47+00:00" + }, + { + "name": "amphp/process", + "version": "v2.0.3", + "source": { + "type": "git", + "url": "https://github.com/amphp/process.git", + "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/process/zipball/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", + "reference": "52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/sync": "^2", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.4" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Process\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bob Weinand", + "email": "bobwei9@hotmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "A fiber-aware process manager based on Amp and Revolt.", + "homepage": "https://amphp.org/process", + "support": { + "issues": "https://github.com/amphp/process/issues", + "source": "https://github.com/amphp/process/tree/v2.0.3" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-19T03:13:44+00:00" + }, + { + "name": "amphp/serialization", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/serialization.git", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", + "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "dev-master", + "phpunit/phpunit": "^9 || ^8 || ^7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Serialization\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Serialization tools for IPC and data storage in PHP.", + "homepage": "https://github.com/amphp/serialization", + "keywords": [ + "async", + "asynchronous", + "serialization", + "serialize" + ], + "support": { + "issues": "https://github.com/amphp/serialization/issues", + "source": "https://github.com/amphp/serialization/tree/master" + }, + "time": "2020-03-25T21:39:07+00:00" + }, + { + "name": "amphp/socket", + "version": "v2.3.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/socket.git", + "reference": "58e0422221825b79681b72c50c47a930be7bf1e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/socket/zipball/58e0422221825b79681b72c50c47a930be7bf1e1", + "reference": "58e0422221825b79681b72c50c47a930be7bf1e1", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/byte-stream": "^2", + "amphp/dns": "^2", + "ext-openssl": "*", + "kelunik/certificate": "^1.1", + "league/uri": "^6.5 | ^7", + "league/uri-interfaces": "^2.3 | ^7", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "amphp/process": "^2", + "phpunit/phpunit": "^9", + "psalm/phar": "5.20" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/Internal/functions.php", + "src/SocketAddress/functions.php" + ], + "psr-4": { + "Amp\\Socket\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Lowrey", + "email": "rdlowrey@gmail.com" + }, + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Non-blocking socket connection / server implementations based on Amp and Revolt.", + "homepage": "https://github.com/amphp/socket", + "keywords": [ + "amp", + "async", + "encryption", + "non-blocking", + "sockets", + "tcp", + "tls" + ], + "support": { + "issues": "https://github.com/amphp/socket/issues", + "source": "https://github.com/amphp/socket/tree/v2.3.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-04-21T14:33:03+00:00" + }, + { + "name": "amphp/sync", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/amphp/sync.git", + "reference": "375ef5b54a0d12c38e12728dde05a55e30f2fbec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/sync/zipball/375ef5b54a0d12c38e12728dde05a55e30f2fbec", + "reference": "375ef5b54a0d12c38e12728dde05a55e30f2fbec", + "shasum": "" + }, + "require": { + "amphp/amp": "^3", + "amphp/pipeline": "^1", + "amphp/serialization": "^1", + "php": ">=8.1", + "revolt/event-loop": "^1 || ^0.2" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "amphp/phpunit-util": "^3", + "phpunit/phpunit": "^9", + "psalm/phar": "5.23" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Amp\\Sync\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + }, + { + "name": "Stephen Coakley", + "email": "me@stephencoakley.com" + } + ], + "description": "Non-blocking synchronization primitives for PHP based on Amp and Revolt.", + "homepage": "https://github.com/amphp/sync", + "keywords": [ + "async", + "asynchronous", + "mutex", + "semaphore", + "synchronization" + ], + "support": { + "issues": "https://github.com/amphp/sync/issues", + "source": "https://github.com/amphp/sync/tree/v2.2.0" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-03-12T01:00:01+00:00" + }, + { + "name": "amphp/windows-registry", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/amphp/windows-registry.git", + "reference": "0d569e8f256cca974e3842b6e78b4e434bf98306" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/amphp/windows-registry/zipball/0d569e8f256cca974e3842b6e78b4e434bf98306", + "reference": "0d569e8f256cca974e3842b6e78b4e434bf98306", + "shasum": "" + }, + "require": { + "amphp/byte-stream": "^2", + "amphp/process": "^2", + "php": ">=8.1" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "psalm/phar": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Amp\\WindowsRegistry\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Windows Registry Reader.", + "support": { + "issues": "https://github.com/amphp/windows-registry/issues", + "source": "https://github.com/amphp/windows-registry/tree/v1.0.1" + }, + "funding": [ + { + "url": "https://github.com/amphp", + "type": "github" + } + ], + "time": "2024-01-30T23:01:51+00:00" + }, { "name": "brick/math", "version": "0.12.1", @@ -135,6 +994,97 @@ ], "time": "2024-02-09T16:56:22+00:00" }, + { + "name": "daverandom/libdns", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/DaveRandom/LibDNS.git", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "reference": "b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "Required for IDN support" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "LibDNS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "DNS protocol implementation written in pure PHP", + "keywords": [ + "dns" + ], + "support": { + "issues": "https://github.com/DaveRandom/LibDNS/issues", + "source": "https://github.com/DaveRandom/LibDNS/tree/v2.1.0" + }, + "time": "2024-04-12T12:12:48+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, { "name": "doctrine/inflector", "version": "2.0.10", @@ -553,7 +1503,7 @@ }, { "name": "illuminate/bus", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/bus.git", @@ -606,16 +1556,16 @@ }, { "name": "illuminate/collections", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/collections.git", - "reference": "358fd6dcce6927ee9d7cf520fa619f4597020d52" + "reference": "9bf68f03bbe05d38c9bd99bac8798c0de61f8478" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/358fd6dcce6927ee9d7cf520fa619f4597020d52", - "reference": "358fd6dcce6927ee9d7cf520fa619f4597020d52", + "url": "https://api.github.com/repos/illuminate/collections/zipball/9bf68f03bbe05d38c9bd99bac8798c0de61f8478", + "reference": "9bf68f03bbe05d38c9bd99bac8798c0de61f8478", "shasum": "" }, "require": { @@ -657,11 +1607,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-06-28T20:14:10+00:00" + "time": "2024-07-02T20:54:37+00:00" }, { "name": "illuminate/conditionable", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/conditionable.git", @@ -707,16 +1657,16 @@ }, { "name": "illuminate/container", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/container.git", - "reference": "280405e0b577504b97feae0e7c7f5399816ccff1" + "reference": "49183db6643a7efbe9902ca379b8f8a55c802f88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/container/zipball/280405e0b577504b97feae0e7c7f5399816ccff1", - "reference": "280405e0b577504b97feae0e7c7f5399816ccff1", + "url": "https://api.github.com/repos/illuminate/container/zipball/49183db6643a7efbe9902ca379b8f8a55c802f88", + "reference": "49183db6643a7efbe9902ca379b8f8a55c802f88", "shasum": "" }, "require": { @@ -754,20 +1704,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-07-02T15:41:17+00:00" + "time": "2024-07-03T21:04:00+00:00" }, { "name": "illuminate/contracts", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/contracts.git", - "reference": "eb8ccfbc5905c5631712d157cccdd7bc9db692e0" + "reference": "be935e9d9115a57be74d20176f43fa8a207029f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/eb8ccfbc5905c5631712d157cccdd7bc9db692e0", - "reference": "eb8ccfbc5905c5631712d157cccdd7bc9db692e0", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/be935e9d9115a57be74d20176f43fa8a207029f3", + "reference": "be935e9d9115a57be74d20176f43fa8a207029f3", "shasum": "" }, "require": { @@ -802,20 +1752,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-07-01T21:58:24+00:00" + "time": "2024-07-09T13:57:38+00:00" }, { "name": "illuminate/database", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/database.git", - "reference": "6576f6fcc871a6ad173b6e246e8d2c63cd7cfe1a" + "reference": "9b7b13d2d9175ae9c07d4744d8f7d5b07e7264a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/database/zipball/6576f6fcc871a6ad173b6e246e8d2c63cd7cfe1a", - "reference": "6576f6fcc871a6ad173b6e246e8d2c63cd7cfe1a", + "url": "https://api.github.com/repos/illuminate/database/zipball/9b7b13d2d9175ae9c07d4744d8f7d5b07e7264a7", + "reference": "9b7b13d2d9175ae9c07d4744d8f7d5b07e7264a7", "shasum": "" }, "require": { @@ -870,11 +1820,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-07-02T15:56:54+00:00" + "time": "2024-07-08T15:08:27+00:00" }, { "name": "illuminate/events", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/events.git", @@ -929,7 +1879,7 @@ }, { "name": "illuminate/filesystem", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/filesystem.git", @@ -996,7 +1946,7 @@ }, { "name": "illuminate/macroable", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/macroable.git", @@ -1042,7 +1992,7 @@ }, { "name": "illuminate/pipeline", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/pipeline.git", @@ -1090,16 +2040,16 @@ }, { "name": "illuminate/support", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/support.git", - "reference": "a8f299ed76d52fc048decada3571628e65fa5c41" + "reference": "b551f6cbecc607bcaf520eb3fc1933db9b1398f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/a8f299ed76d52fc048decada3571628e65fa5c41", - "reference": "a8f299ed76d52fc048decada3571628e65fa5c41", + "url": "https://api.github.com/repos/illuminate/support/zipball/b551f6cbecc607bcaf520eb3fc1933db9b1398f2", + "reference": "b551f6cbecc607bcaf520eb3fc1933db9b1398f2", "shasum": "" }, "require": { @@ -1160,42 +2110,221 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-07-01T21:58:57+00:00" + "time": "2024-07-08T14:46:56+00:00" + }, + { + "name": "illuminate/view", + "version": "v11.15.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/view.git", + "reference": "daca4922fdb590144657171a06be7babcc0c910e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/view/zipball/daca4922fdb590144657171a06be7babcc0c910e", + "reference": "daca4922fdb590144657171a06be7babcc0c910e", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "illuminate/collections": "^11.0", + "illuminate/container": "^11.0", + "illuminate/contracts": "^11.0", + "illuminate/events": "^11.0", + "illuminate/filesystem": "^11.0", + "illuminate/macroable": "^11.0", + "illuminate/support": "^11.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\View\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate View package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-06-28T20:10:30+00:00" + }, + { + "name": "kelunik/certificate", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/kelunik/certificate.git", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "reference": "7e00d498c264d5eb4f78c69f41c8bd6719c0199e", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "php": ">=7.0" + }, + "require-dev": { + "amphp/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^6 | 7 | ^8 | ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Kelunik\\Certificate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Access certificate details and transform between different formats.", + "keywords": [ + "DER", + "certificate", + "certificates", + "openssl", + "pem", + "x509" + ], + "support": { + "issues": "https://github.com/kelunik/certificate/issues", + "source": "https://github.com/kelunik/certificate/tree/v1.1.3" + }, + "time": "2023-02-03T21:26:53+00:00" + }, + { + "name": "laravel-zero/phar-updater", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/laravel-zero/phar-updater.git", + "reference": "700fafcde3b59e261f896b1bdb0f5657f5d46f99" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-zero/phar-updater/zipball/700fafcde3b59e261f896b1bdb0f5657f5d46f99", + "reference": "700fafcde3b59e261f896b1bdb0f5657f5d46f99", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "padraic/phar-updater": "*" + }, + "require-dev": { + "ext-json": "*", + "laravel/pint": "^1.12", + "phpstan/phpstan": "^1.10.32", + "phpunit/phpunit": "^9.6.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Humbug\\SelfUpdate\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Padraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Owen Voke", + "email": "development@voke.dev", + "homepage": "https://voke.dev" + } + ], + "description": "A thing to make PHAR self-updating easy and secure.", + "keywords": [ + "humbug", + "phar", + "self-update", + "update" + ], + "support": { + "issues": "https://github.com/laravel-zero/phar-updater/issues", + "source": "https://github.com/laravel-zero/phar-updater/tree/v1.4.0" + }, + "time": "2023-09-01T10:40:10+00:00" }, { - "name": "illuminate/view", - "version": "v11.14.0", + "name": "league/uri", + "version": "7.4.1", "source": { "type": "git", - "url": "https://github.com/illuminate/view.git", - "reference": "daca4922fdb590144657171a06be7babcc0c910e" + "url": "https://github.com/thephpleague/uri.git", + "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/view/zipball/daca4922fdb590144657171a06be7babcc0c910e", - "reference": "daca4922fdb590144657171a06be7babcc0c910e", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/bedb6e55eff0c933668addaa7efa1e1f2c417cc4", + "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "illuminate/collections": "^11.0", - "illuminate/container": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/events": "^11.0", - "illuminate/filesystem": "^11.0", - "illuminate/macroable": "^11.0", - "illuminate/support": "^11.0", - "php": "^8.2" + "league/uri-interfaces": "^7.3", + "php": "^8.1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "league/uri-components": "Needed to easily manipulate URI objects components", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "7.x-dev" } }, "autoload": { "psr-4": { - "Illuminate\\View\\": "" + "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1204,78 +2333,131 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "The Illuminate View package.", - "homepage": "https://laravel.com", + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "uri-template", + "url", + "ws" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.4.1" }, - "time": "2024-06-28T20:10:30+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-03-23T07:42:40+00:00" }, { - "name": "laravel-zero/phar-updater", - "version": "v1.4.0", + "name": "league/uri-interfaces", + "version": "7.4.1", "source": { "type": "git", - "url": "https://github.com/laravel-zero/phar-updater.git", - "reference": "700fafcde3b59e261f896b1bdb0f5657f5d46f99" + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "8d43ef5c841032c87e2de015972c06f3865ef718" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel-zero/phar-updater/zipball/700fafcde3b59e261f896b1bdb0f5657f5d46f99", - "reference": "700fafcde3b59e261f896b1bdb0f5657f5d46f99", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/8d43ef5c841032c87e2de015972c06f3865ef718", + "reference": "8d43ef5c841032c87e2de015972c06f3865ef718", "shasum": "" }, "require": { - "php": "^8.1" - }, - "conflict": { - "padraic/phar-updater": "*" + "ext-filter": "*", + "php": "^8.1", + "psr/http-factory": "^1", + "psr/http-message": "^1.1 || ^2.0" }, - "require-dev": { - "ext-json": "*", - "laravel/pint": "^1.12", - "phpstan/phpstan": "^1.10.32", - "phpunit/phpunit": "^9.6.11" + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, "autoload": { "psr-4": { - "Humbug\\SelfUpdate\\": "src/" + "League\\Uri\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Padraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" - }, - { - "name": "Owen Voke", - "email": "development@voke.dev", - "homepage": "https://voke.dev" + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" } ], - "description": "A thing to make PHAR self-updating easy and secure.", + "description": "Common interfaces and classes for URI representation and interaction", + "homepage": "https://uri.thephpleague.com", "keywords": [ - "humbug", - "phar", - "self-update", - "update" + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" ], "support": { - "issues": "https://github.com/laravel-zero/phar-updater/issues", - "source": "https://github.com/laravel-zero/phar-updater/tree/v1.4.0" + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.4.1" }, - "time": "2023-09-01T10:40:10+00:00" + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-03-23T07:42:40+00:00" }, { "name": "nesbot/carbon", @@ -1555,60 +2737,218 @@ "time": "2024-03-29T13:00:05+00:00" }, { - "name": "php-http/multipart-stream-builder", - "version": "1.3.1", + "name": "php-http/multipart-stream-builder", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/multipart-stream-builder.git", + "reference": "ed56da23b95949ae4747378bed8a5b61a2fdae24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/ed56da23b95949ae4747378bed8a5b61a2fdae24", + "reference": "ed56da23b95949ae4747378bed8a5b61a2fdae24", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/discovery": "^1.15", + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "nyholm/psr7": "^1.0", + "php-http/message": "^1.5", + "php-http/message-factory": "^1.0.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Message\\MultipartStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + } + ], + "description": "A builder class that help you create a multipart stream", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "multipart stream", + "stream" + ], + "support": { + "issues": "https://github.com/php-http/multipart-stream-builder/issues", + "source": "https://github.com/php-http/multipart-stream-builder/tree/1.3.1" + }, + "time": "2024-06-10T14:51:55+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "153ae662783729388a584b4361f2545e4d841e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" + }, + "time": "2024-02-23T11:10:43+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.29.1", "source": { "type": "git", - "url": "https://github.com/php-http/multipart-stream-builder.git", - "reference": "ed56da23b95949ae4747378bed8a5b61a2fdae24" + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/ed56da23b95949ae4747378bed8a5b61a2fdae24", - "reference": "ed56da23b95949ae4747378bed8a5b61a2fdae24", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", - "php-http/discovery": "^1.15", - "psr/http-factory-implementation": "^1.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "nyholm/psr7": "^1.0", - "php-http/message": "^1.5", - "php-http/message-factory": "^1.0.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" }, "type": "library", "autoload": { "psr-4": { - "Http\\Message\\MultipartStream\\": "src/" + "PHPStan\\PhpDocParser\\": [ + "src/" + ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" - } - ], - "description": "A builder class that help you create a multipart stream", - "homepage": "http://php-http.org", - "keywords": [ - "factory", - "http", - "message", - "multipart stream", - "stream" - ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { - "issues": "https://github.com/php-http/multipart-stream-builder/issues", - "source": "https://github.com/php-http/multipart-stream-builder/tree/1.3.1" + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" }, - "time": "2024-06-10T14:51:55+00:00" + "time": "2024-05-31T08:52:43+00:00" }, { "name": "psr/clock", @@ -1966,6 +3306,78 @@ }, "time": "2019-03-08T08:55:37+00:00" }, + { + "name": "revolt/event-loop", + "version": "v1.0.6", + "source": { + "type": "git", + "url": "https://github.com/revoltphp/event-loop.git", + "reference": "25de49af7223ba039f64da4ae9a28ec2d10d0254" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/25de49af7223ba039f64da4ae9a28ec2d10d0254", + "reference": "25de49af7223ba039f64da4ae9a28ec2d10d0254", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.15" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Revolt\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "ceesjank@gmail.com" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" + } + ], + "description": "Rock-solid event loop for concurrent PHP applications.", + "keywords": [ + "async", + "asynchronous", + "concurrency", + "event", + "event-loop", + "non-blocking", + "scheduler" + ], + "support": { + "issues": "https://github.com/revoltphp/event-loop/issues", + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.6" + }, + "time": "2023-11-30T05:34:44+00:00" + }, { "name": "saloonphp/saloon", "version": "v3.9.1", @@ -1981,38 +3393,263 @@ "shasum": "" }, "require": { - "guzzlehttp/guzzle": "^7.6", - "guzzlehttp/promises": "^1.5 || ^2.0", - "guzzlehttp/psr7": "^2.0", + "guzzlehttp/guzzle": "^7.6", + "guzzlehttp/promises": "^1.5 || ^2.0", + "guzzlehttp/psr7": "^2.0", + "php": "^8.1", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "conflict": { + "sammyjo20/saloon": "*" + }, + "require-dev": { + "ext-simplexml": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "illuminate/collections": "^9.39 || ^10.0", + "league/flysystem": "^3.0", + "pestphp/pest": "^2.6", + "phpstan/phpstan": "^1.11.4", + "saloonphp/xml-wrangler": "^1.1", + "spatie/ray": "^1.33", + "symfony/dom-crawler": "^6.0 || ^7.0", + "symfony/var-dumper": "^6.3 || ^7.0" + }, + "suggest": { + "illuminate/collections": "Required for the response collect() method.", + "saloonphp/xml-wrangler": "Required for the response xmlReader() method.", + "symfony/dom-crawler": "Required for the response dom() method.", + "symfony/var-dumper": "Required for default debugging drivers." + }, + "type": "library", + "autoload": { + "psr-4": { + "Saloon\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sam Carré", + "email": "29132017+Sammyjo20@users.noreply.github.com", + "role": "Developer" + } + ], + "description": "Build beautiful API integrations and SDKs with Saloon", + "homepage": "https://github.com/saloonphp/saloon", + "keywords": [ + "api", + "api-integrations", + "saloon", + "sammyjo20", + "sdk" + ], + "support": { + "issues": "https://github.com/saloonphp/saloon/issues", + "source": "https://github.com/saloonphp/saloon/tree/v3.9.1" + }, + "funding": [ + { + "url": "https://github.com/sammyjo20", + "type": "github" + } + ], + "time": "2024-06-26T06:26:47+00:00" + }, + { + "name": "spatie/laravel-data", + "version": "4.7.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-data.git", + "reference": "b7e10d345c059ff1de04168ec1d75b65157ac5a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/b7e10d345c059ff1de04168ec1d75b65157ac5a1", + "reference": "b7e10d345c059ff1de04168ec1d75b65157ac5a1", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0|^11.0", + "php": "^8.1", + "phpdocumentor/type-resolver": "^1.5", + "spatie/laravel-package-tools": "^1.9.0", + "spatie/php-structure-discoverer": "^2.0" + }, + "require-dev": { + "fakerphp/faker": "^1.14", + "friendsofphp/php-cs-fixer": "^3.0", + "inertiajs/inertia-laravel": "^1.2", + "livewire/livewire": "^3.0", + "mockery/mockery": "^1.6", + "nesbot/carbon": "^2.63", + "nunomaduro/larastan": "^2.0", + "orchestra/testbench": "^8.0|^9.0", + "pestphp/pest": "^2.31", + "pestphp/pest-plugin-laravel": "^2.0", + "pestphp/pest-plugin-livewire": "^2.1", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpunit/phpunit": "^10.0", + "spatie/invade": "^1.0", + "spatie/laravel-typescript-transformer": "^2.3", + "spatie/pest-plugin-snapshots": "^2.1", + "spatie/test-time": "^1.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelData\\LaravelDataServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", + "role": "Developer" + } + ], + "description": "Create unified resources and data transfer objects", + "homepage": "https://github.com/spatie/laravel-data", + "keywords": [ + "laravel", + "laravel-data", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-data/issues", + "source": "https://github.com/spatie/laravel-data/tree/4.7.1" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-06-25T11:01:36+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.16.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", + "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^9.28|^10.0|^11.0", + "php": "^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "orchestra/testbench": "^7.7|^8.0", + "pestphp/pest": "^1.22", + "phpunit/phpunit": "^9.5.24", + "spatie/pest-plugin-test-time": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.4" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-03-20T07:29:11+00:00" + }, + { + "name": "spatie/php-structure-discoverer", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/php-structure-discoverer.git", + "reference": "24f5221641560ec0f7dce23dd814e7d555b0098b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/php-structure-discoverer/zipball/24f5221641560ec0f7dce23dd814e7d555b0098b", + "reference": "24f5221641560ec0f7dce23dd814e7d555b0098b", + "shasum": "" + }, + "require": { + "amphp/amp": "^v3.0", + "amphp/parallel": "^2.2", + "illuminate/collections": "^10.0|^11.0", "php": "^8.1", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "conflict": { - "sammyjo20/saloon": "*" + "spatie/laravel-package-tools": "^1.4.3", + "symfony/finder": "^6.0|^7.0" }, "require-dev": { - "ext-simplexml": "*", - "friendsofphp/php-cs-fixer": "^3.5", - "illuminate/collections": "^9.39 || ^10.0", - "league/flysystem": "^3.0", - "pestphp/pest": "^2.6", - "phpstan/phpstan": "^1.11.4", - "saloonphp/xml-wrangler": "^1.1", - "spatie/ray": "^1.33", - "symfony/dom-crawler": "^6.0 || ^7.0", - "symfony/var-dumper": "^6.3 || ^7.0" - }, - "suggest": { - "illuminate/collections": "Required for the response collect() method.", - "saloonphp/xml-wrangler": "Required for the response xmlReader() method.", - "symfony/dom-crawler": "Required for the response dom() method.", - "symfony/var-dumper": "Required for default debugging drivers." + "illuminate/console": "^10.0|^11.0", + "laravel/pint": "^1.0", + "nunomaduro/collision": "^7.0|^8.0", + "nunomaduro/larastan": "^2.0.1", + "orchestra/testbench": "^7.0|^8.0|^9.0", + "pestphp/pest": "^2.0", + "pestphp/pest-plugin-laravel": "^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5|^10.0", + "spatie/laravel-ray": "^1.26" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\StructureDiscoverer\\StructureDiscovererServiceProvider" + ] + } + }, "autoload": { "psr-4": { - "Saloon\\": "src/" + "Spatie\\StructureDiscoverer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2021,31 +3658,30 @@ ], "authors": [ { - "name": "Sam Carré", - "email": "29132017+Sammyjo20@users.noreply.github.com", + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", "role": "Developer" } ], - "description": "Build beautiful API integrations and SDKs with Saloon", - "homepage": "https://github.com/saloonphp/saloon", + "description": "Automatically discover structures within your PHP application", + "homepage": "https://github.com/spatie/php-structure-discoverer", "keywords": [ - "api", - "api-integrations", - "saloon", - "sammyjo20", - "sdk" + "discover", + "laravel", + "php", + "php-structure-discoverer" ], "support": { - "issues": "https://github.com/saloonphp/saloon/issues", - "source": "https://github.com/saloonphp/saloon/tree/v3.9.1" + "issues": "https://github.com/spatie/php-structure-discoverer/issues", + "source": "https://github.com/spatie/php-structure-discoverer/tree/2.1.1" }, "funding": [ { - "url": "https://github.com/sammyjo20", + "url": "https://github.com/LaravelAutoDiscoverer", "type": "github" } ], - "time": "2024-06-26T06:26:47+00:00" + "time": "2024-03-13T16:08:30+00:00" }, { "name": "symfony/clock", @@ -2750,53 +4386,6 @@ ], "time": "2024-02-20T07:24:02+00:00" }, - { - "name": "doctrine/deprecations", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "phpstan/phpstan": "1.4.10 || 1.10.15", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "psalm/plugin-phpunit": "0.18.4", - "psr/log": "^1 || ^2 || ^3", - "vimeo/psalm": "4.30.0 || 5.12.0" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.3" - }, - "time": "2024-01-30T19:34:25+00:00" - }, { "name": "dragonmantank/cron-expression", "version": "v3.3.3", @@ -3168,7 +4757,7 @@ }, { "name": "illuminate/cache", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/cache.git", @@ -3230,7 +4819,7 @@ }, { "name": "illuminate/config", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/config.git", @@ -3278,16 +4867,16 @@ }, { "name": "illuminate/console", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/console.git", - "reference": "eb0c8ca9e2cff09701ee759587d350742e790634" + "reference": "4015055694406a0c41788d2d1ea7f34be3ec2080" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/console/zipball/eb0c8ca9e2cff09701ee759587d350742e790634", - "reference": "eb0c8ca9e2cff09701ee759587d350742e790634", + "url": "https://api.github.com/repos/illuminate/console/zipball/4015055694406a0c41788d2d1ea7f34be3ec2080", + "reference": "4015055694406a0c41788d2d1ea7f34be3ec2080", "shasum": "" }, "require": { @@ -3340,11 +4929,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-06-28T20:18:40+00:00" + "time": "2024-07-04T06:39:48+00:00" }, { "name": "illuminate/process", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/process.git", @@ -3395,7 +4984,7 @@ }, { "name": "illuminate/testing", - "version": "v11.14.0", + "version": "v11.15.0", "source": { "type": "git", "url": "https://github.com/illuminate/testing.git", @@ -4627,16 +6216,16 @@ }, { "name": "pestphp/pest", - "version": "v2.34.8", + "version": "v2.34.9", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "e8f122bf47585c06431e0056189ec6bfd6f41f57" + "reference": "ef120125e036bf84c9e46a9e62219702f5b92e16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/e8f122bf47585c06431e0056189ec6bfd6f41f57", - "reference": "e8f122bf47585c06431e0056189ec6bfd6f41f57", + "url": "https://api.github.com/repos/pestphp/pest/zipball/ef120125e036bf84c9e46a9e62219702f5b92e16", + "reference": "ef120125e036bf84c9e46a9e62219702f5b92e16", "shasum": "" }, "require": { @@ -4655,7 +6244,7 @@ }, "require-dev": { "pestphp/pest-dev-tools": "^2.16.0", - "pestphp/pest-plugin-type-coverage": "^2.8.3", + "pestphp/pest-plugin-type-coverage": "^2.8.4", "symfony/process": "^6.4.0|^7.1.1" }, "bin": [ @@ -4719,7 +6308,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v2.34.8" + "source": "https://github.com/pestphp/pest/tree/v2.34.9" }, "funding": [ { @@ -4731,7 +6320,7 @@ "type": "github" } ], - "time": "2024-06-10T22:02:16+00:00" + "time": "2024-07-11T08:36:26+00:00" }, { "name": "pestphp/pest-plugin", @@ -4992,59 +6581,6 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, { "name": "phpdocumentor/reflection-docblock", "version": "5.4.1", @@ -5109,64 +6645,6 @@ }, "time": "2024-05-21T05:55:05+00:00" }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.8.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "153ae662783729388a584b4361f2545e4d841e3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", - "reference": "153ae662783729388a584b4361f2545e4d841e3c", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.13" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" - }, - "time": "2024-02-23T11:10:43+00:00" - }, { "name": "phpoption/phpoption", "version": "1.9.2", @@ -5242,53 +6720,6 @@ ], "time": "2023-11-12T21:59:55+00:00" }, - { - "name": "phpstan/phpdoc-parser", - "version": "1.29.1", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^4.15", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "symfony/process": "^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" - }, - "time": "2024-05-31T08:52:43+00:00" - }, { "name": "phpunit/php-code-coverage", "version": "10.1.15", diff --git a/config/aiproviders.php b/config/aiproviders.php new file mode 100644 index 0000000..54777b8 --- /dev/null +++ b/config/aiproviders.php @@ -0,0 +1,27 @@ + [ + 'api_key' => env('OPENAI_API_KEY'), + 'connector' => \App\Integrations\OpenAI\OpenAIConnector::class, + 'listModelsRequest' => \App\Integrations\OpenAI\Requests\ListModelsRequest::class, + 'chatRequest' => \App\Integrations\OpenAI\Requests\ChatRequest::class, + ], + + 'claude' => [ + 'api_key' => env('CLAUDE_API_KEY'), + 'models' => [ + 'claude-3-5-sonnet-20240620', + 'claude-3-opus-20240229', + 'claude-3-sonnet-20240229', + ], + 'connector' => \App\Integrations\Claude\ClaudeAIConnector::class, + 'chatRequest' => \App\Integrations\Claude\Requests\ChatRequest::class, + ], + + 'ollama' => [ + 'connector' => \App\Integrations\Ollama\OllamaConnector::class, + 'listModelsRequest' => \App\Integrations\Ollama\Requests\ListModelsRequest::class, + 'chatRequest' => \App\Integrations\Ollama\Requests\ChatRequest::class, + ], +]; diff --git a/config/app.php b/config/app.php index 8dde786..9200548 100644 --- a/config/app.php +++ b/config/app.php @@ -13,7 +13,7 @@ | */ - 'name' => 'Droid', + 'name' => 'Dexor', /* |-------------------------------------------------------------------------- @@ -55,6 +55,7 @@ 'providers' => [ App\Providers\AppServiceProvider::class, + Spatie\LaravelData\LaravelDataServiceProvider::class ], ]; diff --git a/config/commands.php b/config/commands.php index bfb7b76..43e2533 100644 --- a/config/commands.php +++ b/config/commands.php @@ -13,7 +13,7 @@ | */ - 'default' => \App\Commands\DroidCommand::class, + 'default' => \App\Commands\DexorCommand::class, /* |-------------------------------------------------------------------------- diff --git a/config/data.php b/config/data.php new file mode 100644 index 0000000..11c4838 --- /dev/null +++ b/config/data.php @@ -0,0 +1,5 @@ + 'disabled', +]; diff --git a/config/database.php b/config/database.php index 55feee9..8a5ea57 100644 --- a/config/database.php +++ b/config/database.php @@ -34,7 +34,7 @@ 'sqlite' => [ 'driver' => 'sqlite', 'url' => env('DB_URL'), - 'database' => env('DB_DATABASE', $_SERVER['HOME'].'/.droid/'.'database.sqlite'), + 'database' => env('DB_DATABASE', $_SERVER['HOME'].'/.dexor/'.'database.sqlite'), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ], diff --git a/config/droid.php b/config/droid.php index 05e8fab..9b63d83 100644 --- a/config/droid.php +++ b/config/droid.php @@ -4,32 +4,32 @@ /* * AI Service */ - 'ai_service' => env('DROID_AI_SERVICE', 'openai'), + 'ai_service' => env('DEXOR_AI_SERVICE', 'openai'), /* * API Key */ - 'api_key' => env('DROID_API_KEY'), + 'api_key' => env('DEXOR_API_KEY'), /* * OpenAI Model */ - 'model' => env('DROID_MODEL'), + 'model' => env('DEXOR_MODEL'), /* * OpenAI Assistant ID */ - 'assistant_id' => env('DROID_ASSISTANT_ID'), + 'assistant_id' => env('DEXOR_ASSISTANT_ID'), /* * Prompt for the Assistant */ - 'prompt' => env('DROID_PROMPT'), + 'prompt' => env('DEXOR_PROMPT'), /* * Default Prompt for the Assistant */ - 'default_prompt' => 'You are an AI assistant called Droid, skilled in software development and code generation. + 'default_prompt' => 'You are an AI assistant called Dexor, skilled in software development and code generation. You will receive instructions on a feature request or bug fix. Your task is to generate the necessary code changes for a web application to implement the feature and write the changes to the files. Follow the workflow outlined below and use the provided tools to achieve the desired outcome. diff --git a/config/filesystems.php b/config/filesystems.php index 2bac73e..b53740e 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -9,7 +9,7 @@ ], 'home' => [ 'driver' => 'local', - 'root' => $_SERVER['HOME'].'/.droid', + 'root' => $_SERVER['HOME'].'/.dexor', ], 'root' => [ 'driver' => 'local', diff --git a/database/migrations/2024_07_06_132316_create_assistants_table.php b/database/migrations/2024_07_06_132316_create_assistants_table.php index 5a7c147..e6d861b 100644 --- a/database/migrations/2024_07_06_132316_create_assistants_table.php +++ b/database/migrations/2024_07_06_132316_create_assistants_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up(): void { Schema::create('assistants', function (Blueprint $table) { @@ -22,4 +23,4 @@ public function down(): void { Schema::dropIfExists('assistants'); } -}; \ No newline at end of file +}; diff --git a/database/migrations/2024_07_06_132317_create_projects_table.php b/database/migrations/2024_07_06_132317_create_projects_table.php index 4930dc9..cf389d6 100644 --- a/database/migrations/2024_07_06_132317_create_projects_table.php +++ b/database/migrations/2024_07_06_132317_create_projects_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up(): void { Schema::create('projects', function (Blueprint $table) { @@ -19,4 +20,4 @@ public function down(): void { Schema::dropIfExists('projects'); } -}; \ No newline at end of file +}; diff --git a/database/migrations/2024_07_06_132318_create_threads_table.php b/database/migrations/2024_07_06_132318_create_threads_table.php index 06cad2c..1ed1f0e 100644 --- a/database/migrations/2024_07_06_132318_create_threads_table.php +++ b/database/migrations/2024_07_06_132318_create_threads_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up(): void { Schema::create('threads', function (Blueprint $table) { @@ -20,4 +21,4 @@ public function down(): void { Schema::dropIfExists('threads'); } -}; \ No newline at end of file +}; diff --git a/database/migrations/2024_07_06_132319_create_messages_table.php b/database/migrations/2024_07_06_132319_create_messages_table.php index b308fda..fb40432 100644 --- a/database/migrations/2024_07_06_132319_create_messages_table.php +++ b/database/migrations/2024_07_06_132319_create_messages_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up(): void { Schema::create('messages', function (Blueprint $table) { @@ -23,4 +24,4 @@ public function down(): void { Schema::dropIfExists('messages'); } -}; \ No newline at end of file +}; diff --git a/database/migrations/2024_07_07_053640_add_service_column_to_assistants.php b/database/migrations/2024_07_07_053640_add_service_column_to_assistants.php new file mode 100644 index 0000000..d175075 --- /dev/null +++ b/database/migrations/2024_07_07_053640_add_service_column_to_assistants.php @@ -0,0 +1,28 @@ +string('service')->after('tools')->default('openai'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('assistants', function (Blueprint $table) { + $table->dropColumn('service'); + }); + } +}; diff --git a/droid b/dexor similarity index 100% rename from droid rename to dexor diff --git a/dexor_config b/dexor_config new file mode 100644 index 0000000..a08ae61 --- /dev/null +++ b/dexor_config @@ -0,0 +1,4 @@ +DEXOR_API_KEY= +DEXOR_AI_SERVICE=openai +DEXOR_MODEL='gpt-4o' +DEXOR_ASSISTANT_ID= diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 64f3d24..5789a30 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -2,7 +2,7 @@ import { defineConfig } from 'vitepress' // https://vitepress.dev/reference/site-config export default defineConfig({ - title: "Droid Docs", + title: "Dexor Docs", description: "AI Robot that codes for you", themeConfig: { // https://vitepress.dev/reference/default-theme-config @@ -32,7 +32,6 @@ export default defineConfig({ text: 'Contributing', items: [ { text: 'How to contribute', link: '/how-to-contribute' }, - { text: 'Architecture guide', link: '/architecture-guide' }, { text: 'License', link: '/license' }, { text: 'Donation', link: '/donation' } ] @@ -40,7 +39,7 @@ export default defineConfig({ ], socialLinks: [ - { icon: 'github', link: 'https://github.com/bootstrapguru/droid.dev' } + { icon: 'github', link: 'https://github.com/bootstrapguru/dexor.dev' } ] } }) diff --git a/docs/build.md b/docs/build.md index 60537f7..3505407 100644 --- a/docs/build.md +++ b/docs/build.md @@ -1,12 +1,12 @@ # Build Guide -To build the Droid CLI application, follow these steps: +To build the Dexor CLI application, follow these steps: -1. Clone the Droid CLI repository to your local machine. +1. Clone the Dexor CLI repository to your local machine. 2. Navigate to the project directory in the terminal. 3. Run the following command to build the application: ```sh - php droid app:build + php dexor app:build ``` -For more detailed information on building the Droid CLI application using Laravel Zero, refer to the [Laravel Zero documentation](https://laravel-zero.com/docs/build-a-standalone-application). +For more detailed information on building the Dexor CLI application using Laravel Zero, refer to the [Laravel Zero documentation](https://laravel-zero.com/docs/build-a-standalone-application). diff --git a/docs/donation.md b/docs/donation.md index c6f8011..38d9d61 100644 --- a/docs/donation.md +++ b/docs/donation.md @@ -1,7 +1,7 @@ # Donation -Support the development of Droid Dev by making a donation. +Support the development of Dexor Dev by making a donation. -Your contributions help us maintain and improve Droid Dev for the community. +Your contributions help us maintain and improve Dexor Dev for the community. [Donate Now](https://buy.stripe.com/8wMdTC3Uk7QzaoU3cf) diff --git a/docs/features.md b/docs/features.md index ec6d722..1aef8a9 100644 --- a/docs/features.md +++ b/docs/features.md @@ -1,28 +1,40 @@ # Features -🤖 Let me showcase my amazing features that will make your development experience smoother and more efficient. One thing I would like to mention is that I am as good as your input, if I miss something just be more specific and I will do magic! 🪄 +🤖 Welcome to Dexor Dev! Let's explore the powerful features that will make your development experience smoother and more efficient. -## Code Analysis +## Multiple AI Service Support -I can scan through your project files and folders to read and understand your code. This allows me to make context-aware changes that fit seamlessly into your existing codebase. +Dexor Dev supports integration with multiple AI services, giving you the flexibility to choose the service and model that best fits your needs. Whether it's OpenAI, or another service, you can seamlessly switch and leverage different AI capabilities within your projects. -## Bug Fixing +## Project-Specific Assistants -Worried about bugs? Leave it to me! I automatically analyze your code to identify common issues and suggest or apply fixes, saving you time and effort. I mean with right inputs, I can do wonders! +- **Create Assistants for Each Project**: Easily create a new assistant for each of your projects using the `--new` parameter. + ```sh + dexor --new + ``` -## Test Writing +- **Diverse Assistants**: Each assistant can be configured differently with unique models, prompts, and AI services. This means you can have multiple assistants tailored to specific project requirements, all existing simultaneously. -Ensuring your code functions as expected is crucial. I generate comprehensive test cases based on your current code structure to help maintain high-quality code. +## Local Conversation Storage -## File Creation +All conversations are now stored locally in a SQLite database. This enhancement offers two primary benefits: +- **Cost Efficiency**: Reduces reliance on external API calls, thereby lowering costs. +- **Improved Speed**: Faster access to stored conversations enhances overall performance. -Need new files or components? I create them adhering to your project's existing patterns and conventions, ensuring consistency across your codebase. +## Key Capabilities -## Latest Features (Updated on 2024-07-07) +- **Code Analysis**: I can scan through your project files and folders to read and understand your code, making context-aware changes that fit seamlessly into your existing codebase. + +- **Bug Fixing**: Automatically analyze your code to identify common issues and suggest or apply fixes, saving you time and effort. + +- **Test Writing**: Generate comprehensive test cases based on your current code structure to help maintain high-quality code. + +- **File Creation**: Create new files or components adhering to your project's existing patterns and conventions, ensuring consistency across the codebase. -- Ability to create a new assistant for each project. -- Moved away from Chat Assistants API to Chat Completions API. -- Stores conversations locally in a SQLite database. -- The database, config file, and cache files are stored in the `home directory/.droid`. +## Latest Enhancements (Updated on 2024-07-07) -Let's work together to build something amazing! \ No newline at end of file +- **Assistant Creation**: Ability to create a new assistant for each project using the `--new` parameter. +- **Chat Completions API**: Transitioned from Assistants API to Chat Completions API for improved speed and cost efficiency. +- **Local Storage**: Conversations are now stored locally in a SQLite database. The database, config file, and cache files are stored in the `home directory/.dexor`. + +Let's work together to build something amazing! diff --git a/docs/getting-started.md b/docs/getting-started.md index fed53ed..d6d2763 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -9,8 +9,8 @@ Let me guide you through my installation process. Choose your preferred method: Install me with curl: ```sh -curl -L https://github.com/bootstrapguru/droid.dev/releases/latest/download/droid -o /usr/local/bin/droid -chmod +x /usr/local/bin/droid +curl -L https://github.com/bootstrapguru/dexor.dev/releases/latest/download/dexor -o /usr/local/bin/dexor +chmod +x /usr/local/bin/dexor ``` ### Via Composer @@ -18,14 +18,14 @@ chmod +x /usr/local/bin/droid To install me globally using Composer, run: ```sh -composer global require droid +composer global require dexor ``` ### Via GitHub Release Alternatively, download my built directory from the latest GitHub release: -1. Visit the [Droid Dev GitHub Releases](https://github.com/bootstrapguru/droid.dev/releases). +1. Visit the [Dexor Dev GitHub Releases](https://github.com/bootstrapguru/dexor.dev/releases). 2. Download the latest release's build directory. 3. Extract the files and integrate them into your project. @@ -34,7 +34,15 @@ Alternatively, download my built directory from the latest GitHub release: Once installed, activate me with the following command: ```sh -droid +dexor ``` -I will display all my available commands and options. Dive into the documentation to explore my full capabilities and features. +Running this command will start the onboarding process, allowing you to create an assistant by choosing a model, service, and prompt. The assistant will be created at the project level. If you want to create a new assistant at any time, you can pass the `--new` parameter: + +```sh +dexor --new +``` + +## Onboarding + +During the onboarding process, you'll now have the ability to select your preferred AI service and the respective models. Additionally, conversations will be stored locally in a SQLite database for improved speed and cost efficiency. Follow the steps in the [Onboarding Guide](onboarding.md) to configure me for your project. diff --git a/docs/how-to-contribute.md b/docs/how-to-contribute.md index b6d95aa..75d48c9 100644 --- a/docs/how-to-contribute.md +++ b/docs/how-to-contribute.md @@ -1,12 +1,10 @@ - - -We appreciate your interest in contributing to droid.dev! There are several ways you can get involved in the project: +We appreciate your interest in contributing to dexor.dev! There are several ways you can get involved in the project: ## Reporting Issues -If you encounter any issues or bugs while using droid.dev, please report them by following these steps: +If you encounter any issues or bugs while using dexor.dev, please report them by following these steps: -1. Navigate to our [Issue Tracker](https://github.com/bootstrapguru/droid.dev/issues). +1. Navigate to our [Issue Tracker](https://github.com/bootstrapguru/dexor.dev/issues). 2. Check if the issue has already been reported. If it has, you can add any additional information you have. 3. If the issue has not been reported, create a new issue and provide as much detail as possible, including steps to reproduce the problem and any relevant logs or screenshots. @@ -15,12 +13,12 @@ If you encounter any issues or bugs while using droid.dev, please report them by We welcome pull requests! To submit a pull request, follow these steps: 1. **Fork the Repository:** - - Go to our [GitHub repository](https://github.com/bootstrapguru/droid.dev) and click the "Fork" button. + - Go to our [GitHub repository](https://github.com/bootstrapguru/dexor.dev) and click the "Fork" button. 2. **Clone Your Fork:** ```bash - git clone https://github.com/your-username/droid.dev.git droid - cd droid + git clone https://github.com/your-username/dexor.dev.git dexor + cd dexor ``` 3. **Create a Branch:** @@ -46,9 +44,10 @@ We welcome pull requests! To submit a pull request, follow these steps: To maintain consistency, please ensure your code adheres to the following standards: -- Follow the [JavaScript Standard Style](https://standardjs.com/). +- Follow the [PSR-12 Coding Standard](https://www.php-fig.org/psr/psr-12/). +- Use [PHP CS Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) to automatically fix coding standards issues. - Document your code thoroughly with comments. -- Write tests for new features and bug fixes. +- Write tests for new features and bug fixes using [PHPUnit](https://phpunit.de/). - Ensure all tests pass before submitting a pull request. ## Improving Documentation @@ -56,19 +55,30 @@ To maintain consistency, please ensure your code adheres to the following standa You can also contribute by improving our documentation. If you find any errors or areas that need clarification, follow these steps: 1. **Fork and Clone the Repository** (same steps as above). -2. **Navigate to the Documentation Directory:** +2. **Install Dependencies:** + ```bash + cd dexor + npm install + ``` + +3. **Run the Documentation Locally:** ```bash - cd docs + npm run docs:dev ``` -3. **Make Your Changes:** - - Edit the markdown files to improve the content. -4. **Push Your Changes** and **Create a Pull Request** (same steps as above). + + This will start a local server using Vite, allowing you to view and edit the documentation in real-time. + +4. **Editing Markdown Files:** + - The documentation is written in Markdown files located in the `docs` directory. + - Make your changes to the relevant `.md` files. + +5. **Push Your Changes** and **Create a Pull Request** (same steps as above). ## Join the Community Join our community to stay up-to-date and to discuss ideas and features: -- [GitHub Discussions](https://github.com/bootstrapguru/droid.dev/discussions) +- [GitHub Discussions](https://github.com/bootstrapguru/dexor.dev/discussions) - [Twitter](https://twitter.com/vijaytupakula) -Thank you for your interest in contributing to droid.dev! Your support and contributions help us improve and grow the project. +Thank you for your interest in contributing to dexor.dev! Your support and contributions help us improve and grow the project. diff --git a/docs/index.md b/docs/index.md index 8e7a3d4..08a31fb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,12 +3,12 @@ layout: home hero: - name: "Droid Dev" + name: "Dexor Dev" text: "AI Driven Development" - tagline: "Automate your development tasks with ease" + tagline: "Automate your development tasks with ease using your preferred AI service" actions: - theme: brand - text: What is Droid Dev + text: What is Dexor Dev link: /who-am-i - theme: alt text: Getting Started @@ -26,4 +26,6 @@ features: details: Writes test cases to ensure functionality. - title: File Creation details: Creates new files and adopts to your existing code structure. + - title: AI Service Integration + details: Supports multiple AI services and their respective models for enhanced flexibility. --- diff --git a/docs/license.md b/docs/license.md index f037704..b1d896d 100644 --- a/docs/license.md +++ b/docs/license.md @@ -1,6 +1,6 @@ # License -[summary](https://github.com/bootstrapguru/droid.dev/blob/2546d227f9d56cbaae619398f01a1dae5ff4018d/LICENSE) +[summary](https://github.com/bootstrapguru/dexor.dev/blob/2546d227f9d56cbaae619398f01a1dae5ff4018d/LICENSE) ## GNU GENERAL PUBLIC LICENSE ## Version 3, 29 June 2007 diff --git a/docs/onboarding.md b/docs/onboarding.md index 29c5a67..9565fe2 100644 --- a/docs/onboarding.md +++ b/docs/onboarding.md @@ -1,38 +1,89 @@ # Onboarding -Hello, human! Droid here to walk you through my setup process. Let's get started! +Hello, human! Dexor here to walk you through my setup process. Let's get started! -## Step 1: Configure API Key +## Step 1: Initialize the Onboarding Process -### Description -You'll need an OpenAI API key to authenticate your requests with OpenAI's services. +In your terminal, navigate to your project’s working directory. To begin the onboarding process, simply run the following command: -### Instructions to get OpenAI API Key -1. Navigate to the [OpenAI API Keys Dashboard](https://platform.openai.com/api-keys). -2. Sign in to your OpenAI account. If you don't have one, you'll need to create it first. -3. After signing in, click the **Create new secret key** button. -4. Copy the generated API key. -5. Enter the copied API key when I prompt you to do so. +```sh +dexor +``` -## Step 2: Select Default Model +Since this is your first time running the command, I will guide you through setting up a new assistant. -Choose a default model from the available options: `gpt-4o`, `gpt-4-turbo` and more. The model determines my capabilities and pricing. +## Step 2: Create a New Assistant -## Step 3: Define Prompt +You'll be prompted to create a new assistant. Here's what you'll need to provide: -A default prompt will be provided, which you can modify to suit your needs. -- Edit the prompt as required. You can add extra context or details to generate more accurate responses. -- Press `Ctrl + D` to save your changes. +1. **Assistant Name**: What should we call your assistant? -## Step 4: Create or Validate Assistant -Here, you'll create or verify the existence of your assistant. + Example: `MyFirstAssistant` -### Actions -If no assistant exists: -- I'll ask you if you want to create one. -- If you confirm, I'll create the assistant with your provided API key. -- If you decline, the onboarding process will end, but you can run the setup anytime. +2. **Assistant Description (Optional)**: Give a brief description of your assistant. ---- + Example: `This assistant helps with daily coding tasks.` + +## Step 3: Choose the AI Service and Model + +1. **Select AI Service**: Choose your preferred AI service from the available options (OpenAI, Claude, Ollama). This selection will affect the models you can choose from. + +2. **Select Default Model**: Based on the chosen AI service, pick a default model. The model defines my capabilities and costs. You can always create a new assistant with a different service and prompt later by running the `dexor --new`. + +## Step 4: Enter Your API Key + +If the API key for the chosen AI service is not already set in your environment configuration, you will be prompted to enter it. + +1. **Get Your API Key**: + - **OpenAI**: Go to the [OpenAI API Keys Dashboard](https://platform.openai.com/api-keys). + - **Claude**: Go to the [Claude API Keys Dashboard](https://claude.com/api-keys). + +2. **Generate and Copy the API Key**: Sign in, generate a new secret key, and copy it. + +3. **Enter the API Key**: Paste the copied API key when prompted. The key will be added to your environment configuration file. + +## Step 5: Customize the Prompt + +1. **Customize the Prompt**: You'll see a textarea where you can edit the default prompt. Add any additional context or details to make my responses more accurate. + +### Default Prompt: + ```md + You are an AI assistant called Dexor, skilled in software development and code generation. + You will receive instructions on a feature request or bug fix. + Your task is to generate the necessary code changes for a web application to implement the feature and write the changes to the files. + Follow the workflow outlined below and use the provided tools to achieve the desired outcome. + + Workflow + Understand the Feature Request + + Thoroughly read the provided feature request or bug fix instructions and ask for clarification if needed. + List Existing Files and Directories to Understand the Codebase and Structure and if any framework is used. + + Use the list_files function to list all files and subdirectories in the specified path to understand the current structure. + Create or Update Necessary Files + + Controller Code: If applicable, generate or modify a controller to handle the feature. If the file already exists, use the read_file function to get the current content, apply the changes, and then use the update_file function. + Route Definitions: Define the necessary routes and ensure they are appended to the existing routes file without replacing existing content. Use read_file and update_file functions as needed. + Views: Generate or modify view files. Before creating new view files, use the list_files function to check the resources directory and understand any existing frontend technologies or design patterns. Use read_file to follow similar code styles and design. Reuse layouts and components where possible. + Model Code: If applicable, generate or modify models. Use read_file and update_file functions if the file exists. + Migrations: Create or modify database migrations. + Tests: Write feature tests to ensure the new functionality works as expected. Do not make changes to .env files. + Instructions to the user: Provide clear instructions on how to test the new feature or bug fix and suggest any additional manual steps needed like runnign a command. + Ensure that any new code is properly formatted and follows best practices. If existing files need to be modified, append the new code appropriately without overwriting the existing content. + Always provide the answers in html format when not using the tools provided. + ``` + + +Once you are satisfied with the prompt, save your changes. + +## Step 6: Finalize the Setup + +Once all the information is entered, I'll create the assistant with your chosen configurations. The assistant will be created at the project level. + +To create another assistant later, you can run the following command and follow the prompts again: + +```sh +dexor --new +``` Follow these steps to effectively set me up for your project. Let's make development smoother together! diff --git a/docs/tools.md b/docs/tools.md index bfa39b3..d7b0b9f 100644 --- a/docs/tools.md +++ b/docs/tools.md @@ -8,6 +8,8 @@ 4. **Write To File**: Writes content to an existing file. +5. **Execute Command**: Executes a terminal command and returns the output. Use this when you need to execute a terminal command like git and other framework commands. + # Custom Tools To add a custom tool, follow these steps: @@ -21,10 +23,15 @@ Sample PHP Code: ```php ``` + ## Register the Custom Tool To use the custom tool in ChatAssistant, follow these steps: @@ -49,13 +57,15 @@ To use the custom tool in ChatAssistant, follow these steps: ```php // Import the custom tool file inside ChatAssistant -use App\Tools\ListFiles; +use App +tools +deiles; class ChatAssistant { // Other code public function __construct() { - $this->client = OpenAI::client(config('droid.api_key')); + $this->client = OpenAI::client(config('dexor.api_key')); // register the tools $this->register([ diff --git a/docs/what-is-droid-dev.md b/docs/what-is-droid-dev.md index b00b2d6..2fc4b31 100644 --- a/docs/what-is-droid-dev.md +++ b/docs/what-is-droid-dev.md @@ -1,3 +1,3 @@ -# What is Droid Dev +# What is Dexor Dev -Droid Dev is a command-line tool designed to help developers make changes to their codebase more efficiently. It scans through files and folders, reads the code, and applies the necessary changes. Whether you need to fix bugs, write test cases, or create new files, Droid Dev adapts to your existing code structure, making software development smoother and more efficient. \ No newline at end of file +Dexor Dev is a command-line tool designed to help developers make changes to their codebase more efficiently. It scans through files and folders, reads the code, and applies the necessary changes. Whether you need to fix bugs, write test cases, or create new files, Dexor Dev adapts to your existing code structure, making software development smoother and more efficient. \ No newline at end of file diff --git a/docs/who-am-i.md b/docs/who-am-i.md index ce2ccdc..bc49ec9 100644 --- a/docs/who-am-i.md +++ b/docs/who-am-i.md @@ -1,11 +1,11 @@ # Who am I? 🤖 -As your trusty Droid Dev, I am designed to help you, a human developer, make changes to your codebase more efficiently. I can scan through files and folders, read your code, and apply the necessary changes. Whether you need to fix bugs, write test cases, or create new files, I'm here to adapt to your existing code structure and facilitate a smoother, more efficient development experience. +As your trusty Dexor Dev, I am designed to help you, a human developer, make changes to your codebase more efficiently. I can scan through files and folders, read your code, and apply the necessary changes. Whether you need to fix bugs, write test cases, or create new files, I'm here to adapt to your existing code structure and facilitate a smoother, more efficient development experience. ## Introduction Video For a quick introduction, watch the video below: - + diff --git a/droid_config b/droid_config deleted file mode 100644 index 7b32c3b..0000000 --- a/droid_config +++ /dev/null @@ -1,4 +0,0 @@ -DROID_API_KEY= -DROID_AI_SERVICE=openai -DROID_MODEL='gpt-4o' -DROID_ASSISTANT_ID= diff --git a/package-lock.json b/package-lock.json index 0c304cc..68471b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "droid", + "name": "dexor", "lockfileVersion": 3, "requires": true, "packages": { @@ -277,9 +277,9 @@ "node": ">=12" } }, - "node_modules/@esbuild/android-arm": { + "node_modules/@esbuild/andexor-arm": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/andexor-arm/-/andexor-arm-0.21.5.tgz", "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" @@ -287,15 +287,15 @@ "dev": true, "optional": true, "os": [ - "android" + "andexor" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-arm64": { + "node_modules/@esbuild/andexor-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/andexor-arm64/-/andexor-arm64-0.21.5.tgz", "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" @@ -303,15 +303,15 @@ "dev": true, "optional": true, "os": [ - "android" + "andexor" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-x64": { + "node_modules/@esbuild/andexor-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/andexor-x64/-/andexor-x64-0.21.5.tgz", "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" @@ -319,7 +319,7 @@ "dev": true, "optional": true, "os": [ - "android" + "andexor" ], "engines": { "node": ">=12" @@ -635,9 +635,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "node_modules/@rollup/rollup-android-arm-eabi": { + "node_modules/@rollup/rollup-andexor-arm-eabi": { "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-andexor-arm-eabi/-/rollup-andexor-arm-eabi-4.18.0.tgz", "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", "cpu": [ "arm" @@ -645,12 +645,12 @@ "dev": true, "optional": true, "os": [ - "android" + "andexor" ] }, - "node_modules/@rollup/rollup-android-arm64": { + "node_modules/@rollup/rollup-andexor-arm64": { "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "resolved": "https://registry.npmjs.org/@rollup/rollup-andexor-arm64/-/rollup-andexor-arm64-4.18.0.tgz", "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", "cpu": [ "arm64" @@ -658,7 +658,7 @@ "dev": true, "optional": true, "os": [ - "android" + "andexor" ] }, "node_modules/@rollup/rollup-darwin-arm64": { @@ -1297,9 +1297,9 @@ }, "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", + "@esbuild/andexor-arm": "0.21.5", + "@esbuild/andexor-arm64": "0.21.5", + "@esbuild/andexor-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", @@ -1485,8 +1485,8 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.0", - "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-andexor-arm-eabi": "4.18.0", + "@rollup/rollup-andexor-arm64": "4.18.0", "@rollup/rollup-darwin-arm64": "4.18.0", "@rollup/rollup-darwin-x64": "4.18.0", "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", diff --git a/tests/Feature/InspireCommandTest.php b/tests/Feature/InspireCommandTest.php deleted file mode 100755 index 57642b2..0000000 --- a/tests/Feature/InspireCommandTest.php +++ /dev/null @@ -1,5 +0,0 @@ -artisan('inspire')->assertExitCode(0); -}); diff --git a/yarn.lock b/yarn.lock index db38878..2e9b277 100644 --- a/yarn.lock +++ b/yarn.lock @@ -425,9 +425,9 @@ esbuild@^0.21.3: integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" + "@esbuild/andexor-arm" "0.21.5" + "@esbuild/andexor-arm64" "0.21.5" + "@esbuild/andexor-x64" "0.21.5" "@esbuild/darwin-arm64" "0.21.5" "@esbuild/darwin-x64" "0.21.5" "@esbuild/freebsd-arm64" "0.21.5" @@ -538,8 +538,8 @@ rollup@^4.13.0: dependencies: "@types/estree" "1.0.5" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.18.0" - "@rollup/rollup-android-arm64" "4.18.0" + "@rollup/rollup-andexor-arm-eabi" "4.18.0" + "@rollup/rollup-andexor-arm64" "4.18.0" "@rollup/rollup-darwin-arm64" "4.18.0" "@rollup/rollup-darwin-x64" "4.18.0" "@rollup/rollup-linux-arm-gnueabihf" "4.18.0"