diff --git a/autoload.php b/autoload.php index cd2e749..0396fab 100644 --- a/autoload.php +++ b/autoload.php @@ -1,21 +1,27 @@ =7.2", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0", - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "http-interop/http-factory-tests": "^0.9", - "php-http/message-factory": "^1.0", - "php-http/psr7-integration-tests": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", - "symfony/error-handler": "^4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, - "autoload": { - "psr-4": { - "Nyholm\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" - }, - { - "name": "Martijn van der Ven", - "email": "martijn@vanderven.se" - } - ], - "description": "A fast PHP7 implementation of PSR-7", - "homepage": "https://tnyholm.se", - "keywords": [ - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.2" - }, - "funding": [ - { - "url": "https://github.com/Zegnat", - "type": "github" - }, - { - "url": "https://github.com/nyholm", - "type": "github" - } - ], - "time": "2024-09-09T07:06:30+00:00" - }, - { - "name": "openai-php/client", - "version": "v0.17.1", - "source": { - "type": "git", - "url": "https://github.com/openai-php/client.git", - "reference": "f7d3150159a7b840fe144568bede1c072f768343" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/openai-php/client/zipball/f7d3150159a7b840fe144568bede1c072f768343", - "reference": "f7d3150159a7b840fe144568bede1c072f768343", - "shasum": "" - }, - "require": { - "php": "^8.2.0", - "php-http/discovery": "^1.20.0", - "php-http/multipart-stream-builder": "^1.4.2", - "psr/http-client": "^1.0.3", - "psr/http-client-implementation": "^1.0.1", - "psr/http-factory-implementation": "*", - "psr/http-message": "^1.1.0|^2.0.0" - }, - "require-dev": { - "guzzlehttp/guzzle": "^7.9.3", - "guzzlehttp/psr7": "^2.7.1", - "laravel/pint": "^1.24.0", - "mockery/mockery": "^1.6.12", - "nunomaduro/collision": "^8.8.0", - "pestphp/pest": "^3.8.2|^4.0.0", - "pestphp/pest-plugin-arch": "^3.1.1|^4.0.0", - "pestphp/pest-plugin-type-coverage": "^3.5.1|^4.0.0", - "phpstan/phpstan": "^1.12.25", - "symfony/var-dumper": "^7.2.6" - }, - "type": "library", - "autoload": { - "files": [ - "src/OpenAI.php" - ], - "psr-4": { - "OpenAI\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - }, - { - "name": "Sandro Gehri" - } - ], - "description": "OpenAI PHP is a supercharged PHP API client that allows you to interact with the Open AI API", - "keywords": [ - "GPT-3", - "api", - "client", - "codex", - "dall-e", - "language", - "natural", - "openai", - "php", - "processing", - "sdk" - ], - "support": { - "issues": "https://github.com/openai-php/client/issues", - "source": "https://github.com/openai-php/client/tree/v0.17.1" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/gehrisandro", - "type": "github" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - } - ], - "time": "2025-10-09T10:35:54+00:00" - }, - { - "name": "php-http/discovery", - "version": "1.20.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/discovery.git", - "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", - "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "nyholm/psr7": "<1.0", - "zendframework/zend-diactoros": "*" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "*", - "psr/http-factory-implementation": "*", - "psr/http-message-implementation": "*" - }, - "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "graham-campbell/phpspec-skip-example-extension": "^5.0", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "sebastian/comparator": "^3.0.5 || ^4.0.8", - "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" - }, - "type": "composer-plugin", - "extra": { - "class": "Http\\Discovery\\Composer\\Plugin", - "plugin-optional": true - }, - "autoload": { - "psr-4": { - "Http\\Discovery\\": "src/" - }, - "exclude-from-classmap": [ - "src/Composer/Plugin.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", - "homepage": "http://php-http.org", - "keywords": [ - "adapter", - "client", - "discovery", - "factory", - "http", - "message", - "psr17", - "psr7" - ], - "support": { - "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.20.0" - }, - "time": "2024-10-02T11:20:13+00:00" - }, - { - "name": "php-http/multipart-stream-builder", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/php-http/multipart-stream-builder.git", - "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/10086e6de6f53489cca5ecc45b6f468604d3460e", - "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e", - "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.4.2" - }, - "time": "2024-09-04T13:22:54+00:00" - }, - { - "name": "psr/container", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" - }, - "time": "2021-11-05T16:47:00+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, - { - "name": "psr/http-message", - "version": "2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" - }, - "time": "2023-04-04T09:54:51+00:00" - }, - { - "name": "psr/log", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" - }, - "time": "2024-09-11T13:17:53+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.6.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-25T14:21:43+00:00" - }, - { - "name": "symfony/http-client", - "version": "v7.3.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "4b62871a01c49457cf2a8e560af7ee8a94b87a62" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/4b62871a01c49457cf2a8e560af7ee8a94b87a62", - "reference": "4b62871a01c49457cf2a8e560af7ee8a94b87a62", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "~3.4.4|^3.5.2", - "symfony/polyfill-php83": "^1.29", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "amphp/amp": "<2.5", - "amphp/socket": "<1.1", - "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.4" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "3.0" - }, - "require-dev": { - "amphp/http-client": "^4.2.1|^5.0", - "amphp/http-tunnel": "^1.0|^2.0", - "guzzlehttp/promises": "^1.4|^2.0", - "nyholm/psr7": "^1.0", - "php-http/httplug": "^1.0|^2.0", - "psr/http-client": "^1.0", - "symfony/amphp-http-client-meta": "^1.0|^2.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", - "homepage": "https://symfony.com", - "keywords": [ - "http" - ], - "support": { - "source": "https://github.com/symfony/http-client/tree/v7.3.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-09-11T10:12:26+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v3.6.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "75d7043853a42837e68111812f4d964b01e5101c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", - "reference": "75d7043853a42837e68111812f4d964b01e5101c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-04-29T11:18:49+00:00" - }, - { - "name": "symfony/polyfill-php83", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-07-08T02:45:35+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v3.6.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-04-25T09:37:31+00:00" - } - ], + "content-hash": "687b3e6b748b881211f844a30bd83281", + "packages": [], "packages-dev": [ { "name": "brianium/paratest", @@ -1649,32 +673,113 @@ "symfony/console": "^7.3.4" }, "require-dev": { - "illuminate/console": "^11.46.1", - "laravel/pint": "^1.25.1", - "mockery/mockery": "^1.6.12", - "pestphp/pest": "^2.36.0 || ^3.8.4", - "phpstan/phpstan": "^1.12.32", - "phpstan/phpstan-strict-rules": "^1.6.2", - "symfony/var-dumper": "^7.3.4", - "thecodingmachine/phpstan-strict-rules": "^1.0.0" + "illuminate/console": "^11.46.1", + "laravel/pint": "^1.25.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.4", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.3.4", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.2" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2025-10-18T11:10:27+00:00" + }, + { + "name": "nyholm/psr7", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Termwind\\Laravel\\TermwindServiceProvider" - ] - }, "branch-alias": { - "dev-2.x": "2.x-dev" + "dev-master": "1.8-dev" } }, "autoload": { - "files": [ - "src/Functions.php" - ], "psr-4": { - "Termwind\\": "src/" + "Nyholm\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1683,38 +788,35 @@ ], "authors": [ { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" } ], - "description": "Its like Tailwind CSS, but for the console.", + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", "keywords": [ - "cli", - "console", - "css", - "package", - "php", - "style" + "psr-17", + "psr-7" ], "support": { - "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.3.2" + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" }, "funding": [ { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", + "url": "https://github.com/Zegnat", "type": "github" }, { - "url": "https://github.com/xiCO2k", + "url": "https://github.com/nyholm", "type": "github" } ], - "time": "2025-10-18T11:10:27+00:00" + "time": "2024-09-09T07:06:30+00:00" }, { "name": "pestphp/pest", @@ -3265,11 +2367,222 @@ "type": "thanks_dev" }, { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-10-03T04:28:03+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "time": "2025-10-03T04:28:03+00:00" + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" }, { "name": "psr/simple-cache", @@ -4384,25 +3697,263 @@ "symfony/process": "<6.4" }, "provide": { - "psr/log-implementation": "1.0|2.0|3.0" + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-22T15:31:00+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.3.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/http-client", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "4b62871a01c49457cf2a8e560af7ee8a94b87a62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/4b62871a01c49457cf2a8e560af7ee8a94b87a62", + "reference": "4b62871a01c49457cf2a8e560af7ee8a94b87a62", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", "symfony/dependency-injection": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", "symfony/messenger": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Console\\": "" + "Symfony\\Component\\HttpClient\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4414,24 +3965,21 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Eases the creation of beautiful and testable command line interfaces", + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "keywords": [ - "cli", - "command-line", - "console", - "terminal" + "http" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.4" + "source": "https://github.com/symfony/http-client/tree/v7.3.4" }, "funding": [ { @@ -4451,35 +3999,41 @@ "type": "tidelift" } ], - "time": "2025-09-22T15:31:00+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { - "name": "symfony/finder", - "version": "v7.3.2", + "name": "symfony/http-client-contracts", + "version": "v3.6.0", "source": { "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "75d7043853a42837e68111812f4d964b01e5101c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", - "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", "shasum": "" }, "require": { - "php": ">=8.2" - }, - "require-dev": { - "symfony/filesystem": "^6.4|^7.0" + "php": ">=8.1" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, "autoload": { "psr-4": { - "Symfony\\Component\\Finder\\": "" + "Symfony\\Contracts\\HttpClient\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4488,18 +4042,26 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Finds files and directories via an intuitive fluent interface", + "description": "Generic abstractions related to HTTP clients", "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], "support": { - "source": "https://github.com/symfony/finder/tree/v7.3.2" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" }, "funding": [ { @@ -4510,16 +4072,12 @@ "url": "https://github.com/fabpot", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-07-15T13:41:35+00:00" + "time": "2025-04-29T11:18:49+00:00" }, { "name": "symfony/polyfill-ctype", @@ -4856,6 +4414,86 @@ ], "time": "2024-12-23T08:48:59+00:00" }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, { "name": "symfony/process", "version": "v7.3.4", @@ -4921,6 +4559,89 @@ ], "time": "2025-09-11T10:12:26+00:00" }, + { + "name": "symfony/service-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-25T09:37:31+00:00" + }, { "name": "symfony/string", "version": "v7.3.4", @@ -5250,9 +4971,9 @@ "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, - "platform": { + "platform": {}, + "platform-dev": { "php": "^8.4" }, - "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/inc/providers.php b/inc/providers.php index 811d97d..a93a5c0 100644 --- a/inc/providers.php +++ b/inc/providers.php @@ -1,14 +1,14 @@ filters; } - public function prompt( mixed $input ): Agent_Runner { - return new Agent_Runner( + public function prompt( mixed $input ): Wp_Agents_System_Agent_Runner { + return new Wp_Agents_System_Agent_Runner( $input, $this ); @@ -60,7 +55,7 @@ public function tools(): array { return $this->tools; } - public function get_memory( string $session_id ): ?Abstract_Memory { + public function get_memory( string $session_id ): ?Wp_Agents_Memory_Abstract { if ( $this->memory ) { $memory_class = $this->memory; diff --git a/lib/memory/class-abstract-memory.php b/lib/memory/class-abstract-memory.php deleted file mode 100644 index 28c8aa0..0000000 --- a/lib/memory/class-abstract-memory.php +++ /dev/null @@ -1,24 +0,0 @@ -agent = $agent; - $this->session_id = $session_id; - } - - abstract public function remember( Message $message ): void; - - abstract public function load( ?int $limit = null ): Message_Stack; - - abstract public function forget_all(): void; -} diff --git a/lib/memory/class-abstract.php b/lib/memory/class-abstract.php new file mode 100644 index 0000000..5305fbf --- /dev/null +++ b/lib/memory/class-abstract.php @@ -0,0 +1,19 @@ +agent = $agent; + $this->session_id = $session_id; + } + + abstract public function remember( Wp_Agents_System_Message $message ): void; + + abstract public function load( ?int $limit = null ): Wp_Agents_System_Message_Stack; + + abstract public function forget_all(): void; +} diff --git a/lib/memory/class-database-memory.php b/lib/memory/class-database.php similarity index 78% rename from lib/memory/class-database-memory.php rename to lib/memory/class-database.php index 5a03fec..773bc75 100644 --- a/lib/memory/class-database-memory.php +++ b/lib/memory/class-database.php @@ -1,12 +1,6 @@ table = $wpdb->prefix . 'agents_memory_messages'; } - public function remember( Message $message ): void { + public function remember( Wp_Agents_System_Message $message ): void { $this->db->insert( $this->table, array( @@ -34,7 +28,7 @@ public function remember( Message $message ): void { ); } - public function load( ?int $limit = null ): Message_Stack { + public function load( ?int $limit = null ): Wp_Agents_System_Message_Stack { $sql = "SELECT author, message, metadata FROM {$this->table} WHERE agent = %s AND session_id = %s @@ -54,7 +48,7 @@ public function load( ?int $limit = null ): Message_Stack { $messages = array_map( function ( $row ) { - return new Memorized_Message( + return new Wp_Agents_System_Memorized_Message( $row['author'], $row['message'], json_decode( $row['metadata'] ?? '[]', true ) @@ -63,7 +57,7 @@ function ( $row ) { $results ); - return new Message_Stack( $messages ); + return new Wp_Agents_System_Message_Stack( $messages ); } public function forget_all(): void { diff --git a/lib/providers/class-interface.php b/lib/providers/class-interface.php new file mode 100644 index 0000000..c7583be --- /dev/null +++ b/lib/providers/class-interface.php @@ -0,0 +1,8 @@ +api_key = $api_key; - } - - public function chat( Message_Stack $message_stack, Abstract_Llm_Agent $agent ): void { - $client = \OpenAI::client( $this->api_key ); - $tools = $agent->tools(); - - $message_stack->unshift( new Message( 'system', $agent->instructions() ) ); - - $flatten = function ( Message $message ) { - return array( - 'role' => $message->get_author(), - 'content' => $message->get_message(), - ) + $message->get_metadata(); - }; - - $parameters = array( - 'model' => $agent->get_model(), - 'messages' => $message_stack->map( $flatten ), - 'response_format' => array( 'type' => $agent->json() ? 'json_object' : 'text' ), - ); - - if ( count( $tools ) ) { - $tool_registry = new Tool_Registry( $tools ); - $parameters['tools'] = $tool_registry->definitions(); - } - - $response = $client->chat()->create( $parameters ); - $openai_message = $response->choices[0]->message; - - // phpcs:ignore WordPress.NamingConventions.ValidVariableName - if ( ! empty( $openai_message->toolCalls ) ) { - $tool_calls = array(); - $tool_messages = array(); - - // phpcs:ignore WordPress.NamingConventions.ValidVariableName - foreach ( $openai_message->toolCalls as $call ) { - $function = $call->function; - $args = json_decode( $function->arguments ?? '{}', true ); - - if ( ! is_array( $args ) ) { - $args = array(); - } - $result = $tool_registry->execute( $function->name, $args ); - - $tool_calls[] = array( - 'id' => $call->id, - 'type' => $call->type ?? 'function', - 'function' => array( - 'name' => $call->function->name, - 'arguments' => $call->function->arguments, - ), - ); - - $tool_messages[] = new Message( - 'tool', - wp_json_encode( $result ), - array( - 'tool_call_id' => $call->id, - ) - ); - } - - $message_stack->add( - new Message( - $openai_message->role, - $openai_message->content, - array( - 'tool_calls' => $tool_calls, - ) - ) - ); - $message_stack->add( $tool_messages ); - - $follow = $client->chat()->create( - array( - 'model' => $agent->get_model(), - 'messages' => $message_stack->map( $flatten ), - 'response_format' => array( 'type' => $agent->json() ? 'json_object' : 'text' ), - ) - ); - - $openai_message = $follow->choices[0]->message; - $message_stack->add( - new Message( - $openai_message->role, - $openai_message->content - ) - ); - } else { - $message_stack->add( - new Message( - $openai_message->role, - $openai_message->content, - ) - ); - } - } -} diff --git a/lib/providers/class-open-ai.php b/lib/providers/class-open-ai.php new file mode 100644 index 0000000..afdb1c7 --- /dev/null +++ b/lib/providers/class-open-ai.php @@ -0,0 +1,148 @@ +api_key = $api_key; + } + + public function chat( Wp_Agents_System_Message_Stack $message_stack, Wp_Agents_Llm_Abstract $agent ): void { + $tools = $agent->tools(); + + $message_stack->unshift( new Wp_Agents_System_Message( 'developer', $agent->instructions() ) ); + + $body = array( + 'model' => $agent->get_model(), + 'messages' => $message_stack->map( array( $this, 'flatten' ) ), + 'response_format' => array( 'type' => $agent->json() ? 'json_object' : 'text' ), + ); + + $tool_registry = new Wp_Agents_Tools_Registry(); + if ( count( $tools ) ) { + $tool_registry->add( $tools ); + $body['tools'] = $tool_registry->definitions(); + } + + $response = $this->post( 'https://api.openai.com/v1/chat/completions', $body ); + if ( is_wp_error( $response ) ) { + $message_stack->add( new Wp_Agents_System_Message( 'assistant', 'Error: request failed' ) ); + + return; + } + + $openai_message = $response['choices'][0]['message']; + + // phpcs:ignore WordPress.NamingConventions.ValidVariableName + if ( ! empty( $openai_message['tool_calls'] ) ) { + $tool_calls = array(); + $tool_messages = array(); + + // phpcs:ignore WordPress.NamingConventions.ValidVariableName + foreach ( $openai_message['tool_calls'] as $call ) { + $args = json_decode( $call['function']['arguments'] ?? '{}', true ); + if ( ! is_array( $args ) ) { + $args = array(); + } + + if ( ! is_array( $args ) ) { + $args = array(); + } + $result = $tool_registry->execute( $call['function']['name'], $args ); + + $tool_calls[] = array( + 'id' => $call['id'], + 'type' => $call['type'] ?? 'function', + 'function' => array( + 'name' => $call['function']['name'], + 'arguments' => $call['function']['arguments'], + ), + ); + + $tool_messages[] = new Wp_Agents_System_Message( + 'tool', + wp_json_encode( $result ), + array( + 'tool_call_id' => $call['id'], + ) + ); + } + + $message_stack->add( + new Wp_Agents_System_Message( + $openai_message['role'], + $openai_message['content'], + array( + 'tool_calls' => $tool_calls, + ) + ) + ); + $message_stack->add( $tool_messages ); + + $follow = $this->post( + 'https://api.openai.com/v1/chat/completions', + array( + 'model' => $agent->get_model(), + 'messages' => $message_stack->map( array( $this, 'flatten' ) ), + 'response_format' => array( 'type' => $agent->json() ? 'json_object' : 'text' ), + ) + ); + if ( is_wp_error( $response ) ) { + $message_stack->add( new Wp_Agents_System_Message( 'assistant', 'Error: request failed' ) ); + + return; + } + + $openai_message = $follow['choices'][0]['message']; + $message_stack->add( + new Wp_Agents_System_Message( + $openai_message['role'], + $openai_message['content'] + ) + ); + } else { + $message_stack->add( + new Wp_Agents_System_Message( + $openai_message['role'], + $openai_message['content'], + ) + ); + } + } + + public function memorizable( Wp_Agents_System_Message $message ): bool { + return ! in_array( $message->get_author(), array( 'system', 'developer' ), true ); + } + + public function flatten( Wp_Agents_System_Message $message ): array { + return array( + 'role' => $message->get_author(), + 'content' => $message->get_message(), + ) + $message->get_metadata(); + } + + protected function post( string $url, array $body = array() ): array|WP_Error { + $args = array( + 'headers' => array( + 'Authorization' => 'Bearer ' . $this->api_key, + 'Content-Type' => 'application/json', + ), + 'timeout' => 30, + ); + + if ( ! empty( $body ) ) { + $args['body'] = wp_json_encode( $body ); + } + + $response = wp_remote_post( $url, $args ); + if ( is_wp_error( $response ) ) { + return new WP_Error( + 'wp_agents_openai_invalid_response', + 'Invalid response returned by the OpenAI API.' + ); + } + + return json_decode( wp_remote_retrieve_body( $response ), true ); + } +} diff --git a/lib/providers/class-provider-interface.php b/lib/providers/class-provider-interface.php deleted file mode 100644 index 11033d5..0000000 --- a/lib/providers/class-provider-interface.php +++ /dev/null @@ -1,11 +0,0 @@ -file = "{$dir}/wp-agents.log"; - } - - public function log( $level, $message, array $context = array() ): void { - global $wp_filesystem; - $date = gmdate( 'Y-m-d H:i:s' ); - $msg = $this->interpolate( $message, $context ); - - $line = "[{$date}] {$level}: {$msg}\n"; - $wp_filesystem->put_contents( $this->file, $line, FILE_APPEND | LOCK_EX ); - } - - protected function interpolate( string $message, array $context ): string { - $replace = array(); - foreach ( $context as $key => $val ) { - if ( is_array( $val ) || is_object( $val ) ) { - $val = wp_json_encode( $val, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT ); - } - $replace[ '{' . $key . '}' ] = $val; - } - - return strtr( $message, $replace ); - } -} diff --git a/lib/services/class-provider-manager.php b/lib/services/class-provider-manager.php index c8b6ff3..9199193 100644 --- a/lib/services/class-provider-manager.php +++ b/lib/services/class-provider-manager.php @@ -1,21 +1,22 @@ input = $input; $this->agent = $agent; - $this->provider = Provider_Manager::get( $agent->get_provider() ); + $this->provider = Wp_Agents_Services_Provider_Manager::get( $agent->get_provider() ); } public function with_session( ?string $session_id ): static { @@ -28,15 +22,15 @@ public function with_session( ?string $session_id ): static { return $this; } - public function chat(): Message { + public function chat(): Wp_Agents_System_Message { $memory = $this->session_id ? $this->agent->get_memory( $this->session_id ) : null; - $message_stack = $memory ? $memory->load() : new Message_Stack(); - $message_stack->add( new Message( 'user', $this->input ) ); + $message_stack = $memory ? $memory->load() : new Wp_Agents_System_Message_Stack(); + $message_stack->add( new Wp_Agents_System_Message( 'user', $this->input ) ); $this->provider->chat( $message_stack, $this->agent ); foreach ( $message_stack->all() as $message ) { - if ( ! $message->memorized() && 'system' !== $message->get_author() ) { + if ( ! $message->memorized() && $this->provider->memorizable( $message ) ) { $memory?->remember( $message ); } } diff --git a/lib/system/class-memorized-message.php b/lib/system/class-memorized-message.php index e3f60a2..31fa95d 100644 --- a/lib/system/class-memorized-message.php +++ b/lib/system/class-memorized-message.php @@ -1,8 +1,6 @@ messages ); } - public function first(): ?Message { + public function first(): ?Wp_Agents_System_Message { return $this->messages[0] ?? null; } - public function last(): ?Message { + public function last(): ?Wp_Agents_System_Message { $count = count( $this->messages ); return $count ? $this->messages[ $count - 1 ] : null; } - public function unshift( Message $message ) { + public function unshift( Wp_Agents_System_Message $message ) { array_unshift( $this->messages, $message ); } - public function add( array|Message $messages ) { - $messages = $messages instanceof Message ? array( $messages ) : $messages; + public function add( array|Wp_Agents_System_Message $messages ) { + $messages = $messages instanceof Wp_Agents_System_Message ? array( $messages ) : $messages; foreach ( $messages as $message ) { - if ( $message instanceof Message ) { + if ( $message instanceof Wp_Agents_System_Message ) { $this->messages[] = $message; } } diff --git a/lib/system/class-message.php b/lib/system/class-message.php index 82afcfb..95db680 100644 --- a/lib/system/class-message.php +++ b/lib/system/class-message.php @@ -1,8 +1,6 @@ message; + return $this->message ?? ''; } public function memorized(): bool { diff --git a/lib/system/class-rest.php b/lib/system/class-rest.php index 7b9b395..9866264 100644 --- a/lib/system/class-rest.php +++ b/lib/system/class-rest.php @@ -1,10 +1,6 @@ get_param( 'agent' ) ); + $agent = Wp_Agents_Services_Agent_Manager::get( $request->get_param( 'agent' ) ); $message = $request->get_param( 'message' ); $response = $agent diff --git a/lib/system/class-schema.php b/lib/system/class-schema.php index 661c68f..50e3914 100644 --- a/lib/system/class-schema.php +++ b/lib/system/class-schema.php @@ -1,8 +1,6 @@ add( $tool_classes ); + } + + public function add( array|string $tool_classes ): void { + $tool_classes = is_string( $tool_classes ) ? array( $tool_classes ) : $tool_classes; + foreach ( $tool_classes as $tool_class ) { if ( ! class_exists( $tool_class ) ) { continue; @@ -36,7 +38,10 @@ public function definitions(): array { public function execute( string $name, array $arguments = array() ): mixed { if ( ! isset( $this->tools[ $name ] ) ) { - throw new Tool_Not_Found_Exception(); + return new WP_Error( + 'wp_agents_tool_not_found', + "The tool with the name {$name} was not found." + ); } return $this->tools[ $name ]->execute( $arguments ); diff --git a/logs/.gitkeep b/logs/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/phpcs.xml b/phpcs.xml new file mode 100644 index 0000000..da5e2a3 --- /dev/null +++ b/phpcs.xml @@ -0,0 +1,16 @@ + + + WordPress coding standards for wp-agents + lib + wp-agents.php + + + + + + + + + + vendor/* + diff --git a/phpcs.xml.dist b/phpcs.xml.dist deleted file mode 100644 index 9068663..0000000 --- a/phpcs.xml.dist +++ /dev/null @@ -1,14 +0,0 @@ - - - WordPress coding standards for wp-agents - lib - wp-agents.php - - - - - - - - vendor/* - diff --git a/wp-agents.php b/wp-agents.php index 1255361..0c34038 100644 --- a/wp-agents.php +++ b/wp-agents.php @@ -13,67 +13,50 @@ * Domain Path: /languages */ -if ( file_exists( __DIR__ . '/vendor/autoload.php' ) ) { - require_once __DIR__ . '/vendor/autoload.php'; +require_once 'autoload.php'; - if ( ! function_exists( 'wp_agents_install' ) ) { - - function wp_agents_install() { - $schema = new \Wp_Agents\System\Schema(); - $schema->install(); - } - - register_activation_hook( __FILE__, 'wp_agents_install' ); +if ( ! function_exists( 'wp_agents_install' ) ) { + function wp_agents_install(): void { + $schema = new Wp_Agents_System_Schema(); + $schema->install(); } - add_action( - 'plugins_loaded', - function () { - if ( ! function_exists( 'wp_agents_logger' ) ) { - - function wp_agents_logger() { - static $logger; - - if ( ! isset( $logger ) ) { - $logger = new \Wp_Agents\Services\Logger( __DIR__ ); - } + register_activation_hook( __FILE__, 'wp_agents_install' ); - return $logger; - } - - } - - if ( ! function_exists( 'wp_agents_register' ) ) { - - function wp_agents_register( string $name, string $agent_class ) { - \Wp_Agents\Services\Agent_Manager::register( $name, $agent_class ); - } +} - } +if ( ! function_exists( 'wp_agents_register' ) ) { - if ( ! function_exists( 'wp_agents_register_provider' ) ) { + function wp_agents_register( string $name, string $agent_class ): void { + Wp_Agents_Services_Agent_Manager::register( $name, $agent_class ); + } - function wp_agents_register_provider( string $name, callable $callback ) { - \Wp_Agents\Services\Provider_Manager::register( $name, $callback ); - } +} - require_once __DIR__ . '/inc/providers.php'; +if ( ! function_exists( 'wp_agents_register_provider' ) ) { - } + function wp_agents_register_provider( string $name, callable $callback ): void { + Wp_Agents_Services_Provider_Manager::register( $name, $callback ); + } - if ( ! function_exists( 'wp_agents_get' ) ) { + require_once __DIR__ . '/inc/providers.php'; - function wp_agents_get( string $name ) { - return \Wp_Agents\Services\Agent_Manager::get( $name ); - } +} - } +if ( ! function_exists( 'wp_agents_get' ) ) { - add_action( 'init', array( \Wp_Agents\Services\Provider_Manager::class, 'boot' ) ); - add_action( 'init', array( \Wp_Agents\Services\Agent_Manager::class, 'boot' ) ); - add_action( 'rest_api_init', array( \Wp_Agents\System\Rest::class, 'register' ) ); - } - ); + function wp_agents_get( string $name ): Wp_Agents_Llm_Abstract|WP_Error { + return Wp_Agents_Services_Agent_Manager::get( $name ); + } } + +add_action( + 'plugins_loaded', + function () { + add_action( 'init', array( Wp_Agents_Services_Provider_Manager::class, 'boot' ) ); + add_action( 'init', array( Wp_Agents_Services_Agent_Manager::class, 'boot' ) ); + add_action( 'rest_api_init', array( Wp_Agents_System_Rest::class, 'register' ) ); + } +);