feat: introduce core polydock architecture and API clients#185
feat: introduce core polydock architecture and API clients#185dan2k3k4 wants to merge 16 commits into
Conversation
bb15074 to
7410161
Compare
…ecure stdin injection
…rds, and correct host name variable
…esAmazeeAiBackend
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR inlines the core Polydock architecture (engine/app base, interfaces, enums, loggers, clients) into the repository under the App\Polydock\* namespace, updates the application/test code to use the new local namespaces, and adds a DB migration to rewrite stored app class FQCNs.
Changes:
- Migrate imports across the codebase from
FreedomtechHosting/*Polydock/Lagoon packages to in-repoApp\Polydock\*classes. - Add in-repo Lagoon client + SSH wrapper and introduce many app lifecycle traits (create/deploy/claim/remove/upgrade).
- Add a migration to rewrite persisted app class names to the new local namespaces.
Reviewed changes
Copilot reviewed 167 out of 176 changed files in this pull request and generated 14 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/Unit/Services/PolydockAppClassDiscoveryTest.php | Update discovery test imports/expected namespace label. |
| tests/Unit/PolydockEngine/PolydockEngineTest.php | Update engine unit test imports; adjust required-variable tests. |
| tests/Unit/Models/PolydockAppInstanceTest.php | Update enum/app imports to local Polydock namespace. |
| tests/Feature/Security/OneTimeLoginRouteSecurityTest.php | Update enum import and stored app_type FQCN string. |
| tests/Feature/Jobs/StaleLifecycleJobTest.php | Update enum/app imports to local Polydock namespace. |
| tests/Feature/GeneralApplicationTest.php | Update imports to local Polydock apps/enums. |
| tests/Feature/Controllers/FormControllerTest.php | Convert tests to PHPUnit #[Test] attributes. |
| tests/Feature/Controllers/Api/RegisterControllerTest.php | Convert tests to PHPUnit #[Test] attributes. |
| tests/Feature/Console/Commands/TriggerLagoonDeployOnAppInstancesTest.php | Update Lagoon client + enum imports. |
| tests/Feature/Console/Commands/SyncLagoonMetadataTest.php | Update Lagoon client + enum imports. |
| tests/Feature/Console/Commands/RunLagoonCommandOnAppInstancesTest.php | Update Lagoon client + enum imports. |
| tests/Feature/Console/Commands/RemoveEmptyProjectsCommandTest.php | Update Lagoon client + enum imports. |
| tests/Feature/Console/Commands/RemoveAppInstancesTest.php | Update enum import. |
| tests/Feature/Console/Commands/MarkStuckInstancesFailedCommandTest.php | Update enum import. |
| tests/Feature/Console/Commands/BanEmailsCommandTest.php | Update enum import. |
| tests/Feature/Audit/ModelActivityLogTest.php | Update enum import. |
| tests/Feature/Audit/ApiAuditTest.php | Update enum import. |
| tests/Feature/Api/InstanceHealthApiTest.php | Update enum/app imports. |
| tests/Feature/Api/AuthenticatedApiTest.php | Update enum import and seeded polydock_app_class FQCN string. |
| tests/Doubles/BaseTestPolydockServiceProvider.php | Update service provider interface/logger imports. |
| database/seeders/LocalstackSeeder.php | Update seeded Polydock app import. |
| database/seeders/DatabaseSeeder.php | Update seeded Polydock app imports. |
| database/seeders/AmazeeTrialSeeder.php | Update seeded Polydock AI app import. |
| database/migrations/2026_06_23_205000_migrate_polydock_app_classes.php | New migration to remap persisted app class names. |
| database/migrations/2026_06_13_000001_add_purge_statuses_to_polydock_app_instances_table.php | Update enum import to local namespace. |
| database/migrations/2026_05_27_000001_add_purge_fields_to_polydock_app_instances_table.php | Update enum import to local namespace. |
| database/migrations/2025_03_15_000007_add_new_statuses_to_polydock_app_instances_table.php | Update enum import to local namespace. |
| database/migrations/2025_03_14_000002_create_polydock_app_instances_table.php | Update enum import to local namespace. |
| database/factories/PolydockStoreAppFactory.php | Update factory Polydock AI app import. |
| composer.json | Add spatie/ssh dependency. |
| app/Services/PolydockAppClassDiscovery.php | Switch discovery source to filesystem scan under app/Polydock/Apps. |
| app/Services/LagoonProjectPurgeService.php | Update Lagoon client/logger imports. |
| app/Services/LagoonClientService.php | Update Lagoon client + SSH imports. |
| app/PolydockServiceProviders/PolydockServiceProviderFTLagoon.php | Update Lagoon provider imports to local clients/core interfaces. |
| app/PolydockServiceProviders/PolydockServiceProviderAmazeeAiBackend.php | Update AmazeeAI backend provider imports to local client/core interfaces. |
| app/PolydockEngine/Traits/PolydockEngineFunctionCallerTrait.php | Update enums/exceptions imports to local core. |
| app/PolydockEngine/PolydockLogger.php | Update logger interface import to local core. |
| app/PolydockEngine/Engine.php | Migrate engine to local core types and required-variable validation semantics. |
| app/Polydock/Core/Traits/PolydockAppLoggerTrait.php | New shared logger trait for engine/apps. |
| app/Polydock/Core/Traits/PolydockAppFundamentalsTrait.php | New fundamentals getters/setters trait. |
| app/Polydock/Core/Traits/PolydockAppConfigurationTrait.php | New configuration state trait. |
| app/Polydock/Core/PolydockServiceProviderInterface.php | New local Polydock service provider interface. |
| app/Polydock/Core/PolydockEngineInterface.php | New local engine interface. |
| app/Polydock/Core/PolydockEngineBase.php | New local engine base class. |
| app/Polydock/Core/PolydockAppVariableDefinitionInterface.php | New local variable definition interface. |
| app/Polydock/Core/PolydockAppVariableDefinitionBase.php | New local variable definition base implementation. |
| app/Polydock/Core/PolydockAppValidationException.php | New local app validation exception type. |
| app/Polydock/Core/PolydockAppLoggerInterface.php | New local logger interface. |
| app/Polydock/Core/PolydockAppInstanceStatusFlowException.php | New local status flow exception type. |
| app/Polydock/Core/Loggers/PolydockAppEchoLogger.php | New echo logger implementation. |
| app/Polydock/Core/Loggers/PolydockAppCacheLogger.php | New cache logger implementation. |
| app/Polydock/Core/Exceptions/PolydockEngineValidationException.php | New engine validation exception type. |
| app/Polydock/Core/Exceptions/PolydockEngineProcessPolydockAppInstanceException.php | New engine processing exception type. |
| app/Polydock/Core/Contracts/HasStoreAppFormFields.php | New contract for store-app Filament fields. |
| app/Polydock/Core/Contracts/HasAppInstanceFormFields.php | New contract for instance Filament fields. |
| app/Polydock/Core/Attributes/PolydockAppTitle.php | New attribute for app labels. |
| app/Polydock/Core/Attributes/PolydockAppStoreFields.php | New attribute for store-app schema methods and prefix. |
| app/Polydock/Core/Attributes/PolydockAppInstanceFields.php | New attribute for app-instance schema methods and prefix. |
| app/Polydock/Clients/Lagoon/Ssh.php | New Lagoon SSH wrapper around spatie/ssh. |
| app/Polydock/Clients/Lagoon/LagoonVariableScopeInvalidException.php | New Lagoon client exception type. |
| app/Polydock/Clients/Lagoon/LagoonClientTokenRequiredToInitializeException.php | New Lagoon client exception type. |
| app/Polydock/Clients/Lagoon/LagoonClientPrivateKeyNotFoundException.php | New Lagoon client exception type. |
| app/Polydock/Clients/Lagoon/LagoonClientInitializeRequiredToInteractException.php | New Lagoon client exception type. |
| app/Polydock/Clients/Lagoon/GraphQLResponse.php | New GraphQL response wrapper. |
| app/Polydock/Clients/Lagoon/GraphQLClient.php | New GraphQL HTTP client wrapper. |
| app/Polydock/Clients/Lagoon/Enums/LagoonVariableScope.php | New Lagoon variable-scope enum. |
| app/Polydock/Clients/Lagoon/ClientTraits/OrganizationTrait.php | New Lagoon org operations trait. |
| app/Polydock/Clients/Lagoon/ClientTraits/GroupTrait.php | New Lagoon group operations trait. |
| app/Polydock/Clients/Lagoon/ClientTraits/AuthTrait.php | New Lagoon auth operations trait. |
| app/Polydock/Clients/Lagoon/Client.php | New composed Lagoon client using traits. |
| app/Polydock/Clients/AmazeeAi/Exception/HttpException.php | New HTTP exception type for AmazeeAI client. |
| app/Polydock/Apps/PrivateGpt/Traits/UsesAmazeeAiDevmode.php | New devmode override wrapper for AmazeeAI operations. |
| app/Polydock/Apps/PrivateGpt/Traits/Create/PreCreateAppInstanceTrait.php | New PrivateGpt pre-create stage implementation. |
| app/Polydock/Apps/PrivateGpt/Traits/Create/CreateAppInstanceTrait.php | New PrivateGpt create stage implementation. |
| app/Polydock/Apps/PrivateGpt/Interfaces/LoggerInterface.php | New PrivateGpt logger abstraction. |
| app/Polydock/Apps/PrivateGpt/Interfaces/LagoonOperationsInterface.php | New PrivateGpt Lagoon ops abstraction. |
| app/Polydock/Apps/PrivateGpt/Interfaces/LagoonClientProviderInterface.php | New PrivateGpt provider interface for Lagoon client. |
| app/Polydock/Apps/PrivateGpt/Interfaces/AmazeeAiOperationsInterface.php | New PrivateGpt AmazeeAI ops abstraction. |
| app/Polydock/Apps/PrivateGpt/Generated/Routemap/Routemapper.php | New generated routing helper. |
| app/Polydock/Apps/PrivateGpt/Generated/Dto/VdbKeysResponse.php | New generated DTO. |
| app/Polydock/Apps/PrivateGpt/Generated/Dto/TeamResponse.php | New generated DTO. |
| app/Polydock/Apps/PrivateGpt/Generated/Dto/RegionResponse.php | New generated DTO. |
| app/Polydock/Apps/PrivateGpt/Generated/Dto/LlmKeysResponse.php | New generated DTO. |
| app/Polydock/Apps/PrivateGpt/Generated/Dto/HealthResponse.php | New generated DTO. |
| app/Polydock/Apps/PrivateGpt/Generated/Dto/APIToken.php | New generated DTO. |
| app/Polydock/Apps/PrivateGpt/Generated/Dto/AdministratorResponse.php | New generated DTO. |
| app/Polydock/Apps/PrivateGpt/Exceptions/AmazeeAiValidationException.php | New mapping/validation exception. |
| app/Polydock/Apps/PrivateGpt/Exceptions/AmazeeAiClientException.php | New base exception type. |
| app/Polydock/Apps/Generic/Traits/Upgrade/UpgradeAppInstanceTrait.php | New generic upgrade stage logic. |
| app/Polydock/Apps/Generic/Traits/Upgrade/PreUpgradeAppInstanceTrait.php | New generic pre-upgrade stage logic. |
| app/Polydock/Apps/Generic/Traits/Upgrade/PostUpgradeAppInstanceTrait.php | New generic post-upgrade stage logic. |
| app/Polydock/Apps/Generic/Traits/Upgrade/PollUpgradeProgressAppInstanceTrait.php | New generic upgrade polling stub. |
| app/Polydock/Apps/Generic/Traits/Remove/RemoveAppInstanceTrait.php | New generic remove stage logic. |
| app/Polydock/Apps/Generic/Traits/Remove/PreRemoveAppInstanceTrait.php | New generic pre-remove stage logic. |
| app/Polydock/Apps/Generic/Traits/Remove/PostRemoveAppInstanceTrait.php | New generic post-remove stage logic. |
| app/Polydock/Apps/Generic/Traits/Health/PollHealthProgressAppInstanceTrait.php | New generic health polling stub. |
| app/Polydock/Apps/Generic/Traits/Deploy/PreDeployAppInstanceTrait.php | New generic pre-deploy stage logic. |
| app/Polydock/Apps/Generic/Traits/Deploy/PostDeployAppInstanceTrait.php | New generic post-deploy stage logic. |
| app/Polydock/Apps/Generic/Traits/Deploy/PollDeployProgressAppInstanceTrait.php | New generic deploy polling implementation. |
| app/Polydock/Apps/Generic/Traits/Deploy/DeployAppInstanceTrait.php | New generic deploy stage logic. |
| app/Polydock/Apps/Generic/Traits/Create/PreCreateAppInstanceTrait.php | New generic pre-create stage logic. |
| app/Polydock/Apps/Generic/Traits/Create/CreateAppInstanceTrait.php | New generic create stage logic. |
| app/Polydock/Apps/Generic/Traits/Claim/ClaimAppInstanceTrait.php | New generic claim stage logic and route fallback. |
| app/Polydock/Apps/Generic/PolydockAiApp.php | New generic AI app base. |
| app/Polydock/Apps/DependencyTrack/Traits/Create/PreCreateAppInstanceTrait.php | New DependencyTrack pre-create stage logic. |
| app/Polydock/Apps/DependencyTrack/Traits/Create/PostCreateAppInstanceTrait.php | New DependencyTrack post-create stage logic. |
| app/Polydock/Apps/DependencyTrack/PolydockDependencyTrackApp.php | New DependencyTrack app implementation. |
| app/Polydock/Apps/AmazeeClaw/Traits/Create/PreCreateAppInstanceTrait.php | New AmazeeClaw pre-create stage logic. |
| app/Polydock/Apps/AmazeeClaw/Traits/Create/PostCreateAppInstanceTrait.php | New AmazeeClaw post-create stage logic. |
| app/Polydock/Apps/AmazeeClaw/Traits/Claim/ClaimAppInstanceTrait.php | New AmazeeClaw claim stage logic. |
| app/Polydock/Apps/AmazeeClaw/PolydockAmazeeClawAiApp.php | New AmazeeClaw app implementation. |
| app/Models/UserGroup.php | Update enum import. |
| app/Models/PolydockStoreApp.php | Update enum import. |
| app/Models/PolydockAppInstance.php | Update core Polydock imports to local namespace. |
| app/Listeners/ProcessPolydockAppInstanceStatusChange.php | Update enum import. |
| app/Jobs/ProcessUserRemoteRegistration.php | Update attribute import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Trial/ProcessTrialCompleteStageRemovalJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Remove/RemoveJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Remove/PreRemoveJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Remove/PostRemoveJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Purge/ProcessProjectPurgeJob.php | Update enums/exceptions imports. |
| app/Jobs/ProcessPolydockAppInstanceJobs/ProgressToNextStageJob.php | Update enums/exceptions imports. |
| app/Jobs/ProcessPolydockAppInstanceJobs/New/ProcessNewJob.php | Update enums/exceptions imports. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Deploy/PreDeployJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Deploy/PostDeployJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Deploy/PollDeploymentJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Deploy/DeployJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Create/PreCreateJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Create/PostCreateJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Create/CreateJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/Claim/ClaimJob.php | Update enum import. |
| app/Jobs/ProcessPolydockAppInstanceJobs/BaseJob.php | Update enums/exceptions imports. |
| app/Jobs/EnsureUnallocatedAppInstancesJob.php | Update enum import. |
| app/Http/Controllers/Api/PolydockInstanceHealthController.php | Update enum import. |
| app/Http/Controllers/Api/AuthenticatedApiController.php | Update enum import. |
| app/Filament/Admin/Resources/UserGroupResource/RelationManagers/AppInstancesRelationManager.php | Update enum import. |
| app/Filament/Admin/Resources/PolydockStoreAppResource/RelationManagers/PreWarmInstancesRelationManager.php | Update enum import. |
| app/Filament/Admin/Resources/PolydockStoreAppResource/Pages/EditPolydockStoreApp.php | Update store-fields attribute import. |
| app/Filament/Admin/Resources/PolydockStoreAppResource/Pages/CreatePolydockStoreApp.php | Update store-fields attribute import. |
| app/Filament/Admin/Resources/PolydockStoreAppResource.php | Update enum import. |
| app/Filament/Admin/Resources/PolydockAppInstanceResource/Pages/ViewPolydockAppInstance.php | Update enum import. |
| app/Filament/Admin/Resources/PolydockAppInstanceResource/Pages/ListPolydockAppInstances.php | Update enum import. |
| app/Filament/Admin/Resources/PolydockAppInstanceResource/Pages/CreatePolydockAppInstance.php | Update instance-fields attribute import. |
| app/Filament/Admin/Resources/PolydockAppInstanceResource.php | Update instance-fields attribute + enum imports. |
| app/Events/PolydockAppInstanceStatusChanged.php | Update enum import. |
| app/Console/Commands/TriggerLagoonDeployOnAppInstances.php | Update Lagoon client import. |
| app/Console/Commands/TriggerLagoonDeployOnAppInstance.php | Update Lagoon client import. |
| app/Console/Commands/SyncLagoonMetadata.php | Update enum import. |
| app/Console/Commands/RunLagoonCommandOnAppInstances.php | Update Lagoon client import. |
| app/Console/Commands/RemoveUnclaimedAppInstancesCommand.php | Update enum import. |
| app/Console/Commands/RemoveEmptyProjectsCommand.php | Update enums/logger imports. |
| app/Console/Commands/RemoveAppInstances.php | Update enum import. |
| app/Console/Commands/PollDeploymentStatusCommand.php | Update enum import. |
| app/Console/Commands/MarkStuckInstancesFailedCommand.php | Update enum import. |
| app/Console/Commands/ListUnclaimedAppInstancesCommand.php | Update enum import. |
| app/Console/Commands/DispatchTrialCompleteStageRemovalJobsCommand.php | Update enum import. |
| app/Console/Commands/DispatchProjectPurgeJobsCommand.php | Update enum import. |
| app/Console/Commands/BanEmailsCommand.php | Update enum import. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| public function validateAppInstanceHasAllRequiredVariables(PolydockAppInstanceInterface $appInstance): bool | ||
| { | ||
| foreach ($appInstance->getApp()->getVariableDefinitions() as $variableDefinition) { | ||
| if ($appInstance->getKeyValue($variableDefinition->getName()) === null) { | ||
| throw new PolydockEngineValidationException( |
3d558cc to
8286cfc
Compare
8286cfc to
d8bd130
Compare
| $data = json_decode($response->getBody()->getContents(), true); | ||
|
|
||
| return $data['message']; |
There was a problem hiding this comment.
deleteTeam accesses $data['message'] without guarding against a null or missing key. When the API returns an empty body (e.g. a 204 No Content) or invalid JSON, json_decode() returns null, making $data['message'] evaluate to null. In PHP 8.0+ this causes an unhandled TypeError ("must be of type string, null returned") that escapes the catch block entirely, since only GuzzleException|RequestException is caught there.
| $data = json_decode($response->getBody()->getContents(), true); | |
| return $data['message']; | |
| $data = json_decode($response->getBody()->getContents(), true); | |
| return $data['message'] ?? ''; |
Greptile Summary
This PR internalises the Polydock architecture by moving app classes, core interfaces, and API clients from external packages (
FreedomtechHosting/*,Amazeeio/*) into the application's own namespace, and ships a data migration to repoint existingpolydock_store_appsrecords to the new class names.deleteProjectByName,deployProjectEnvironmentByName, and build-variable interpolation) are fixed by switching to non-interpolated<<<'GQL'heredocs with typed variable maps, and the falsy-value validation bug inPolydockEngineBaseis corrected to use=== null || === ''.PolydockAppClassDiscovery::getClassMap()now scansapp/Polydock/Apps/directly instead of relying on Composer's classmap; Trait files are safely excluded becauseclass_exists()returns false for them, and results are cached in-memory.Http-basedAmazeeAi\Client(used by service providers) and the Guzzle-basedPrivateGpt\Client\AmazeeAiClient(used by the PrivateGPT app);deleteTeamin the Guzzle client has an unguarded$data['message']access that throws aTypeErrorwhen the API returns an empty or non-JSON body.Confidence Score: 4/5
Safe to merge with one small fix: deleteTeam in AmazeeAiClient can throw an unhandled TypeError when the API returns an empty or non-JSON body; everything else looks correct.
The core architecture changes are well-structured and fix several previously-flagged bugs. The one remaining defect is in AmazeeAiClient::deleteTeam, which accesses $data['message'] unconditionally — a DELETE endpoint that responds with 204 No Content would trigger an unhandled TypeError on every call. This path is reachable during normal provisioning teardown.
app/Polydock/Apps/PrivateGpt/Client/AmazeeAiClient.php — the deleteTeam method needs a null-safe access on the message key
Important Files Changed
Sequence Diagram
%%{init: {'theme': 'neutral'}}%% sequenceDiagram participant Job as ProcessPolydockAppInstanceJob participant Engine as PolydockEngine participant App as PolydockApp (Generic/AmazeeClaw/PrivateGPT) participant LagoonClient as Lagoon\Client participant AmazeeAiClient as AmazeeAi\Client (new) participant GuzzleClient as PrivateGpt\AmazeeAiClient (Guzzle) Job->>Engine: processPolydockAppInstance(appInstance) Engine->>Engine: validateAppInstanceHasAllRequiredVariables() Engine->>App: preCreateAppInstance / createAppInstance / ... App->>LagoonClient: Lagoon GraphQL operations (non-interpolated heredocs) App->>AmazeeAiClient: HTTP via Laravel Http facade App->>GuzzleClient: HTTP via Guzzle (PrivateGPT only) Engine->>Engine: pushProjectMetadata(appInstance) Engine->>LagoonClient: updateProjectMetadata()%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% sequenceDiagram participant Job as ProcessPolydockAppInstanceJob participant Engine as PolydockEngine participant App as PolydockApp (Generic/AmazeeClaw/PrivateGPT) participant LagoonClient as Lagoon\Client participant AmazeeAiClient as AmazeeAi\Client (new) participant GuzzleClient as PrivateGpt\AmazeeAiClient (Guzzle) Job->>Engine: processPolydockAppInstance(appInstance) Engine->>Engine: validateAppInstanceHasAllRequiredVariables() Engine->>App: preCreateAppInstance / createAppInstance / ... App->>LagoonClient: Lagoon GraphQL operations (non-interpolated heredocs) App->>AmazeeAiClient: HTTP via Laravel Http facade App->>GuzzleClient: HTTP via Guzzle (PrivateGPT only) Engine->>Engine: pushProjectMetadata(appInstance) Engine->>LagoonClient: updateProjectMetadata()Reviews (5): Last reviewed commit: "refactor(privategpt): resolve exception ..." | Re-trigger Greptile