From f133c43e151036fe0ae9625df5ec87b756c5cd10 Mon Sep 17 00:00:00 2001 From: Jordanmuss99 <164892154+Jordanmuss99@users.noreply.github.com> Date: Tue, 28 Apr 2026 19:27:33 +1000 Subject: [PATCH 01/30] =?UTF-8?q?docs:=20close=20out=20dp-20=20audit=20?= =?UTF-8?q?=E2=80=94=20remove=20resolved=20TODOs,=20update=20PROGRESS.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROGRESS.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PROGRESS.md b/PROGRESS.md index 77d5ec6..29578ec 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -6,9 +6,9 @@ Active implementation tracking. **Claude: Update this as you work.** ## Current Status -**Phase**: dp-19 slider→reservation-API wiring shipped -**Last Updated**: 2026-04-27 -**Last Session**: dp-19 shipped. Wired `dynamicSliderGroup` Alpine component to `POST /api/dynamic-pterodactyl/reservation`; swapped route middleware to `checkout` for guest support; made `cart_item_id` optional; added `Cart::checkout()` confirmation hook; 3 new guest tests green; CodeRabbit 2 findings fixed. +**Phase**: dp-20 reservation lifecycle close-out (shipped as part of dp-19) +**Last Updated**: 2026-04-28 +**Last Session**: dp-20 audit pass confirmed all 4 changes (cart-clear race fix, confirm-return logging, cleanup cron, expires_at guard) were already implemented in dp-19 commit `a861479`. All 128 tests green. Plan closed out. --- @@ -58,6 +58,7 @@ All documentation and scaffolding complete. 9 spec files + 4 support files (CLAU | dp-16 | Docs sync: align 03-API + 05-ADMIN-UI + 09-IMPLEMENTATION with post-dp-13 architecture | Shipped — squash `f5f88c7` (PR #19) | Apr 2026 | | dp-18 | Capacity-fanout Performance: batch admin-view Pterodactyl reads | Shipped — squash `be4756f` (PR #20) | Apr 2026 | | dp-19 | Wire customer-facing slider to reservation API (guest support) | Shipped — direct commits on `dynamic-slider` | Apr 2026 | +| dp-20 | Reservation lifecycle fixes (cart-clear race, confirm-return, cleanup cron, expires_at guard) | Shipped inside dp-19 commit `a861479` (no separate PR) | Apr 2026 | --- From a979596d6efe10d64710b17a20f51f7568585f40 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 18:59:15 +1000 Subject: [PATCH 02/30] fix(resources): batch location availability reads --- Services/ResourceCalculationService.php | 53 ++++--- tests/Unit/ResourceCalculationServiceTest.php | 130 +++++++++++++----- 2 files changed, 129 insertions(+), 54 deletions(-) diff --git a/Services/ResourceCalculationService.php b/Services/ResourceCalculationService.php index 696bf4d..3b66c8c 100644 --- a/Services/ResourceCalculationService.php +++ b/Services/ResourceCalculationService.php @@ -143,9 +143,10 @@ public function buildClusterSnapshot(): array /** * Calculate available resources for a specific node */ - private function calculateNodeAvailability(array $node, ?string $excludeReservationToken = null): array + private function calculateNodeAvailability(array $nodeWithServers, ?string $excludeReservationToken = null): array { - $servers = $this->fetchServersOnNode($node['id']); + $node = $nodeWithServers['node']; + $servers = $nodeWithServers['servers']; $pendingReservations = $this->getPendingReservations($node['id'], $excludeReservationToken); return $this->buildNodeAvailabilityFromServers($node, $servers, $pendingReservations); @@ -200,13 +201,13 @@ public function testConnection(): array public function verifyAvailability(int $nodeId, array $requirements, ?string $excludeReservationToken = null): bool { $nodes = $this->fetchNodesInLocation($this->getNodeLocation($nodeId)); - $node = \collect($nodes)->firstWhere('id', $nodeId); + $nodeWithServers = \collect($nodes)->first(fn ($n) => ($n['node']['id'] ?? null) === $nodeId); - if (! $node) { + if (! $nodeWithServers) { return false; } - $availability = $this->calculateNodeAvailability($node, $excludeReservationToken); + $availability = $this->calculateNodeAvailability($nodeWithServers, $excludeReservationToken); return $availability['available']['memory'] >= $requirements['memory'] && $availability['available']['cpu'] >= $requirements['cpu'] @@ -225,23 +226,35 @@ public function getLocations(): array private function fetchNodesInLocation(int $locationId): array { - $data = $this->pterodactylGet('/api/application/nodes', [ - 'filter[location_id]' => $locationId, - 'per_page' => 100, - ]); - - return \collect($data['data'] ?? []) - ->map(fn ($node) => $node['attributes']) - ->toArray(); - } + $response = $this->pterodactylGet( + "/api/application/locations/{$locationId}", + ['include' => 'nodes,servers'] + ); + + $nodesData = $response['attributes']['relationships']['nodes']['data'] ?? []; + $serversData = $response['attributes']['relationships']['servers']['data'] ?? []; + + // Group servers by node_id for per-node allocation accounting + $serversByNode = []; + foreach ($serversData as $server) { + $nodeId = $server['attributes']['node'] ?? null; + if ($nodeId === null) { + continue; + } + $serversByNode[$nodeId][] = $server['attributes']; + } - private function fetchServersOnNode(int $nodeId): array - { - $data = $this->pterodactylGet("/api/application/nodes/{$nodeId}", ['include' => 'servers']); + $nodes = []; + foreach ($nodesData as $node) { + $attrs = $node['attributes']; + $nodeId = $attrs['id']; + $nodes[] = [ + 'node' => $attrs, + 'servers' => $serversByNode[$nodeId] ?? [], + ]; + } - return \collect($this->extractRelationshipData($data, 'servers')) - ->map(fn ($server) => $server['attributes']) - ->toArray(); + return $nodes; } private function buildNodeAvailabilityFromServers(array $node, array $servers, array $pendingReservations): array diff --git a/tests/Unit/ResourceCalculationServiceTest.php b/tests/Unit/ResourceCalculationServiceTest.php index 0b38c69..6db6af8 100644 --- a/tests/Unit/ResourceCalculationServiceTest.php +++ b/tests/Unit/ResourceCalculationServiceTest.php @@ -192,6 +192,26 @@ public function test_verify_availability_without_exclusion_fails_on_edge_fit(): $this->assertFalse($this->service->verifyAvailability(5, $resources)); } + public function test_location_availability_groups_included_servers_by_node(): void + { + Http::fake($this->availabilityHttpFake( + nodeId: 5, + locationId: 1, + totalMemory: 8192, + totalDisk: 51200, + totalCpuThreads: 4, + servers: [ + ['node' => 5, 'memory' => 1024, 'cpu' => 50, 'disk' => 5120], + ['node' => 6, 'memory' => 4096, 'cpu' => 200, 'disk' => 20480], + ], + )); + + $result = $this->service->getLocationAvailability(1); + + $this->assertSame(['memory' => 1024, 'cpu' => 50, 'disk' => 5120], $result['nodes'][0]['allocated']); + $this->assertSame(['memory' => 7168, 'cpu' => 350, 'disk' => 46080], $result['nodes'][0]['available']); + } + public function test_snapshot_with_single_location_single_node(): void { $calls = 0; @@ -251,29 +271,35 @@ public function test_snapshot_aggregates_across_locations(): void $this->assertLessThanOrEqual(4, $calls); } - public function test_snapshot_handles_paginated_node_response(): void + public function test_snapshot_handles_paginated_location_response(): void { $calls = 0; Http::fake($this->clusterSnapshotHttpFake( $calls, locations: [ - ['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1'], + [ + ['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1'], + ['id' => 2, 'short' => 'dc2', 'long' => 'Data Center 2'], + ], + [ + ['id' => 3, 'short' => 'dc3', 'long' => 'Data Center 3'], + ], ], nodePages: [ [ $this->nodeWithServersPayload(1, 1, 'Node 1', []), - $this->nodeWithServersPayload(2, 1, 'Node 2', []), - ], - [ - $this->nodeWithServersPayload(3, 1, 'Node 3', []), + $this->nodeWithServersPayload(2, 2, 'Node 2', []), + $this->nodeWithServersPayload(3, 3, 'Node 3', []), ], ], )); $snapshot = $this->service->buildClusterSnapshot(); - $this->assertSame([1, 2, 3], $snapshot['by_location'][1]['nodes']); + $this->assertSame([1], $snapshot['by_location'][1]['nodes']); + $this->assertSame([2], $snapshot['by_location'][2]['nodes']); + $this->assertSame([3], $snapshot['by_location'][3]['nodes']); $this->assertCount(3, $snapshot['nodes']); $this->assertLessThanOrEqual(4, $calls); } @@ -349,36 +375,64 @@ private function insertPendingReservation(string $token, int $nodeId, int $locat ]); } - private function availabilityHttpFake(int $nodeId, int $locationId, int $totalMemory, int $totalDisk, int $totalCpuThreads): callable + private function availabilityHttpFake( + int $nodeId, + int $locationId, + int $totalMemory, + int $totalDisk, + int $totalCpuThreads, + array $servers = [], + ): callable { - return function ($request) use ($nodeId, $locationId, $totalMemory, $totalDisk, $totalCpuThreads) { + return function ($request) use ($nodeId, $locationId, $totalMemory, $totalDisk, $totalCpuThreads, $servers) { $url = $request->url(); + $query = []; + parse_str(parse_url($url, PHP_URL_QUERY) ?? '', $query); - if (str_contains($url, '/api/application/nodes?')) { - return Http::response([ - 'data' => [[ - 'attributes' => [ - 'id' => $nodeId, - 'location_id' => $locationId, - 'name' => 'Node '.$nodeId, - 'fqdn' => 'node-'.$nodeId.'.example.com', - 'memory' => $totalMemory, - 'disk' => $totalDisk, - 'cpu_threads' => $totalCpuThreads, - 'memory_overallocate' => 0, - 'disk_overallocate' => 0, - 'maintenance_mode' => false, - ], - ]], - ], 200); - } - - if (str_contains($url, "/api/application/nodes/{$nodeId}?include=servers")) { + if (str_contains($url, "/api/application/locations/{$locationId}") && ($query['include'] ?? null) === 'nodes,servers') { return Http::response([ + 'object' => 'location', 'attributes' => [ + 'id' => $locationId, + 'short' => 'dc'.$locationId, + 'long' => 'Data Center '.$locationId, 'relationships' => [ + 'nodes' => [ + 'object' => 'list', + 'data' => [[ + 'object' => 'node', + 'attributes' => [ + 'id' => $nodeId, + 'location_id' => $locationId, + 'name' => 'Node '.$nodeId, + 'fqdn' => 'node-'.$nodeId.'.example.com', + 'memory' => $totalMemory, + 'disk' => $totalDisk, + 'cpu_threads' => $totalCpuThreads, + 'memory_overallocate' => 0, + 'disk_overallocate' => 0, + 'maintenance_mode' => false, + 'allocated_resources' => [ + 'memory' => 0, + 'disk' => 0, + ], + ], + ]], + ], 'servers' => [ - 'data' => [], + 'object' => 'list', + 'data' => array_map(fn (array $server, int $index) => [ + 'object' => 'server', + 'attributes' => [ + 'id' => ($server['node'] * 100) + $index, + 'node' => $server['node'], + 'limits' => [ + 'memory' => $server['memory'], + 'cpu' => $server['cpu'], + 'disk' => $server['disk'], + ], + ], + ], $servers, array_keys($servers)), ], ], ], @@ -407,13 +461,16 @@ private function clusterSnapshotHttpFake(int &$calls, array $locations, array $n $query = []; parse_str(parse_url($url, PHP_URL_QUERY) ?? '', $query); - if (str_contains($url, '/api/application/locations')) { + if (str_contains($url, '/api/application/locations') && ! preg_match('#/api/application/locations/\d+#', $url)) { + $locationPages = $this->isPaginatedPayload($locations) ? $locations : [$locations]; + $page = (int) ($query['page'] ?? 1); + return Http::response([ - 'data' => array_map(fn (array $location) => ['attributes' => $location], $locations), + 'data' => array_map(fn (array $location) => ['attributes' => $location], $locationPages[$page - 1] ?? []), 'meta' => [ 'pagination' => [ - 'current_page' => 1, - 'total_pages' => 1, + 'current_page' => $page, + 'total_pages' => count($locationPages), ], ], ], 200); @@ -437,6 +494,11 @@ private function clusterSnapshotHttpFake(int &$calls, array $locations, array $n }; } + private function isPaginatedPayload(array $payload): bool + { + return isset($payload[0]) && is_array($payload[0]) && array_is_list($payload[0]); + } + private function nodeWithServersPayload(int $nodeId, int $locationId, string $name, array $servers): array { return [ From 35ac1959f944151ce680bd5d2293bfc35ef3e70f Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 18:59:51 +1000 Subject: [PATCH 03/30] test: support standalone Paymenter checkouts --- phpunit.xml | 1 + tests/LaravelTestCase.php | 9 ++++++++- tests/bootstrap.php | 26 ++++++++++++++++++++++---- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/phpunit.xml b/phpunit.xml index 9a2d06f..90dae74 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -27,6 +27,7 @@ + diff --git a/tests/LaravelTestCase.php b/tests/LaravelTestCase.php index aac8b77..c6446ab 100644 --- a/tests/LaravelTestCase.php +++ b/tests/LaravelTestCase.php @@ -12,12 +12,19 @@ abstract class LaravelTestCase extends BaseTestCase */ public function createApplication() { - $bootstrap = __DIR__ . '/../../../../bootstrap/app.php'; + $paymenterBasePath = getenv('PAYMENTER_BASE_PATH'); + $bootstrap = $paymenterBasePath + ? rtrim($paymenterBasePath, '/\\') . '/bootstrap/app.php' + : __DIR__ . '/../../../../bootstrap/app.php'; if (!file_exists($bootstrap)) { $bootstrap = '/var/www/paymenter/bootstrap/app.php'; } + if (!file_exists($bootstrap)) { + throw new \RuntimeException('Unable to locate Paymenter bootstrap/app.php. Set PAYMENTER_BASE_PATH for standalone checkouts.'); + } + $app = require $bootstrap; $app->make(Kernel::class)->bootstrap(); diff --git a/tests/bootstrap.php b/tests/bootstrap.php index e4bde8c..dfe05b3 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,18 +1,36 @@ addPsr4( + 'Paymenter\\Extensions\\Others\\DynamicPterodactyl\\', + dirname(__DIR__) . '/', +); // dp-13 guard: refuse to boot against a non-test database. $db = getenv('DB_DATABASE') ?: ($_ENV['DB_DATABASE'] ?? ''); -if ($db !== 'paymenter_test' && $db !== ':memory:' && $db !== '') { +$connection = getenv('DB_CONNECTION') ?: ($_ENV['DB_CONNECTION'] ?? ''); +$appEnvironment = getenv('APP_ENV') ?: ($_ENV['APP_ENV'] ?? ''); +$isSqliteTestDatabase = $appEnvironment === 'testing' + && $connection === 'sqlite' + && ($db === ':memory:' || str_ends_with(strtolower($db), '.sqlite')); + +if ($db !== 'paymenter_test' && $db !== '' && ! $isSqliteTestDatabase) { fwrite(STDERR, "ABORT: phpunit would run against DB_DATABASE='$db'. " - . "Expected 'paymenter_test' or ':memory:'. See .sisyphus/notepads/dp-11-authorization-surface-reduction/incidents.md.\n"); + . "Expected 'paymenter_test' or a testing-only SQLite database. " + . "See .sisyphus/notepads/dp-11-authorization-surface-reduction/incidents.md.\n"); exit(2); } From f652667a39571cbd2991fa9469220e7cfff99440 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 19:03:22 +1000 Subject: [PATCH 04/30] docs: refresh availability security wiki --- .../Availability Endpoints.md | 97 ++++++++++++++++--- .../repowiki/en/meta/repowiki-metadata.json | 2 +- 2 files changed, 85 insertions(+), 14 deletions(-) diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md index 7a81b42..2d71405 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md @@ -11,22 +11,30 @@ - [DECISIONS.md](file://DECISIONS.md) +## Update Summary +**Changes Made** +- Enhanced security section with new test assertions for preventing node-level data exposure +- Updated endpoint specification to emphasize security boundaries +- Added comprehensive security testing coverage details +- Strengthened error handling documentation with security considerations + ## Table of Contents 1. [Introduction](#introduction) 2. [Project Structure](#project-structure) 3. [Core Components](#core-components) 4. [Architecture Overview](#architecture-overview) 5. [Detailed Component Analysis](#detailed-component-analysis) -6. [Dependency Analysis](#dependency-analysis) -7. [Performance Considerations](#performance-considerations) -8. [Troubleshooting Guide](#troubleshooting-guide) -9. [Conclusion](#conclusion) +6. [Security and Data Exposure Prevention](#security-and-data-exposure-prevention) +7. [Dependency Analysis](#dependency-analysis) +8. [Performance Considerations](#performance-considerations) +9. [Troubleshooting Guide](#troubleshooting-guide) +10. [Conclusion](#conclusion) ## Introduction -This document specifies the customer-facing availability endpoint that returns aggregate, location-based capacity data for Pterodactyl nodes. It covers authentication, rate limiting, request/response schemas, error handling, and performance characteristics. The endpoint is designed to answer “what can I get at this location right now?” without exposing node-level internals to customers. +This document specifies the customer-facing availability endpoint that returns aggregate, location-based capacity data for Pterodactyl nodes. It covers authentication, rate limiting, request/response schemas, error handling, performance characteristics, and comprehensive security measures designed to prevent node-level data exposure to customers. The endpoint is designed to answer "what can I get at this location right now?" without exposing node-level internals to customers. ## Project Structure -The availability feature spans routes, a controller, and services that call the Pterodactyl API in real time. Customer endpoints are grouped under a single route prefix with shared middleware for session-based authentication and throttling. +The availability feature spans routes, a controller, and services that call the Pterodactyl API in real time. Customer endpoints are grouped under a single route prefix with shared middleware for session-based authentication and throttling. Security measures ensure that only aggregate data is returned to customers while detailed node information remains admin-only. ```mermaid graph TB @@ -36,6 +44,8 @@ MW --> Ctrl["AvailabilityController::getByLocation"] Ctrl --> NodeSel["NodeSelectionService::getMaxAvailable"] Ctrl --> ResCalc["ResourceCalculationService::getLocationAvailability"] ResCalc --> Ptero["Pterodactyl API"] +Ctrl --> Security["Security Layer
Data Sanitization"] +Security --> Response["Secure JSON Response
No Node Details"] ``` **Diagram sources** @@ -49,7 +59,7 @@ ResCalc --> Ptero["Pterodactyl API"] ## Core Components - Route group: Defines the public availability endpoint and applies session-based authentication and rate limiting. -- Controller: Orchestrates aggregation and returns a simplified response to customers. +- Controller: Orchestrates aggregation and returns a simplified response to customers with built-in security sanitization. - Services: - NodeSelectionService: Computes maximum allocatable resources across a location. - ResourceCalculationService: Fetches live node/server data from Pterodactyl and aggregates totals and per-node details (used internally and by admin). @@ -59,6 +69,7 @@ Key responsibilities: - Throttle requests to protect downstream Pterodactyl API budget. - Aggregate per-location maxima for memory, CPU, and disk. - Provide a boolean flag indicating whether all three resources have positive availability. +- **Enhanced**: Ensure no node-level data leaks to customer responses through comprehensive testing and validation. **Section sources** - [routes/api.php:17-22](file://routes/api.php#L17-L22) @@ -72,6 +83,7 @@ The GET /api/dynamic-pterodactyl/availability/{locationId} flow: 2. AvailabilityController::getByLocation resolves max available resources via NodeSelectionService. 3. It also fetches location availability via ResourceCalculationService to compute node_count and resource_capacity booleans. 4. A compact JSON response is returned with only aggregate fields; no node identifiers or internal details are exposed. +5. **Enhanced**: Comprehensive test coverage ensures security boundaries are maintained. ```mermaid sequenceDiagram @@ -93,6 +105,7 @@ S-->>N : Aggregated availability N-->>A : Max available {memory, cpu, disk} A->>S : getLocationAvailability(locationId) S-->>A : Location data including nodes[] +A->>A : Security sanitization
Remove node details A-->>C : {success, data : {location_id, max_memory, max_cpu, max_disk, node_count, has_capacity, resource_capacity}} ``` @@ -172,10 +185,11 @@ Error handling - Pterodactyl API failures: - Network timeouts, connection errors, or non-2xx responses result in exceptions thrown by the service layer and surfaced as success: false with a descriptive message. - Rate limiting exceeded: - - Requests beyond 30 per minute receive a standard throttle response from the framework’s throttle middleware. + - Requests beyond 30 per minute receive a standard throttle response from the framework's throttle middleware. Why node-level details are not exposed -- Customer-facing endpoints intentionally return only aggregate per-location maxima and counts. Node names, FQDNs, maintenance flags, and per-node capacities are reserved for admin-only access. This reduces information leakage and keeps the customer experience focused on “can I buy here?” rather than infrastructure specifics. +- Customer-facing endpoints intentionally return only aggregate per-location maxima and counts. Node names, FQDNs, maintenance flags, and per-node capacities are reserved for admin-only access. This reduces information leakage and keeps the customer experience focused on "can I buy here?" rather than infrastructure specifics. +- **Enhanced Security**: Comprehensive test coverage ensures that node-level data never leaks to customer responses through automated assertions. **Section sources** - [routes/api.php:17-22](file://routes/api.php#L17-L22) @@ -203,7 +217,7 @@ ForEachNode --> |No| ReturnData["Return {location_id, nodes[], max_available, to ``` **Diagram sources** -- [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) +- [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-67) - [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) **Section sources** @@ -224,6 +238,46 @@ ForEachNode --> |No| ReturnData["Return {location_id, nodes[], max_available, to - [routes/api.php:32-40](file://routes/api.php#L32-L40) - [EnsureUserIsAdmin.php:9-21](file://Http/Middleware/EnsureUserIsAdmin.php#L9-L21) +## Security and Data Exposure Prevention + +### Enhanced Security Measures +The system implements comprehensive security measures to prevent node-level data exposure in customer responses: + +#### Test Coverage for Security Boundaries +- **Automated Assertions**: Tests explicitly verify that the 'nodes' key is never present in customer-facing availability responses +- **Security Validation**: Both positive and negative capacity scenarios include assertions to ensure data isolation +- **Mock Testing**: Service mocks simulate realistic scenarios while maintaining security boundaries + +#### Security Implementation Details +- **Response Sanitization**: Customer endpoints return only aggregate data (max_memory, max_cpu, max_disk, node_count) +- **Admin Isolation**: Detailed node information is exclusively available through admin-only endpoints with proper authorization +- **Data Minimization**: Even when internal services process node-level data, it is never exposed to customer responses + +#### Security Testing Examples +The test suite includes comprehensive security validation: +- Verifies absence of 'nodes' key in customer responses +- Tests both capacity-available and capacity-exhausted scenarios +- Ensures consistent security behavior across different resource states + +```mermaid +flowchart TD +CustomerReq["Customer Request"] --> AuthCheck["Authentication Check"] +AuthCheck --> SecurityLayer["Security Layer"] +SecurityLayer --> DataAggregation["Aggregate Data Only"] +DataAggregation --> SecurityValidation["Security Validation
(No node details)"] +SecurityValidation --> TestCoverage["Automated Test Coverage"] +TestCoverage --> SecureResponse["Secure Response
(Aggregate only)"] +``` + +**Diagram sources** +- [AvailabilityApiTest.php:48-49](file://tests/Feature/AvailabilityApiTest.php#L48-L49) +- [AvailabilityApiTest.php:77-78](file://tests/Feature/AvailabilityApiTest.php#L77-L78) + +**Section sources** +- [AvailabilityApiTest.php:48-49](file://tests/Feature/AvailabilityApiTest.php#L48-L49) +- [AvailabilityApiTest.php:77-78](file://tests/Feature/AvailabilityApiTest.php#L77-L78) +- [DECISIONS.md:237-239](file://DECISIONS.md#L237-L239) + ## Dependency Analysis ```mermaid classDiagram @@ -242,20 +296,29 @@ class ResourceCalculationService { +testConnection() array +getLocations() array } +class AvailabilityApiTest { ++test_has_capacity_false_when_cpu_exhausted_but_memory_positive() void ++test_has_capacity_true_when_all_resources_positive() void ++bindAvailabilityServices(maxAvailable) void +} AvailabilityController --> NodeSelectionService : "uses" AvailabilityController --> ResourceCalculationService : "uses" NodeSelectionService --> ResourceCalculationService : "delegates" +AvailabilityApiTest --> NodeSelectionService : "mocks" +AvailabilityApiTest --> ResourceCalculationService : "mocks" ``` **Diagram sources** - [AvailabilityController.php:9-20](file://Http/Controllers/Api/AvailabilityController.php#L9-L20) - [NodeSelectionService.php:5-12](file://Services/NodeSelectionService.php#L5-L12) - [ResourceCalculationService.php:10-21](file://Services/ResourceCalculationService.php#L10-L21) +- [AvailabilityApiTest.php:12-100](file://tests/Feature/AvailabilityApiTest.php#L12-L100) **Section sources** - [AvailabilityController.php:9-20](file://Http/Controllers/Api/AvailabilityController.php#L9-L20) - [NodeSelectionService.php:5-12](file://Services/NodeSelectionService.php#L5-L12) - [ResourceCalculationService.php:10-21](file://Services/ResourceCalculationService.php#L10-L21) +- [AvailabilityApiTest.php:12-100](file://tests/Feature/AvailabilityApiTest.php#L12-L100) ## Performance Considerations - Real-time data fetching: @@ -268,8 +331,7 @@ NodeSelectionService --> ResourceCalculationService : "delegates" - 30 req/min protects against excessive load on the Pterodactyl API and mitigates abuse. - Database reads: - Pending reservations are summed per node to adjust available capacity accurately at query time. - -[No sources needed since this section provides general guidance] +- **Enhanced**: Security validation adds minimal overhead through automated testing but ensures long-term security posture without runtime performance impact. ## Troubleshooting Guide Common issues and how they manifest: @@ -283,15 +345,24 @@ Common issues and how they manifest: - Network timeouts, connection failures, or non-2xx responses cause exceptions in the service layer; these are caught and returned as success: false with a message and error details. - Unexpected payload: - Malformed or non-JSON responses from Pterodactyl are treated as errors and logged for diagnostics. +- **Enhanced**: Security validation failures: + - If tests detect node-level data exposure, investigate the response structure and ensure proper sanitization in the controller layer. Verification tips - Confirm you are authenticated via a valid session cookie. - Ensure your client respects the throttle limits and implements exponential backoff. - Validate that the locationId exists in your Pterodactyl instance. +- **Enhanced**: Run security tests to verify no node-level data exposure in responses. **Section sources** - [AvailabilityController.php:45-51](file://Http/Controllers/Api/AvailabilityController.php#L45-L51) - [ResourceCalculationService.php:452-498](file://Services/ResourceCalculationService.php#L452-L498) +- [AvailabilityApiTest.php:48-49](file://tests/Feature/AvailabilityApiTest.php#L48-L49) +- [AvailabilityApiTest.php:77-78](file://tests/Feature/AvailabilityApiTest.php#L77-L78) ## Conclusion -The GET /api/dynamic-pterodactyl/availability/{locationId} endpoint provides a secure, rate-limited, and real-time view of aggregate capacity for a given location. It exposes only what customers need to make purchasing decisions—maximum allocatable memory, CPU, and disk, along with a simple capacity indicator—while keeping node-level internals private. Errors are handled consistently, and performance is optimized through batched API calls and careful timeout/retry policies. \ No newline at end of file +The GET /api/dynamic-pterodactyl/availability/{locationId} endpoint provides a secure, rate-limited, and real-time view of aggregate capacity for a given location. It exposes only what customers need to make purchasing decisions—maximum allocatable memory, CPU, and disk, along with a simple capacity indicator—while keeping node-level internals private. + +**Enhanced Security**: The system now includes comprehensive automated testing to ensure that node-level data never leaks to customer responses. These security measures provide confidence that the data boundary between customer and admin interfaces remains intact, protecting sensitive infrastructure information while delivering accurate capacity information to customers. + +Errors are handled consistently, performance is optimized through batched API calls and careful timeout/retry policies, and security is enforced through both architectural design and comprehensive test coverage. diff --git a/.qoder/repowiki/en/meta/repowiki-metadata.json b/.qoder/repowiki/en/meta/repowiki-metadata.json index 0d7be4b..ac050db 100644 --- a/.qoder/repowiki/en/meta/repowiki-metadata.json +++ b/.qoder/repowiki/en/meta/repowiki-metadata.json @@ -1 +1 @@ -{"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":99,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:48:47.8218489+10:00","gmt_modified":"2026-08-14T18:48:47.8218489+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:43:09.3742295+10:00","raw_data":"WikiEncrypted:k297iOFQy9oqfJmcEkC3d77ZGM/0+lgF8c5KNHlKBcZGKhgG6RupM5f5pti32Y7jK1BHd1ueLOV7zFCDZP1LVkTrVAmwqml3NNnf9QMI8Vd5JZQiKdsecTEySGm5GQu8Jn3yHVAqGBLEMnB0TAvWSqJKQ4yNFF2fCb/eMSndVvWcf52C5alxlhFQFDCS/pU6Z9pjZ/rv422zTBKvRExfKRc+c1sufXc5psdtsh7T8b/YQWinN6XR2kq+Jhg1+JOYW22lbLXLKV+8+rHmjOnT2+Vq5xoB63ciSHVb/0vn5phyPIgWJZirMtiE0uzHBXI3GhEZ52CvUrzbjg4N1M2+oY5swqBnX5QVHqduQ15EQ/MpmWeyd+lzSFAKFC981JJsuaIGXjnm34htiQAs93ngUPA4i8FAf0lEi5vqmIvMhgVsV4I3xCgnSlHTyLO+QDKgYvXztsHxOx5jk3v4GVQljuEpsEbFygbznyzqHjyJKo4xWW1BoCTUHTKr/BtP/+mAPClbgo9rCuNeOQWAYcON1NMkLsk2yudNhIgJYqnctGQCqssurQL3u9Bwhh2qy5dj/8zZ7ri08RSMTJzEgSL0PE8foCxmzBKfejGIHzblcNZWmDhPGAAHggx1WfyTesdUXVou94vCdn7AbOwQfpw/oiB8GXYUP3Xuk2iuoM8Wi3pC6MIcCxOEJEjyyBKn2f9DKA4mNAOrTgW5PTTiypwXUK8QZJQXSHA/V639EfuTGX92Bk7s/OjYaBf92/c90JrkSKfNF6s/PclVGef1YwaB3r6iPqp0mboAcChfGgINfj0atx+Oq6ynZ7JxIK4QNLkAPeyO5Mc3/OjZZNU4Yr+YZsNDnorcKTnBPknRk2OYiMCvbdGjtEumLjOVYsPOf/Qk6Hk+7ViodjVVblVtuMDLSATuq4H2mTS0+bOrUqHkNyeOmCkJM4TSnM5wYvG2hDCXavGjCG7oqAYbZq495Vy1HGMxai+WPPGIZIOmHuFrPb5EuI8cG0JZa380jf6d/qbMSQEK3Tngv7iS9Ds7wv87qTtXQYNoTUiq1JtcCsEiT5klUbBjAcIUeVs0Voju2GVdtE6ULFLheuimhH/UgpiwgQQz0Pr5gGteArsxM3PZdWZYFj4JzmrmHOMV9WCQU4scFzWDNDk3m98mO9hPClbrEMcMuzmTafkISDHD5+CFg/1GdHkFpQvDki/GWAv2B7aKanjuiuBsCHUTwFYK6SDa8UikzbxzKoYV/Ir9XyxfDsqqmfCwt6mJ0pgvSNqyyOogw0ONN186igFL1SfS+bJU14SIDSMjroSm+32ZznjptTYaeXFO9qVBY2FHv8An+9xTofB5TeSRMYNNcFQHmze+NZw/KH6XPLUBjX80oMyfmjIe1XIRE55PdBl16Qv2kREC0w11OcuP3Njc4FN2mNm8xujDufrYWLwUBkvdSll3Qz4k4NKUfoNB5FkEXd4b9zJq56t5g/X44szhhYFrCr3LTesXEGWSKakeSNmGvTeJaJA54qhUFIFJfu4qhdwL502cJsK+7opvVKaOYuL2bJ6sdEYoFTw82eQpbuzzmpoY9+qZfBCDPcrnrz7XaMqjAny+NT3L4oKiylqrRtDLwdtd9+2p0JVhXv8xmxTcik9A8vV1TuuVLvYZJ0rFCEMkgJG5ORr62EvbqzCXXHGLIiyoRPogtKsTBQyV1TWl92jHlloT4vPMjbS06v1Fv6LeFMvPvcSgQS1z8goOlyNCc+7uXg==","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBVcsEy5TNHlP/Xz/D/ELaiZcLqVqvsFHZojMIvWXbqtAYqvdZNM8XlBghzpiqWnEov1SV7FQtFPIpj9j/EofU1iDJXVRmqaz5fZFYghM4g6eO9cJ4FK7JsL738Jk9Pp80MZLg8hV/wWALidFrhbh/4LOB+9n+7zkzR2sBNubQpQ8CJCXywcf+P2+Pve3bo4Q2XdnYCEud4sF87/Fh6XF/yl4YV+aVoUDW7tlISB4ZX7+yVhkBU+MHlkjh9Q3wsb82HFvz1GL4gR/pxDMVhhLV6eIIEJvhbXFJ9TfG5Rzkaobf7DkZX6CNWPqRb1vIa1SqQnWSD/KPpeGKRH+B/DFqBZ7eb/hSKBeb14MrTIKWuu4wRF7kOKMIJBVuMYWQrX6NG5oUKP1xUvJjDeerXVq7kG1AlJV1VqD5Da0c4KGBNIMelVdcLVBQOj8hqIM/vlr7KRkfTC1wKtE2Qz5glBCmIymh76+xzX8DCyNNMiLn+wCCGDuPzz3Fzqv8twRVUsvSfg/QLe0aWjgM4Rw+BePhdj3uGonWLcJ5ZvyKyAVlrM7gUoUMBz/KJiAlD4FAsmXPvIbxnPN0ApMDTVbThe14MgVc03fnMupeiO+tlEUSIpFtR5gIoV8ys/O3FZhtCRzI2DUqbXiqgrxSQ57B0nFSTKfuxl/yiBFRzI3+V03TtTUZ7P5Eg+v6wipDcAka3ri8fJWQU2mYgQkevu3K89lDHiaoMoTry8Vyn/wGR5dNvPy4s7hCsI5irNVhNWfZ9r6CqdoAxe2J4b2TbkeUQy7yb2RSbL5neccpDzlTBYIaTUZHvFwYl8dcbit+0GTXs7hFz4wiHKAWbNnjtTbGLFKLDzfBfrjA7TpLB03o+elWdqBN7rPnNy10tZf4EPIa6do65PecZ2hTDlydEJbb4nDOaklaESrjqhGkf165rK7eIbSKEyYHHbPycQhlkSvUdC3MamKUVQutZG46YTPy1ncD3CXhlIbO/VC2L/IZNrJD5WsqK0SaZII5Npo1R2/GM7P9k2hX00M+bo31khxj7QI/QC5uibD2Jx6ziB2BRGTNOYPQudB1IAZk4uvsQ+giuDZ/o4FZvQNqislT7Z4Ow2ji9qRk+lDNq65aguCByiNEEpUpA45EA8ZZypAR2Hkt+UaOq1FhzTcKEFSUbz/oyp8G7IUi1+5cMFfYyYtReYki+9ACci5DyyMrZKqznID2Gyl353hmIAIhcc17jW/QmIIHxFJ10eqs4yjyuISQCDq8b0Vho0FfatTBaV4nsWlecER3pH31ovCsTEBsIGFhDE4s2YD3WIstIMlL80k62Lz77x5HB3xkAkb05Nvq7E0NY+EiJ0KUJqUAST0bIQWxdLUL+Rg9NgCGbUPsl9J3khXYJ+5BcAHRQ2Qn5MJog60AwSaxXT5JM+b7EFXUbPLJBqbsPktU+UevN9OnstD1z6xZ6X4cWXQrV6D4TWM0sUtU8y8QaivnVp4s4iYwLfrA+cEHtwgJ+5PrHPD5FSjswMY2Z7bu7Tgu5Txo1oKSABpv9in19t+HrwN96Ik1yNFe85QpLLF4F+Y5zQZU9ZDYtCg6illkCxGGOBCF0v5SMF69/tkU5KUaEVk90va5y5tKsysiU92Ds3eJkOLf39k8sUJtH0yFu18Jbaw2GDFpO/d/VkB797dJLrLKZOeYFeATUISpwfU06aFMubaqXyblgKy3+S9ki/fVVX5z6ThiXVs35OPUAKrq6ChluTdaPEbFFo0zbPYDpxEsd40/pybI/tgV7fFfXHwW4LUfcIZzS7HZkTqfcpBBLT/5t+cZ+LwSbtzrwc12elLAT4nvgcay1JkLDXREXYcalhltzpxhCrpaPu8qks7zzyy7bTfKGzzzEqAIh9wfb+3ONdQe8aCOFyB6uWxX8OLuuGWsa/vajo4XG7EeUA+z7dLlfPJFmsxkhpMHYScbbjT/SSkhlwZlXowmqqN/3AtHQ+m8TLOJKbdXj3Z+wHVKQQtV3hKuD/X8OW/D4TdgpS0/n9o8Nj8BP3b0qkM","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T18:43:09.3747486+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"bba642c046ad0dfd91f8ff402787369549124486","last_commit_update":"2026-08-14T18:48:47.8309011+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T18:48:47.8309011+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file +{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-86","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"247-289","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"452-498","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"53ce981e551c2c7b4b2f9bc49ee0c60654c40364","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file From b9783935802b8489ecbb887bde7b6c353e882480 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 19:40:44 +1000 Subject: [PATCH 05/30] test: harden standalone database isolation --- DECISIONS.md | 2 +- tests/AGENTS.md | 6 +-- tests/TestDatabaseGuard.php | 29 +++++++++++++ tests/Unit/ResourceCalculationServiceTest.php | 8 ++++ tests/Unit/TestDatabaseGuardTest.php | 43 +++++++++++++++++++ tests/bootstrap.php | 13 +++--- 6 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 tests/TestDatabaseGuard.php create mode 100644 tests/Unit/TestDatabaseGuardTest.php diff --git a/DECISIONS.md b/DECISIONS.md index ebf655d..ac54ab6 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -244,7 +244,7 @@ Unit coverage accepted for dp-06. The full Filament-action lifecycle end-to-end ### 6. Test Isolation Mandate (dp-13, Apr 2026) -Extension phpunit MUST set `CACHE_STORE=array`, `SESSION_DRIVER=array`, `QUEUE_CONNECTION=sync`, `MAIL_MAILER=array`, `BCRYPT_ROUNDS=4`, `PULSE_ENABLED=false`, `TELESCOPE_ENABLED=false` — mirroring the root `phpunit.xml`. Failure to do so risks polluting the shared Redis/file cache on a development host, corrupting the settings key read by running web workers. This caused a production outage on 2026-04-23. The `bootstrap.php` guard provides a second line of defence (aborts if `DB_DATABASE` is not a recognised test DB). See `incidents.md` for forensics. +Extension phpunit MUST set `CACHE_STORE=array`, `SESSION_DRIVER=array`, `QUEUE_CONNECTION=sync`, `MAIL_MAILER=array`, `BCRYPT_ROUNDS=4`, `PULSE_ENABLED=false`, `TELESCOPE_ENABLED=false` — mirroring the root `phpunit.xml`. Failure to do so risks polluting the shared Redis/file cache on a development host, corrupting the settings key read by running web workers. This caused a production outage on 2026-04-23. The `bootstrap.php` guard provides a second line of defence: it accepts only `paymenter_test`, `:memory:`, or a strictly named `dynamic-pterodactyl-test-*.sqlite` file directly inside the system temp directory. Empty database names and arbitrary SQLite paths remain forbidden. See `incidents.md` for forensics. ### 7. SetupWizard Atomicity Contract (dp-13, Apr 2026) diff --git a/tests/AGENTS.md b/tests/AGENTS.md index 14cf2ee..ba3c87d 100644 --- a/tests/AGENTS.md +++ b/tests/AGENTS.md @@ -23,7 +23,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p | Task | Start at | Notes | |---|---|---| -| Harness boot / DB safety | `bootstrap.php`, `../phpunit.xml` | `paymenter_test` / `:memory:` guard is enforced before app boot | +| Harness boot / DB safety | `bootstrap.php`, `TestDatabaseGuard.php`, `../phpunit.xml` | `paymenter_test`, `:memory:`, or a strictly named disposable SQLite file in the system temp directory is enforced before app boot | | Lightweight service seam | `TestCase.php` | Mockery cleanup, `createPricingConfig()`, `createNodeData()`, `standardResources()` | | App-backed test seam | `LaravelTestCase.php` | Paymenter kernel boot, `createConfigOption()`, slider defaults, node fixtures | | Reservation state / audits | `Unit/ReservationServiceTest.php` | Mixes facade mocks and real DB assertions under transactions | @@ -40,7 +40,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p - Any DB-writing test must use `Illuminate\Foundation\Testing\DatabaseTransactions`; this includes DB-backed `Unit/` tests and all current API feature tests. - Feature API tests must `require __DIR__ . '/../../routes/api.php';` in `setUp()` because extension routes are loaded manually by `DynamicPterodactyl::boot()` at runtime. - For schedule assertions, boot the extension in the test and inspect `app(Schedule::class)->events()`; no local Job/Command classes exist. -- The bootstrap refuses unsafe databases: `DB_DATABASE` must be `paymenter_test`, `:memory:`, or empty before Laravel boots. +- The bootstrap refuses unsafe databases: `DB_DATABASE` must be `paymenter_test`, `:memory:`, or a `dynamic-pterodactyl-test-*.sqlite` file directly inside the system temp directory before Laravel boots. An empty value is rejected so the application cannot fall through to a production `.env` database after the guard runs. - `phpunit.xml` fixes testing env, `MAIL_MAILER=array`, `SESSION_DRIVER=array`, `CACHE_STORE=array` with legacy `CACHE_DRIVER=file`, sync queue, and service-source warning restrictions. - Use shared fixture helpers before creating local copies: `standardResources()`, `createNodeData()`, `createConfigOption()`, and per-file helpers such as configured products/cart items. - Common fakes are `Mockery` service/container bindings, `Http::fake()` with `Http::preventStrayRequests()` for panel calls, `Notification::fake()`, `Event::fake()`, `Log::spy()`, `Config::set()`, and `Gate::policy()`. @@ -55,7 +55,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p - Do not put app/factory/facade tests on raw `TestCase` except the existing separate-process `AlertService` facade isolation seam. - Do not claim `Unit/` files are all pure units; several intentionally boot Laravel and write DB rows. - Do not duplicate root command blocks, generic PHPUnit advice, or project-wide anti-patterns here. -- Do not loosen the `paymenter_test` / `:memory:` bootstrap guard. +- Do not broaden the database guard beyond `paymenter_test`, `:memory:`, or the validated disposable system-temp SQLite naming contract. - Do not add live Pterodactyl network calls; fake panel HTTP explicitly and prevent strays when testing capacity reads. - Do not expose or assert full reservation tokens in audit payloads; assert `token_prefix` behavior. - Current direct coverage gaps to watch: `CartItemCreatedListener`, `ServiceCreatedListener`, `PricingController::getConfig()`, and `AuditLogService` retrieval methods. diff --git a/tests/TestDatabaseGuard.php b/tests/TestDatabaseGuard.php new file mode 100644 index 0000000..12ed6e0 --- /dev/null +++ b/tests/TestDatabaseGuard.php @@ -0,0 +1,29 @@ +service->getLocationAvailability(1); + Http::assertSentCount(1); + Http::assertSent(function ($request): bool { + $query = []; + parse_str(parse_url($request->url(), PHP_URL_QUERY) ?? '', $query); + + return parse_url($request->url(), PHP_URL_PATH) === '/api/application/locations/1' + && ($query['include'] ?? null) === 'nodes,servers'; + }); $this->assertSame(['memory' => 1024, 'cpu' => 50, 'disk' => 5120], $result['nodes'][0]['allocated']); $this->assertSame(['memory' => 7168, 'cpu' => 350, 'disk' => 46080], $result['nodes'][0]['available']); } diff --git a/tests/Unit/TestDatabaseGuardTest.php b/tests/Unit/TestDatabaseGuardTest.php new file mode 100644 index 0000000..18e721c --- /dev/null +++ b/tests/Unit/TestDatabaseGuardTest.php @@ -0,0 +1,43 @@ +assertNotFalse($temporaryFile); + + $database = $temporaryFile.'.sqlite'; + rename($temporaryFile, $database); + + try { + $this->assertFalse(TestDatabaseGuard::allows($database, 'sqlite', 'testing')); + } finally { + unlink($database); + } + } + + public function test_allows_disposable_sqlite_database_in_system_temp_directory(): void + { + $database = sys_get_temp_dir().DIRECTORY_SEPARATOR.'dynamic-pterodactyl-test-example.sqlite'; + + $this->assertTrue(TestDatabaseGuard::allows($database, 'sqlite', 'testing')); + } + + public function test_rejects_disposable_name_outside_system_temp_directory(): void + { + $database = dirname(sys_get_temp_dir()).DIRECTORY_SEPARATOR.'dynamic-pterodactyl-test-example.sqlite'; + + $this->assertFalse(TestDatabaseGuard::allows($database, 'sqlite', 'testing')); + } + + public function test_rejects_empty_database_name_before_application_boot(): void + { + $this->assertFalse(TestDatabaseGuard::allows('', 'sqlite', 'testing')); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index dfe05b3..c3c14d8 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -19,17 +19,20 @@ dirname(__DIR__) . '/', ); +require __DIR__ . '/TestDatabaseGuard.php'; + // dp-13 guard: refuse to boot against a non-test database. $db = getenv('DB_DATABASE') ?: ($_ENV['DB_DATABASE'] ?? ''); $connection = getenv('DB_CONNECTION') ?: ($_ENV['DB_CONNECTION'] ?? ''); $appEnvironment = getenv('APP_ENV') ?: ($_ENV['APP_ENV'] ?? ''); -$isSqliteTestDatabase = $appEnvironment === 'testing' - && $connection === 'sqlite' - && ($db === ':memory:' || str_ends_with(strtolower($db), '.sqlite')); -if ($db !== 'paymenter_test' && $db !== '' && ! $isSqliteTestDatabase) { +if (! \Paymenter\Extensions\Others\DynamicPterodactyl\Tests\TestDatabaseGuard::allows( + $db, + $connection, + $appEnvironment, +)) { fwrite(STDERR, "ABORT: phpunit would run against DB_DATABASE='$db'. " - . "Expected 'paymenter_test' or a testing-only SQLite database. " + . "Expected 'paymenter_test', ':memory:', or a disposable dynamic-pterodactyl-test-*.sqlite file in the system temp directory. " . "See .sisyphus/notepads/dp-11-authorization-surface-reduction/incidents.md.\n"); exit(2); } From ae33b4653367194f43f5ee0401a32abb6f5da5f2 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 19:41:11 +1000 Subject: [PATCH 06/30] docs: reconcile wiki with batched location reads --- .../Admin API Endpoints.md | 2 +- .../Availability Endpoints.md | 4 +- .../Architecture Overview.md | 5 +- .../Companion Extension Pattern.md | 2 +- .../Cart Events and Listeners.md | 2 +- .../Event-Driven Architecture.md | 4 +- .../Payment and Service Events.md | 2 +- .../Real-Time Integration Strategy.md | 5 +- .../Node Selection Service.md | 7 ++- .../Reservation Service.md | 14 +++--- .../Resource Calculation Service.md | 2 +- .../Service Layer Design.md | 2 +- .../en/content/Core Services/Core Services.md | 2 +- .../Core Services/NodeSelectionService.md | 4 +- .../ResourceCalculationService.md | 15 +++--- .qoder/repowiki/en/content/Deployment.md | 4 +- .qoder/repowiki/en/content/Getting Started.md | 4 +- .qoder/repowiki/en/content/Testing.md | 8 ++-- .qoder/repowiki/en/content/Troubleshooting.md | 8 ++-- .../repowiki/en/meta/repowiki-metadata.json | 2 +- 02-SERVICES.md | 48 ++++++++----------- 08-ALGORITHMS.md | 2 +- 09-IMPLEMENTATION.md | 2 +- PROGRESS.md | 16 +++---- 24 files changed, 73 insertions(+), 93 deletions(-) diff --git a/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md b/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md index 5e6f354..97fd20b 100644 --- a/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md @@ -175,7 +175,7 @@ Notes: - [api.php:32-40](file://routes/api.php#L32-L40) - [AdminCapacityController.php:17-61](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L17-L61) - [ResourceCalculationService.php:69-141](file://Services/ResourceCalculationService.php#L69-L141) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:426-450](file://Services/ResourceCalculationService.php#L426-L450) ### Reservation Management: GET /api/dynamic-pterodactyl/admin/reservations diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md index 2d71405..1bcf6d1 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md @@ -218,12 +218,12 @@ ForEachNode --> |No| ReturnData["Return {location_id, nodes[], max_available, to **Diagram sources** - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-67) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) **Section sources** - [NodeSelectionService.php:78-86](file://Services/NodeSelectionService.php#L78-L86) - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) ### Middleware and Security - Web session and authentication: diff --git a/.qoder/repowiki/en/content/Architecture Overview/Architecture Overview.md b/.qoder/repowiki/en/content/Architecture Overview/Architecture Overview.md index 8c5bd36..c4e3e69 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Architecture Overview.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Architecture Overview.md @@ -296,8 +296,7 @@ participant Ctrl as "AvailabilityController" participant ResCalc as "ResourceCalculationService" participant Ptero as "Pterodactyl API" Ctrl->>ResCalc : getLocationAvailability(locationId) -ResCalc->>Ptero : GET /nodes?filter[location_id]=... -ResCalc->>Ptero : GET /nodes/{id}?include=servers +ResCalc->>Ptero : GET /locations/{id}?include=nodes,servers ResCalc->>ResCalc : buildNodeAvailabilityFromServers(...) ResCalc-->>Ctrl : {max_available, totals, allocated, nodes[]} ``` @@ -471,4 +470,4 @@ Common issues and where to look: ## Conclusion The Dynamic Pterodactyl extension integrates seamlessly with Paymenter’s built-in Pterodactyl integration through a companion extension pattern. Its event-driven architecture hooks into cart and invoice lifecycles to manage short-lived reservations backed by pessimistic database locking. The service-oriented design cleanly separates API concerns, business logic, and data models, while real-time API calls guarantee accurate availability. Strict reservation lifecycle states and admin-only exposure of node-level data further strengthen reliability and security. -[No sources needed since this section summarizes without analyzing specific files] \ No newline at end of file +[No sources needed since this section summarizes without analyzing specific files] diff --git a/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md b/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md index d0f63ec..5bdcab6 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md @@ -215,7 +215,7 @@ RSC-->>Controller : aggregated availability **Diagram sources** - [Services/ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) -- [Services/ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [Services/ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [Services/ResourceCalculationService.php:426-450](file://Services/ResourceCalculationService.php#L426-L450) **Section sources** diff --git a/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Cart Events and Listeners.md b/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Cart Events and Listeners.md index c932d7d..3f3e1c1 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Cart Events and Listeners.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Cart Events and Listeners.md @@ -320,7 +320,7 @@ API integration: **Section sources** - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) - [ResourceCalculationService.php:198-214](file://Services/ResourceCalculationService.php#L198-L214) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:452-498](file://Services/ResourceCalculationService.php#L452-L498) ### Data Model and Schema diff --git a/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Event-Driven Architecture.md b/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Event-Driven Architecture.md index 184b025..fb541f6 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Event-Driven Architecture.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Event-Driven Architecture.md @@ -345,12 +345,12 @@ G -- No --> I["Return false"] **Diagram sources** - [ResourceCalculationService.php:198-214](file://Services/ResourceCalculationService.php#L198-L214) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:500-522](file://Services/ResourceCalculationService.php#L500-L522) **Section sources** - [ResourceCalculationService.php:198-214](file://Services/ResourceCalculationService.php#L198-L214) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:500-522](file://Services/ResourceCalculationService.php#L500-L522) ### Audit Logging diff --git a/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Payment and Service Events.md b/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Payment and Service Events.md index 3e3d272..f5c9c43 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Payment and Service Events.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Payment and Service Events.md @@ -280,7 +280,7 @@ API interaction: **Section sources** - [ResourceCalculationService.php:200-214](file://Services/ResourceCalculationService.php#L200-L214) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:452-498](file://Services/ResourceCalculationService.php#L452-L498) ### AlertService: Shortfall Notifications diff --git a/.qoder/repowiki/en/content/Architecture Overview/Real-Time Integration Strategy.md b/.qoder/repowiki/en/content/Architecture Overview/Real-Time Integration Strategy.md index 2cbed0a..02ed419 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Real-Time Integration Strategy.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Real-Time Integration Strategy.md @@ -92,8 +92,7 @@ participant D as "Database" C->>R : GET /availability/{locationId} R->>A : getByLocation(locationId) A->>S : getLocationAvailability(locationId) -S->>P : GET /nodes (filtered by location) -S->>P : GET /nodes/{id}?include=servers +S->>P : GET /locations/{id}?include=nodes,servers S->>D : SUM pending reservations per node S-->>A : Location availability + max available A-->>C : Aggregate capacity response @@ -291,4 +290,4 @@ Verification steps: - [03-API.md:677-721](file://03-API.md#L677-L721) ## Conclusion -This extension integrates with Pterodactyl using a strict real-time strategy: no caching, direct API reads, and careful batching to balance accuracy and performance. Robust error handling ensures graceful degradation when the panel is unavailable, while throttling and timeouts protect both systems under load. Operational monitoring and logging provide visibility into API health and performance, enabling proactive management of capacity and reliability. \ No newline at end of file +This extension integrates with Pterodactyl using a strict real-time strategy: no caching, direct API reads, and careful batching to balance accuracy and performance. Robust error handling ensures graceful degradation when the panel is unavailable, while throttling and timeouts protect both systems under load. Operational monitoring and logging provide visibility into API health and performance, enabling proactive management of capacity and reliability. diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md index d8fba8f..96a84ee 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md @@ -90,8 +90,8 @@ C->>R : create(productId, locationId, resources) R->>D : BEGIN TRANSACTION + lockForUpdate(pending reservations) R->>N : selectBestNode(locationId, resources) N->>RC : getLocationAvailability(locationId) -RC->>P : GET /nodes, /nodes/{id}?include=servers -P-->>RC : node/server attributes +RC->>P : GET /locations/{id}?include=nodes,servers +P-->>RC : location, node, and server attributes RC->>D : SUM(pending reservations per node) RC-->>N : {nodes[], max_available} N-->>R : best node or null @@ -184,7 +184,6 @@ class ResourceCalculationService { +verifyAvailability(nodeId, requirements, excludeToken) bool -calculateNodeAvailability(node, excludeToken) array -fetchNodesInLocation(locationId) array --fetchServersOnNode(nodeId) array -getPendingReservations(nodeId, excludeToken) array } ``` @@ -321,4 +320,4 @@ Relevant behaviors: - [ResourceCalculationServiceTest.php:175-193](file://tests/Unit/ResourceCalculationServiceTest.php#L175-L193) ## Conclusion -NodeSelectionService implements a robust weighted best-fit algorithm that balances load distribution and avoids hotspots by prioritizing memory headroom, then disk, then CPU. It relies on ResourceCalculationService for real-time availability, ensuring decisions reflect the current cluster state. ReservationService orchestrates creation with strong concurrency controls, maintaining a strict reservation lifecycle. Together, these components provide reliable, scalable resource allocation across Pterodactyl nodes. \ No newline at end of file +NodeSelectionService implements a robust weighted best-fit algorithm that balances load distribution and avoids hotspots by prioritizing memory headroom, then disk, then CPU. It relies on ResourceCalculationService for real-time availability, ensuring decisions reflect the current cluster state. ReservationService orchestrates creation with strong concurrency controls, maintaining a strict reservation lifecycle. Together, these components provide reliable, scalable resource allocation across Pterodactyl nodes. diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Reservation Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Reservation Service.md index dd98851..bc2447a 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Reservation Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Reservation Service.md @@ -267,11 +267,9 @@ participant ResSvc as "ResourceCalculationService" participant Ptero as "Pterodactyl API" participant DB as "Database" Caller->>ResSvc : getLocationAvailability(location_id) -ResSvc->>Ptero : fetchNodesInLocation -Ptero-->>ResSvc : nodes -loop For each node -ResSvc->>Ptero : fetchServersOnNode -Ptero-->>ResSvc : servers +ResSvc->>Ptero : GET /locations/{id}?include=nodes,servers +Ptero-->>ResSvc : location with nodes and servers +loop For each included node ResSvc->>DB : getPendingReservations(node_id) DB-->>ResSvc : reserved resources ResSvc->>ResSvc : buildNodeAvailabilityFromServers @@ -281,13 +279,13 @@ ResSvc-->>Caller : locationData with nodes, max_available, totals **Diagram sources** - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:426-450](file://Services/ResourceCalculationService.php#L426-L450) **Section sources** - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) - [ResourceCalculationService.php:198-214](file://Services/ResourceCalculationService.php#L198-L214) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:426-450](file://Services/ResourceCalculationService.php#L426-L450) ### Data Model and Migration Evolution @@ -501,4 +499,4 @@ Operational tips: ## Conclusion The ReservationService provides a robust, concurrency-safe mechanism for reserving Pterodactyl node resources during checkout. Its strict state machine, pessimistic locking, idempotency support, and integration with event-driven workflows ensure reliable capacity management. By coordinating with NodeSelectionService and ResourceCalculationService, it assigns optimal nodes and verifies availability at critical points. The removal of the 'released' state simplifies lifecycle semantics, focusing on pending, confirmed, expired, and cancelled states. Operational visibility through auditing and alerts helps maintain system health and responsiveness. -[No sources needed since this section summarizes without analyzing specific files] \ No newline at end of file +[No sources needed since this section summarizes without analyzing specific files] diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md index 1783340..b77aa71 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md @@ -140,7 +140,7 @@ LoopNodes --> |No| ReturnLoc["Return location data"] **Section sources** - [ResourceCalculationService.php:26-141](file://Services/ResourceCalculationService.php#L26-L141) - [ResourceCalculationService.php:146-214](file://Services/ResourceCalculationService.php#L146-L214) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:452-498](file://Services/ResourceCalculationService.php#L452-L498) ### AvailabilityController diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md index 44c7e6a..3ed0163 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md @@ -141,7 +141,7 @@ Aggregate --> Return(["Return location data"]) **Diagram sources** - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) - [ResourceCalculationService.php:146-152](file://Services/ResourceCalculationService.php#L146-L152) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) **Section sources** - [ResourceCalculationService.php:26-222](file://Services/ResourceCalculationService.php#L26-L222) diff --git a/.qoder/repowiki/en/content/Core Services/Core Services.md b/.qoder/repowiki/en/content/Core Services/Core Services.md index 52a658e..6f89f0e 100644 --- a/.qoder/repowiki/en/content/Core Services/Core Services.md +++ b/.qoder/repowiki/en/content/Core Services/Core Services.md @@ -162,7 +162,7 @@ Integration points: **Section sources** - [ResourceCalculationService.php:23-222](file://Services/ResourceCalculationService.php#L23-L222) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:302-384](file://Services/ResourceCalculationService.php#L302-L384) - [ResourceCalculationService.php:452-498](file://Services/ResourceCalculationService.php#L452-L498) diff --git a/.qoder/repowiki/en/content/Core Services/NodeSelectionService.md b/.qoder/repowiki/en/content/Core Services/NodeSelectionService.md index 136dbc1..3152dfc 100644 --- a/.qoder/repowiki/en/content/Core Services/NodeSelectionService.md +++ b/.qoder/repowiki/en/content/Core Services/NodeSelectionService.md @@ -102,7 +102,7 @@ NSS-->>Caller : best node or null **Diagram sources** - [NodeSelectionService.php:22-76](file://Services/NodeSelectionService.php#L22-L76) - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) ## Detailed Component Analysis @@ -185,7 +185,7 @@ Error handling and resilience: **Section sources** - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:452-498](file://Services/ResourceCalculationService.php#L452-L498) - [ResourceCalculationServiceTest.php:53-139](file://tests/Unit/ResourceCalculationServiceTest.php#L53-L139) diff --git a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md index afec7ae..95685e9 100644 --- a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md +++ b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md @@ -89,11 +89,9 @@ participant HTTP as "HTTP Client" participant Ptero as "Pterodactyl API" participant DB as "Local DB" Caller->>RCS : getLocationAvailability(locationId[, token]) -RCS->>HTTP : GET /nodes?filter[location_id] -HTTP-->>RCS : Nodes list -loop per node -RCS->>HTTP : GET /nodes/{id}?include=servers -HTTP-->>RCS : Node + servers +RCS->>HTTP : GET /locations/{id}?include=nodes,servers +HTTP-->>RCS : Location with nodes and servers +loop per included node RCS->>DB : SUM(pending reservations for node) DB-->>RCS : Reserved totals RCS->>RCS : Compute effective totals and available @@ -150,7 +148,7 @@ Usage pattern example: - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) - [ResourceCalculationService.php:146-152](file://Services/ResourceCalculationService.php#L146-L152) - [ResourceCalculationService.php:226-245](file://Services/ResourceCalculationService.php#L226-L245) -- [ResourceCalculationService.php:247-289](file://Services/ResourceCalculationService.php#L247-L289) +- [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:500-522](file://Services/ResourceCalculationService.php#L500-L522) ### Method: buildClusterSnapshot() @@ -252,7 +250,6 @@ class ResourceCalculationService { -getPendingReservations(nodeId, excludeReservationToken) array -getPendingReservationsForNodes(nodeIds) array -fetchNodesInLocation(locationId) array --fetchServersOnNode(nodeId) array -buildNodeAvailabilityFromServers(node, servers, pendingReservations) array -fetchAllLocations() array -fetchClusterNodes() array @@ -316,7 +313,7 @@ External integrations: ## Performance Considerations - No caching: Real-time queries avoid staleness and overselling risks. -- Batched API calls: buildClusterSnapshot() uses include=servers and paginated endpoints to minimize round trips while maintaining accuracy. +- Batched API calls: getLocationAvailability() reads a location with include=nodes,servers in one request; buildClusterSnapshot() uses include=servers and paginated endpoints. - Timeouts and retries: - Default per-call timeout and connectTimeout protect against slow or hanging connections. - Retry only on transient connection errors; 429 and 5xx do not retry to respect upstream signals. @@ -358,4 +355,4 @@ Operational tips: - [api.php:17-25](file://routes/api.php#L17-L25) ## Conclusion -ResourceCalculationService provides accurate, real-time availability by querying Pterodactyl and accounting for pending reservations. Its design prioritizes correctness over speed: no caching, batched API calls, and robust error handling. Together with ReservationService and NodeSelectionService, it ensures that customers are offered realistic options and that the system prevents overselling throughout the checkout flow. \ No newline at end of file +ResourceCalculationService provides accurate, real-time availability by querying Pterodactyl and accounting for pending reservations. Its design prioritizes correctness over speed: no caching, batched API calls, and robust error handling. Together with ReservationService and NodeSelectionService, it ensures that customers are offered realistic options and that the system prevents overselling throughout the checkout flow. diff --git a/.qoder/repowiki/en/content/Deployment.md b/.qoder/repowiki/en/content/Deployment.md index bac39f0..3c9b177 100644 --- a/.qoder/repowiki/en/content/Deployment.md +++ b/.qoder/repowiki/en/content/Deployment.md @@ -137,7 +137,7 @@ Important notes: ### Environment Configuration Requirements Configure the following settings in the extension configuration: - pterodactyl_url: Full URL to your Pterodactyl panel. -- pterodactyl_api_key: Application API key from Pterodactyl admin panel. +- pterodactyl_api_key: Application API key from Pterodactyl admin panel with read access to Locations, Nodes, and Servers. - reservation_ttl: Minutes to hold reservations during checkout (default 15). Operational requirements: @@ -456,4 +456,4 @@ Deploying the Dynamic Pterodactyl extension requires careful configuration of Pt - Ensure tests are run against a dedicated test database to avoid polluting shared stores. **Section sources** -- [phpunit.xml:28-41](file://phpunit.xml#L28-L41) \ No newline at end of file +- [phpunit.xml:28-41](file://phpunit.xml#L28-L41) diff --git a/.qoder/repowiki/en/content/Getting Started.md b/.qoder/repowiki/en/content/Getting Started.md index 9ba2f6d..33b6c8e 100644 --- a/.qoder/repowiki/en/content/Getting Started.md +++ b/.qoder/repowiki/en/content/Getting Started.md @@ -229,7 +229,7 @@ SliderCfg["SliderConfigReaderService"] --> ConfigOpt["ConfigOption (dynamic_slid ## Troubleshooting Guide Common setup issues and resolutions: -- Missing Pterodactyl credentials: Ensure panel URL and API key are set in extension settings. Without them, availability checks and reservations cannot succeed. +- Missing Pterodactyl credentials: Ensure the panel URL and an application API key with Locations, Nodes, and Servers read access are set in extension settings. Without all three permissions, availability checks and reservations cannot succeed. - No sliders appearing: Use the Setup Wizard to create dynamic_slider options for the product. Verify the product has at least one slider enabled. - Availability shows zero capacity: Confirm Pterodactyl nodes have headroom for the requested resources. Check the availability endpoint for the selected location. - Reservation not created on cart add: Ensure the product has dynamic_slider options and a location is selected. Errors are logged but do not block cart operations. @@ -274,4 +274,4 @@ The Dynamic Pterodactyl extension enhances your Pterodactyl products with dynami - GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes **Section sources** -- [routes/api.php:17-40](file://routes/api.php#L17-L40) \ No newline at end of file +- [routes/api.php:17-40](file://routes/api.php#L17-L40) diff --git a/.qoder/repowiki/en/content/Testing.md b/.qoder/repowiki/en/content/Testing.md index 924b0bb..db5cc12 100644 --- a/.qoder/repowiki/en/content/Testing.md +++ b/.qoder/repowiki/en/content/Testing.md @@ -189,10 +189,8 @@ participant RCS as "ResourceCalculationService" participant H as "Http Client" participant DB as "Database" T->>RCS : getLocationAvailability(locationId, excludeToken?) -RCS->>H : GET /api/application/nodes?filter[location_id]=... -H-->>RCS : Nodes payload -RCS->>H : GET /api/application/nodes/{id}?include=servers -H-->>RCS : Servers payload +RCS->>H : GET /api/application/locations/{id}?include=nodes,servers +H-->>RCS : Location payload with nodes and servers RCS->>DB : Sum pending reservations by node DB-->>RCS : Reserved totals RCS-->>T : Availability with max_available and totals @@ -460,4 +458,4 @@ The test suite provides robust coverage across service logic, API endpoints, and - Identify slow tests by running subsets and comparing durations. - Reduce DB operations by minimizing fixture size and using in-memory databases where possible. -[No sources needed since this section provides general guidance] \ No newline at end of file +[No sources needed since this section provides general guidance] diff --git a/.qoder/repowiki/en/content/Troubleshooting.md b/.qoder/repowiki/en/content/Troubleshooting.md index 5953abc..c566124 100644 --- a/.qoder/repowiki/en/content/Troubleshooting.md +++ b/.qoder/repowiki/en/content/Troubleshooting.md @@ -120,7 +120,7 @@ Symptoms: - Error logs show connection exceptions or HTTP error codes. Root causes: -- Invalid or missing Pterodactyl URL or API key in extension settings. +- Invalid or missing Pterodactyl URL or application API key, or missing read access to Locations, Nodes, or Servers. - Network connectivity issues or firewall restrictions. - Rate limiting (HTTP 429) from Pterodactyl. - Non-JSON or malformed responses. @@ -131,7 +131,7 @@ Diagnostics: - Check throttling middleware on routes to ensure requests are not being rejected due to excessive frequency. Resolution steps: -- Verify extension settings contain a valid panel URL and application API key. +- Verify extension settings contain a valid panel URL and an application API key with Locations, Nodes, and Servers read access. - Confirm network access to the Pterodactyl panel host and port. - If encountering 429, reduce request frequency or adjust client retry/backoff behavior. - Review server logs for detailed error context when non-JSON payloads occur. @@ -358,7 +358,7 @@ Diagnostics: ### Authentication Failures Steps: -- Confirm the application API key has sufficient permissions in Pterodactyl. +- Confirm the application API key has read access to Locations, Nodes, and Servers in Pterodactyl. - Verify Authorization header usage in internal calls. - Review logs for 4xx errors indicating invalid credentials. @@ -528,4 +528,4 @@ This guide consolidates diagnosis and resolution steps for common issues in the - [AvailabilityController.php:22-69](file://Http/Controllers/Api/AvailabilityController.php#L22-L69) - [DynamicPterodactyl.php:116-126](file://DynamicPterodactyl.php#L116-L126) - [AlertService.php:33-75](file://Services/AlertService.php#L33-L75) -- [AlertService.php:128-248](file://Services/AlertService.php#L128-L248) \ No newline at end of file +- [AlertService.php:128-248](file://Services/AlertService.php#L128-L248) diff --git a/.qoder/repowiki/en/meta/repowiki-metadata.json b/.qoder/repowiki/en/meta/repowiki-metadata.json index ac050db..ea8bb38 100644 --- a/.qoder/repowiki/en/meta/repowiki-metadata.json +++ b/.qoder/repowiki/en/meta/repowiki-metadata.json @@ -1 +1 @@ -{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-86","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"247-289","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"452-498","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"53ce981e551c2c7b4b2f9bc49ee0c60654c40364","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file +{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-86","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"227-257","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"452-498","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"a979596d6efe10d64710b17a20f51f7568585f40","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file diff --git a/02-SERVICES.md b/02-SERVICES.md index b541f22..f6fb180 100644 --- a/02-SERVICES.md +++ b/02-SERVICES.md @@ -56,8 +56,8 @@ class ResourceCalculationService 'total_allocated' => ['memory' => 0, 'cpu' => 0, 'disk' => 0], ]; - foreach ($nodes as $node) { - $nodeAvailability = $this->calculateNodeAvailability($node); + foreach ($nodes as $nodeWithServers) { + $nodeAvailability = $this->calculateNodeAvailability($nodeWithServers); $locationData['nodes'][] = $nodeAvailability; // Track maximum available across all nodes @@ -90,9 +90,10 @@ class ResourceCalculationService /** * Calculate available resources for a specific node */ - public function calculateNodeAvailability(array $node): array + public function calculateNodeAvailability(array $nodeWithServers): array { - $servers = $this->fetchServersOnNode($node['id']); + $node = $nodeWithServers['node']; + $servers = $nodeWithServers['servers']; // Sum allocated resources from all servers $allocated = ['memory' => 0, 'cpu' => 0, 'disk' => 0]; @@ -227,36 +228,25 @@ class ResourceCalculationService 'Authorization' => 'Bearer ' . $this->apiKey, 'Accept' => 'application/json', 'Content-Type' => 'application/json', - ])->get("{$this->apiUrl}/api/application/nodes", [ - 'filter[location_id]' => $locationId, - 'per_page' => 100, + ])->get("{$this->apiUrl}/api/application/locations/{$locationId}", [ + 'include' => 'nodes,servers', ]); if (!$response->successful()) { - throw new \RuntimeException('Failed to fetch nodes: ' . $response->body()); + throw new \RuntimeException('Failed to fetch location: ' . $response->body()); } - - return collect($response->json('data', [])) - ->map(fn($node) => $node['attributes']) - ->toArray(); - } - - private function fetchServersOnNode(int $nodeId): array - { - $response = Http::withHeaders([ - 'Authorization' => 'Bearer ' . $this->apiKey, - 'Accept' => 'application/json', - ])->get("{$this->apiUrl}/api/application/nodes/{$nodeId}", [ - 'include' => 'servers', - ]); - - if (!$response->successful()) { - throw new \RuntimeException('Failed to fetch node details'); - } - - return collect($response->json('attributes.relationships.servers.data', [])) + + $attributes = $response->json('attributes', []); + $serversByNode = collect(data_get($attributes, 'relationships.servers.data', [])) ->map(fn($server) => $server['attributes']) - ->toArray(); + ->groupBy('node'); + + return collect(data_get($attributes, 'relationships.nodes.data', [])) + ->map(fn($node) => [ + 'node' => $node['attributes'], + 'servers' => $serversByNode->get($node['attributes']['id'], collect())->values()->all(), + ]) + ->all(); } private function getPendingReservations(int $nodeId): array diff --git a/08-ALGORITHMS.md b/08-ALGORITHMS.md index 2987eca..bc3722c 100644 --- a/08-ALGORITHMS.md +++ b/08-ALGORITHMS.md @@ -145,7 +145,7 @@ CPU is NOT overallocated (uses thread count × 100). ┌─────────────────────────────────────────────────────────────────┐ │ Pterodactyl API │ ├─────────────────────────────────────────────────────────────────┤ -│ GET /api/application/nodes/{id}?include=servers │ +│ GET /api/application/locations/{id}?include=nodes,servers │ │ │ │ Returns: │ │ - node.memory (base capacity) │ diff --git a/09-IMPLEMENTATION.md b/09-IMPLEMENTATION.md index 0539909..367a6bf 100644 --- a/09-IMPLEMENTATION.md +++ b/09-IMPLEMENTATION.md @@ -85,7 +85,7 @@ Improvement items from the 2026-04-26 audit pass: - **dp-14**: Rate-limit reservation endpoints to 10 req/min per authenticated user — ✅ Shipped (PR #17) - **dp-16**: Documentation sync: align 03-API + 05-ADMIN-UI + 09-IMPLEMENTATION with post-dp-13 architecture — ✅ Shipped (this PR) - **dp-17**: Alert delivery log + `AlertDeliveryFailed` escalation event — ✅ Shipped (PR #18) -- **dp-18**: Capacity-fanout performance: batch Pterodactyl reads in `ResourceCalculationService` to reduce O(locations × nodes) API calls in admin views — Pending +- **dp-18**: Capacity-fanout performance: batch Pterodactyl reads in `ResourceCalculationService` to reduce O(locations × nodes) API calls in admin views — ✅ Shipped (PR #20) --- diff --git a/PROGRESS.md b/PROGRESS.md index 29578ec..32dc190 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -6,9 +6,9 @@ Active implementation tracking. **Claude: Update this as you work.** ## Current Status -**Phase**: dp-20 reservation lifecycle close-out (shipped as part of dp-19) -**Last Updated**: 2026-04-28 -**Last Session**: dp-20 audit pass confirmed all 4 changes (cart-clear race fix, confirm-return logging, cleanup cron, expires_at guard) were already implemented in dp-19 commit `a861479`. All 128 tests green. Plan closed out. +**Phase**: Panel/GitHub reconciliation and Qoder Wiki refresh +**Last Updated**: 2026-08-17 +**Last Session**: Preserved the dp-20 close-out, reconciled the location availability batching work, hardened the standalone Windows test database guard, and refreshed the Qoder/GitHub Wiki documentation for the batched `locations/{id}?include=nodes,servers` flow. --- @@ -16,7 +16,7 @@ Active implementation tracking. **Claude: Update this as you work.** > **For Claude**: Read this + "Current Session State" to quickly understand where we are. -All documentation and scaffolding complete. 9 spec files + 4 support files (CLAUDE.md, DECISIONS.md, PROGRESS.md, CHANGELOG.md) + skeleton directory. Ready to begin Phase 1: Database migrations and core models. Start with 01-DATABASE.md. +All dp-NN backlog items are implemented. The active reconciliation is staged on `agent/reconcile-dynamic-and-wiki` and published as draft PR #23. Mutagen deployment remains paused until review and merge. --- @@ -67,11 +67,11 @@ All documentation and scaffolding complete. 9 spec files + 4 support files (CLAU > **Claude**: Update this frequently during work, not just at session end. > This survives compaction and helps resume quickly. -**Last checkpoint**: 2026-04-27 -**Working on**: No active task -**Status**: dp-19 shipped. `dynamicSliderGroup` Alpine wired to reservation API; guest support via `checkout` middleware; `Cart::checkout()` confirms reservations with extension-disabled fallback. CodeRabbit findings fixed (Alpine x-data fallback + obsidian theme sync). +**Last checkpoint**: 2026-08-17 +**Working on**: Draft PR #23 reconciliation and Wiki verification +**Status**: Panel changes are preserved on the reconciliation branch; Qoder Wiki pages are migrated to GitHub Wiki and refreshed for the final batched location API flow. **Current file**: PROGRESS.md -**Next action**: All dp-NN backlog items complete. Next work determined by driver. +**Next action**: Complete exact-SHA review, then merge draft PR #23 when approved. Resume Mutagen only as a separately authorized deployment step. **Blockers**: None ### This Session's Changes: From 6347021b818330bed952caf95cd89664be51c05f Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 19:44:12 +1000 Subject: [PATCH 07/30] docs: remove residual per-node wiki flow --- .../Public API Endpoints/Availability Endpoints.md | 2 +- .../Architecture Overview/Companion Extension Pattern.md | 4 ++-- .../Event-Driven Architecture/Event-Driven Architecture.md | 4 ++-- .../Service Layer Design/Resource Calculation Service.md | 6 +++--- .../Service Layer Design/Service Layer Design.md | 4 ++-- .../en/content/Core Services/ResourceCalculationService.md | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md index 1bcf6d1..cb1a8b0 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md @@ -207,7 +207,7 @@ Why node-level details are not exposed ```mermaid flowchart TD -Start(["getLocationAvailability(locationId)"]) --> FetchNodes["Fetch nodes in location"] +Start(["getLocationAvailability(locationId)"]) --> FetchNodes["Fetch location with nodes and servers"] FetchNodes --> ForEachNode{"For each node"} ForEachNode --> |Yes| CalcNode["Calculate node availability
from servers + reservations"] CalcNode --> UpdateMax["Update max_available per resource"] diff --git a/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md b/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md index 5bdcab6..8936ad7 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md @@ -201,7 +201,7 @@ participant RSC as "ResourceCalculationService" participant Ptero as "Pterodactyl API" participant DB as "Reservations DB" Controller->>RSC : getLocationAvailability(locationId) -RSC->>Ptero : GET nodes (filtered by location) +RSC->>Ptero : GET /locations/{id}?include=nodes,servers Ptero-->>RSC : nodes loop For each node RSC->>Ptero : GET node with servers @@ -363,4 +363,4 @@ Common issues and diagnostics: ## Conclusion Dynamic Pterodactyl implements a robust companion extension pattern that enhances Paymenter’s built-in Pterodactyl integration without replacing core functionality. It maintains separation of concerns by delegating pricing to core while owning reservations, availability, and alerts. The extension lifecycle is cleanly managed through installation, boot, and scheduled tasks, and it integrates deeply with Paymenter’s event system to ensure reliable checkout flows. Real-time API access, pessimistic locking, and thorough auditing provide correctness and observability, while admin tools and Filament 4 interfaces offer operational control. -[No sources needed since this section summarizes without analyzing specific files] \ No newline at end of file +[No sources needed since this section summarizes without analyzing specific files] diff --git a/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Event-Driven Architecture.md b/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Event-Driven Architecture.md index fb541f6..378c14b 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Event-Driven Architecture.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Event-Driven Architecture/Event-Driven Architecture.md @@ -333,7 +333,7 @@ Responsibilities: ```mermaid flowchart TD -A["verifyAvailability(nodeId, requirements, excludeToken)"] --> B["Fetch nodes in location"] +A["verifyAvailability(nodeId, requirements, excludeToken)"] --> B["Fetch location with nodes and servers"] B --> C["Find target node"] C --> D["Calculate node availability"] D --> E["Sum allocated resources across servers"] @@ -434,4 +434,4 @@ Operational checks: ## Conclusion The extension implements a robust, event-driven checkout flow that reserves resources during cart operations, confirms them upon payment with real-time availability checks, and maintains comprehensive audit trails. Concurrency is handled through pessimistic locking and retries, while scheduled tasks ensure data consistency. This design balances reliability, performance, and observability across the payment and provisioning workflow. -[No sources needed since this section summarizes without analyzing specific files] \ No newline at end of file +[No sources needed since this section summarizes without analyzing specific files] diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md index b77aa71..bebc0fd 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md @@ -87,7 +87,7 @@ participant D as "Local DB" C->>A : GET /availability/{locationId} A->>N : getMaxAvailable(locationId) N->>S : getLocationAvailability(locationId) -S->>P : GET nodes (filtered by location) +S->>P : GET /locations/{id}?include=nodes,servers S->>P : GET node + servers (include=servers) S->>D : SUM pending reservations (node_id, pending, not expired) S-->>N : Node availability arrays @@ -125,7 +125,7 @@ Examples of usage patterns: ```mermaid flowchart TD -Start(["getLocationAvailability"]) --> FetchNodes["Fetch nodes in location"] +Start(["getLocationAvailability"]) --> FetchNodes["Fetch location with nodes and servers"] FetchNodes --> LoopNodes{"For each node"} LoopNodes --> |Yes| CalcNode["Calculate node availability"] CalcNode --> UpdateMax["Update max_available per resource"] @@ -253,4 +253,4 @@ ResourceCalculationService delivers accurate, real-time resource availability by The service balances accuracy with performance through pagination, batching, and targeted retries, while ensuring robust error handling and safe degradation when Pterodactyl is unavailable. Customer-facing endpoints remain privacy-preserving by exposing only aggregated maxima, reserving node-level detail for administrative use. -[No sources needed since this section summarizes without analyzing specific files] \ No newline at end of file +[No sources needed since this section summarizes without analyzing specific files] diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md index 3ed0163..ef0ac3c 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md @@ -131,7 +131,7 @@ Error handling: ```mermaid flowchart TD -Start(["getLocationAvailability"]) --> FetchNodes["Fetch nodes in location"] +Start(["getLocationAvailability"]) --> FetchNodes["Fetch location with nodes and servers"] FetchNodes --> ForEachNode["For each node"] ForEachNode --> CalcNode["Calculate node availability
+ pending reservations"] CalcNode --> Aggregate["Aggregate totals and max available"] @@ -350,4 +350,4 @@ The service layer cleanly separates concerns: This design supports robust workflows across checkout, confirmation, cancellation, and monitoring, while maintaining clear boundaries and graceful degradation when external systems are unavailable. -[No sources needed since this section summarizes without analyzing specific files] \ No newline at end of file +[No sources needed since this section summarizes without analyzing specific files] diff --git a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md index 95685e9..1774501 100644 --- a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md +++ b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md @@ -132,8 +132,8 @@ Return value: - total_allocated: sum of allocated resources across nodes Processing logic: -- Fetches nodes in the location via Pterodactyl -- For each node, fetches servers and pending reservations +- Fetches the location with included nodes and servers in one Pterodactyl request +- Groups included servers by node and fetches pending reservations for each node - Computes effective totals using overallocation settings - Subtracts allocated and reserved resources to derive available - Aggregates max and totals across nodes From 1d8ce1a0053e111bbbe85e12da5e016ab1796a3f Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 20:07:57 +1000 Subject: [PATCH 08/30] fix: harden test isolation and availability errors --- DECISIONS.md | 2 +- DynamicPterodactyl.php | 2 +- .../Api/AvailabilityController.php | 9 ++-- Services/ResourceCalculationService.php | 44 ++++++++++++----- tests/AGENTS.md | 2 +- tests/Feature/AvailabilityApiTest.php | 22 +++++++++ tests/TestDatabaseGuard.php | 47 ++++++++++++++++--- tests/Unit/ResourceCalculationServiceTest.php | 22 +++++++++ tests/Unit/TestDatabaseGuardTest.php | 26 ++++++++++ 9 files changed, 153 insertions(+), 23 deletions(-) diff --git a/DECISIONS.md b/DECISIONS.md index ac54ab6..097e606 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -244,7 +244,7 @@ Unit coverage accepted for dp-06. The full Filament-action lifecycle end-to-end ### 6. Test Isolation Mandate (dp-13, Apr 2026) -Extension phpunit MUST set `CACHE_STORE=array`, `SESSION_DRIVER=array`, `QUEUE_CONNECTION=sync`, `MAIL_MAILER=array`, `BCRYPT_ROUNDS=4`, `PULSE_ENABLED=false`, `TELESCOPE_ENABLED=false` — mirroring the root `phpunit.xml`. Failure to do so risks polluting the shared Redis/file cache on a development host, corrupting the settings key read by running web workers. This caused a production outage on 2026-04-23. The `bootstrap.php` guard provides a second line of defence: it accepts only `paymenter_test`, `:memory:`, or a strictly named `dynamic-pterodactyl-test-*.sqlite` file directly inside the system temp directory. Empty database names and arbitrary SQLite paths remain forbidden. See `incidents.md` for forensics. +Extension phpunit MUST set `CACHE_STORE=array`, `SESSION_DRIVER=array`, `QUEUE_CONNECTION=sync`, `MAIL_MAILER=array`, `BCRYPT_ROUNDS=4`, `PULSE_ENABLED=false`, `TELESCOPE_ENABLED=false` — mirroring the root `phpunit.xml`. Failure to do so risks polluting the shared Redis/file cache on a development host, corrupting the settings key read by running web workers. This caused a production outage on 2026-04-23. The `bootstrap.php` guard provides a second line of defence: it requires `APP_ENV=testing` and accepts only `paymenter_test`, `:memory:`, or a strictly named `dynamic-pterodactyl-test-*.sqlite` file directly inside the system temp directory. Existing SQLite files must resolve inside that directory and have exactly one filesystem link, preventing symlink and hard-link aliases. Empty database names and arbitrary SQLite paths remain forbidden. See `incidents.md` for forensics. ### 7. SetupWizard Atomicity Contract (dp-13, Apr 2026) diff --git a/DynamicPterodactyl.php b/DynamicPterodactyl.php index 229021d..d94042a 100644 --- a/DynamicPterodactyl.php +++ b/DynamicPterodactyl.php @@ -60,7 +60,7 @@ public function getConfig($values = []): array 'name' => 'pterodactyl_api_key', 'label' => 'Pterodactyl API Key', 'type' => 'password', - 'description' => 'Application API key from Pterodactyl admin panel', + 'description' => 'Application API key with read access to Locations, Nodes, and Servers', 'required' => true, ], [ diff --git a/Http/Controllers/Api/AvailabilityController.php b/Http/Controllers/Api/AvailabilityController.php index 8b66e38..5965526 100644 --- a/Http/Controllers/Api/AvailabilityController.php +++ b/Http/Controllers/Api/AvailabilityController.php @@ -42,11 +42,12 @@ public function getByLocation(int $locationId): JsonResponse 'resource_capacity' => $resourceCapacity, ], ]); - } catch (\Exception $e) { + } catch (\Throwable $e) { + \report($e); + return response()->json([ 'success' => false, 'message' => 'Failed to fetch availability', - 'error' => $e->getMessage(), ], 500); } } @@ -60,7 +61,9 @@ public function getNodes(int $locationId): JsonResponse 'success' => true, 'data' => $locationData, ]); - } catch (\Exception $e) { + } catch (\Throwable $e) { + \report($e); + return response()->json([ 'success' => false, 'message' => 'Failed to fetch node details', diff --git a/Services/ResourceCalculationService.php b/Services/ResourceCalculationService.php index 3b66c8c..f99bacd 100644 --- a/Services/ResourceCalculationService.php +++ b/Services/ResourceCalculationService.php @@ -231,22 +231,30 @@ private function fetchNodesInLocation(int $locationId): array ['include' => 'nodes,servers'] ); - $nodesData = $response['attributes']['relationships']['nodes']['data'] ?? []; - $serversData = $response['attributes']['relationships']['servers']['data'] ?? []; + $nodesData = $this->extractRelationshipData($response, 'nodes'); + $serversData = $this->extractRelationshipData($response, 'servers'); // Group servers by node_id for per-node allocation accounting $serversByNode = []; foreach ($serversData as $server) { - $nodeId = $server['attributes']['node'] ?? null; + $attributes = is_array($server) && is_array($server['attributes'] ?? null) + ? $server['attributes'] + : null; + $nodeId = $attributes['node'] ?? null; if ($nodeId === null) { continue; } - $serversByNode[$nodeId][] = $server['attributes']; + $serversByNode[$nodeId][] = $attributes; } $nodes = []; foreach ($nodesData as $node) { - $attrs = $node['attributes']; + $attrs = is_array($node) && is_array($node['attributes'] ?? null) + ? $node['attributes'] + : null; + if ($attrs === null || ! isset($attrs['id'], $attrs['name'], $attrs['fqdn'], $attrs['memory'], $attrs['disk'])) { + continue; + } $nodeId = $attrs['id']; $nodes[] = [ 'node' => $attrs, @@ -261,9 +269,10 @@ private function buildNodeAvailabilityFromServers(array $node, array $servers, a { $allocated = ['memory' => 0, 'cpu' => 0, 'disk' => 0]; foreach ($servers as $server) { - $allocated['memory'] += $server['limits']['memory'] ?? 0; - $allocated['cpu'] += $server['limits']['cpu'] ?? 0; - $allocated['disk'] += $server['limits']['disk'] ?? 0; + $limits = is_array($server['limits'] ?? null) ? $server['limits'] : []; + $allocated['memory'] += $limits['memory'] ?? 0; + $allocated['cpu'] += $limits['cpu'] ?? 0; + $allocated['disk'] += $limits['disk'] ?? 0; } $effectiveMemory = $node['memory'] * (1 + ($node['memory_overallocate'] ?? 0) / 100); @@ -398,9 +407,22 @@ private function pterodactylGetPaginatedData(string $path, array $query = []): a private function extractRelationshipData(array $payload, string $relationship): array { - return $payload['attributes']['relationships'][$relationship]['data'] - ?? $payload['relationships'][$relationship]['data'] - ?? []; + $attributes = is_array($payload['attributes'] ?? null) ? $payload['attributes'] : []; + $relationshipSets = [ + is_array($attributes['relationships'] ?? null) ? $attributes['relationships'] : [], + is_array($payload['relationships'] ?? null) ? $payload['relationships'] : [], + ]; + + foreach ($relationshipSets as $relationships) { + $entry = is_array($relationships[$relationship] ?? null) + ? $relationships[$relationship] + : []; + if (is_array($entry['data'] ?? null)) { + return $entry['data']; + } + } + + return []; } private function emptyClusterSnapshot(): array diff --git a/tests/AGENTS.md b/tests/AGENTS.md index ba3c87d..83760d1 100644 --- a/tests/AGENTS.md +++ b/tests/AGENTS.md @@ -40,7 +40,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p - Any DB-writing test must use `Illuminate\Foundation\Testing\DatabaseTransactions`; this includes DB-backed `Unit/` tests and all current API feature tests. - Feature API tests must `require __DIR__ . '/../../routes/api.php';` in `setUp()` because extension routes are loaded manually by `DynamicPterodactyl::boot()` at runtime. - For schedule assertions, boot the extension in the test and inspect `app(Schedule::class)->events()`; no local Job/Command classes exist. -- The bootstrap refuses unsafe databases: `DB_DATABASE` must be `paymenter_test`, `:memory:`, or a `dynamic-pterodactyl-test-*.sqlite` file directly inside the system temp directory before Laravel boots. An empty value is rejected so the application cannot fall through to a production `.env` database after the guard runs. +- The bootstrap refuses unsafe databases and requires `APP_ENV=testing`. `DB_DATABASE` must be `paymenter_test`, `:memory:`, or a `dynamic-pterodactyl-test-*.sqlite` file directly inside the system temp directory before Laravel boots. An empty value is rejected, and existing SQLite files must resolve inside that directory with exactly one filesystem link. - `phpunit.xml` fixes testing env, `MAIL_MAILER=array`, `SESSION_DRIVER=array`, `CACHE_STORE=array` with legacy `CACHE_DRIVER=file`, sync queue, and service-source warning restrictions. - Use shared fixture helpers before creating local copies: `standardResources()`, `createNodeData()`, `createConfigOption()`, and per-file helpers such as configured products/cart items. - Common fakes are `Mockery` service/container bindings, `Http::fake()` with `Http::preventStrayRequests()` for panel calls, `Notification::fake()`, `Event::fake()`, `Log::spy()`, `Config::set()`, and `Gate::policy()`. diff --git a/tests/Feature/AvailabilityApiTest.php b/tests/Feature/AvailabilityApiTest.php index 34a9786..54504a2 100644 --- a/tests/Feature/AvailabilityApiTest.php +++ b/tests/Feature/AvailabilityApiTest.php @@ -78,6 +78,28 @@ public function test_has_capacity_true_when_all_resources_positive(): void 'Customer availability response must not expose node-level data'); } + public function test_customer_failure_response_does_not_expose_internal_exception(): void + { + /** @var User $user */ + $user = User::factory()->create(); + + $nodeService = Mockery::mock(NodeSelectionService::class); + $nodeService->shouldReceive('getMaxAvailable') + ->once() + ->with(1) + ->andThrow(new \RuntimeException('panel-internal-host:8080 failed')); + $this->app->instance(NodeSelectionService::class, $nodeService); + $this->app->instance(ResourceCalculationService::class, Mockery::mock(ResourceCalculationService::class)); + + $response = $this->actingAs($user)->getJson('/api/dynamic-pterodactyl/availability/1'); + + $response->assertStatus(500)->assertExactJson([ + 'success' => false, + 'message' => 'Failed to fetch availability', + ]); + $this->assertStringNotContainsString('panel-internal-host', $response->getContent()); + } + private function bindAvailabilityServices(array $maxAvailable): void { $nodeService = Mockery::mock(NodeSelectionService::class); diff --git a/tests/TestDatabaseGuard.php b/tests/TestDatabaseGuard.php index 12ed6e0..eda2b4f 100644 --- a/tests/TestDatabaseGuard.php +++ b/tests/TestDatabaseGuard.php @@ -6,11 +6,15 @@ final class TestDatabaseGuard { public static function allows(string $database, string $connection, string $environment): bool { + if ($environment !== 'testing') { + return false; + } + if ($database === 'paymenter_test') { - return true; + return in_array($connection, ['mysql', 'mariadb'], true); } - if ($environment !== 'testing' || $connection !== 'sqlite') { + if ($connection !== 'sqlite') { return false; } @@ -21,9 +25,40 @@ public static function allows(string $database, string $connection, string $envi $databaseDirectory = realpath(dirname($database)); $temporaryDirectory = realpath(sys_get_temp_dir()); - return $databaseDirectory !== false - && $temporaryDirectory !== false - && strcasecmp($databaseDirectory, $temporaryDirectory) === 0 - && preg_match('/^dynamic-pterodactyl-test-[a-z0-9-]+\.sqlite$/i', basename($database)) === 1; + if ($databaseDirectory === false + || $temporaryDirectory === false + ) { + return false; + } + + $pathsMatch = PHP_OS_FAMILY === 'Windows' + ? strcasecmp($databaseDirectory, $temporaryDirectory) === 0 + : $databaseDirectory === $temporaryDirectory; + + if (! $pathsMatch + || preg_match('/^dynamic-pterodactyl-test-[a-z0-9-]+\.sqlite$/i', basename($database)) !== 1 + ) { + return false; + } + + if (! file_exists($database)) { + return true; + } + + $resolvedDatabase = realpath($database); + $fileStatus = @stat($database); + + return ! is_link($database) + && $resolvedDatabase !== false + && self::pathsEqual(dirname($resolvedDatabase), $temporaryDirectory) + && is_array($fileStatus) + && ($fileStatus['nlink'] ?? 0) === 1; + } + + private static function pathsEqual(string $left, string $right): bool + { + return PHP_OS_FAMILY === 'Windows' + ? strcasecmp($left, $right) === 0 + : $left === $right; } } diff --git a/tests/Unit/ResourceCalculationServiceTest.php b/tests/Unit/ResourceCalculationServiceTest.php index 62f2474..c846bf8 100644 --- a/tests/Unit/ResourceCalculationServiceTest.php +++ b/tests/Unit/ResourceCalculationServiceTest.php @@ -220,6 +220,28 @@ public function test_location_availability_groups_included_servers_by_node(): vo $this->assertSame(['memory' => 7168, 'cpu' => 350, 'disk' => 46080], $result['nodes'][0]['available']); } + public function test_location_availability_ignores_malformed_included_relationships(): void + { + Http::fake([ + 'panel.example.com/*' => Http::response([ + 'object' => 'location', + 'attributes' => [ + 'id' => 1, + 'relationships' => [ + 'nodes' => ['data' => 'not-an-array'], + 'servers' => ['data' => [['attributes' => 'not-an-array']]], + ], + ], + ], 200), + ]); + + $result = $this->service->getLocationAvailability(1); + + Http::assertSentCount(1); + $this->assertSame([], $result['nodes']); + $this->assertSame(['memory' => 0, 'cpu' => 0, 'disk' => 0], $result['max_available']); + } + public function test_snapshot_with_single_location_single_node(): void { $calls = 0; diff --git a/tests/Unit/TestDatabaseGuardTest.php b/tests/Unit/TestDatabaseGuardTest.php index 18e721c..ffd2bc2 100644 --- a/tests/Unit/TestDatabaseGuardTest.php +++ b/tests/Unit/TestDatabaseGuardTest.php @@ -40,4 +40,30 @@ public function test_rejects_empty_database_name_before_application_boot(): void { $this->assertFalse(TestDatabaseGuard::allows('', 'sqlite', 'testing')); } + + public function test_rejects_paymenter_test_database_outside_testing_environment(): void + { + $this->assertFalse(TestDatabaseGuard::allows('paymenter_test', 'mysql', 'production')); + $this->assertTrue(TestDatabaseGuard::allows('paymenter_test', 'mariadb', 'testing')); + } + + public function test_rejects_hard_linked_sqlite_alias(): void + { + $suffix = bin2hex(random_bytes(6)); + $sourceDirectory = sys_get_temp_dir().DIRECTORY_SEPARATOR.'database-guard-source-'.$suffix; + $source = $sourceDirectory.DIRECTORY_SEPARATOR.'valuable.sqlite'; + $alias = sys_get_temp_dir().DIRECTORY_SEPARATOR.'dynamic-pterodactyl-test-hardlink-'.$suffix.'.sqlite'; + + mkdir($sourceDirectory); + file_put_contents($source, 'must not be treated as a disposable test database'); + $this->assertTrue(link($source, $alias)); + + try { + $this->assertFalse(TestDatabaseGuard::allows($alias, 'sqlite', 'testing')); + } finally { + unlink($alias); + unlink($source); + rmdir($sourceDirectory); + } + } } From c34192ea4aa521dc8ee59ede45b38a0459c2fed8 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 20:08:02 +1000 Subject: [PATCH 09/30] docs: remove final per-node availability remnants --- .../Architecture Overview/Companion Extension Pattern.md | 6 ++---- .../Service Layer Design/Resource Calculation Service.md | 1 - .../Service Layer Design/Service Layer Design.md | 2 +- .qoder/repowiki/en/content/Core Services/Core Services.md | 4 ++-- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md b/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md index 8936ad7..3d9d4df 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md @@ -202,10 +202,8 @@ participant Ptero as "Pterodactyl API" participant DB as "Reservations DB" Controller->>RSC : getLocationAvailability(locationId) RSC->>Ptero : GET /locations/{id}?include=nodes,servers -Ptero-->>RSC : nodes -loop For each node -RSC->>Ptero : GET node with servers -Ptero-->>RSC : servers +Ptero-->>RSC : location with nodes and servers +loop For each included node RSC->>DB : SUM pending reservations for node DB-->>RSC : reserved amounts RSC->>RSC : compute available = effective - allocated - reserved diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md index bebc0fd..6e286a2 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md @@ -88,7 +88,6 @@ C->>A : GET /availability/{locationId} A->>N : getMaxAvailable(locationId) N->>S : getLocationAvailability(locationId) S->>P : GET /locations/{id}?include=nodes,servers -S->>P : GET node + servers (include=servers) S->>D : SUM pending reservations (node_id, pending, not expired) S-->>N : Node availability arrays N-->>A : Max available per resource diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md index ef0ac3c..dc68163 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md @@ -95,7 +95,7 @@ participant P as "Pterodactyl API" C->>A : GET /availability/{locationId} A->>N : getMaxAvailable(locationId) N->>R : getLocationAvailability(locationId) -R->>P : GET nodes + servers (paginated) +R->>P : GET /locations/{id}?include=nodes,servers P-->>R : JSON payload R-->>N : location availability N-->>A : max_available diff --git a/.qoder/repowiki/en/content/Core Services/Core Services.md b/.qoder/repowiki/en/content/Core Services/Core Services.md index 6f89f0e..81f72ed 100644 --- a/.qoder/repowiki/en/content/Core Services/Core Services.md +++ b/.qoder/repowiki/en/content/Core Services/Core Services.md @@ -105,7 +105,7 @@ Client->>RSvc : create(productId, locationId, resources, ...) RSvc->>DB : lockForUpdate(pending reservations) RSvc->>NSvc : selectBestNode(locationId, resources) NSvc->>RCSvc : getLocationAvailability(locationId) -RCSvc->>PT : GET nodes/servers (real-time) +RCSvc->>PT : GET /locations/{id}?include=nodes,servers PT-->>RCSvc : node/server data RCSvc-->>NSvc : availability + totals NSvc-->>RSvc : selected node or null @@ -485,4 +485,4 @@ NextCfg --> Done(["End"]) **Diagram sources** - [AlertService.php:33-75](file://Services/AlertService.php#L33-L75) - [AlertService.php:77-126](file://Services/AlertService.php#L77-L126) -- [AlertService.php:128-248](file://Services/AlertService.php#L128-L248) \ No newline at end of file +- [AlertService.php:128-248](file://Services/AlertService.php#L128-L248) From 77c9807e6c258649f40319a6cee14014df2860fa Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 20:16:38 +1000 Subject: [PATCH 10/30] test: atomically claim standalone sqlite database --- DECISIONS.md | 2 +- tests/AGENTS.md | 6 ++-- tests/LaravelTestCase.php | 23 +++++++++++- tests/TestDatabaseGuard.php | 53 ++++++++++++++++++---------- tests/Unit/TestDatabaseGuardTest.php | 38 ++++++++++---------- tests/bootstrap.php | 4 +-- 6 files changed, 82 insertions(+), 44 deletions(-) diff --git a/DECISIONS.md b/DECISIONS.md index 097e606..8d184be 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -244,7 +244,7 @@ Unit coverage accepted for dp-06. The full Filament-action lifecycle end-to-end ### 6. Test Isolation Mandate (dp-13, Apr 2026) -Extension phpunit MUST set `CACHE_STORE=array`, `SESSION_DRIVER=array`, `QUEUE_CONNECTION=sync`, `MAIL_MAILER=array`, `BCRYPT_ROUNDS=4`, `PULSE_ENABLED=false`, `TELESCOPE_ENABLED=false` — mirroring the root `phpunit.xml`. Failure to do so risks polluting the shared Redis/file cache on a development host, corrupting the settings key read by running web workers. This caused a production outage on 2026-04-23. The `bootstrap.php` guard provides a second line of defence: it requires `APP_ENV=testing` and accepts only `paymenter_test`, `:memory:`, or a strictly named `dynamic-pterodactyl-test-*.sqlite` file directly inside the system temp directory. Existing SQLite files must resolve inside that directory and have exactly one filesystem link, preventing symlink and hard-link aliases. Empty database names and arbitrary SQLite paths remain forbidden. See `incidents.md` for forensics. +Extension phpunit MUST set `CACHE_STORE=array`, `SESSION_DRIVER=array`, `QUEUE_CONNECTION=sync`, `MAIL_MAILER=array`, `BCRYPT_ROUNDS=4`, `PULSE_ENABLED=false`, `TELESCOPE_ENABLED=false` — mirroring the root `phpunit.xml`. Failure to do so risks polluting the shared Redis/file cache on a development host, corrupting the settings key read by running web workers. This caused a production outage on 2026-04-23. The `bootstrap.php` guard provides a second line of defence: it requires `APP_ENV=testing` and accepts only `paymenter_test`, `:memory:`, or a new `dynamic-pterodactyl-test-*/database.sqlite` path under the system temp directory. File-backed SQLite is claimed by atomically creating its private directory and database and holding the exclusive file handle; every pre-existing path is rejected. Empty database names, arbitrary paths, and filename-based trust are forbidden. See `incidents.md` for forensics. ### 7. SetupWizard Atomicity Contract (dp-13, Apr 2026) diff --git a/tests/AGENTS.md b/tests/AGENTS.md index 83760d1..218408f 100644 --- a/tests/AGENTS.md +++ b/tests/AGENTS.md @@ -23,7 +23,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p | Task | Start at | Notes | |---|---|---| -| Harness boot / DB safety | `bootstrap.php`, `TestDatabaseGuard.php`, `../phpunit.xml` | `paymenter_test`, `:memory:`, or a strictly named disposable SQLite file in the system temp directory is enforced before app boot | +| Harness boot / DB safety | `bootstrap.php`, `TestDatabaseGuard.php`, `../phpunit.xml` | `paymenter_test`, `:memory:`, or an atomically claimed new `dynamic-pterodactyl-test-*/database.sqlite` path is enforced before app boot | | Lightweight service seam | `TestCase.php` | Mockery cleanup, `createPricingConfig()`, `createNodeData()`, `standardResources()` | | App-backed test seam | `LaravelTestCase.php` | Paymenter kernel boot, `createConfigOption()`, slider defaults, node fixtures | | Reservation state / audits | `Unit/ReservationServiceTest.php` | Mixes facade mocks and real DB assertions under transactions | @@ -40,7 +40,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p - Any DB-writing test must use `Illuminate\Foundation\Testing\DatabaseTransactions`; this includes DB-backed `Unit/` tests and all current API feature tests. - Feature API tests must `require __DIR__ . '/../../routes/api.php';` in `setUp()` because extension routes are loaded manually by `DynamicPterodactyl::boot()` at runtime. - For schedule assertions, boot the extension in the test and inspect `app(Schedule::class)->events()`; no local Job/Command classes exist. -- The bootstrap refuses unsafe databases and requires `APP_ENV=testing`. `DB_DATABASE` must be `paymenter_test`, `:memory:`, or a `dynamic-pterodactyl-test-*.sqlite` file directly inside the system temp directory before Laravel boots. An empty value is rejected, and existing SQLite files must resolve inside that directory with exactly one filesystem link. +- The bootstrap refuses unsafe databases and requires `APP_ENV=testing`. `DB_DATABASE` must be `paymenter_test`, `:memory:`, or `dynamic-pterodactyl-test-*/database.sqlite` under the system temp directory. For file-backed SQLite, the guard atomically creates a new private directory and database, holds the exclusive file handle, and rejects every pre-existing directory or database. `LaravelTestCase` migrates a newly claimed standalone SQLite database on its first application boot. - `phpunit.xml` fixes testing env, `MAIL_MAILER=array`, `SESSION_DRIVER=array`, `CACHE_STORE=array` with legacy `CACHE_DRIVER=file`, sync queue, and service-source warning restrictions. - Use shared fixture helpers before creating local copies: `standardResources()`, `createNodeData()`, `createConfigOption()`, and per-file helpers such as configured products/cart items. - Common fakes are `Mockery` service/container bindings, `Http::fake()` with `Http::preventStrayRequests()` for panel calls, `Notification::fake()`, `Event::fake()`, `Log::spy()`, `Config::set()`, and `Gate::policy()`. @@ -55,7 +55,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p - Do not put app/factory/facade tests on raw `TestCase` except the existing separate-process `AlertService` facade isolation seam. - Do not claim `Unit/` files are all pure units; several intentionally boot Laravel and write DB rows. - Do not duplicate root command blocks, generic PHPUnit advice, or project-wide anti-patterns here. -- Do not broaden the database guard beyond `paymenter_test`, `:memory:`, or the validated disposable system-temp SQLite naming contract. +- Do not broaden the database guard beyond `paymenter_test`, `:memory:`, or an atomically claimed new system-temp SQLite directory. Never infer disposability from a pre-existing filename. - Do not add live Pterodactyl network calls; fake panel HTTP explicitly and prevent strays when testing capacity reads. - Do not expose or assert full reservation tokens in audit payloads; assert `token_prefix` behavior. - Current direct coverage gaps to watch: `CartItemCreatedListener`, `ServiceCreatedListener`, `PricingController::getConfig()`, and `AuditLogService` retrieval methods. diff --git a/tests/LaravelTestCase.php b/tests/LaravelTestCase.php index c6446ab..25e5000 100644 --- a/tests/LaravelTestCase.php +++ b/tests/LaravelTestCase.php @@ -7,6 +7,8 @@ abstract class LaravelTestCase extends BaseTestCase { + private static bool $standaloneSqliteMigrated = false; + /** * Creates the application. */ @@ -26,7 +28,26 @@ public function createApplication() } $app = require $bootstrap; - $app->make(Kernel::class)->bootstrap(); + $kernel = $app->make(Kernel::class); + $kernel->bootstrap(); + + $database = getenv('DB_DATABASE') ?: ($_ENV['DB_DATABASE'] ?? ''); + if (! self::$standaloneSqliteMigrated + && (getenv('DB_CONNECTION') ?: ($_ENV['DB_CONNECTION'] ?? '')) === 'sqlite' + && $database !== ':memory:' + ) { + $kernel->call('migrate', [ + '--database' => 'sqlite', + '--force' => true, + ]); + $kernel->call('migrate', [ + '--database' => 'sqlite', + '--path' => dirname(__DIR__).'/database/migrations', + '--realpath' => true, + '--force' => true, + ]); + self::$standaloneSqliteMigrated = true; + } return $app; } diff --git a/tests/TestDatabaseGuard.php b/tests/TestDatabaseGuard.php index eda2b4f..7420301 100644 --- a/tests/TestDatabaseGuard.php +++ b/tests/TestDatabaseGuard.php @@ -4,7 +4,10 @@ final class TestDatabaseGuard { - public static function allows(string $database, string $connection, string $environment): bool + /** @var array */ + private static array $claimedDatabaseHandles = []; + + public static function claim(string $database, string $connection, string $environment): bool { if ($environment !== 'testing') { return false; @@ -22,37 +25,51 @@ public static function allows(string $database, string $connection, string $envi return true; } - $databaseDirectory = realpath(dirname($database)); + return self::claimDisposableSqliteDatabase($database); + } + + private static function claimDisposableSqliteDatabase(string $database): bool + { + $databaseDirectory = dirname($database); + $directoryParent = realpath(dirname($databaseDirectory)); $temporaryDirectory = realpath(sys_get_temp_dir()); - if ($databaseDirectory === false + if ($directoryParent === false || $temporaryDirectory === false + || ! self::pathsEqual($directoryParent, $temporaryDirectory) + || preg_match('/^dynamic-pterodactyl-test-[a-z0-9-]+$/i', basename($databaseDirectory)) !== 1 + || basename($database) !== 'database.sqlite' ) { return false; } - $pathsMatch = PHP_OS_FAMILY === 'Windows' - ? strcasecmp($databaseDirectory, $temporaryDirectory) === 0 - : $databaseDirectory === $temporaryDirectory; + if (! @mkdir($databaseDirectory, 0700)) { + return false; + } + + $resolvedDirectory = realpath($databaseDirectory); + if ($resolvedDirectory === false || ! self::pathsEqual(dirname($resolvedDirectory), $temporaryDirectory)) { + @rmdir($databaseDirectory); - if (! $pathsMatch - || preg_match('/^dynamic-pterodactyl-test-[a-z0-9-]+\.sqlite$/i', basename($database)) !== 1 - ) { return false; } - if (! file_exists($database)) { - return true; + $handle = @fopen($database, 'x+b'); + $fileStatus = $handle === false ? false : fstat($handle); + + if ($handle === false || ! is_array($fileStatus) || ($fileStatus['nlink'] ?? 0) !== 1) { + if (is_resource($handle)) { + fclose($handle); + } + @unlink($database); + @rmdir($databaseDirectory); + + return false; } - $resolvedDatabase = realpath($database); - $fileStatus = @stat($database); + self::$claimedDatabaseHandles[$database] = $handle; - return ! is_link($database) - && $resolvedDatabase !== false - && self::pathsEqual(dirname($resolvedDatabase), $temporaryDirectory) - && is_array($fileStatus) - && ($fileStatus['nlink'] ?? 0) === 1; + return true; } private static function pathsEqual(string $left, string $right): bool diff --git a/tests/Unit/TestDatabaseGuardTest.php b/tests/Unit/TestDatabaseGuardTest.php index ffd2bc2..eb94cc5 100644 --- a/tests/Unit/TestDatabaseGuardTest.php +++ b/tests/Unit/TestDatabaseGuardTest.php @@ -16,7 +16,7 @@ public function test_rejects_existing_arbitrary_sqlite_database(): void rename($temporaryFile, $database); try { - $this->assertFalse(TestDatabaseGuard::allows($database, 'sqlite', 'testing')); + $this->assertFalse(TestDatabaseGuard::claim($database, 'sqlite', 'testing')); } finally { unlink($database); } @@ -24,46 +24,46 @@ public function test_rejects_existing_arbitrary_sqlite_database(): void public function test_allows_disposable_sqlite_database_in_system_temp_directory(): void { - $database = sys_get_temp_dir().DIRECTORY_SEPARATOR.'dynamic-pterodactyl-test-example.sqlite'; + $database = sys_get_temp_dir().DIRECTORY_SEPARATOR.'dynamic-pterodactyl-test-'.bin2hex(random_bytes(6)) + .DIRECTORY_SEPARATOR.'database.sqlite'; - $this->assertTrue(TestDatabaseGuard::allows($database, 'sqlite', 'testing')); + $this->assertTrue(TestDatabaseGuard::claim($database, 'sqlite', 'testing')); + $this->assertFileExists($database); } public function test_rejects_disposable_name_outside_system_temp_directory(): void { - $database = dirname(sys_get_temp_dir()).DIRECTORY_SEPARATOR.'dynamic-pterodactyl-test-example.sqlite'; + $database = dirname(sys_get_temp_dir()).DIRECTORY_SEPARATOR.'dynamic-pterodactyl-test-example' + .DIRECTORY_SEPARATOR.'database.sqlite'; - $this->assertFalse(TestDatabaseGuard::allows($database, 'sqlite', 'testing')); + $this->assertFalse(TestDatabaseGuard::claim($database, 'sqlite', 'testing')); } public function test_rejects_empty_database_name_before_application_boot(): void { - $this->assertFalse(TestDatabaseGuard::allows('', 'sqlite', 'testing')); + $this->assertFalse(TestDatabaseGuard::claim('', 'sqlite', 'testing')); } public function test_rejects_paymenter_test_database_outside_testing_environment(): void { - $this->assertFalse(TestDatabaseGuard::allows('paymenter_test', 'mysql', 'production')); - $this->assertTrue(TestDatabaseGuard::allows('paymenter_test', 'mariadb', 'testing')); + $this->assertFalse(TestDatabaseGuard::claim('paymenter_test', 'mysql', 'production')); + $this->assertTrue(TestDatabaseGuard::claim('paymenter_test', 'mariadb', 'testing')); } - public function test_rejects_hard_linked_sqlite_alias(): void + public function test_rejects_pre_existing_disposable_database_directory(): void { $suffix = bin2hex(random_bytes(6)); - $sourceDirectory = sys_get_temp_dir().DIRECTORY_SEPARATOR.'database-guard-source-'.$suffix; - $source = $sourceDirectory.DIRECTORY_SEPARATOR.'valuable.sqlite'; - $alias = sys_get_temp_dir().DIRECTORY_SEPARATOR.'dynamic-pterodactyl-test-hardlink-'.$suffix.'.sqlite'; + $databaseDirectory = sys_get_temp_dir().DIRECTORY_SEPARATOR.'dynamic-pterodactyl-test-existing-'.$suffix; + $database = $databaseDirectory.DIRECTORY_SEPARATOR.'database.sqlite'; - mkdir($sourceDirectory); - file_put_contents($source, 'must not be treated as a disposable test database'); - $this->assertTrue(link($source, $alias)); + mkdir($databaseDirectory); + file_put_contents($database, 'must not be treated as a disposable test database'); try { - $this->assertFalse(TestDatabaseGuard::allows($alias, 'sqlite', 'testing')); + $this->assertFalse(TestDatabaseGuard::claim($database, 'sqlite', 'testing')); } finally { - unlink($alias); - unlink($source); - rmdir($sourceDirectory); + unlink($database); + rmdir($databaseDirectory); } } } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index c3c14d8..a43b01f 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -26,13 +26,13 @@ $connection = getenv('DB_CONNECTION') ?: ($_ENV['DB_CONNECTION'] ?? ''); $appEnvironment = getenv('APP_ENV') ?: ($_ENV['APP_ENV'] ?? ''); -if (! \Paymenter\Extensions\Others\DynamicPterodactyl\Tests\TestDatabaseGuard::allows( +if (! \Paymenter\Extensions\Others\DynamicPterodactyl\Tests\TestDatabaseGuard::claim( $db, $connection, $appEnvironment, )) { fwrite(STDERR, "ABORT: phpunit would run against DB_DATABASE='$db'. " - . "Expected 'paymenter_test', ':memory:', or a disposable dynamic-pterodactyl-test-*.sqlite file in the system temp directory. " + . "Expected 'paymenter_test', ':memory:', or a new system-temp dynamic-pterodactyl-test-*/database.sqlite path claimed by this process. " . "See .sisyphus/notepads/dp-11-authorization-surface-reduction/incidents.md.\n"); exit(2); } From 2a9c3a4ba9aa6489e7cb85e36f3588338befcc6a Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 20:16:45 +1000 Subject: [PATCH 11/30] fix: fail closed on malformed availability payloads --- Services/ResourceCalculationService.php | 30 ++++++++++--- tests/Unit/ResourceCalculationServiceTest.php | 44 ++++++++++++++++--- 2 files changed, 64 insertions(+), 10 deletions(-) diff --git a/Services/ResourceCalculationService.php b/Services/ResourceCalculationService.php index f99bacd..2f89946 100644 --- a/Services/ResourceCalculationService.php +++ b/Services/ResourceCalculationService.php @@ -231,8 +231,8 @@ private function fetchNodesInLocation(int $locationId): array ['include' => 'nodes,servers'] ); - $nodesData = $this->extractRelationshipData($response, 'nodes'); - $serversData = $this->extractRelationshipData($response, 'servers'); + $nodesData = $this->requireRelationshipData($response, 'nodes'); + $serversData = $this->requireRelationshipData($response, 'servers'); // Group servers by node_id for per-node allocation accounting $serversByNode = []; @@ -241,8 +241,8 @@ private function fetchNodesInLocation(int $locationId): array ? $server['attributes'] : null; $nodeId = $attributes['node'] ?? null; - if ($nodeId === null) { - continue; + if ($nodeId === null || ! is_array($attributes['limits'] ?? null)) { + throw new \RuntimeException('Pterodactyl API returned an invalid included server payload.'); } $serversByNode[$nodeId][] = $attributes; } @@ -253,7 +253,7 @@ private function fetchNodesInLocation(int $locationId): array ? $node['attributes'] : null; if ($attrs === null || ! isset($attrs['id'], $attrs['name'], $attrs['fqdn'], $attrs['memory'], $attrs['disk'])) { - continue; + throw new \RuntimeException('Pterodactyl API returned an invalid included node payload.'); } $nodeId = $attrs['id']; $nodes[] = [ @@ -425,6 +425,26 @@ private function extractRelationshipData(array $payload, string $relationship): return []; } + private function requireRelationshipData(array $payload, string $relationship): array + { + $attributes = is_array($payload['attributes'] ?? null) ? $payload['attributes'] : []; + $relationships = is_array($attributes['relationships'] ?? null) + ? $attributes['relationships'] + : []; + $entry = is_array($relationships[$relationship] ?? null) + ? $relationships[$relationship] + : null; + + if ($entry === null || ! is_array($entry['data'] ?? null)) { + throw new \RuntimeException(sprintf( + 'Pterodactyl API returned an invalid %s relationship payload.', + $relationship + )); + } + + return $entry['data']; + } + private function emptyClusterSnapshot(): array { return [ diff --git a/tests/Unit/ResourceCalculationServiceTest.php b/tests/Unit/ResourceCalculationServiceTest.php index c846bf8..11d1e80 100644 --- a/tests/Unit/ResourceCalculationServiceTest.php +++ b/tests/Unit/ResourceCalculationServiceTest.php @@ -220,7 +220,7 @@ public function test_location_availability_groups_included_servers_by_node(): vo $this->assertSame(['memory' => 7168, 'cpu' => 350, 'disk' => 46080], $result['nodes'][0]['available']); } - public function test_location_availability_ignores_malformed_included_relationships(): void + public function test_location_availability_rejects_malformed_included_relationships(): void { Http::fake([ 'panel.example.com/*' => Http::response([ @@ -235,11 +235,45 @@ public function test_location_availability_ignores_malformed_included_relationsh ], 200), ]); - $result = $this->service->getLocationAvailability(1); + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid nodes relationship payload'); - Http::assertSentCount(1); - $this->assertSame([], $result['nodes']); - $this->assertSame(['memory' => 0, 'cpu' => 0, 'disk' => 0], $result['max_available']); + $this->service->getLocationAvailability(1); + } + + public function test_location_availability_rejects_malformed_included_server_limits(): void + { + Http::fake([ + 'panel.example.com/*' => Http::response([ + 'object' => 'location', + 'attributes' => [ + 'id' => 1, + 'relationships' => [ + 'nodes' => ['data' => [[ + 'attributes' => [ + 'id' => 5, + 'name' => 'Node 5', + 'fqdn' => 'node-5.example.com', + 'memory' => 8192, + 'disk' => 51200, + 'cpu_threads' => 4, + ], + ]]], + 'servers' => ['data' => [[ + 'attributes' => [ + 'node' => 5, + 'limits' => 'not-an-array', + ], + ]]], + ], + ], + ], 200), + ]); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid included server payload'); + + $this->service->getLocationAvailability(1); } public function test_snapshot_with_single_location_single_node(): void From d21bcfcb0f0b6889c66bac0953309c2d516fb520 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 20:47:16 +1000 Subject: [PATCH 12/30] test: generate isolated standalone sqlite database --- DECISIONS.md | 2 +- tests/AGENTS.md | 6 +-- tests/TestDatabaseGuard.php | 60 ++++++++++++++++++---------- tests/Unit/TestDatabaseGuardTest.php | 18 ++++----- tests/bootstrap.php | 14 +++++-- 5 files changed, 63 insertions(+), 37 deletions(-) diff --git a/DECISIONS.md b/DECISIONS.md index 8d184be..c6fd1ba 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -244,7 +244,7 @@ Unit coverage accepted for dp-06. The full Filament-action lifecycle end-to-end ### 6. Test Isolation Mandate (dp-13, Apr 2026) -Extension phpunit MUST set `CACHE_STORE=array`, `SESSION_DRIVER=array`, `QUEUE_CONNECTION=sync`, `MAIL_MAILER=array`, `BCRYPT_ROUNDS=4`, `PULSE_ENABLED=false`, `TELESCOPE_ENABLED=false` — mirroring the root `phpunit.xml`. Failure to do so risks polluting the shared Redis/file cache on a development host, corrupting the settings key read by running web workers. This caused a production outage on 2026-04-23. The `bootstrap.php` guard provides a second line of defence: it requires `APP_ENV=testing` and accepts only `paymenter_test`, `:memory:`, or a new `dynamic-pterodactyl-test-*/database.sqlite` path under the system temp directory. File-backed SQLite is claimed by atomically creating its private directory and database and holding the exclusive file handle; every pre-existing path is rejected. Empty database names, arbitrary paths, and filename-based trust are forbidden. See `incidents.md` for forensics. +Extension phpunit MUST set `CACHE_STORE=array`, `SESSION_DRIVER=array`, `QUEUE_CONNECTION=sync`, `MAIL_MAILER=array`, `BCRYPT_ROUNDS=4`, `PULSE_ENABLED=false`, `TELESCOPE_ENABLED=false` — mirroring the root `phpunit.xml`. Failure to do so risks polluting the shared Redis/file cache on a development host, corrupting the settings key read by running web workers. This caused a production outage on 2026-04-23. The `bootstrap.php` guard provides a second line of defence: it requires `APP_ENV=testing` and accepts only `paymenter_test`, `:memory:`, or the `:temporary:` sentinel. The sentinel generates an unpredictable private system-temp directory, atomically creates the SQLite database, holds the exclusive file handle, and replaces `DB_DATABASE` before Paymenter boots. Caller-supplied SQLite paths, empty database names, and filename-based trust are forbidden. See `incidents.md` for forensics. ### 7. SetupWizard Atomicity Contract (dp-13, Apr 2026) diff --git a/tests/AGENTS.md b/tests/AGENTS.md index 218408f..11b8b06 100644 --- a/tests/AGENTS.md +++ b/tests/AGENTS.md @@ -23,7 +23,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p | Task | Start at | Notes | |---|---|---| -| Harness boot / DB safety | `bootstrap.php`, `TestDatabaseGuard.php`, `../phpunit.xml` | `paymenter_test`, `:memory:`, or an atomically claimed new `dynamic-pterodactyl-test-*/database.sqlite` path is enforced before app boot | +| Harness boot / DB safety | `bootstrap.php`, `TestDatabaseGuard.php`, `../phpunit.xml` | `paymenter_test`, `:memory:`, or the `:temporary:` sentinel for an internally generated SQLite database is enforced before app boot | | Lightweight service seam | `TestCase.php` | Mockery cleanup, `createPricingConfig()`, `createNodeData()`, `standardResources()` | | App-backed test seam | `LaravelTestCase.php` | Paymenter kernel boot, `createConfigOption()`, slider defaults, node fixtures | | Reservation state / audits | `Unit/ReservationServiceTest.php` | Mixes facade mocks and real DB assertions under transactions | @@ -40,7 +40,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p - Any DB-writing test must use `Illuminate\Foundation\Testing\DatabaseTransactions`; this includes DB-backed `Unit/` tests and all current API feature tests. - Feature API tests must `require __DIR__ . '/../../routes/api.php';` in `setUp()` because extension routes are loaded manually by `DynamicPterodactyl::boot()` at runtime. - For schedule assertions, boot the extension in the test and inspect `app(Schedule::class)->events()`; no local Job/Command classes exist. -- The bootstrap refuses unsafe databases and requires `APP_ENV=testing`. `DB_DATABASE` must be `paymenter_test`, `:memory:`, or `dynamic-pterodactyl-test-*/database.sqlite` under the system temp directory. For file-backed SQLite, the guard atomically creates a new private directory and database, holds the exclusive file handle, and rejects every pre-existing directory or database. `LaravelTestCase` migrates a newly claimed standalone SQLite database on its first application boot. +- The bootstrap refuses unsafe databases and requires `APP_ENV=testing`. `DB_DATABASE` must be `paymenter_test`, `:memory:`, or the `:temporary:` sentinel. For `:temporary:`, the guard generates an unpredictable private directory under the system temp directory, atomically creates the database, holds the exclusive file handle, and replaces `DB_DATABASE` before Paymenter boots. User-supplied SQLite paths are never accepted. `LaravelTestCase` migrates the claimed database on first application boot. - `phpunit.xml` fixes testing env, `MAIL_MAILER=array`, `SESSION_DRIVER=array`, `CACHE_STORE=array` with legacy `CACHE_DRIVER=file`, sync queue, and service-source warning restrictions. - Use shared fixture helpers before creating local copies: `standardResources()`, `createNodeData()`, `createConfigOption()`, and per-file helpers such as configured products/cart items. - Common fakes are `Mockery` service/container bindings, `Http::fake()` with `Http::preventStrayRequests()` for panel calls, `Notification::fake()`, `Event::fake()`, `Log::spy()`, `Config::set()`, and `Gate::policy()`. @@ -55,7 +55,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p - Do not put app/factory/facade tests on raw `TestCase` except the existing separate-process `AlertService` facade isolation seam. - Do not claim `Unit/` files are all pure units; several intentionally boot Laravel and write DB rows. - Do not duplicate root command blocks, generic PHPUnit advice, or project-wide anti-patterns here. -- Do not broaden the database guard beyond `paymenter_test`, `:memory:`, or an atomically claimed new system-temp SQLite directory. Never infer disposability from a pre-existing filename. +- Do not broaden the database guard beyond `paymenter_test`, `:memory:`, or the internally generated `:temporary:` workflow. Never accept a caller-supplied SQLite path or infer disposability from a filename. - Do not add live Pterodactyl network calls; fake panel HTTP explicitly and prevent strays when testing capacity reads. - Do not expose or assert full reservation tokens in audit payloads; assert `token_prefix` behavior. - Current direct coverage gaps to watch: `CartItemCreatedListener`, `ServiceCreatedListener`, `PricingController::getConfig()`, and `AuditLogService` retrieval methods. diff --git a/tests/TestDatabaseGuard.php b/tests/TestDatabaseGuard.php index 7420301..772fbaa 100644 --- a/tests/TestDatabaseGuard.php +++ b/tests/TestDatabaseGuard.php @@ -7,53 +7,54 @@ final class TestDatabaseGuard /** @var array */ private static array $claimedDatabaseHandles = []; - public static function claim(string $database, string $connection, string $environment): bool + private static bool $cleanupRegistered = false; + + public static function claim(string $database, string $connection, string $environment): ?string { if ($environment !== 'testing') { - return false; + return null; } if ($database === 'paymenter_test') { - return in_array($connection, ['mysql', 'mariadb'], true); + return in_array($connection, ['mysql', 'mariadb'], true) ? $database : null; } if ($connection !== 'sqlite') { - return false; + return null; } if ($database === ':memory:') { - return true; + return $database; + } + + if ($database !== ':temporary:') { + return null; } - return self::claimDisposableSqliteDatabase($database); + return self::claimDisposableSqliteDatabase(); } - private static function claimDisposableSqliteDatabase(string $database): bool + private static function claimDisposableSqliteDatabase(): ?string { - $databaseDirectory = dirname($database); - $directoryParent = realpath(dirname($databaseDirectory)); $temporaryDirectory = realpath(sys_get_temp_dir()); - - if ($directoryParent === false - || $temporaryDirectory === false - || ! self::pathsEqual($directoryParent, $temporaryDirectory) - || preg_match('/^dynamic-pterodactyl-test-[a-z0-9-]+$/i', basename($databaseDirectory)) !== 1 - || basename($database) !== 'database.sqlite' - ) { - return false; + if ($temporaryDirectory === false) { + return null; } + $databaseDirectory = $temporaryDirectory.DIRECTORY_SEPARATOR + .'dynamic-pterodactyl-test-'.bin2hex(random_bytes(16)); if (! @mkdir($databaseDirectory, 0700)) { - return false; + return null; } $resolvedDirectory = realpath($databaseDirectory); if ($resolvedDirectory === false || ! self::pathsEqual(dirname($resolvedDirectory), $temporaryDirectory)) { @rmdir($databaseDirectory); - return false; + return null; } + $database = $resolvedDirectory.DIRECTORY_SEPARATOR.'database.sqlite'; $handle = @fopen($database, 'x+b'); $fileStatus = $handle === false ? false : fstat($handle); @@ -64,12 +65,29 @@ private static function claimDisposableSqliteDatabase(string $database): bool @unlink($database); @rmdir($databaseDirectory); - return false; + return null; } self::$claimedDatabaseHandles[$database] = $handle; + if (! self::$cleanupRegistered) { + register_shutdown_function(static function (): void { + self::releaseClaims(); + }); + self::$cleanupRegistered = true; + } + + return $database; + } + + private static function releaseClaims(): void + { + foreach (self::$claimedDatabaseHandles as $database => $handle) { + fclose($handle); + @unlink($database); + @rmdir(dirname($database)); + } - return true; + self::$claimedDatabaseHandles = []; } private static function pathsEqual(string $left, string $right): bool diff --git a/tests/Unit/TestDatabaseGuardTest.php b/tests/Unit/TestDatabaseGuardTest.php index eb94cc5..48a3970 100644 --- a/tests/Unit/TestDatabaseGuardTest.php +++ b/tests/Unit/TestDatabaseGuardTest.php @@ -16,7 +16,7 @@ public function test_rejects_existing_arbitrary_sqlite_database(): void rename($temporaryFile, $database); try { - $this->assertFalse(TestDatabaseGuard::claim($database, 'sqlite', 'testing')); + $this->assertNull(TestDatabaseGuard::claim($database, 'sqlite', 'testing')); } finally { unlink($database); } @@ -24,10 +24,10 @@ public function test_rejects_existing_arbitrary_sqlite_database(): void public function test_allows_disposable_sqlite_database_in_system_temp_directory(): void { - $database = sys_get_temp_dir().DIRECTORY_SEPARATOR.'dynamic-pterodactyl-test-'.bin2hex(random_bytes(6)) - .DIRECTORY_SEPARATOR.'database.sqlite'; + $database = TestDatabaseGuard::claim(':temporary:', 'sqlite', 'testing'); - $this->assertTrue(TestDatabaseGuard::claim($database, 'sqlite', 'testing')); + $this->assertIsString($database); + $this->assertStringStartsWith(realpath(sys_get_temp_dir()).DIRECTORY_SEPARATOR, $database); $this->assertFileExists($database); } @@ -36,18 +36,18 @@ public function test_rejects_disposable_name_outside_system_temp_directory(): vo $database = dirname(sys_get_temp_dir()).DIRECTORY_SEPARATOR.'dynamic-pterodactyl-test-example' .DIRECTORY_SEPARATOR.'database.sqlite'; - $this->assertFalse(TestDatabaseGuard::claim($database, 'sqlite', 'testing')); + $this->assertNull(TestDatabaseGuard::claim($database, 'sqlite', 'testing')); } public function test_rejects_empty_database_name_before_application_boot(): void { - $this->assertFalse(TestDatabaseGuard::claim('', 'sqlite', 'testing')); + $this->assertNull(TestDatabaseGuard::claim('', 'sqlite', 'testing')); } public function test_rejects_paymenter_test_database_outside_testing_environment(): void { - $this->assertFalse(TestDatabaseGuard::claim('paymenter_test', 'mysql', 'production')); - $this->assertTrue(TestDatabaseGuard::claim('paymenter_test', 'mariadb', 'testing')); + $this->assertNull(TestDatabaseGuard::claim('paymenter_test', 'mysql', 'production')); + $this->assertSame('paymenter_test', TestDatabaseGuard::claim('paymenter_test', 'mariadb', 'testing')); } public function test_rejects_pre_existing_disposable_database_directory(): void @@ -60,7 +60,7 @@ public function test_rejects_pre_existing_disposable_database_directory(): void file_put_contents($database, 'must not be treated as a disposable test database'); try { - $this->assertFalse(TestDatabaseGuard::claim($database, 'sqlite', 'testing')); + $this->assertNull(TestDatabaseGuard::claim($database, 'sqlite', 'testing')); } finally { unlink($database); rmdir($databaseDirectory); diff --git a/tests/bootstrap.php b/tests/bootstrap.php index a43b01f..fea94a7 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -26,16 +26,24 @@ $connection = getenv('DB_CONNECTION') ?: ($_ENV['DB_CONNECTION'] ?? ''); $appEnvironment = getenv('APP_ENV') ?: ($_ENV['APP_ENV'] ?? ''); -if (! \Paymenter\Extensions\Others\DynamicPterodactyl\Tests\TestDatabaseGuard::claim( +$claimedDatabase = \Paymenter\Extensions\Others\DynamicPterodactyl\Tests\TestDatabaseGuard::claim( $db, $connection, $appEnvironment, -)) { +); + +if ($claimedDatabase === null) { fwrite(STDERR, "ABORT: phpunit would run against DB_DATABASE='$db'. " - . "Expected 'paymenter_test', ':memory:', or a new system-temp dynamic-pterodactyl-test-*/database.sqlite path claimed by this process. " + . "Expected 'paymenter_test', ':memory:', or ':temporary:' for an internally generated standalone SQLite database. " . "See .sisyphus/notepads/dp-11-authorization-surface-reduction/incidents.md.\n"); exit(2); } +if ($claimedDatabase !== $db) { + putenv("DB_DATABASE={$claimedDatabase}"); + $_ENV['DB_DATABASE'] = $claimedDatabase; + $_SERVER['DB_DATABASE'] = $claimedDatabase; +} + require __DIR__ . '/TestCase.php'; require __DIR__ . '/LaravelTestCase.php'; From 6ebc7ce7bc21846792f615dd1de6faeeeb8edb7f Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 20:47:16 +1000 Subject: [PATCH 13/30] fix: reject incomplete capacity payloads --- Services/ResourceCalculationService.php | 195 ++++++++++++------ tests/Unit/ResourceCalculationServiceTest.php | 146 ++++++++++++- 2 files changed, 263 insertions(+), 78 deletions(-) diff --git a/Services/ResourceCalculationService.php b/Services/ResourceCalculationService.php index 2f89946..3ed524b 100644 --- a/Services/ResourceCalculationService.php +++ b/Services/ResourceCalculationService.php @@ -234,30 +234,26 @@ private function fetchNodesInLocation(int $locationId): array $nodesData = $this->requireRelationshipData($response, 'nodes'); $serversData = $this->requireRelationshipData($response, 'servers'); - // Group servers by node_id for per-node allocation accounting + $nodesById = []; + foreach ($nodesData as $node) { + $attributes = $this->requireNodeAttributes($node); + $nodesById[$attributes['id']] = $attributes; + } + $serversByNode = []; foreach ($serversData as $server) { - $attributes = is_array($server) && is_array($server['attributes'] ?? null) - ? $server['attributes'] - : null; - $nodeId = $attributes['node'] ?? null; - if ($nodeId === null || ! is_array($attributes['limits'] ?? null)) { - throw new \RuntimeException('Pterodactyl API returned an invalid included server payload.'); + $attributes = $this->requireServerAttributes($server); + $nodeId = $attributes['node']; + if (! array_key_exists($nodeId, $nodesById)) { + throw new \RuntimeException('Pterodactyl API returned a server for an unknown included node.'); } $serversByNode[$nodeId][] = $attributes; } $nodes = []; - foreach ($nodesData as $node) { - $attrs = is_array($node) && is_array($node['attributes'] ?? null) - ? $node['attributes'] - : null; - if ($attrs === null || ! isset($attrs['id'], $attrs['name'], $attrs['fqdn'], $attrs['memory'], $attrs['disk'])) { - throw new \RuntimeException('Pterodactyl API returned an invalid included node payload.'); - } - $nodeId = $attrs['id']; + foreach ($nodesById as $nodeId => $attributes) { $nodes[] = [ - 'node' => $attrs, + 'node' => $attributes, 'servers' => $serversByNode[$nodeId] ?? [], ]; } @@ -267,17 +263,19 @@ private function fetchNodesInLocation(int $locationId): array private function buildNodeAvailabilityFromServers(array $node, array $servers, array $pendingReservations): array { + $this->validateNodeAttributes($node); + $allocated = ['memory' => 0, 'cpu' => 0, 'disk' => 0]; foreach ($servers as $server) { - $limits = is_array($server['limits'] ?? null) ? $server['limits'] : []; - $allocated['memory'] += $limits['memory'] ?? 0; - $allocated['cpu'] += $limits['cpu'] ?? 0; - $allocated['disk'] += $limits['disk'] ?? 0; + $this->validateServerAttributes($server); + $allocated['memory'] += $server['limits']['memory']; + $allocated['cpu'] += $server['limits']['cpu']; + $allocated['disk'] += $server['limits']['disk']; } $effectiveMemory = $node['memory'] * (1 + ($node['memory_overallocate'] ?? 0) / 100); $effectiveDisk = $node['disk'] * (1 + ($node['disk_overallocate'] ?? 0) / 100); - $effectiveCpu = ($node['cpu_threads'] ?? 4) * 100; + $effectiveCpu = $node['cpu_threads'] * 100; $available = [ 'memory' => max(0, (int) $effectiveMemory - $allocated['memory'] - $pendingReservations['memory']), @@ -336,43 +334,52 @@ private function fetchClusterNodes(): array private function fetchClusterNodesWithIncludedServers(): array { - return \collect($this->pterodactylGetPaginatedData('/api/application/nodes', [ + $nodes = []; + foreach ($this->pterodactylGetPaginatedData('/api/application/nodes', [ 'include' => 'servers', 'per_page' => 100, - ]))->mapWithKeys(function ($node) { - $attributes = $node['attributes'] ?? []; + ]) as $node) { + $attributes = $this->requireNodeAttributes($node); + $servers = []; + foreach ($this->requireRelationshipData($node, 'servers') as $server) { + $serverAttributes = $this->requireServerAttributes($server); + if ($serverAttributes['node'] !== $attributes['id']) { + throw new \RuntimeException('Pterodactyl API returned a server for an unexpected node.'); + } + $servers[] = $serverAttributes; + } - return [ - $attributes['id'] => [ - 'node' => $attributes, - 'location_id' => $attributes['location_id'], - 'servers' => \collect($this->extractRelationshipData($node, 'servers')) - ->map(fn ($server) => $server['attributes']) - ->toArray(), - ], + $nodes[$attributes['id']] = [ + 'node' => $attributes, + 'location_id' => $attributes['location_id'], + 'servers' => $servers, ]; - })->toArray(); + } + + return $nodes; } private function fetchClusterNodesFromServerIndex(): array { - $nodes = \collect($this->pterodactylGetPaginatedData('/api/application/nodes', ['per_page' => 100])) - ->mapWithKeys(fn ($node) => [ - $node['attributes']['id'] => [ - 'node' => $node['attributes'], - 'location_id' => $node['attributes']['location_id'], - 'servers' => [], - ], - ]) - ->toArray(); + $nodes = []; + foreach ($this->pterodactylGetPaginatedData('/api/application/nodes', ['per_page' => 100]) as $node) { + $attributes = $this->requireNodeAttributes($node); + $nodes[$attributes['id']] = [ + 'node' => $attributes, + 'location_id' => $attributes['location_id'], + 'servers' => [], + ]; + } foreach ($this->pterodactylGetPaginatedData('/api/application/servers', ['per_page' => 100]) as $server) { - $attributes = $server['attributes'] ?? []; - $nodeId = $attributes['node'] ?? null; + $attributes = $this->requireServerAttributes($server); + $nodeId = $attributes['node']; - if ($nodeId !== null && array_key_exists($nodeId, $nodes)) { - $nodes[$nodeId]['servers'][] = $attributes; + if (! array_key_exists($nodeId, $nodes)) { + throw new \RuntimeException('Pterodactyl API returned a server for an unknown node.'); } + + $nodes[$nodeId]['servers'][] = $attributes; } return $nodes; @@ -385,7 +392,10 @@ private function pterodactylGetPaginatedData(string $path, array $query = []): a while (true) { $payload = $this->pterodactylGet($path, array_merge($query, ['page' => $page])); - $data = array_merge($data, $payload['data'] ?? []); + if (! is_array($payload['data'] ?? null)) { + throw new \RuntimeException('Pterodactyl API returned an invalid paginated data payload.'); + } + $data = array_merge($data, $payload['data']); $pagination = $payload['meta']['pagination'] ?? null; if (! is_array($pagination)) { @@ -405,26 +415,6 @@ private function pterodactylGetPaginatedData(string $path, array $query = []): a return $data; } - private function extractRelationshipData(array $payload, string $relationship): array - { - $attributes = is_array($payload['attributes'] ?? null) ? $payload['attributes'] : []; - $relationshipSets = [ - is_array($attributes['relationships'] ?? null) ? $attributes['relationships'] : [], - is_array($payload['relationships'] ?? null) ? $payload['relationships'] : [], - ]; - - foreach ($relationshipSets as $relationships) { - $entry = is_array($relationships[$relationship] ?? null) - ? $relationships[$relationship] - : []; - if (is_array($entry['data'] ?? null)) { - return $entry['data']; - } - } - - return []; - } - private function requireRelationshipData(array $payload, string $relationship): array { $attributes = is_array($payload['attributes'] ?? null) ? $payload['attributes'] : []; @@ -445,6 +435,77 @@ private function requireRelationshipData(array $payload, string $relationship): return $entry['data']; } + private function requireNodeAttributes(mixed $payload): array + { + $attributes = is_array($payload) && is_array($payload['attributes'] ?? null) + ? $payload['attributes'] + : null; + if ($attributes === null) { + throw new \RuntimeException('Pterodactyl API returned an invalid included node payload.'); + } + + $this->validateNodeAttributes($attributes); + $attributes['id'] = (int) $attributes['id']; + $attributes['location_id'] = (int) $attributes['location_id']; + + return $attributes; + } + + private function requireServerAttributes(mixed $payload): array + { + $attributes = is_array($payload) && is_array($payload['attributes'] ?? null) + ? $payload['attributes'] + : null; + if ($attributes === null) { + throw new \RuntimeException('Pterodactyl API returned an invalid included server payload.'); + } + + $this->validateServerAttributes($attributes); + $attributes['node'] = (int) $attributes['node']; + + return $attributes; + } + + private function validateNodeAttributes(array $attributes): void + { + foreach (['id', 'location_id'] as $field) { + if (filter_var($attributes[$field] ?? null, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) === false) { + throw new \RuntimeException('Pterodactyl API returned an invalid included node payload.'); + } + } + + foreach (['memory', 'disk', 'cpu_threads'] as $field) { + if (! is_numeric($attributes[$field] ?? null) || (float) $attributes[$field] <= 0) { + throw new \RuntimeException('Pterodactyl API returned an invalid included node payload.'); + } + } + + if (! is_string($attributes['name'] ?? null) || $attributes['name'] === '' + || ! is_string($attributes['fqdn'] ?? null) || $attributes['fqdn'] === '') { + throw new \RuntimeException('Pterodactyl API returned an invalid included node payload.'); + } + + foreach (['memory_overallocate', 'disk_overallocate'] as $field) { + if (array_key_exists($field, $attributes) && ! is_numeric($attributes[$field])) { + throw new \RuntimeException('Pterodactyl API returned an invalid included node payload.'); + } + } + } + + private function validateServerAttributes(array $attributes): void + { + if (filter_var($attributes['node'] ?? null, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) === false + || ! is_array($attributes['limits'] ?? null)) { + throw new \RuntimeException('Pterodactyl API returned an invalid included server payload.'); + } + + foreach (['memory', 'cpu', 'disk'] as $field) { + if (! is_numeric($attributes['limits'][$field] ?? null) || (float) $attributes['limits'][$field] < 0) { + throw new \RuntimeException('Pterodactyl API returned an invalid included server payload.'); + } + } + } + private function emptyClusterSnapshot(): array { return [ diff --git a/tests/Unit/ResourceCalculationServiceTest.php b/tests/Unit/ResourceCalculationServiceTest.php index 11d1e80..20c4f70 100644 --- a/tests/Unit/ResourceCalculationServiceTest.php +++ b/tests/Unit/ResourceCalculationServiceTest.php @@ -204,6 +204,7 @@ public function test_location_availability_groups_included_servers_by_node(): vo ['node' => 5, 'memory' => 1024, 'cpu' => 50, 'disk' => 5120], ['node' => 6, 'memory' => 4096, 'cpu' => 200, 'disk' => 20480], ], + additionalNodeIds: [6], )); $result = $this->service->getLocationAvailability(1); @@ -218,6 +219,8 @@ public function test_location_availability_groups_included_servers_by_node(): vo }); $this->assertSame(['memory' => 1024, 'cpu' => 50, 'disk' => 5120], $result['nodes'][0]['allocated']); $this->assertSame(['memory' => 7168, 'cpu' => 350, 'disk' => 46080], $result['nodes'][0]['available']); + $this->assertSame(['memory' => 4096, 'cpu' => 200, 'disk' => 20480], $result['nodes'][1]['allocated']); + $this->assertSame(['memory' => 4096, 'cpu' => 200, 'disk' => 30720], $result['nodes'][1]['available']); } public function test_location_availability_rejects_malformed_included_relationships(): void @@ -252,6 +255,7 @@ public function test_location_availability_rejects_malformed_included_server_lim 'nodes' => ['data' => [[ 'attributes' => [ 'id' => 5, + 'location_id' => 1, 'name' => 'Node 5', 'fqdn' => 'node-5.example.com', 'memory' => 8192, @@ -276,6 +280,125 @@ public function test_location_availability_rejects_malformed_included_server_lim $this->service->getLocationAvailability(1); } + public function test_location_availability_rejects_incomplete_included_server_limits(): void + { + Http::fake($this->availabilityHttpFake( + nodeId: 5, + locationId: 1, + totalMemory: 8192, + totalDisk: 51200, + totalCpuThreads: 4, + servers: [['node' => 5, 'memory' => 1024, 'cpu' => 50]], + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid included server payload'); + + $this->service->getLocationAvailability(1); + } + + public function test_location_availability_rejects_negative_included_server_limits(): void + { + Http::fake($this->availabilityHttpFake( + nodeId: 5, + locationId: 1, + totalMemory: 8192, + totalDisk: 51200, + totalCpuThreads: 4, + servers: [['node' => 5, 'memory' => 1024, 'cpu' => -1, 'disk' => 5120]], + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid included server payload'); + + $this->service->getLocationAvailability(1); + } + + public function test_location_availability_rejects_server_for_unknown_node(): void + { + Http::fake($this->availabilityHttpFake( + nodeId: 5, + locationId: 1, + totalMemory: 8192, + totalDisk: 51200, + totalCpuThreads: 4, + servers: [['node' => 6, 'memory' => 1024, 'cpu' => 50, 'disk' => 5120]], + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('unknown included node'); + + $this->service->getLocationAvailability(1); + } + + public function test_location_availability_rejects_node_without_cpu_threads(): void + { + Http::fake([ + 'panel.example.com/*' => Http::response([ + 'attributes' => [ + 'relationships' => [ + 'nodes' => ['data' => [[ + 'attributes' => [ + 'id' => 5, + 'location_id' => 1, + 'name' => 'Node 5', + 'fqdn' => 'node-5.example.com', + 'memory' => 8192, + 'disk' => 51200, + ], + ]]], + 'servers' => ['data' => []], + ], + ], + ], 200), + ]); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid included node payload'); + + $this->service->getLocationAvailability(1); + } + + public function test_snapshot_falls_back_when_included_servers_relationship_is_missing(): void + { + $calls = 0; + $node = $this->nodeWithServersPayload(1, 1, 'Node 1', []); + unset($node['attributes']['relationships']); + + Http::fake(function ($request) use (&$calls, $node) { + $calls++; + $url = $request->url(); + + if (str_contains($url, '/api/application/locations')) { + return Http::response([ + 'data' => [['attributes' => ['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1']]], + ], 200); + } + + if (str_contains($url, '/api/application/nodes')) { + return Http::response(['data' => [$node]], 200); + } + + if (str_contains($url, '/api/application/servers')) { + return Http::response([ + 'data' => [[ + 'attributes' => [ + 'node' => 1, + 'limits' => ['memory' => 1024, 'cpu' => 50, 'disk' => 5120], + ], + ]], + ], 200); + } + + return Http::response([], 404); + }); + + $snapshot = $this->service->buildClusterSnapshot(); + + $this->assertSame(['memory' => 1024, 'cpu' => 50, 'disk' => 5120], $snapshot['nodes'][1]['allocated']); + $this->assertSame(4, $calls); + } + public function test_snapshot_with_single_location_single_node(): void { $calls = 0; @@ -446,9 +569,10 @@ private function availabilityHttpFake( int $totalDisk, int $totalCpuThreads, array $servers = [], + array $additionalNodeIds = [], ): callable { - return function ($request) use ($nodeId, $locationId, $totalMemory, $totalDisk, $totalCpuThreads, $servers) { + return function ($request) use ($nodeId, $locationId, $totalMemory, $totalDisk, $totalCpuThreads, $servers, $additionalNodeIds) { $url = $request->url(); $query = []; parse_str(parse_url($url, PHP_URL_QUERY) ?? '', $query); @@ -463,13 +587,13 @@ private function availabilityHttpFake( 'relationships' => [ 'nodes' => [ 'object' => 'list', - 'data' => [[ + 'data' => array_map(fn (int $includedNodeId) => [ 'object' => 'node', 'attributes' => [ - 'id' => $nodeId, + 'id' => $includedNodeId, 'location_id' => $locationId, - 'name' => 'Node '.$nodeId, - 'fqdn' => 'node-'.$nodeId.'.example.com', + 'name' => 'Node '.$includedNodeId, + 'fqdn' => 'node-'.$includedNodeId.'.example.com', 'memory' => $totalMemory, 'disk' => $totalDisk, 'cpu_threads' => $totalCpuThreads, @@ -481,7 +605,7 @@ private function availabilityHttpFake( 'disk' => 0, ], ], - ]], + ], array_merge([$nodeId], $additionalNodeIds)), ], 'servers' => [ 'object' => 'list', @@ -490,11 +614,11 @@ private function availabilityHttpFake( 'attributes' => [ 'id' => ($server['node'] * 100) + $index, 'node' => $server['node'], - 'limits' => [ - 'memory' => $server['memory'], - 'cpu' => $server['cpu'], - 'disk' => $server['disk'], - ], + 'limits' => array_intersect_key($server, [ + 'memory' => true, + 'cpu' => true, + 'disk' => true, + ]), ], ], $servers, array_keys($servers)), ], From ec7ba5e0af9361a52d8d94141595ea2149c3d7a9 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 20:47:16 +1000 Subject: [PATCH 14/30] docs: align wiki and reconciliation status --- .../en/content/API Reference/API Reference.md | 4 ++-- .../Availability Endpoints.md | 8 ++++---- .../Public API Endpoints/Public API Endpoints.md | 6 +++--- .qoder/repowiki/en/content/Deployment.md | 1 + .qoder/repowiki/en/content/Testing.md | 16 ++++++++-------- PROGRESS.md | 8 ++++++-- 6 files changed, 24 insertions(+), 19 deletions(-) diff --git a/.qoder/repowiki/en/content/API Reference/API Reference.md b/.qoder/repowiki/en/content/API Reference/API Reference.md index 7df432e..aed692e 100644 --- a/.qoder/repowiki/en/content/API Reference/API Reference.md +++ b/.qoder/repowiki/en/content/API Reference/API Reference.md @@ -145,7 +145,7 @@ AvailCtrl-->>Client : {success,data : {location_id,max_memory,max_cpu,max_disk,n - has_capacity: boolean - resource_capacity: object with memory/cpu/disk booleans - Errors: - - 500: failure to fetch availability (includes message and error fields) + - 500: failure to fetch availability (returns only the generic message; exception details are reported server-side) - GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes - Auth: web + auth + admin @@ -519,4 +519,4 @@ The Dynamic Pterodactyl extension exposes a focused set of APIs for availability - Validate inputs on the client side but rely on server-side validation and authorization. - Do not expose node-level details to customers; use admin endpoints for internal tools only. -[No sources needed since this section provides general guidance] \ No newline at end of file +[No sources needed since this section provides general guidance] diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md index cb1a8b0..be4f35e 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md @@ -138,7 +138,7 @@ A-->>C : {success, data : {location_id, max_memory, max_cpu, max_disk, node_coun - cpu: boolean (true if max_cpu > 0) - disk: boolean (true if max_disk > 0) - Error responses: - - On exceptions during processing, returns success: false with message and error fields, HTTP 500. + - On exceptions during processing, returns HTTP 500 with `success: false` and the generic message `Failed to fetch availability`. Exception details are reported server-side and are not returned to customers. Request examples - Basic request: @@ -181,9 +181,9 @@ Request examples Error handling - Invalid or missing locationId: - - If the location does not exist or cannot be resolved, upstream errors propagate through services and are caught by the controller, returning success: false with a generic message and error details. + - If the location does not exist or cannot be resolved, the controller returns `success: false` with a generic message and reports the underlying exception server-side. - Pterodactyl API failures: - - Network timeouts, connection errors, or non-2xx responses result in exceptions thrown by the service layer and surfaced as success: false with a descriptive message. + - Network timeouts, connection errors, or non-2xx responses result in a generic `success: false` response; upstream details remain in server-side diagnostics. - Rate limiting exceeded: - Requests beyond 30 per minute receive a standard throttle response from the framework's throttle middleware. @@ -342,7 +342,7 @@ Common issues and how they manifest: - Invalid location: - If the locationId does not resolve to any nodes, the service may return empty aggregates; the controller wraps errors into a consistent failure response. - Pterodactyl API errors: - - Network timeouts, connection failures, or non-2xx responses cause exceptions in the service layer; these are caught and returned as success: false with a message and error details. + - Network timeouts, connection failures, or non-2xx responses are caught, reported server-side, and returned as `success: false` with only the generic availability failure message. - Unexpected payload: - Malformed or non-JSON responses from Pterodactyl are treated as errors and logged for diagnostics. - **Enhanced**: Security validation failures: diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md index bd52b11..b242479 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md @@ -132,7 +132,7 @@ Example request: - Success response example: - { "success": true, "data": { "location_id": 1, "max_memory": 1000, "max_cpu": 100, "max_disk": 1000, "node_count": 3, "has_capacity": true, "resource_capacity": { "memory": true, "cpu": true, "disk": true } } } - Error response example: - - { "success": false, "message": "Failed to fetch availability", "error": "" } + - { "success": false, "message": "Failed to fetch availability" } Implementation notes: - Uses NodeSelectionService to compute maximum available resources per location. @@ -345,7 +345,7 @@ Common issues and resolutions: - You do not own the reservation and are not an admin. Error response patterns: -- Availability failures: 500 with generic message and optional error details. +- Availability failures: 500 with a generic message only; exception details are reported server-side. - Pricing failures: 500 with generic message; detailed error only when debug is enabled. - Reservation failures: 422 for validation/runtime errors; 404 for not found; 403 for unauthorized. @@ -359,4 +359,4 @@ Error response patterns: ## Conclusion The Dynamic Pterodactyl public API provides secure, rate-limited endpoints for checking availability, calculating dynamic pricing, and managing short-lived resource reservations during checkout. It exposes only aggregate capacity to customers, preserving node-level details for administrative use. The design emphasizes idempotency, real-time accuracy, and robust authorization to ensure safe and reliable integration with the checkout flow. -[No sources needed since this section summarizes without analyzing specific files] \ No newline at end of file +[No sources needed since this section summarizes without analyzing specific files] diff --git a/.qoder/repowiki/en/content/Deployment.md b/.qoder/repowiki/en/content/Deployment.md index 3c9b177..1e73cb7 100644 --- a/.qoder/repowiki/en/content/Deployment.md +++ b/.qoder/repowiki/en/content/Deployment.md @@ -144,6 +144,7 @@ Operational requirements: - Scheduler must be running to execute cleanup and alert checks. - Database must support transactions and pessimistic locking. - Network access to the Pterodactyl Panel API must be allowed from the Paymenter host. +- Node payloads must provide a numeric `cpu_threads` capacity value; missing or malformed node/server capacity fields fail closed instead of advertising unverified capacity. **Section sources** - [DynamicPterodactyl.php:48-75](file://DynamicPterodactyl.php#L48-L75) diff --git a/.qoder/repowiki/en/content/Testing.md b/.qoder/repowiki/en/content/Testing.md index db5cc12..769a3f4 100644 --- a/.qoder/repowiki/en/content/Testing.md +++ b/.qoder/repowiki/en/content/Testing.md @@ -100,7 +100,7 @@ Key components under test: ## Architecture Overview The testing architecture isolates external dependencies and enforces deterministic environments: - phpunit.xml forces array cache/session/queue and sync queue. -- tests/bootstrap.php aborts if DB_DATABASE is not a test database. +- tests/bootstrap.php requires `APP_ENV=testing` and accepts only `paymenter_test`, `:memory:`, or the `:temporary:` sentinel. The sentinel generates and atomically claims an unpredictable private SQLite path before Paymenter boots; caller-supplied SQLite paths are rejected. - Feature tests load routes and use DatabaseTransactions to keep state isolated per test. - Unit tests mock or fake HTTP and DB interactions to avoid real calls. @@ -124,7 +124,7 @@ sequenceDiagram **Diagram sources** - [phpunit.xml:28-41](file://phpunit.xml#L28-L41) -- [tests/bootstrap.php:11-17](file://tests/bootstrap.php#L11-L17) +- [tests/bootstrap.php:23-48](file://tests/bootstrap.php#L23-L48) - [tests/LaravelTestCase.php:13-25](file://tests/LaravelTestCase.php#L13-L25) ## Detailed Component Analysis @@ -329,7 +329,7 @@ ALS --> NOTIF["Notifications"] ## Troubleshooting Guide Common issues and fixes: -- Running against wrong database: tests/bootstrap.php aborts unless DB_DATABASE is paymenter_test or :memory:. Ensure your environment matches. +- Running against wrong database: tests/bootstrap.php aborts unless `DB_DATABASE` is `paymenter_test`, `:memory:`, or `:temporary:`. Use `:temporary:` for standalone SQLite; do not provide a filesystem path. - Stray HTTP requests: enable Http::preventStrayRequests() in setUp to catch unexpected network calls during unit tests. - Stale global state in alert tests: use #[RunTestsInSeparateProcesses] and #[PreserveGlobalState(false)] to isolate Facade containers. - Authorization failures: ensure Gate policies are registered and actors are set up correctly in tests. @@ -341,7 +341,7 @@ Debugging tips: - Use assertDatabaseHas/assertDatabaseMissing to validate exact state changes in reservations and audit logs. **Section sources** -- [tests/bootstrap.php:11-17](file://tests/bootstrap.php#L11-L17) +- [tests/bootstrap.php:23-48](file://tests/bootstrap.php#L23-L48) - [tests/Unit/ResourceCalculationServiceTest.php:18-33](file://tests/Unit/ResourceCalculationServiceTest.php#L18-L33) - [tests/Unit/AlertServiceTest.php:26-62](file://tests/Unit/AlertServiceTest.php#L26-L62) - [tests/Unit/ReservationServiceTest.php:29-46](file://tests/Unit/ReservationServiceTest.php#L29-L46) @@ -354,7 +354,7 @@ The test suite provides robust coverage across service logic, API endpoints, and ## Appendices ### How to Run the Test Suite -- Ensure DB_DATABASE is set to paymenter_test or :memory:. +- Set `DB_DATABASE` to `paymenter_test`, `:memory:`, or `:temporary:`. The standalone `:temporary:` database is generated, migrated on first application boot, and cleaned up at process shutdown. - Use the outer Paymenter vendor PHPUnit binary as configured by the project. - Run unit tests: vendor/bin/phpunit --testsuite=Unit - Run feature tests: vendor/bin/phpunit --testsuite=Feature @@ -363,7 +363,7 @@ The test suite provides robust coverage across service logic, API endpoints, and **Section sources** - [phpunit.xml:13-20](file://phpunit.xml#L13-L20) - [phpunit.xml:28-41](file://phpunit.xml#L28-L41) -- [tests/bootstrap.php:11-17](file://tests/bootstrap.php#L11-L17) +- [tests/bootstrap.php:23-48](file://tests/bootstrap.php#L23-L48) ### Writing New Tests - Unit tests: @@ -398,14 +398,14 @@ The test suite provides robust coverage across service logic, API endpoints, and ### Test Database Setup and Fixtures - Database isolation: - phpunit.xml sets DB_CONNECTION and DB_DATABASE for tests. - - tests/bootstrap.php enforces test database guard. + - tests/bootstrap.php enforces the test database guard and atomically owns any standalone SQLite path before use. - Fixtures: - Create minimal required records (products, config options, carts, cart items) within tests. - Use factories where available; otherwise insert raw rows via DB facade. **Section sources** - [phpunit.xml:34-36](file://phpunit.xml#L34-L36) -- [tests/bootstrap.php:11-17](file://tests/bootstrap.php#L11-L17) +- [tests/bootstrap.php:23-48](file://tests/bootstrap.php#L23-L48) - [tests/Feature/ReservationApiTest.php:402-446](file://tests/Feature/ReservationApiTest.php#L402-L446) ### Assertion Patterns diff --git a/PROGRESS.md b/PROGRESS.md index 32dc190..91edf33 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -72,11 +72,15 @@ All dp-NN backlog items are implemented. The active reconciliation is staged on **Status**: Panel changes are preserved on the reconciliation branch; Qoder Wiki pages are migrated to GitHub Wiki and refreshed for the final batched location API flow. **Current file**: PROGRESS.md **Next action**: Complete exact-SHA review, then merge draft PR #23 when approved. Resume Mutagen only as a separately authorized deployment step. -**Blockers**: None +**Blockers**: PR #22 overlaps this reconciliation and must be rebased after PR #23; merging it unchanged would restore superseded test-guard and error-response behavior. No CI checks are configured on PR #23. ### This Session's Changes: -1. dp-19 — direct commits on `dynamic-slider` (extension) and `dynamic-slider/1.4.7` (outer Paymenter). +1. Preserved the dp-20 panel close-out without restoring obsolete deployment guidance. +2. Reconciled the location availability path to one `locations/{id}?include=nodes,servers` request and fail-closed capacity parsing. +3. Replaced caller-selected SQLite test paths with the internally generated `:temporary:` database workflow. +4. Migrated the retained Qoder page set to GitHub Wiki and synchronized API, deployment, and testing contracts. +5. Published draft PR #23 for exact-SHA review; Mutagen deployment remains paused. --- From 2f7566545fd7b6e5f129905d098b88de6d12cc99 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 21:16:22 +1000 Subject: [PATCH 15/30] test: isolate sqlite without filesystem paths --- DECISIONS.md | 2 +- tests/AGENTS.md | 6 +-- tests/TestDatabaseGuard.php | 59 ++++++---------------------- tests/Unit/TestDatabaseGuardTest.php | 25 ++++++++++-- 4 files changed, 38 insertions(+), 54 deletions(-) diff --git a/DECISIONS.md b/DECISIONS.md index c6fd1ba..fca4bc1 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -244,7 +244,7 @@ Unit coverage accepted for dp-06. The full Filament-action lifecycle end-to-end ### 6. Test Isolation Mandate (dp-13, Apr 2026) -Extension phpunit MUST set `CACHE_STORE=array`, `SESSION_DRIVER=array`, `QUEUE_CONNECTION=sync`, `MAIL_MAILER=array`, `BCRYPT_ROUNDS=4`, `PULSE_ENABLED=false`, `TELESCOPE_ENABLED=false` — mirroring the root `phpunit.xml`. Failure to do so risks polluting the shared Redis/file cache on a development host, corrupting the settings key read by running web workers. This caused a production outage on 2026-04-23. The `bootstrap.php` guard provides a second line of defence: it requires `APP_ENV=testing` and accepts only `paymenter_test`, `:memory:`, or the `:temporary:` sentinel. The sentinel generates an unpredictable private system-temp directory, atomically creates the SQLite database, holds the exclusive file handle, and replaces `DB_DATABASE` before Paymenter boots. Caller-supplied SQLite paths, empty database names, and filename-based trust are forbidden. See `incidents.md` for forensics. +Extension phpunit MUST set `CACHE_STORE=array`, `SESSION_DRIVER=array`, `QUEUE_CONNECTION=sync`, `MAIL_MAILER=array`, `BCRYPT_ROUNDS=4`, `PULSE_ENABLED=false`, `TELESCOPE_ENABLED=false` — mirroring the root `phpunit.xml`. Failure to do so risks polluting the shared Redis/file cache on a development host, corrupting the settings key read by running web workers. This caused a production outage on 2026-04-23. The `bootstrap.php` guard provides a second line of defence: it requires `APP_ENV=testing` and accepts only `paymenter_test`, `:memory:`, or the `:temporary:` sentinel. The sentinel creates an unpredictable process-private named in-memory SQLite database, retains an anchor PDO connection for its lifetime, and replaces `DB_DATABASE` before Paymenter boots. There is no filesystem pathname to substitute. Caller-supplied SQLite paths or URI names and empty database names are forbidden. See `incidents.md` for forensics. ### 7. SetupWizard Atomicity Contract (dp-13, Apr 2026) diff --git a/tests/AGENTS.md b/tests/AGENTS.md index 11b8b06..a7f59c7 100644 --- a/tests/AGENTS.md +++ b/tests/AGENTS.md @@ -23,7 +23,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p | Task | Start at | Notes | |---|---|---| -| Harness boot / DB safety | `bootstrap.php`, `TestDatabaseGuard.php`, `../phpunit.xml` | `paymenter_test`, `:memory:`, or the `:temporary:` sentinel for an internally generated SQLite database is enforced before app boot | +| Harness boot / DB safety | `bootstrap.php`, `TestDatabaseGuard.php`, `../phpunit.xml` | `paymenter_test`, `:memory:`, or the `:temporary:` sentinel for an internally generated named in-memory SQLite database is enforced before app boot | | Lightweight service seam | `TestCase.php` | Mockery cleanup, `createPricingConfig()`, `createNodeData()`, `standardResources()` | | App-backed test seam | `LaravelTestCase.php` | Paymenter kernel boot, `createConfigOption()`, slider defaults, node fixtures | | Reservation state / audits | `Unit/ReservationServiceTest.php` | Mixes facade mocks and real DB assertions under transactions | @@ -40,7 +40,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p - Any DB-writing test must use `Illuminate\Foundation\Testing\DatabaseTransactions`; this includes DB-backed `Unit/` tests and all current API feature tests. - Feature API tests must `require __DIR__ . '/../../routes/api.php';` in `setUp()` because extension routes are loaded manually by `DynamicPterodactyl::boot()` at runtime. - For schedule assertions, boot the extension in the test and inspect `app(Schedule::class)->events()`; no local Job/Command classes exist. -- The bootstrap refuses unsafe databases and requires `APP_ENV=testing`. `DB_DATABASE` must be `paymenter_test`, `:memory:`, or the `:temporary:` sentinel. For `:temporary:`, the guard generates an unpredictable private directory under the system temp directory, atomically creates the database, holds the exclusive file handle, and replaces `DB_DATABASE` before Paymenter boots. User-supplied SQLite paths are never accepted. `LaravelTestCase` migrates the claimed database on first application boot. +- The bootstrap refuses unsafe databases and requires `APP_ENV=testing`. `DB_DATABASE` must be `paymenter_test`, `:memory:`, or the `:temporary:` sentinel. For `:temporary:`, the guard generates an unpredictable process-private named in-memory SQLite database, retains an anchor PDO connection, and replaces `DB_DATABASE` before Paymenter boots. User-supplied SQLite paths and URI names are never accepted. `LaravelTestCase` migrates the shared in-memory database on first application boot; process teardown discards it. - `phpunit.xml` fixes testing env, `MAIL_MAILER=array`, `SESSION_DRIVER=array`, `CACHE_STORE=array` with legacy `CACHE_DRIVER=file`, sync queue, and service-source warning restrictions. - Use shared fixture helpers before creating local copies: `standardResources()`, `createNodeData()`, `createConfigOption()`, and per-file helpers such as configured products/cart items. - Common fakes are `Mockery` service/container bindings, `Http::fake()` with `Http::preventStrayRequests()` for panel calls, `Notification::fake()`, `Event::fake()`, `Log::spy()`, `Config::set()`, and `Gate::policy()`. @@ -55,7 +55,7 @@ Largest files are `Unit/ReservationServiceTest.php` and `Unit/AlertServiceTest.p - Do not put app/factory/facade tests on raw `TestCase` except the existing separate-process `AlertService` facade isolation seam. - Do not claim `Unit/` files are all pure units; several intentionally boot Laravel and write DB rows. - Do not duplicate root command blocks, generic PHPUnit advice, or project-wide anti-patterns here. -- Do not broaden the database guard beyond `paymenter_test`, `:memory:`, or the internally generated `:temporary:` workflow. Never accept a caller-supplied SQLite path or infer disposability from a filename. +- Do not broaden the database guard beyond `paymenter_test`, `:memory:`, or the internally generated `:temporary:` workflow. Never accept a caller-supplied SQLite path or named-memory URI. - Do not add live Pterodactyl network calls; fake panel HTTP explicitly and prevent strays when testing capacity reads. - Do not expose or assert full reservation tokens in audit payloads; assert `token_prefix` behavior. - Current direct coverage gaps to watch: `CartItemCreatedListener`, `ServiceCreatedListener`, `PricingController::getConfig()`, and `AuditLogService` retrieval methods. diff --git a/tests/TestDatabaseGuard.php b/tests/TestDatabaseGuard.php index 772fbaa..76c8b42 100644 --- a/tests/TestDatabaseGuard.php +++ b/tests/TestDatabaseGuard.php @@ -4,8 +4,8 @@ final class TestDatabaseGuard { - /** @var array */ - private static array $claimedDatabaseHandles = []; + /** @var array */ + private static array $claimedDatabaseConnections = []; private static bool $cleanupRegistered = false; @@ -31,44 +31,22 @@ public static function claim(string $database, string $connection, string $envir return null; } - return self::claimDisposableSqliteDatabase(); + return self::claimIsolatedSqliteDatabase(); } - private static function claimDisposableSqliteDatabase(): ?string + private static function claimIsolatedSqliteDatabase(): ?string { - $temporaryDirectory = realpath(sys_get_temp_dir()); - if ($temporaryDirectory === false) { - return null; - } - - $databaseDirectory = $temporaryDirectory.DIRECTORY_SEPARATOR - .'dynamic-pterodactyl-test-'.bin2hex(random_bytes(16)); - if (! @mkdir($databaseDirectory, 0700)) { - return null; - } - - $resolvedDirectory = realpath($databaseDirectory); - if ($resolvedDirectory === false || ! self::pathsEqual(dirname($resolvedDirectory), $temporaryDirectory)) { - @rmdir($databaseDirectory); - - return null; - } - - $database = $resolvedDirectory.DIRECTORY_SEPARATOR.'database.sqlite'; - $handle = @fopen($database, 'x+b'); - $fileStatus = $handle === false ? false : fstat($handle); - - if ($handle === false || ! is_array($fileStatus) || ($fileStatus['nlink'] ?? 0) !== 1) { - if (is_resource($handle)) { - fclose($handle); - } - @unlink($database); - @rmdir($databaseDirectory); + $database = 'file:dynamic-pterodactyl-test-'.bin2hex(random_bytes(16)).'?mode=memory&cache=shared'; + try { + $connection = new \PDO('sqlite:'.$database, null, null, [ + \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, + ]); + } catch (\PDOException) { return null; } - self::$claimedDatabaseHandles[$database] = $handle; + self::$claimedDatabaseConnections[$database] = $connection; if (! self::$cleanupRegistered) { register_shutdown_function(static function (): void { self::releaseClaims(); @@ -81,19 +59,6 @@ private static function claimDisposableSqliteDatabase(): ?string private static function releaseClaims(): void { - foreach (self::$claimedDatabaseHandles as $database => $handle) { - fclose($handle); - @unlink($database); - @rmdir(dirname($database)); - } - - self::$claimedDatabaseHandles = []; - } - - private static function pathsEqual(string $left, string $right): bool - { - return PHP_OS_FAMILY === 'Windows' - ? strcasecmp($left, $right) === 0 - : $left === $right; + self::$claimedDatabaseConnections = []; } } diff --git a/tests/Unit/TestDatabaseGuardTest.php b/tests/Unit/TestDatabaseGuardTest.php index 48a3970..f94ecb2 100644 --- a/tests/Unit/TestDatabaseGuardTest.php +++ b/tests/Unit/TestDatabaseGuardTest.php @@ -22,13 +22,32 @@ public function test_rejects_existing_arbitrary_sqlite_database(): void } } - public function test_allows_disposable_sqlite_database_in_system_temp_directory(): void + public function test_creates_isolated_named_memory_sqlite_database(): void { $database = TestDatabaseGuard::claim(':temporary:', 'sqlite', 'testing'); $this->assertIsString($database); - $this->assertStringStartsWith(realpath(sys_get_temp_dir()).DIRECTORY_SEPARATOR, $database); - $this->assertFileExists($database); + $this->assertMatchesRegularExpression( + '/^file:dynamic-pterodactyl-test-[a-f0-9]{32}\?mode=memory&cache=shared$/', + $database, + ); + + $writer = new \PDO('sqlite:'.$database); + $writer->exec('CREATE TABLE claim_probe (value TEXT NOT NULL)'); + $writer->exec("INSERT INTO claim_probe (value) VALUES ('owned')"); + unset($writer); + + $reader = new \PDO('sqlite:'.$database); + $this->assertSame('owned', $reader->query('SELECT value FROM claim_probe')->fetchColumn()); + } + + public function test_rejects_caller_supplied_named_memory_database(): void + { + $this->assertNull(TestDatabaseGuard::claim( + 'file:shared-production?mode=memory&cache=shared', + 'sqlite', + 'testing', + )); } public function test_rejects_disposable_name_outside_system_temp_directory(): void From d97a0ac30932b6cb4767309e679cd78187160cc6 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 21:16:22 +1000 Subject: [PATCH 16/30] fix: use one validated availability snapshot --- 02-SERVICES.md | 56 ++++++++++++------- 03-API.md | 11 ++-- .../Api/AvailabilityController.php | 2 +- Services/NodeSelectionService.php | 8 ++- Services/ResourceCalculationService.php | 8 ++- tests/Feature/AvailabilityApiTest.php | 22 +++++--- tests/Unit/NodeSelectionServiceTest.php | 19 +++++++ tests/Unit/ResourceCalculationServiceTest.php | 42 +++++++++++++- 8 files changed, 130 insertions(+), 38 deletions(-) diff --git a/02-SERVICES.md b/02-SERVICES.md index f6fb180..e11d9bd 100644 --- a/02-SERVICES.md +++ b/02-SERVICES.md @@ -110,7 +110,9 @@ class ResourceCalculationService // Formula: total * (1 + overallocate_percentage / 100) $effectiveMemory = $node['memory'] * (1 + ($node['memory_overallocate'] ?? 0) / 100); $effectiveDisk = $node['disk'] * (1 + ($node['disk_overallocate'] ?? 0) / 100); - $effectiveCpu = ($node['cpu_threads'] ?? 4) * 100; // No overallocation for CPU + // cpu_threads must come from an explicit panel customization or a local + // capacity policy. Stock Pterodactyl does not expose node CPU capacity. + $effectiveCpu = $node['cpu_threads'] * 100; // Calculate available (total - allocated - pending) $available = [ @@ -224,29 +226,43 @@ class ResourceCalculationService private function fetchNodesInLocation(int $locationId): array { - $response = Http::withHeaders([ - 'Authorization' => 'Bearer ' . $this->apiKey, - 'Accept' => 'application/json', - 'Content-Type' => 'application/json', - ])->get("{$this->apiUrl}/api/application/locations/{$locationId}", [ + $response = $this->pterodactylGet( + "/api/application/locations/{$locationId}", + [ 'include' => 'nodes,servers', - ]); - - if (!$response->successful()) { - throw new \RuntimeException('Failed to fetch location: ' . $response->body()); + ] + ); + + $nodesData = $this->requireRelationshipData($response, 'nodes'); + $serversData = $this->requireRelationshipData($response, 'servers'); + + $nodesById = []; + foreach ($nodesData as $node) { + $attributes = $this->requireNodeAttributes($node); + if ($attributes['location_id'] !== $locationId) { + throw new \RuntimeException('Pterodactyl API returned a node for an unexpected location.'); + } + $nodesById[$attributes['id']] = $attributes; } - $attributes = $response->json('attributes', []); - $serversByNode = collect(data_get($attributes, 'relationships.servers.data', [])) - ->map(fn($server) => $server['attributes']) - ->groupBy('node'); + $serversByNode = []; + foreach ($serversData as $server) { + $attributes = $this->requireServerAttributes($server); + if (! array_key_exists($attributes['node'], $nodesById)) { + throw new \RuntimeException('Pterodactyl API returned a server for an unknown included node.'); + } + $serversByNode[$attributes['node']][] = $attributes; + } - return collect(data_get($attributes, 'relationships.nodes.data', [])) - ->map(fn($node) => [ - 'node' => $node['attributes'], - 'servers' => $serversByNode->get($node['attributes']['id'], collect())->values()->all(), - ]) - ->all(); + $nodes = []; + foreach ($nodesById as $nodeId => $attributes) { + $nodes[] = [ + 'node' => $attributes, + 'servers' => $serversByNode[$nodeId] ?? [], + ]; + } + + return $nodes; } private function getPendingReservations(int $nodeId): array diff --git a/03-API.md b/03-API.md index 3ab3985..74ae356 100644 --- a/03-API.md +++ b/03-API.md @@ -367,8 +367,8 @@ class AvailabilityController public function getByLocation(int $locationId): JsonResponse { try { - $maxAvailable = $this->nodeService->getMaxAvailable($locationId); $locationData = $this->resourceService->getLocationAvailability($locationId); + $maxAvailable = $this->nodeService->getMaxAvailable($locationId, $locationData); $resourceCapacity = [ 'memory' => $maxAvailable['memory'] > 0, 'cpu' => $maxAvailable['cpu'] > 0, @@ -387,11 +387,12 @@ class AvailabilityController 'resource_capacity' => $resourceCapacity, ], ]); - } catch (\Exception $e) { + } catch (\Throwable $e) { + report($e); + return response()->json([ 'success' => false, 'message' => 'Failed to fetch availability', - 'error' => $e->getMessage(), ], 500); } } @@ -405,7 +406,9 @@ class AvailabilityController 'success' => true, 'data' => $locationData, ]); - } catch (\Exception $e) { + } catch (\Throwable $e) { + report($e); + return response()->json([ 'success' => false, 'message' => 'Failed to fetch node details', diff --git a/Http/Controllers/Api/AvailabilityController.php b/Http/Controllers/Api/AvailabilityController.php index 5965526..1c53217 100644 --- a/Http/Controllers/Api/AvailabilityController.php +++ b/Http/Controllers/Api/AvailabilityController.php @@ -22,8 +22,8 @@ public function __construct( public function getByLocation(int $locationId): JsonResponse { try { - $maxAvailable = $this->nodeService->getMaxAvailable($locationId); $locationData = $this->resourceService->getLocationAvailability($locationId); + $maxAvailable = $this->nodeService->getMaxAvailable($locationId, $locationData); $resourceCapacity = [ 'memory' => $maxAvailable['memory'] > 0, 'cpu' => $maxAvailable['cpu'] > 0, diff --git a/Services/NodeSelectionService.php b/Services/NodeSelectionService.php index 570ecd1..f5810f8 100644 --- a/Services/NodeSelectionService.php +++ b/Services/NodeSelectionService.php @@ -78,9 +78,13 @@ public function selectBestNode(int $locationId, array $requirements): ?array /** * Get maximum allocatable resources across a location */ - public function getMaxAvailable(int $locationId): array + public function getMaxAvailable(int $locationId, ?array $locationData = null): array { - $locationData = $this->resourceService->getLocationAvailability($locationId); + $locationData ??= $this->resourceService->getLocationAvailability($locationId); + if (($locationData['location_id'] ?? null) !== $locationId + || ! is_array($locationData['max_available'] ?? null)) { + throw new \RuntimeException('Invalid location availability snapshot.'); + } return $locationData['max_available']; } diff --git a/Services/ResourceCalculationService.php b/Services/ResourceCalculationService.php index 3ed524b..53268e4 100644 --- a/Services/ResourceCalculationService.php +++ b/Services/ResourceCalculationService.php @@ -237,6 +237,9 @@ private function fetchNodesInLocation(int $locationId): array $nodesById = []; foreach ($nodesData as $node) { $attributes = $this->requireNodeAttributes($node); + if ($attributes['location_id'] !== $locationId) { + throw new \RuntimeException('Pterodactyl API returned a node for an unexpected location.'); + } $nodesById[$attributes['id']] = $attributes; } @@ -404,8 +407,11 @@ private function pterodactylGetPaginatedData(string $path, array $query = []): a $currentPage = (int) ($pagination['current_page'] ?? $page); $totalPages = (int) ($pagination['total_pages'] ?? $currentPage); + if ($currentPage !== $page || $totalPages < 1 || $totalPages < $currentPage) { + throw new \RuntimeException('Pterodactyl API returned invalid pagination metadata.'); + } - if ($currentPage >= $totalPages || $totalPages === 0) { + if ($currentPage === $totalPages) { break; } diff --git a/tests/Feature/AvailabilityApiTest.php b/tests/Feature/AvailabilityApiTest.php index 54504a2..e503e86 100644 --- a/tests/Feature/AvailabilityApiTest.php +++ b/tests/Feature/AvailabilityApiTest.php @@ -83,13 +83,16 @@ public function test_customer_failure_response_does_not_expose_internal_exceptio /** @var User $user */ $user = User::factory()->create(); - $nodeService = Mockery::mock(NodeSelectionService::class); - $nodeService->shouldReceive('getMaxAvailable') + $resourceService = Mockery::mock(ResourceCalculationService::class); + $resourceService->shouldReceive('getLocationAvailability') ->once() ->with(1) ->andThrow(new \RuntimeException('panel-internal-host:8080 failed')); + $this->app->instance(ResourceCalculationService::class, $resourceService); + + $nodeService = Mockery::mock(NodeSelectionService::class); + $nodeService->shouldNotReceive('getMaxAvailable'); $this->app->instance(NodeSelectionService::class, $nodeService); - $this->app->instance(ResourceCalculationService::class, Mockery::mock(ResourceCalculationService::class)); $response = $this->actingAs($user)->getJson('/api/dynamic-pterodactyl/availability/1'); @@ -102,10 +105,16 @@ public function test_customer_failure_response_does_not_expose_internal_exceptio private function bindAvailabilityServices(array $maxAvailable): void { + $locationData = [ + 'location_id' => 1, + 'nodes' => [['node_id' => 1, 'name' => 'Node 1']], + 'max_available' => $maxAvailable, + ]; + $nodeService = Mockery::mock(NodeSelectionService::class); $nodeService->shouldReceive('getMaxAvailable') ->once() - ->with(1) + ->with(1, $locationData) ->andReturn($maxAvailable); $this->app->instance(NodeSelectionService::class, $nodeService); @@ -113,10 +122,7 @@ private function bindAvailabilityServices(array $maxAvailable): void $resourceService->shouldReceive('getLocationAvailability') ->once() ->with(1) - ->andReturn([ - 'location_id' => 1, - 'nodes' => [['node_id' => 1, 'name' => 'Node 1']], - ]); + ->andReturn($locationData); $this->app->instance(ResourceCalculationService::class, $resourceService); } } diff --git a/tests/Unit/NodeSelectionServiceTest.php b/tests/Unit/NodeSelectionServiceTest.php index 8c16ad3..b576e5a 100644 --- a/tests/Unit/NodeSelectionServiceTest.php +++ b/tests/Unit/NodeSelectionServiceTest.php @@ -324,6 +324,7 @@ public function test_get_max_available_returns_location_max(): void $this->mockResourceService->shouldReceive('getLocationAvailability') ->with(1) ->andReturn([ + 'location_id' => 1, 'nodes' => [], 'max_available' => $expected, ]); @@ -333,6 +334,24 @@ public function test_get_max_available_returns_location_max(): void $this->assertEquals($expected, $result); } + public function test_get_max_available_reuses_preloaded_location_snapshot(): void + { + $expected = [ + 'memory' => 16384, + 'cpu' => 800, + 'disk' => 102400, + ]; + $this->mockResourceService->shouldNotReceive('getLocationAvailability'); + + $result = $this->service->getMaxAvailable(1, [ + 'location_id' => 1, + 'nodes' => [], + 'max_available' => $expected, + ]); + + $this->assertSame($expected, $result); + } + /** * Test empty nodes array returns null. */ diff --git a/tests/Unit/ResourceCalculationServiceTest.php b/tests/Unit/ResourceCalculationServiceTest.php index 20c4f70..36693df 100644 --- a/tests/Unit/ResourceCalculationServiceTest.php +++ b/tests/Unit/ResourceCalculationServiceTest.php @@ -331,6 +331,23 @@ public function test_location_availability_rejects_server_for_unknown_node(): vo $this->service->getLocationAvailability(1); } + public function test_location_availability_rejects_node_from_another_location(): void + { + Http::fake($this->availabilityHttpFake( + nodeId: 5, + locationId: 1, + totalMemory: 8192, + totalDisk: 51200, + totalCpuThreads: 4, + includedNodeLocationId: 2, + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('unexpected location'); + + $this->service->getLocationAvailability(1); + } + public function test_location_availability_rejects_node_without_cpu_threads(): void { Http::fake([ @@ -491,6 +508,26 @@ public function test_snapshot_handles_paginated_location_response(): void $this->assertLessThanOrEqual(4, $calls); } + public function test_get_locations_rejects_non_advancing_pagination_metadata(): void + { + Http::fake([ + 'panel.example.com/*' => Http::response([ + 'data' => [], + 'meta' => [ + 'pagination' => [ + 'current_page' => 0, + 'total_pages' => 1, + ], + ], + ], 200), + ]); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid pagination metadata'); + + $this->service->getLocations(); + } + public function test_snapshot_handles_pterodactyl_5xx_gracefully(): void { $calls = 0; @@ -570,9 +607,10 @@ private function availabilityHttpFake( int $totalCpuThreads, array $servers = [], array $additionalNodeIds = [], + ?int $includedNodeLocationId = null, ): callable { - return function ($request) use ($nodeId, $locationId, $totalMemory, $totalDisk, $totalCpuThreads, $servers, $additionalNodeIds) { + return function ($request) use ($nodeId, $locationId, $totalMemory, $totalDisk, $totalCpuThreads, $servers, $additionalNodeIds, $includedNodeLocationId) { $url = $request->url(); $query = []; parse_str(parse_url($url, PHP_URL_QUERY) ?? '', $query); @@ -591,7 +629,7 @@ private function availabilityHttpFake( 'object' => 'node', 'attributes' => [ 'id' => $includedNodeId, - 'location_id' => $locationId, + 'location_id' => $includedNodeLocationId ?? $locationId, 'name' => 'Node '.$includedNodeId, 'fqdn' => 'node-'.$includedNodeId.'.example.com', 'memory' => $totalMemory, From a7f77f5e1ad4017748f74f4d013dc6eb33fe0e00 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 21:18:51 +1000 Subject: [PATCH 17/30] docs: document single snapshot and cpu policy gate --- .../en/content/API Reference/API Reference.md | 3 ++- .../Availability Endpoints.md | 24 +++++++++---------- .../Public API Endpoints.md | 6 ++--- .../Resource Calculation Service.md | 10 ++++---- .../Service Layer Design.md | 8 +++---- .qoder/repowiki/en/content/Deployment.md | 2 +- .qoder/repowiki/en/content/Testing.md | 6 ++--- .qoder/repowiki/en/content/Troubleshooting.md | 10 ++++---- .../repowiki/en/meta/repowiki-metadata.json | 2 +- PROGRESS.md | 4 ++-- 10 files changed, 37 insertions(+), 38 deletions(-) diff --git a/.qoder/repowiki/en/content/API Reference/API Reference.md b/.qoder/repowiki/en/content/API Reference/API Reference.md index aed692e..47f13f5 100644 --- a/.qoder/repowiki/en/content/API Reference/API Reference.md +++ b/.qoder/repowiki/en/content/API Reference/API Reference.md @@ -88,11 +88,12 @@ participant ResCalc as "ResourceCalculationService" participant Ptero as "Pterodactyl API" Client->>Routes : GET /api/dynamic-pterodactyl/availability/{locationId} Routes->>AvailCtrl : getByLocation(locationId) -AvailCtrl->>NodeSel : getMaxAvailable(locationId) AvailCtrl->>ResCalc : getLocationAvailability(locationId) ResCalc->>Ptero : fetch nodes/servers (real-time) Ptero-->>ResCalc : node/server data ResCalc-->>AvailCtrl : aggregated availability +AvailCtrl->>NodeSel : getMaxAvailable(locationId, locationData) +NodeSel-->>AvailCtrl : max_available from same snapshot AvailCtrl-->>Client : {success,data : {location_id,max_memory,max_cpu,max_disk,node_count,has_capacity,resource_capacity}} ``` diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md index be4f35e..a3573bb 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md @@ -41,8 +41,8 @@ graph TB Client["Customer Client"] --> Routes["API Routes
/api/dynamic-pterodactyl"] Routes --> MW["Middleware: web, auth, throttle:30,1"] MW --> Ctrl["AvailabilityController::getByLocation"] -Ctrl --> NodeSel["NodeSelectionService::getMaxAvailable"] Ctrl --> ResCalc["ResourceCalculationService::getLocationAvailability"] +Ctrl --> NodeSel["NodeSelectionService::getMaxAvailable with preloaded snapshot"] ResCalc --> Ptero["Pterodactyl API"] Ctrl --> Security["Security Layer
Data Sanitization"] Security --> Response["Secure JSON Response
No Node Details"] @@ -51,7 +51,7 @@ Security --> Response["Secure JSON Response
No Node Details"] **Diagram sources** - [routes/api.php:17-22](file://routes/api.php#L17-L22) - [AvailabilityController.php:22-52](file://Http/Controllers/Api/AvailabilityController.php#L22-L52) -- [NodeSelectionService.php:78-86](file://Services/NodeSelectionService.php#L78-L86) +- [NodeSelectionService.php:78-90](file://Services/NodeSelectionService.php#L78-L90) - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) **Section sources** @@ -74,14 +74,14 @@ Key responsibilities: **Section sources** - [routes/api.php:17-22](file://routes/api.php#L17-L22) - [AvailabilityController.php:22-52](file://Http/Controllers/Api/AvailabilityController.php#L22-L52) -- [NodeSelectionService.php:78-86](file://Services/NodeSelectionService.php#L78-L86) +- [NodeSelectionService.php:78-90](file://Services/NodeSelectionService.php#L78-L90) - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) ## Architecture Overview The GET /api/dynamic-pterodactyl/availability/{locationId} flow: 1. Request enters the route group with web + auth + throttle middleware. -2. AvailabilityController::getByLocation resolves max available resources via NodeSelectionService. -3. It also fetches location availability via ResourceCalculationService to compute node_count and resource_capacity booleans. +2. AvailabilityController::getByLocation fetches one location snapshot via ResourceCalculationService. +3. It passes that same snapshot to NodeSelectionService to read max_available, then computes node_count and resource_capacity booleans without another panel request. 4. A compact JSON response is returned with only aggregate fields; no node identifiers or internal details are exposed. 5. **Enhanced**: Comprehensive test coverage ensures security boundaries are maintained. @@ -97,14 +97,12 @@ participant P as "Pterodactyl API" C->>R : GET /api/dynamic-pterodactyl/availability/{locationId} R->>M : Apply web, auth, throttle : 30,1 M-->>A : Proceed if authenticated and within limit -A->>N : getMaxAvailable(locationId) -N->>S : getLocationAvailability(locationId) +A->>S : getLocationAvailability(locationId) S->>P : Batched calls to list nodes/servers P-->>S : Node and server data -S-->>N : Aggregated availability -N-->>A : Max available {memory, cpu, disk} -A->>S : getLocationAvailability(locationId) -S-->>A : Location data including nodes[] +S-->>A : Aggregated location data including nodes[] +A->>N : getMaxAvailable(locationId, locationData) +N-->>A : Max available from the same snapshot A->>A : Security sanitization
Remove node details A-->>C : {success, data : {location_id, max_memory, max_cpu, max_disk, node_count, has_capacity, resource_capacity}} ``` @@ -112,7 +110,7 @@ A-->>C : {success, data : {location_id, max_memory, max_cpu, max_disk, node_coun **Diagram sources** - [routes/api.php:17-22](file://routes/api.php#L17-L22) - [AvailabilityController.php:22-52](file://Http/Controllers/Api/AvailabilityController.php#L22-L52) -- [NodeSelectionService.php:78-86](file://Services/NodeSelectionService.php#L78-L86) +- [NodeSelectionService.php:78-90](file://Services/NodeSelectionService.php#L78-L90) - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) ## Detailed Component Analysis @@ -221,7 +219,7 @@ ForEachNode --> |No| ReturnData["Return {location_id, nodes[], max_available, to - [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) **Section sources** -- [NodeSelectionService.php:78-86](file://Services/NodeSelectionService.php#L78-L86) +- [NodeSelectionService.php:78-90](file://Services/NodeSelectionService.php#L78-L90) - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) - [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md index b242479..26ae260 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md @@ -98,10 +98,10 @@ participant N as "NodeSelectionService" participant S as "ResourceCalculationService" C->>R : GET /api/dynamic-pterodactyl/availability/{locationId} R->>A : getByLocation(locationId) -A->>N : getMaxAvailable(locationId) -N-->>A : {memory, cpu, disk} A->>S : getLocationAvailability(locationId) -S-->>A : {nodes, ...} +S-->>A : {nodes, max_available, ...} +A->>N : getMaxAvailable(locationId, locationData) +N-->>A : {memory, cpu, disk} from same snapshot A-->>C : {success, data : {max_memory, max_cpu, max_disk, has_capacity, ...}} ``` diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md index 6e286a2..9a647e3 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md @@ -85,12 +85,12 @@ participant S as "ResourceCalculationService" participant P as "Pterodactyl API" participant D as "Local DB" C->>A : GET /availability/{locationId} -A->>N : getMaxAvailable(locationId) -N->>S : getLocationAvailability(locationId) +A->>S : getLocationAvailability(locationId) S->>P : GET /locations/{id}?include=nodes,servers S->>D : SUM pending reservations (node_id, pending, not expired) -S-->>N : Node availability arrays -N-->>A : Max available per resource +S-->>A : Node availability arrays +A->>N : getMaxAvailable(locationId, locationData) +N-->>A : Max available per resource from same snapshot A-->>C : {has_capacity, max_memory/cpu/disk, node_count} ``` @@ -144,7 +144,7 @@ LoopNodes --> |No| ReturnLoc["Return location data"] ### AvailabilityController Exposes customer-facing availability endpoints: -- getByLocation(locationId): Combines NodeSelectionService.getMaxAvailable with ResourceCalculationService.getLocationAvailability to return has_capacity and per-resource booleans indicating whether memory, CPU, and disk have positive headroom. +- getByLocation(locationId): Fetches location availability once, then passes that snapshot to NodeSelectionService.getMaxAvailable to return has_capacity and per-resource booleans from one consistent panel read. - getNodes(locationId): Returns location-level availability data for admin purposes. Error handling: diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md index dc68163..6559184 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md @@ -93,12 +93,12 @@ participant N as "NodeSelectionService" participant R as "ResourceCalculationService" participant P as "Pterodactyl API" C->>A : GET /availability/{locationId} -A->>N : getMaxAvailable(locationId) -N->>R : getLocationAvailability(locationId) +A->>R : getLocationAvailability(locationId) R->>P : GET /locations/{id}?include=nodes,servers P-->>R : JSON payload -R-->>N : location availability -N-->>A : max_available +R-->>A : location availability +A->>N : getMaxAvailable(locationId, locationData) +N-->>A : max_available from same snapshot A-->>C : {max_memory,max_cpu,max_disk,...} ``` diff --git a/.qoder/repowiki/en/content/Deployment.md b/.qoder/repowiki/en/content/Deployment.md index 1e73cb7..559fff1 100644 --- a/.qoder/repowiki/en/content/Deployment.md +++ b/.qoder/repowiki/en/content/Deployment.md @@ -144,7 +144,7 @@ Operational requirements: - Scheduler must be running to execute cleanup and alert checks. - Database must support transactions and pessimistic locking. - Network access to the Pterodactyl Panel API must be allowed from the Paymenter host. -- Node payloads must provide a numeric `cpu_threads` capacity value; missing or malformed node/server capacity fields fail closed instead of advertising unverified capacity. +- Node payloads must provide a numeric `cpu_threads` capacity value; missing or malformed node/server capacity fields fail closed instead of advertising unverified capacity. Stock Pterodactyl does not expose this node field. Keep deployment paused until PR #22's explicit local `NodeCapacityPolicy` is rebased onto this reconciliation (or an equivalent trusted capacity source is installed). **Section sources** - [DynamicPterodactyl.php:48-75](file://DynamicPterodactyl.php#L48-L75) diff --git a/.qoder/repowiki/en/content/Testing.md b/.qoder/repowiki/en/content/Testing.md index 769a3f4..c41848d 100644 --- a/.qoder/repowiki/en/content/Testing.md +++ b/.qoder/repowiki/en/content/Testing.md @@ -100,7 +100,7 @@ Key components under test: ## Architecture Overview The testing architecture isolates external dependencies and enforces deterministic environments: - phpunit.xml forces array cache/session/queue and sync queue. -- tests/bootstrap.php requires `APP_ENV=testing` and accepts only `paymenter_test`, `:memory:`, or the `:temporary:` sentinel. The sentinel generates and atomically claims an unpredictable private SQLite path before Paymenter boots; caller-supplied SQLite paths are rejected. +- tests/bootstrap.php requires `APP_ENV=testing` and accepts only `paymenter_test`, `:memory:`, or the `:temporary:` sentinel. The sentinel generates an unpredictable process-private named in-memory SQLite database and retains an anchor connection before Paymenter boots; caller-supplied SQLite paths and URI names are rejected. - Feature tests load routes and use DatabaseTransactions to keep state isolated per test. - Unit tests mock or fake HTTP and DB interactions to avoid real calls. @@ -354,7 +354,7 @@ The test suite provides robust coverage across service logic, API endpoints, and ## Appendices ### How to Run the Test Suite -- Set `DB_DATABASE` to `paymenter_test`, `:memory:`, or `:temporary:`. The standalone `:temporary:` database is generated, migrated on first application boot, and cleaned up at process shutdown. +- Set `DB_DATABASE` to `paymenter_test`, `:memory:`, or `:temporary:`. The standalone `:temporary:` database is generated in memory, shared with Laravel through its private URI, migrated on first application boot, and discarded at process shutdown. - Use the outer Paymenter vendor PHPUnit binary as configured by the project. - Run unit tests: vendor/bin/phpunit --testsuite=Unit - Run feature tests: vendor/bin/phpunit --testsuite=Feature @@ -398,7 +398,7 @@ The test suite provides robust coverage across service logic, API endpoints, and ### Test Database Setup and Fixtures - Database isolation: - phpunit.xml sets DB_CONNECTION and DB_DATABASE for tests. - - tests/bootstrap.php enforces the test database guard and atomically owns any standalone SQLite path before use. + - tests/bootstrap.php enforces the test database guard and retains the anchor connection for the process-private standalone SQLite database. - Fixtures: - Create minimal required records (products, config options, carts, cart items) within tests. - Use factories where available; otherwise insert raw rows via DB facade. diff --git a/.qoder/repowiki/en/content/Troubleshooting.md b/.qoder/repowiki/en/content/Troubleshooting.md index c566124..f6867ed 100644 --- a/.qoder/repowiki/en/content/Troubleshooting.md +++ b/.qoder/repowiki/en/content/Troubleshooting.md @@ -96,12 +96,12 @@ participant S as "ResourceCalculationService" participant P as "Pterodactyl API" C->>R : GET /api/dynamic-pterodactyl/availability/{locationId} R->>A : getByLocation(locationId) -A->>N : getMaxAvailable(locationId) -N->>S : getLocationAvailability(locationId) -S->>P : GET /api/application/nodes (with filters) +A->>S : getLocationAvailability(locationId) +S->>P : GET /api/application/locations/{id}?include=nodes,servers P-->>S : nodes + servers -S-->>N : locationData -N-->>A : max_available +S-->>A : locationData +A->>N : getMaxAvailable(locationId, locationData) +N-->>A : max_available from same snapshot A-->>C : {success,data} ``` diff --git a/.qoder/repowiki/en/meta/repowiki-metadata.json b/.qoder/repowiki/en/meta/repowiki-metadata.json index ea8bb38..8ee065f 100644 --- a/.qoder/repowiki/en/meta/repowiki-metadata.json +++ b/.qoder/repowiki/en/meta/repowiki-metadata.json @@ -1 +1 @@ -{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-86","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"227-257","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"452-498","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"a979596d6efe10d64710b17a20f51f7568585f40","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file +{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-90","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"227-265","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"444-513","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted:6mjqr/IowaZHmZRFDheV40UGsQ0sVJEEfQuKG2umzvjguvQXGNDi1nl747nCkFgOsOds5jYVCKsejZB5Ycp55oXbpBTWUOFuTcbJi+3ZrQm9i4kbql3UWJNNseqDdzVBXYHp7WTzFhQ0U5rqZB4uDZ61rmVX/LpmmgFuevs1x8owCRFo3w/YQxC110zOuoxFXRy2D7RBc6ZTQZk/Reik/DkkqHuXW1aYatf+BkXbpHcpfYrOqk8p9/VEp0mMj0gECCQO0Pqw4Hd/Sv3nADV41c6kckej0v9kJtXhZqOzBdsFT7mLWuylMl+qvHsaHJ0MDt5MzrpvlfrgBeGBF5Midf8ReNZ6ORrydHNfFH09xJE6cpbKTERWFXgTyuay7GSWk5DakToppKb1wHNu0axV5Iq6vDU/uFLj1Nshh92Rdd/Nu1PY5z+2DpuP/55wMgC5+trljToArBiPQOHJAn4PtzRb7TLb+cSeKIxDddZ0ZmkGII9iJGE5gsK+DqnvDEAnbNBlGwbz5SIC+7PUjI6rja91bfQSJVQleSXZt86XHg5MtKJ9EwDGiHfHOD5jfZKwxPWwV/qECGdRIM78OQo5SUuP6twlgFU/UnnGz7dRSHYYeoR5mdmHDNZS+3bThmZbxUgjSht5CiCg+6eaiMcph3vjsDgefJtfFegbIm50KOBcyFp/oS2o3GYLVYHq4Hs2iT2VB/R0b6N36KLn2i6o3cfqgzKAI6QQ1C7jRX+8iREvlX3lBr//FC1VuUjr4iORHHlHGiAYFO50FtKAbrzk9gdnSj/zENTdsp6cR32Pbikqe7VjE7lio3O6NQcNHlypZIcUM+6Kyk+NUxn+LDngSqWYvrLat+AA5GqBFxhmhMrSFE0N3KLrPKC+NdWo99CaBzTZ2A+bbwas+ZajkwtAP4yAR+r8xFyf8kqQJ2tzMX3Hu3fs/ZY5IL1SLOpUeolvQV1APALj4BbcSDmNdJ9+mzDyRnbHeUgoxP7vYaqUQhqO7QQK3q26sySlLGLC/HkuR8NMYBsWaAxDopofmdR1ATxpAKWQyqQW0bGBQOPISzTIroTNSM4RPKIH/wyC2e/stnHcI2UnMoRO741LRUdkDYjkoZ4pX71D5l0fIekJjyJVA9Y7yTKy0s6zBxOnGFh/5As6sWSqEt/KBUXi+w2JtZAsIgHRsuH9UkmJD4i/83YgEIkuaxKNDyiSJc18vS9qZfLAR3k6dIDnCeqx2EUM57Hw2X3lHksgjYxhueVcr9sltsnMjqSvWjTJcGusE+pg+8z8MDo4GUxQt9ZGaUS4ZvT+aMTcjHJXKoT7xs0XgHJMGzLEiKvjeO3Xw0Iys459ym3Ju0jEogWDGsNP+5GSkpYhtX7kVR+zPlQuTlNYPIW9kewpAq+PoPYmy4i2WKlJ01CF7HVyHK73SJ3cASCVTlxVlPoO8faKhwLDgEEmWBNQKMfE4WudF8NSSYf3+qVwzpVlXjK5Ws64YYGZb87dbP7Vc4Mr9KSdsFKOouyOkHfWjwGNOSjiMC/pL5mjRILIh7Lo+fccxeFT4m1nTHIQ5YGG8M5Zs3NJr2dlmf8BEc0G4q9qr9M+lzefp+gykp4fS4zsnw/DGl38T/eqr9Tq+saf9MLlHZE/KI/+soLxPv1McH9P3SeGZCVlvxlGSFoO1Beqn1guVZWP0T5Vvs0GDZhcb7HqkmxidrJAMfVnTde6+UT5awe/iqtB8M95DigmGKah/I9I4gqTYGRnHLI4C9AQR3yxlke54c1/hifk7Xj5XKrUXEKBxfyF3P3TY7GUMmtndNA9a06sonBYWM2kytc0U4e0AvSuPhJeEWoR7QGZqo0c9bdkhlRsV65XFj640N9n12eEBa4G96+SXbKVqj+zKeECjLiyMCKx3wDLHa9Cs0VK3KIcl3heMF6lMIzAZOKESrs1ltPN6CT3AV6bSp3F2jT/46EQw9KJYDDUJKdunvmZdpah00g56m20GiY4Jg/7g6Ka46DENUcU62j4muR/DrcMxA1hEfrzTjcGp+f2pze2z9WX5Mv7gC5W90ozOfEvK1HTP6Tc0JqLRj2U2DN5Q+PRfNMoiI2JhfhQm9Chbqmoc86RL3z1A7N88M6VPqamzyPLwzMBXt40Dh9qsi1tNVwA/s9TP1Q7fT3IOCOoclDAbadPOKQMQLHAwas2/1sFNyfDGBSuahQ0LtNbs5oNRHBkhLr+2DFiaeU8SSo9hDAKRzxUiCOiHNFt2XRd4c7zs46e9mJCd+pGIIDEDKKTDfD+Mi5vpVMSivc0q3OW8GuKSYqbVKEG+Gz9HxnmcGOrDcJkRrCulqicsKScSX5/6bWoCabWYIGTsC3KZSueEu7f7xbsyeocxHcOCtU7L5evb6lwfNaaboCWcTVtQK//aet0C70B28WMA9Wly02VeyiGD/RGYWCM7Cqhw9cn63O9UPBKpaoCza2BErOXWtOd9BYJrCahN1jzCfWhDWWquHd+SixiIg/ApExEl7LhfWDhH/yc1kc8K7hq9OlD7gzfJICamZcYrkjZRBx7LebsiA/vdOcyNxDVW7TZ8H9IaAhsuynHN+8hOIBpem1R6ASKkuJLZVzPtPr6nWvHE3Xekh2VLXKhZNd2vN630Zn1KLTKx3mieZk+Ojpa0oXplkte1QA8UDEBLVAXkhbuF9011k2Bd49V0BvMoFT4TDLVJtZ5vQODFyo0C6P3yUpxBKiIYN+DjDuGENy3jZcIQYXIodgg5b0jgVGTMS5uWJSRewUjx/UgZNmbCq6LibeowRk2JiqL4DmiKay2mkQa6BlLFyhjYwWTHddGNj3NrON+35+AN4dpdCkkCr2/kMPv5mnzgi3QJIqWUJXUHdUg3ZbQmG/yf58hLn3J1bLayAu4pSI5cMd7iDOcPx5j5+QzQSAVo5X3Oa1xmq6jiDh6/AAASkH16Hv0sASVxuE8TRWQFm88YShX/aUQcTgte0tD1b0EpuAAceN496lJMmSVM5izotMtraTUMIND3ytV+Q+nXF7PiN7N5HUD6At5Xg32nwCbQ4vF3nhQjOt5820Pem4fG82RyiZw9U3SA+uxVhaXcdV+WCG6wUh/15yTOBbdvgKt9pSm5uYioEumFQOHq76xkVgDmqmFo+4u5k+LUq/PUjYSFBiJ53/t+xu7lz3ZC4pCsqVO0cFPHust3mBOod8pBAh01dCPkD3oYfwnWBPf+MbnhO79AzA6UsP9Bfi0KOv/yLrgVXRaVMZGw2C62K+4pLxQkV0oaX4D07sVGZWTtlGn/BOFvX/MyM+17PAYd4OaEvl5gk25vy5cdm0PbYUX3DZFob/92IDZe6wXDqzc0rAIXRjCOLcabHIKGvMG3BV188kWylEKAzIJpvHKecNawEBwR2xNjR+fMAZ40sNzLD0vMxQhWgC+pQT4EiC7GgCmQBssy18L3QxWYnhjfws4CmhpeLRMk3PwCLNGw+p4xpa3v+G+mLeNlv0FABA4mYmEeOYhqSCfB+jFw4Chi5+72zUGzapammzIh/0GwNYA+WaA+q4z6atxIjj1r17hOM+jO7RGdcJjHxLcFMujfG3Vw0qpmqLO7CCVTvKxkDgMo7lTLTDhRB2nn6bYw27Sg4/SMcy00PIQ9UyIGzhoJIFDTGp+GnFCVqjbknucTfn88utRVQrKT3iOdSHV6G2r0i4byvp1nOtfK06l2mzCE4kVP5Nm2KuYSotlAGrKZPezokOOmWQSJhguOKILjeAYu6lf4MttjIF5ySTVpJ5CsWXs+bZY3pKN2KS3xY2hZtXmxM41S0cfnQJXH0ydWGsbBNLIwVhaha/boR9zi1owv6qWynnFkuASutH+VJtgoqYtge42bGIm8IiVlmfB3Z2q7kNchPgFPm7kfIALte/FLswFb6GL8hLW9O4pEG10vRWPrMkxu/5Cm0dM92QSW1njxOEYj0jHEwr37ZBVJKE2P5om2/9rjYU6CZg4MTD1ybE/t7Gquwnb9x8wm3NdsR3fhVPKOlJBh/XA7PYCDy20HtVSmvStbm0pho/HUmEVfyGQIrgbMTb6IAhumAKWb7NVkMkMhQZjbmXa0Wf0cAyZCwBLBY7AnwFuQ9niRrsjpQAeqGZWtyK2OE31WezwkpoR/X7U7IvsmnR1FvIGZAkKLIph00z7YguWain7pmC675sboI6TmC6XiI8mizzm6xi4F9tXE24+8LAF5Ff7Om4mSZgtyFVbDyTUKKIqXB8UftRmbUbf7sUnl73HsMrl1R+AB9rqOKvgQax9ip3OXwVGFcoPRMwqRlFLoFJ5TkW3FqTCrdC5mVDMAAXNvxHJiBL04K+0pyV5wZ9twfdJhZVR+OfNsUckWFf8MVuWsG7gtuzYCPSbUJjWiK6e2NtzdQTrWyOgpTUkoTqmrNofApyekFDaxJn0tjYeU3sPXMbvb9w+PA7j/l8qkplDfNiEnWRjljtOktshJHGeRYRIKpKcxWV+1iguw+czhG49VFPQRgK9xrtRjCsr5n7tAGJlO1VlJCEa2gOE6IW/Bco3YysRsVBI3dedsoFSVfs9DwTcTNIW4VqaT4MN5EtmVeA65cvfoHpiNQ6ef+ax2AVulUiXFFDmP7yDVMursb0FcXm7KIeDlFC8FRpMa91fp6nc14RrzF441OIyya4T5vbotuokwULzEP695MxWEBHhR64MIZjRScsp8oQKonpHbIec9spVDYiN1HaQW23HAq9bumrRlFiHH6nEKV3H9pXLfVsCtknfLhm9c8JyP4Dx0dFCxJB7Y3v1J6I0QOtj7wb6hrYcGl1+3cBPJyon0gk51eAspwzeHLHiuiEpuQnoNL+1fL3Z40orysvlX1cvpMol9bdmlE4XgbIXVf7KSJL3zI/FkUdoQUqLmYsVs/g5ZpQwrMz3aewxCAl5uOw6sPHhs2NYlYwrdwyGE+zUkDCyf3BssHA4/crZP47IQOnRufr7ZFa90o4IyCJ5wthw+T+c+h0VGeaNnhdRNp/TyQ5HNR4/qN9EdxO7tr1aJfF56hummn7yaTxsI5mIbmJi8uOKGTJU7RHiGIsWukchtx3HEwYBDfNbetAxcQo+1CLHmqs9tp7PF24BP6Qd7BS0nrdRz3nZJlb8cdJygLpDPj/4rh7HmB0e0EOg/2RUUUnRE0ZIZHRuJD2gXv0ZFEF3qIfgXW8XFjplaEnkihIdcnbhR9dl+ZlSB+bABD8w6q20smj/bBz1r4PaMsgnA4UIzHMLWV54yX07E11atWtmN9tiTovj1xuuqAwT3tNr0ZCcJz/2mi7DLYwAem/DKExh3hab4BtDKEWfkghoJZCJPwHQkuc1m6tABgoIs3hqQNfBKJDMINEMnpnvlD/C2ol3Mawo7EbdicIiGsc+poqrky3tLrEtZoOZ/zft6lb8pQM/mNvX6ij6oYH7lYvdtSASOmlkqtuSKyWRxlAASZVociul3HU1q9Xt68iDOvls+aFS+Op14OcvKzqpOTbW/6gZizQkohhXlujGKecvQ+V+WAnLEDgk0W2cA0Mlqt9A1A0HPHt/CND4J2LJm4AulxA+sfXYEmSv861YyYq9VaD0tq6p1LVpwQ3cm5HjWcv1idt8807Z1L2Id7ER/N7uOUS7L0k2UniL7P6QC4IEJW4JVHvQJaO/7Xc7DeUIkv1SiBiGVzrardAiMAI6hSafaWZwAvwsn5GfU5Ng9Uz6JoGf+I1rHgZwb6PP9YAkFUXlFFBqX6CQQt+9axTPKKd/AZ9w6IHHIRIXwjRnLupSoiV7JvgrpQNcQoY0LHxAF3lTlBd91gKvbwWAYTiv0QdBTgJTV9Uuc4Zdp9R9vNTtfs6OpInFvQc0bmKZXoTF9P6+iUetATQfRshlgx4BjtfK9khPcDSsCG9336Lptz40AUh4nmPzxXNZKI+nTfkGoGCIfqVvoUxwlgzFVyngSIll0RlNPMaejUabKI2uvLdBDmnVZLtvK6fW1OxjXHhhSdWwFjxv+favZ2y+suXte26AmFOIuyv2Rm6L9ir76htUVDmawHsczq4PJUZG4OtD8D4JKgGzX7Vg9n8EZGBGykh29VRFkV1oHR3DYTHuldeBQ3z/lyBRB8t39OWaqRQ7IrLD/0ZyLn1bB2ZvtTo6MvW6yLb/ckvkMvQXe9noPrpbHHnEHWnrrCtbVeWWOsMVBYjUgFKLJzeRxYUk+vibIKEz3a4/fTxll10kOIsOjIp+x/dchyU+lezTz0W2esT9pfc5mnIachMdOYDqlP31+OUrIYYX89P2cd/u+mDIPf4F5hR61WWUI4dKHEp+fRgRCOrUk84LW7kezK3W0B7ri1r25kF/2k7gwkEVBL21zmLXYXNFCMCBJCMc3iVDvKYCktLPUOyCheO63oRVbGCgL4LgDKP3gObuwT9xTUDZ+L/cjdbykPSbOBQdrCTWM81gq1n13ehk/T1jPoepjUGMToGvfbBfhAtXvDpgs1ly36iHB7ZxZCG/6n5PgFzjk4szJqH7QfHijwW9sJ3t388W/npXzXYu56ESyau3yVwRhKJ7xqT/E7woImUiwkRE4kwg4tk3eQp415DIsAgkSCyNqTooX9T2udnd+708V8Nwl/B4zXLGzOJQG8QrVfiuYEqRLReD057NhtQ/D/T2U7KGLAM8cWMC0JeVQgn+/tS0CcEhxWwBmVwIp7zLbkWqezjc35Z7mcRepBKS1Db1iTdM7YQdlkj+XP8me5+SHNzzCdfhpNvKMSsvFAFiIJeUU087OD/wEnMh3V6Ki8NXl5sYeVWm4qi09QNYPFgl0z/3eU4K0k3i9lOsGUuBSm6wP+0YTT2ppve5AmA6ioi+d1dbPZLnVAISA+LT8ObdTeW6T0wYbwM4bg/qQ6dOzsKfDpLmyfcYWmNS2FArFhua1s66ZIXGObc1IcvwdHU6gPWdFnkWGSTk7DwNJUyQXooUrNkYL+x8tx14/kOznj4nFBfaT9KQiiMNZVNbSb7I7HjynQG5I1rnPr52Q+yhJOXPMoEaRwDpe4pi0zTMNNEZMmcFWLa8KQi1A4wkCerMyvQhgf1WyJqOX9O36SaJZZxEdG13f3+PvtJNFvMn6iJKnJ1JuyadrAnOVwx/KaNbyNy0DuVmzeh0maLdTIy1yY3d1a77XlcNIZDAC6dAS4V3pVYogzBBRD6FP9kyMpQK22LJcijv2JCyS92gCJbAiR2wRCOYf1jImPbeDOFLCGK2DDLihrdSWMPXzx46qJ38IF0UuGxosv0tL7iZt4TrOXZQXtckkMCNZpLYgH65d4PXF9s4NRA00KmfLdh0z9ihpggvqjkXWQCMsef5c8jBivY/+e+xx1XY+7pf5zBbqi6+MmGvkRnhbmLhOcyJ/bqnVfXcLcrmMUoZtMk6m6yD6kLYau8zhrwR3ZdIQwQ7N3WfMbIo8hd2FekMVIDz4cVfzGtEkQSPIIjmJeUMZ2TsfM9jyzXkUMPKetiALE7UtWxfQ6eEYPOWLNjzbh0sGp+EUoB+6OvP/1RZzDvAncgz/nWjIAS8H2S4LrQTO34s5LGGZmDLRl9f/fVVrwfiWBAeiD0kBXSYTNeJW4wULnzSWlvYr3ll9lCaWdQOnS14yJFEW05VafnYQ3UM+tlbJlFozQ1zehZxNc2Pv3KF4yFp0r8o0fYtMkMnvA8Xh9dmvJ8A/tt7GImE7fvCZKxANwej9Raaf0eCwLZfdW3lS7FB+CZ9y48kXntYMU9JxFUnqoVQrF+hVMBjMRR0abCVXfOVAwbxvdAxIrY8qV+jVGa90WvhAkKkgh+Hf8yCiri6+ifiMfDnv+k1W0UAwQj0dLPop8z3y09Pn8A9G80BEPFmI91s9HJBsAPXccTYveHQktvoUk7Qq+W8b0dAsjsQFs8BcTvGwvQFCYvLo22JMgHL54hZvcvvC1M6sc8uDfzPiQAj6orQhe60GhvE+35362Atxb/fCtBAaKGebYAAMRFg+wsfAH4aEzHvhSFVl42JGPakQS7s2bTx0cbVnMLsBSSji47jIXqAXtiduTFP36loKpYOl7n3KmR7bLcewC7AeNctVIIQ+0JeM+5FjJEQ1EgYA/Ax7GmC+hdXezes3eKI1c6dMOjX6/3lF00DjU4+AvhBkrR3M3ZJAWqr9pSB9fy8vmQRanQxj0Eln4SKNu8IaZ4WbqlEEmbOFJ6u4Io0RSvKzklYMzlm38bNqqEckKRNGspPs7uqYvFfqG2HmzKtzJVJuKvj5zInVSXD98FHeTFA4Eg2qwYhb2H76Pqdb9GFOMODMHna5A7uU7jrSMKTK0goNnv7UZAPSYdWdAEE0E4kHh/F1Jo3J3tOfqXI4ELr9skT6zKbOl6YDbPFDMgUF0IhgO9zQhKrNTf78qxC1KK+lA8KRdFFQb+PWgT72S+ME8dufBZYKNvbhX/QlkgrDm2qmwIU50VKz8MCXCQnYEmjp6jiyqd1FmZyyMg9N0AXgHaPAQwzWAmB/G/YJOGjmk7g1+eu/m1GCOljgkooweAOnryPDQEBmgcG9T1ps5P6ps+Ya6uiU7TdbZYgAZVI6oxeFIPYeGtMqCiMkwDcmWEfYlp16lFc4lVrhpE3wMtXl8/h3UsrNcY4jHEnsWf5L7wV3ukaj722ZjoQOkGAFIRiMyY8F0CshW44gtLgWetKFAlJ9ISdV6GOFb91ONxkUbRHNoWthbRayDDBOixZIi/5w9LMwGSfxfCyzYlnGgBvxxZS/POsYb9WjAVOgYqj1+gA65EpkINO5PzzG35AF+ti3s4QqSQWtuW6ZW3Ry6uThtt/Tw0EDlFDUIXd5K/o3/U6EYl94tslMYDc+AIoEWRTkqTsbsm6ZlJwQ7ARR6pJNWX9/7NbE9VjDXFhhVJwnKWCg9dTi5ifCRMW9eH0ek0hg8fwYi8daC3JoJHxhyo1nWT1HdxY7Q+UxdvBh84hlvXvwD/pA8mD9/NYSVJ2n1O0PVGMC6oQuA2SFQ19/+z04TkDQEi1x4uI3PvE7w3kRn3kfev7JrSJ7508vfEPT3MylzWYGnNNjlstjJpkubu5BRDzKC+nZwylJhJUhrhGCH+SfNH25r59CTULN9buN3C9ZB7Ea+gsFvnZ1TeRDY5tzP5u4RzCkrUlC9uhhd/y2BXjMzZD1xwL3FCXMECHccdnKFfpjbUrhqVFJ3RubK1osuMzNHQ6WR7Dy11GLbvEXA0F84yos72fYJQxYgjUb7w97j50wmnnL8DXDXrQzFxX8Ahwa6PtHwRH8FyCcnvqmH92eCU6JUf92bp3O8J8WKGBO+pfvcFSCpvtZhRpvbMlaus5d3Or7b5YmFqk8ROVqDqFPIEhb6dyDQsdzrs/N+X0hwLCg9cDxpb5r7JOg24OBgqtQOPsOCK6rMj/b7dmPIbmaI2su0QMeNCO0wUpim2/7GiVNgmq3I2Jlwg6ZlhZyz03TiGygZc3nLzdH75C0zPglSVXojAWCJps2cIHUozW/0ivvt22v9+WwcHMnMUfj1GGWs69rtru7urW3Xz0bcX5sAkftMgsB05YdWZJhZkMiCldJMkGfvhUo61x2DRig0p9+WhKv0TUTqABK+WAbT4yjgJUS3dTGFpOGqmWZZRVD6xXEFCsRg0mSDubYcSU2YoPE4k0676dXLj7L75BGaAskadGF7n2eAxJ286S28xa9vm4yVZDYlTZae8eI+3pFTCbFevS5J0kGdZ0TSzy1NclOpOPt7vnT3LzBEYjxjILS6xFmg5+WXnGyAW8YDip0bSslLGkRd7SaolhkcCDz6r0s7gZjFtQbqdScI4odDP1JEweS7TSw+40K71Au698JTMvI8WnIcowhu2blG2b/kOQfGGlaUUNZoVnWNw1IofA8mCYAPSNwPhMsKyBPaKPvY5KAgCAIfHBnyJyXwOXRQs9Sdld6+LtQcuIBv/zeHlF6w3xZxlGbiC6G7Hb2Wo2TJfUJ4tACJnONM8BpETTzFtptGgNipolfvjb1+vNsWAByCkv60yOBlFQcAUzVu0ZZzSGNTSYEqgd5gYtqRNOjXpAIZTxw77wIkfH319Ud1LdZmh29ynRBprzEWjUOi66Q1dRoLIDK7pVsItHaDTmvv4ZnSQNhYqyifgnpqZLRzG84/vlPwipBkOlO4L+r1zpZvvqY92xyhoPnL+ODrrFvaKqI4aHdJBIQdMGJecD9t28ZLhkGuUG2QNpIp74uD8eJUu4qAB8FapCHd+kbaQnXlH6MzzinR7wrcgWB2ONA3E8vPjzmZhiaqi7ZFfm8M8AdVWOdxZYhzBWtK+/CiL/7AO9cOQx7tzl8BNb0hK51P6PZrfnitbvLw6FIRv9x5Wdr3eITxCLOm4hjKr+yKGSG+wilmAejJw5I+eFZSNQ5vYrITiICkpFodOC8V5F5EqeosnDvQIcSs5OeR2AC8bPxWjB6xi39ET96Txz7UUC/NxihI0SZBMmVd4S0ks/kb0RDR85/T2bnlGsRfaxa1LYBKkjGMgw0SwWAuqRoJltDK5RIFKEFdlh5tSmsA1Or8T+PDd59CfOee3S7N2twMQLZnTyZMafxdcmP67y4oPZezP7Bnt+wNqF134fyckNDfmXkBRucAW/OuhZS0NkA+3nOdCBq11LlDoTWgy1OW2ljr9/HbAv4VqJJ0YmqdOjBc3mEP7kOcB56VkzZG4TbgUBxSFn4YzDMDI26MAik4zLCiJHTUKonEQ9tvp62qqO1nXIt7zV3l/4cyzyhTQlcFkXV8PjKBYH4qTUz6Nbxao3h6J+WmfKTZ+IvYGl4VxKteJJTpPSv+QWNgqqgVavZW8XsHZzukUB5IRZ7/H4Df7ABQxoj0LzBzE/75ePugTJuzKFQaVHn43L+NVo0ccFQkC9kTiNg/vzAhRVtslEXSKwneKpm1pIeZWNdZhccTrQ9gLciXENj/W2H3GfvMv1vHIoeBKqaOSOgrx9ThjiQuKex3s1U/lBBC2ke1euyeRJ8M8K30fbY9I71fAAIYV6CDK+FZIWroAss2pHFYpkIfIyZCdc0LV5X9xUrLVHCLx842ip9FbyCj+jw8zr8AqG2Ad/1H1veTeRDo81gktDHY/1cLWgncmuueupisWDTjod7wbnFF73prWdsWJbBh2FyKAsupPUIi04tiV5Xi9LZynAf6Aejt6IP1vKpqkqg0mgIXPWx11JD3Ck39iPElppAzPlUklgCH5CtoacG7KTzrVJD60VLALKPCaJGXoX0vBl4z0sNzbx3JWrW2bZPLRez4J4EK15PpJ/5TmsuTQy28NivG9ljUB2KMQXO9WcDdvZ1/VqFaBb/OwhtDdHPkQAFOYe7uW/fgTeTFgHx/NCnzEMzx7B79UHiabsHDdBAxTNLophWX+5tUfY7qxLweL9hxSq4+hVt5/QUzKmhVvz4UD2Lx1FRAJS1EOdUrSmmso6Q7jklo0e7sGZEwKSxUEF2KCXXb0r8qTjUExpQqdONtE/aU28jpqehsHk7XRhPE2dYPS03q/Gm+T85nLBc2cyQ0TYYx2Ejj4GqXeNjXkWc3mZ192ZsOxyh3ucq/9d3JvR+SzMdS4HKPyju0YbeK+mX+NFm6bnrRakiOM9nZsEUs8c2SPX+70lMzaPBEWNpfFrBVPtWxqRSSpT6Jce4C7L5jJeGfT1+lCSooYRKNgsNeifaQDgPs1vb/Mu3xRMP1ZvqSKtFRYm50eguxyYzvg/VeWunsvTn7csVEAUQEfRj1dcLokLmWk0gYX4fN6ftixM255HXKIHjfx23S+lW1gGSz7SAVuR86ew7fmwDY6u1R2vqRBEM9g2Ualy96gx6GZbgQ2v5/y6/aGLCTAWSNwZaUHNihS0KggKyqQP6fK2PZbaCiiKmzWbhsGjOVoRM9j/VFlyHdgFYoGIoRjfU19PCjZhnCmm7Lk8XhReADCMZXrUvlvNbe0JCzGPGoYTn0HFVVCoXM/7LxASiRghqIjmF4OWqLVFTQ3sc1pBbRo5BsDcJFIKf7G4laq5a8EpMO6jKX0/rXx2RJKUIaRlHGUkSPX48tuOsFNrpgwozw/TE+xSl03ZU+vLHctHLwXEcojbuB9PAt4K+CSZu/zzbYsA86LUH9p+tc4Xzgn6bX8Ztl+iT1zmrGKh/RWDjZ2tJiLPEThKC+ihW+D2AXn/I0SLTFmddJhnc+TLBlPUJl1G4q+F62bhYZH3aJJx5YiOllGpu+/C9GsjN/D+b0pT6V20p0F6sb2bwhhxl9aV+yoL+O4zJIO9FQv+HI6nz3qXdSZt/lZVltoYmw/mCKmyA0Ka140Y1WH4gTTG7nU+Q1FM/gIxRy3ncptjOYZvQfLhYoFv7Avt6o5zzxHoti9VqMt9j410SHYVKQefZMCnY57FmI0yE0bt56TwrXs2IUUFQ83P9kmjP4/AAgjeC8chzIR6x08UjsUvv1z+PMD490ZDWEI6ThAWTAlJB0xMWzL49F25B6HTtdwj3EsByLbjiZnXwhB0wnoiC408/ho1QEpk2QkrtOkiAf3kKJqgHjRtv4UQ6WwhoqkAq7xLRlTKtvtfm87JM0xQJ3XT/72BaS0fdusbwFPXolosfpeHFLqtDMsWPYb7QVDJI6+wtB7DG4FSlRfqQXCH5IkKnlZxTgap2Qd1EFG9cHkivPVMNgdhaKX5Ek30p+65qzPwrQsRtpMjk1bjqL5sH5yZMIF10GJIgajMshf5qx6SlMAdjB5o3t9HK0oZCfBk10eEXXlCXhOCyMYjtQFl/dk7OwJU1oR3olm168FhFz0DPGiyuoLYZ5ZZYVJTh8YShowibINrW+uyztaFNCnVC2orjpOMEnEUeQw0JD7LkQwG5XLYBRXZugCSZm4Qftmpq4FBPgXGjqEmriNDK3chpxHADXSdYnW5NmEp82CvWti+YU1wCyGWA2MEHu7wE7lIiF6wLKBvIs479hJrOISPOQpl0p1SoE7rIOmGmVFMhBljW/l+/d0oTWVcGYkltEPHoScYsdDBgN+sHWnjkat1Z1yNkqOA/U7J3dPfL9vM8NSbiz7vCOnRgcNtjJitxkbYZGXy4WbbCwFFP30v6+fc9tPM99l5Nz2z4EfHwcQnUv91eNXox3LsnzaW3fSED/PhetXI3hkU0kWkPezG4ZkuIdriEuhuHiKjgDTmBQWXno9TDxkQj/aUql09QJa5N1UPmce53Y5uXqanGG4SGyQ9s+epdT5Vigc6Q1lC+i6ZeBTlij3vT4575jFkIqv8d/1X/XWoBEgtqrZP6eLSaYLo+r3Wr87hzRP39q05HUQ3fkt+00HmT9QC7h2rEMxR5ZWt1pGJSgcPZqcVgvsxPUTxtxqom+uv5Z6gODyOjG5CSlQY0ALfBz6JsPhAE/q+YTsCtTSMmz6Uy0R/Coyoeht4nqagfm/FoqfC7dG9qtc+FY3LTC2r3mjNHS6ar4QIynNPF1j9S1HQAqhJDBqcXRk0iH9XTlXq/0p8AkdDhQ35Eb421xJpgcVkTgBAl8fn7ZwDhc7zy4QXVXitL2x2wDhbbEfLvUKO0DsfA3pq/uCQJc+FiUGKWuVyItZHmSFmrPXHsO2xc/X5l35qbJIM+4iyfCizhRmufFsQwoA/kIyp4+nVNmtQXZ3J1P+NAaEFf6u046uNTxVxwVFEkaAkYPhGGI0aWnxId62Z3nJFDgwg+E9AlW1iWAvJewOIPwqSrfl59ZWxProiUO0htNns68hZCiDI466Phqw3p6GsAZ+8vHk+4EIHpmXm6QiqY+OrGHFB9d0YWBEGOvWfoBi2Ly0Hy2ftH4NoxTYJJx3TgmtgvG22xBaLAzd206yBcV2rfs72Q60U4LKl2nRojE5LnUXJNNDBfGp1RjaTmtPyGwMJk4WhMZilTf8mrjktyde404TJGSP2mtMchTyMdJFfZvqpMrfnfMsuQw1sYVfJPa9aij/dGVaxMqrGJxdPVxIeuYVMofV3hweFVrAZWJVdu5SrrRRbAAgF1mnAcrZ8qjOcftMA5VuCupRV81hZLIryA9Wmw9RcXumv9NR1LqGCQjc9l/OP+a5n85XkUxGY4YqdVQE5Fn9y7KHU3o5REsgBxf9spOWTo0BiX8Z7QjDNcKlIbFbJCGVwtRLZyIUpuGknCjh/fzQqpaJQT37pCFmmAtmULb0Nnj6bnGxLjs68r1y5UWadqmIRbB5HZ7oljRYo1bXKOMKRtgwYXS9LFEppyQzwbiR974QZWRqdIEs9wfx6nQLashFS6tG14v5s3FV/fTFmnczwwOq6sJb+4ZGYDJtYVPwSWtYJvEWaG3fGUz4GdeZPajnoULvy8QQnlCCqT8Bkmxsp8zpGwzoNbBGsw7NfU+1HvOm/KVkn/rVbeejpKvx+QfqzvtUsoi3atH3eowS+DZ5GcPfQfSSgREqv4GntJt4Kp3jd3Wjn7mTBYXF2sAJKTROvumsBiEkZu2EIsA38Fc3Ui2GwELKHoSAyp+0JY7rWJB1TQ3yxcOqKlkpZNIWQBfg7mgLfrmHeJ09fQMRomFjfHTXDQ/X6C3oyUwWiPeFNh6ePrS81SP5FzlomMahrmEbirk6yIggnI8TZZsXOvMvs2IdwFV0wFr86Vw1Z7az+dg9X6SAm29aCCK/JsBTN6NF8g3FekeUGYZFIQ/0Q6BMGhCKSFFBxW3AkhZE0Rj4IarQG7Wpnss/As/IPYOq6LyZVpAAKg9R1ihA5xN9Rxv62yoh6StTU3YoG40rvyVUm1jvmR6d8maXUMN8H2RwbA2zrVVhy0ZDqxIIi7zloZVE7TmjiSht2Fz+zVb2+5uUvoB3EnmzCIAtmYPDYtWBuRL8ymFbPX0GmEjNGEnokfOdKcUiI51QTmrLUnp0rf4r91ispSQjeRi15vBCff5qf2zZNVHjfjZQBidMAauaXpijbhdnj59faJnyrfWITXhGFcQiwqYbgfc7NRAKbUYklqOtXMb2n3L/oiCgJuY94RwyWOlY4w5McWksQTppOPG2jME+/pyljRUNIWHMmOVJaf/ysT6suX1kYEZRgQp7KR0yAsE+iQFaEjYY7FlmSsYxSYlNzElzA7gs4eQ7x6tCBB2pbxss03SJl56Eq7rFOsBfGlWMsN/8afazppu5MS0oJTKvcGshtzJhfRqbfxoemD/a1KK4KE2jb0TUnA7yeVCLJcUB4DLAUC3nxhusw3K5TdBOV+Cm5s1+YTuGPncGlzjd0UREp6UNtzWBWN9DdFKHfwqUv8+TGysrlxBFYXCefqXqDfePM1/Bw4fPLeiKaHaJoQOt5LJMZxUGYuBlXAmOxGhDIBrOdN/GKOgo/kIM5Qo2HS25WmIZ3Wcn9EimR07RUXBxEs+I7J7Nw1uBvpzjGtItCNrZXCxf9Am4OEvzKYarWW4DUdLWqzUWEjfxaGdkFo0KRzYH7aHi5paFIjned2xSh7xs7AIknGVNj008ao/hdwrgEOWNXixJtjnYVYTWhxKxcdxyBzehvUtl5nohfhpBzPqRwg7DVRr+mGtj6zI8Db9F03oaGi+vBgg6UHs3SWEcCJ+impg/QGlKERraKegmgdc0oe/HEbOjvly6uMWRUoKjkbZGpnDmuuOFKwLBBSTV2GIvbgLpOP3kgbChkTRgBJXvbqo9e5rmlEfRCA/qJLjHN/qYkSdZfXPG6FL4WswFMQQJfvmrb4aweoVjdUjWDcY9oJeIJIPbRcxOMKwODZ/EmV1gCJxwvjNd9lH2ZRjNRuctdnOh1CFuj3xWAbz80cmF9VfgoDfM/3eLF881BqEu7CqCzsmEc0zvId/Hoaw7+d1WoIVnnZFMqLYiHxyRLrokfFDl4gVP0VA+f8ibJdOxkH7yfFL1pPEE4/g4zTrCLjVoipRKlRgNtrIHMPO9YVP8bKRqUXfZYvVnEvAeJwSewWNY06x2jVaiXp+R+q8wutKccXdsQR+TdzKKRBKKEtVIlRPI9/q7lUt85SNYj16kxxOWd0JusMpkGJOz7ji3SD2z2KwSRSIfOhc0tQFb0+6d39ymPg6ZXLOFRtt2FXxLoVCCpG6fD+mzD6ciln0PbMuG0T60Ak9Q5fFy5N5YquQoMf9r50XJ6EDhBMudNVHXSc3a0ihAvJni77q18MCtKKwSxk0V4SHyKR9WTQQ9IYleFG+MxZ/vUT1G+F008jQW2fo0y38YMDlN0EuXsXGalBDZf3Yrtb1ONBjLoGNiDj5rK6L/w/mN6XTwqyx+Ya5U2GmLMQtnsraE9OjDCPciksyyWr2jzYIcE01m4omTJVX7tdtpMbnus5ibBFDboryjPK8wejiv3RP7aUuHIFg19r7wHqkUIb9XPKBfAKnMyRD3965yewX4ZGgQJ0It8bjWaRVQmhNao4v6or2A1wLyIm5SGEzkXZUu/g7yCEhxPov5d4lBM/IGPHVI7c+tr5c8ABK1XqX+nFdSFyVSaLF6juDWqkyEPYmil/gsMFYUf0hTy4mRK2wK9I7Zj5rmpJN1a8PKrg9N2Q0jskrogtFO+3qafrCEy7LpPI6/I6kSwhGNVQh2tr0inHRw7PgbKY0Wq6ySPcTv/And0ArWq/fxJPngfosoRzdgbmkt3NHzw35SIXZjb6bYyGrXkNA9KS9axVNkiWOODA2yEEwKxrbd7UAVDAzGZOROnFc6zsLHV5HNo0Bx8h8w+Bw8uje8fAyF3JsWzuSXb1yZESI3W6eTLzpovZABB1LUQ5e/7oV+f78p6isaCUOHQRrdSFuvNGUrX6NaHfzfngyafHtokm+WmDoYXlqyeweYD8gQlvRd+q7JJZhFGwrrai0y93w0RLKMQXX40+Pe0WSKtIyoiP0TnDCvuf4WKzGIK+r4QE4BcmXLO30g/anlURkFY0BT6dpB6L4KHgngD32Z2N4UptS1G9g6fC5EShjGv7SiPgoE1v8rrnrLpphaAGvtO1VPowvBdPEUsAI6jzAv66Fm2F25ZATwUMm6N8zy/42lWISydAOxhmaUxCNaow2cSntwWRFeEy29cFbeG6y4hgMgGGWY7tAg3xZcYFgEV4k0XPx3QG6ogUdty5qLGD1wNbtkTHjN/bHZM4axMZCVH2pqruKLtZUE4OtKMho0f9K5fXMnvpnZAH0/Q9DEoflsAaqcGTxL0JcO2lvNEZWHb54m/JpwDrKxQHVLrJ+Arvw1S+TZp795Cqou8SvyKEJ1iY6qOwa26d8h5IMQmGejTRZnr4rp7zbbmyhC0swljYd5ACkuZdyjmtmC6QdrrmK4DH90kUEwov5jJgdYEroiCiQXEsGZ+giYEOeM3oAdmU7r0tx4ljcZ92PQwR97hV9ICAbCaVV7Jn09Qq8oa09FCdsLJ1v3mgyReYhzVNrqJK7vSSZzKS9dPuBqoVyqk7/cH+Qon17hgWuTSz/N6dX2bbOYxAWJ5EVci9y4s29cclYBQqeq69saS4SeSqEbCMfCedhyZkwaCCXczV7qJeiwMb0ow6CAU2Hx7AQaDbiwGzK8mnnGpWn7lJQ2VVGn1QQRz8+ffpHDj2v35ziPMbxlfJEcqnBjVlns6MnBEPC1ZqmAvvz9Ec+EzGOi55nMP4KR8CM/EBVEYVrDATJtqjtrkV3TuTZg9huTfrBoC1l7kdwIzJ80cAkhm+HnB/MwFwNguxAfSIkbv/vHRo8ReiMOUzGIe1+K8bRygvT9KhVwfWTLU/atlZgA2tANnw6kJHJxBAqJF87Slcn49t0ZZ7xXOT/LqbZ6kv0y+o/vnmDfjqKMrAiftl5EGNY18RY3P7forhR9ZIMMK8pjFyJyfOW8BbsTh8FtzJvP7/JFPb+dkD1/7lvL3OXVp+OLbDwAB6W6+5lFA4wy8PRYlZafepKf4YW/pXMflKjQAC7TOyVyYFmudGSmJRW2sSJR1CQxqbZxIHor0QJo3YeyqdscaBNGpi9M9lRSMw3Vx6Pbly9Dj+6tTqRsnmKZRZ8XE3HjaEiOmkU0bvKH2BE382uvQj7vWCcHzSOpsE4/R81It2KzizfmSGwTs4MikPF9AQHRkt8kcfeoCXhQKdd6iIWnOtXAngEYy9Q+Xzs+bZkr85Y7nYq6vfgSDKVYJzG/zmUJL8yZVl08p85ZWgvj8wyupegXez6PCmPdDHOVkOcywmNwFtxjxmVP4QU9IKX9/D9W6CpMRUeBSRKMjWuTmjcI3pLQgOIHDMQ4PDZ6wV9cDlxWLIFJXbFPDNtjqMADR9FV5XOCqrih4jZJ46p/qw+t3SoMsoNJ2LplJOfzReKR+IwKAylNMbp5t6evIOYpk9QBF9/2fdL2AQvJ6CPJEuWQcIEhObcyrzSWnklQtHzwwQ/+Og4B+LsEt0DD9Qut4DUFmRxV6lmMZqIGuuRgXJCltxfg7HAcivqjC0BVp8UM6X8beJULLBioKidpAKmDWiH5E5OwA24YMroHUOl2C/XmbysKlmvhgZiSsnGMaMe8HGXrwSZ9ojz/B+kkO05zvZl/Qp0YMwvExdOjaftz1r+fLvO+F/HXjpKnS7t3C62dWY1ALera7xF0+LIgssOiJhOJH1WRtXBZjXi66xQ25qk1GN6pn+Zr06gmCNzJ7MVeog8tvC3R4iTQUW5TiN0jJCIMMH2iSzsbM8KplqaB1LBO7K9rv043QQu2UItzQFo04PcJvaMQBkOmYeeK5GXgsIqtKiyOwEmejnz5TY1fRxXpV+/EEasiUWci0C2N/jxE0wqzM+/p7fbxThNBLIH2RyTIMExccDDxv2G2mHdzutK/QPQGkS2te27HST/WlaebpBMHLIXUK1BJAawBax23aYG0ZX0tVe8Pu0TIvCUUspeke5f63IDwIFI5fXgJgwFnfr/TGcFabADGuhG7G2r6ojqOExc0kBn4096alxGgB9uuxf4GWedpksXPoShp3gttdCK3OMPqHFdRIgEvWhhmmOvt/g1Tc4PYaUnQU7w3QRhtZuOFtrKoio3I1StNwC8WfQ6Q8lFpfIiJGONPN8SJqd8OMM8DWENBU+n8fpAvMri+PWdFplnsnDenWiywpW4Jr8wDOLNS3OeehccVjPmgp2CFNH3l+Y7KOGgOdawXtF8vuMax2KiDsMS4U1QOYTMv6r8iW3DFwfg3gZyNFqs0rP3hzngl5Lcy3vn4pZc1IaIRKw39IOzllfUywGA/5QFX2dcxPhCTwqxX+icQHm9cIdvqe6oNy2QDmAgX5W7gagulonRpaApQIeSTmvPl2i36dWqnQDeTceeeqmdPWqqUh5Py+HgJJzYWc98QNhF+Ll+g+rfs4aKVQLVxjheTDxrsH0JTv35SPv0+5nN+6LmmAkXr79g4QVWr3+zxV61LrObveSeVWD+7OVk1kkYZr8bI6yPcQt0haSxYYVRlqYMpzyw8n8L9RyawKTa+lkYjZZjCWtzRD4TanAY21hpVAOIwOhBXHlsig9HJ/KcT6s0ezAvgzEAqCHD4qQI4cK9BN8gwzWk5eFOmUx+3mTd3j8xYLX8xXe22pxQhxOBkrhtdpTgnaw7MR1t8spphsFvjqQr+K/AmKJy1EFPFXfJWtvNnJhNOB2K5KVLF6MFEwK6Xb2XpjQMAHdwjDhKFN5dZfOG6OCCv5X/NlGlEyRi0rH6lyqpqy11r4V2g4pdpFOcqKbReDgyJifCPmZziMK5AIXQMl2/P8EiCRb1QKLx83DuIx2tj+N58u/ZIzBiTkzCnHfANPwe1lOkQJRWq9gDUk34Ba7FA8buT8YZZ04ZNgq9lXlBYrL1zwTFm8gWC1SbpKS09SaBa96qQ6DID3XyWPdTBv84WbPKz4V/ky3hS5rhEa38s83EuEGZ8Bs9DLfJkQOV12XEyQYLOUbEyu5m4+H/8VO98piII1PSqmdGZvAx56x0DH8yTfTFuI421grtEqAmvR30WCsOfUw0HPUDFdmb18JoktQmeLBFEge1RIn1mRMQafaIksW2CM1CdiyY7Y/an/NX93EY9fZC4Zgc/CP2UVg+ypStInvgbdPd+h7EW8+JTCgRuNxf+o9ktJ19Z4mUmgJV3JFfhClo+2DoOoftifQFab9yFecSYocX+Lp2tNiCJlJmpmQE/p2dLTo3/ncwU5l3/cA/gzRVp4565tUiYo3owEK/U3a0Ht6/Bbju786eJ730KohblBaNaBfaaX1OTwEa0X5hvV/lDoGXi4IpLW+rsyA8/UaaOtAdnDFIqqYBxlQN3SRLXEUEzjzQtJYwDedEX8nSdnb6ddgFdXhMuJHutwl9fRTQEI623BbCC7PqT/Z9nqYZyFd2lO7Sw7kvMGT37DLwKGHQX9mh++Ye5qMhBCDGGPyti5KUNAXXsuxLRjT0B4V6gNYldeY8c2wypf3gaoOWwwNpEm2p8iua1/T4WZUVLlyPLJKzlFMBRp067ydeY4ltR3IqP0B8hJSBZP/0Bxoe680/XkoWpomt6KVxHB0gmTpuCRl9kBWLzle/UzA7CSMXByAnoslmaOQqZAy2Mpsqpmg9INGhqIUvLZUnfG/ENbuS7szyBw8kbi8J/6jKN4ZC+oHed27EhWRqMO4NxCKWeTjwTTjon9jVExXJbDkhVhi66Z6TcD97jTmiF66S0yF5VOZPX61Um0XZSagzg2ddcs+pfd/RqACb0DK17KJg+kf9AkCoZGLiXGxn0g+9qqxR4tNes5ZKPRA76l9btkXjveHKKAQPvmWaDY55R3kXgxHxeWJCUKwytVvLWTVEUAYtMRYtPZ9S7EKQmI/Yvx0pdWeohGLSX6ai+HR3XyMXGqaJK4YSq9hkSE9lGzTTWiQ0wKbAY1MRLQ6UpAb6wDFf5hEljxGMM2sXPjrHaXixkZLctKs8MSsDjcFH344F1gvp7i2ya+WOjdwGVDwHJNHiFobPzrmvi8ukAz4V4+u0XE7EVBWl8nq4ChG8O0NsauVPwzmICpK3nUvjtpfEgnJpROw1gVZqPGOKXgIW64BzfswsJc6f6EQcsqX6O5fP/u1nGM0OHD6Zg7Bz+RHjN7L2bG+DKzX4CqBnDKs7RODLmdldexCQGleoj9o/Kdcx9ghnyi7/t4KmrHFKIjWdSWdZKaSnhZbCDJeGlqhs++/RuxLHRLKx+NCBPW6jwprsc0f9HQsQJJOnhRbt+zDcC2SdE6C+HRUdW3GSikfuYyh44le7CbO47BG9PKBHYoL25e96Vpe3ljJPcc89vyUqAYsfDubW1BUUEE/algOv7+PQOG8QwH/ttHv2eaNkNZ1oTIUPznSteLrQd6fTJX3ULqC+fpTc2PyvcQq29Vu3hVVXfBneqFvxCmi3rwn8BGFZnFiAIAon3qm5/WNBsItzeYQ7dggCFBk5sI2D8youGWxEwrr4+UEP/P+ee/W/k/T07Oj0AHhlJY5uQaEKgNnOBmfXpNTtM4yhZ1yuVVh3bubf7o2PbqWFebuvtk7r12WuL83kqWN+VOmCyldgtgPUA8wt2KleGQcFjtaQNXjCSSjOoe5A4GqFCm43wCtP3a/9aX7bk1pyXoVIYEf7kJhmtCL8ZthV3MXw5zMSQCeRgLTwJh3/el/H8pW13v3gVX3kgILp92uJi92iMkb3LIvtsKM3WDMBhRZ3o8MW10g1DxIgDKxwl21Sw8lJZQ3T5AFzp8X0dfq2UqFbCL4Wdmskh1t8RTZ8HJcjHYI8oDlLcfl+u4SS9OVLG9+nJgHCT2+ei1VYsBqQOsOnFRLd0Agmf4X6eorn5x7X2DM3bT9/dI3YEp2u0Ys4r5XWrZDHZ4eRDdGXn60PdmEPeu68FRDkW7Qh+roObW1ONtakxyuW+O9+NGwb+Q1iYR+by44LzBtPL6kELiVSDhWTWLYn/DH5AuhS930E1y2sILHtYmikeomhZb0MGfC2MuwdtSE7DDPRPZtZ5YJVw0cqgPxT2O5agPBxpzkc7eamnIsSRjWCeE5Vq+h1LYgE9NtY6d5ZRjLr+mVxp1Ar3v8+aRqGzjYhfEKgJaWmGI/PDuWYr2wD8P5IeNUn/Bl2YZclMesZpS9YftEp729sSOBH34THyeXavr1zu4cXQlfAln1B5aLgU/I/I7ig0Bwo0h7XxnFa2SxQkjy3WzmBRwXXqyfZh9WKd4rLUc2sKvsaeY1Jg6stWX4mX5MgYaF3DjolxK9v7cAml/SDxxCZYyO6SHMxif/EnL5pJPWdrXeS/e5wXbYkDi7E068/dDxdNb2p7rpQRMRTNPSQDlNL5UzaKD9Z51f2l0ZFSCAayxUl/6Mvh407TSaw3RsdnxkCAykhFfn4pq/4azyut0zf03RlfuGJI+SYWg6jvNSdyyrUllFsPxqB1tRDBKDAmvaLWKKB/1b5AgAgLa0fZcPtPbl5G9T02pGozcU7I0nSTBvIYxDvy1x8Soit9dTgFoZZL62WWlNrg8Jg6RnnChRUk/E5PLq2bkTxupEtKuNnGAKfEim7bUAjkwJKe13c+vHnLfWUoalgCgogLABVH3KpxjyIFqIBp6jiT/8hMB9yfQTIZzrUnOxEqP7Wu1OT+i2/wTVDoIsuLH2I60FC1kC+tb13/I55EEWWdxzdY2qIgVwEOVkjIA0nJkIkLZp5Sue7d/aA/qC5ObbavhuGKGZYILBArsRzuk6z6hKl0+39H6YcdnnCcm/snPeUNtxStK37gIQH4tKx2kriKAwDgQnwq/IwHwUSc3hQ9dRccN+ilGtoaCY6ohIUykwOEG4XKDD6NzhtWl9i/6pA49Xrq4fC2Udn1ecxrVReq3PM7TK2RYCNDqLWCtUV4vJVCyY8Avf8sRCVKAn3uXdRzKJCZIdIQzBmBGMDdB9wRuaLbhpOCZgxtWqQ8z0mT+DP2B6a9aR+P/PTcDxHEXwlqqmZc6boVWLHTxWvyEomw35IfLnXou/ZdxEyV2Cqr8MEXfbjGTAA4KEeQtciELhprD8oOWYT3iFw+nJHQVNz31kStQvp2WO/gUko5QU+hwGXyRJ/UsYVE+SA1uayZ6QlxWWNXUw1SyWlvenrH2PLChNoHhOkBzX9mbVGUlpbfUS/rjHLpZ5OjD/VdsGMUGzSoitBLLJqpI4/dDQLvYUxMiMxNSSPnXmeP9QMPjv86ASmE0/cRMOSh5KoTFx8IhLZP/7mS56bsQ9F/5uveCjxcMpX+OpdY+MuQifnTXK7I4BryAm4Bjw0Kg2XHh2rghMRPOYsIECVbcj6pXcmwIQSYbF7QTzT3lFyoA2C8Nak/bc1QP1B/oZ+2/Iad/8Exw9B09ay/x0MSI1R4Y7Md9NWP9+MVz9Jkg8FUnTQ2rBKjOZQX70cOzXZ74ggrx+BzHra+9M5+VAWBoE7oDN1/c5cJKaYCfIPaolhyS3xIwuRfjGL6OaZHdLlRvcYBRlI1K/G2E2GpUTYY/wgVoehfCqY8pZ4UDTsFhU1GOC+N+uxiS9JoQI1+FyDMsgb7rJZO/CVMv6o69iKnPaxPaCt5+c2Dad33dQCAopMdsN2cItE2/tRAw1yNg7nVB6jMI/87cW/L6RF7aQdYj3aj0mNmOp11Hpg7uXyg7WogCJuY0CdhHOUZzsuBVZ2SuutvKRagv55Zm6sNWRhIDtOgnZy8XbEu5UtyvyNRc7qTQHBEdYiNwC54IX8Yj3WycAn5oNk1So6Uesfnti9OP/FrqhBLNm/9HVzYc11WhwG89avztTdyeGv5W0BZCYzSrQOHkca3EPdaTF7mnHr5m1KJiRytPACXdpcGrmuiGXIiJQMK7LWbQwkuJ4bVP1KsuoB6N25vHQhRANFTqYmtg7pCHnwx0S5qVVBjzynrSIV/IH33J7+z+VnW0cMnfHmah6chzLSuRk3gJNIyWdVWLHUbDn5ltgKX1eehfNRF8cEhhXOMj6K3lf4zzBEcFxb17JBi2r1Q7nhOPCGytjWedKFth/j3hm4t59ptjIV2A3Jq8VkaBqYGxnr4PTB+drLFYImAk7WbiqY3A0cMiNPAI9UKz+rmLtLea9oelJ0Aw49AlmN++MdC94NBmphrDdQKz4PF+ejnu+HqFqDrETUQiyB/Q4hJmu4BG8CYV1VKP5EXwLZGzQgMRee5PgGOAvnoIzP7dRGjBTkJmfMT/TghPylI7liIUnb3+9ZtOvBJK7Ji/DtCGR4LqIh8p9zE/5J6qDWiq/WZb766xKTtuh+hXjFoHYc4ksC9cNADD98lVrKM3GyrzTgaSRjLSD9MsXNv85LQNGM44eWU2zBh7w4QDOSVCr6vR7SfcyK3sAFZTjmUiBRvngQ7fessaBGmfhOt6X2qOSfHlDCVg/kBokjQoJGbwx8c36TRMd66/QEAze85yotlXIyy7I1PKUIzc69yO2mQ7Ug14zdug5E8sGAcuaNvPiIPBXHpO5MlSs61k3UmKJYxQI5qJb39fT/IBnyzKJTRkS4DnNfj7U95XtI6ePkO6+1TKPozrLNs8exJ44Lmu8buiUJJ6p1W9NqaHB9zmsY2bTUff3K4veCGXQMwMZhKIA9DVUHJq4k2IPjg13iOIlaCcFwAS3Zq/OZTa+wMPQsFiYw6iw+dfsiJXYguKWTzsip+PKfHpBJpJ2kVEW75O4NtARb32IpxRScSxTnfql9aa10F/TBWTmnVtOLvbXVXOnGel6My2Vw/yXv5eUNxxl+63hZY4mfZeqDFFwNn0e6awS3zuapdG3edbPJJD25ieZ2yDswG8aGudMYdt72I4Al1iSlT8LhfzvhERJXyTQA4Cj10U+JAzlw1fKAvOPGta5QBQiU6tBAnfKkFTsP5E3mG0jJ1BzJn1GtrKkwQ2SXn6IGAjKrsNH1DfIxXo8YtlT65gVC7QyeQjpb8uVCU2KUIrmW759BNhQpp/SOFhAzFz7eoL9Ns7URW1Y4ikDOOmniMDaIYptSR8GFmcUsLiaH8dEq0BozKKnD0loFm5YMvH8OkXmeabOvEQ2eN0KrIDBOq6W5xlsKzOVwwk/S3v0sNt/oiHzbGrD40FsDgTECpKuk0p2WPLjCCQvvtg9cMYoi1m9MnoHJdxP7dLmtZ9SFLntPnVeQ0cVvbzQ5h8zvH87rz2H/zkTrZ80zvrXJo+6Apa5cKirsAxzmpW0YSoPjCR7UKC/UtE3inhqr/SiiNqE+a5TpwDApYGMidUXwyMcqOTEvecZWR2J3lvHb4kNpI0qlJYDkraybyf04TP+kX6Vq593KIzJvVx0T6d8P/80p5iBja/1Yeb1Y6HGb2B2CcS3kaWNXEEQuyAa7GaQUhKSGDSIYl/P7T+sco6qOk612CIT/HJsNfB3tAyOdPkXy5ckI4Gr9b+D/DOZbRQKkw2HwVXSMZLi1VFvgmRjakmIvpCJzhWvF04HbI4jICFwRKSH2Yv6rMpQD057o4v5UzWnm8HLaFCN7fvm0m72BBoVbwfn/ZGtUvGg+1ZNkpfmk85nS22+2YkJNYyQFoSIDKpi50/4JyulgFWZ29MaXnzVvAD0eLGuYiM20e6ZQZUEZ95n3aadVoXgyd8dGu/b4zJCYSk0CcSOhJQJZyeOApSmoFeskD0deSqNBOuwiwDYNVr2TvgqqHNWG4FPeOOVpRw+cJCR/EgssP6C1uGu8Y590aPhjGND19aACfbr7dEvoM0bo/ImRTQZy3ayplHLz/sp/c3F3L6MFXg//TqIoQ7/jej+VUpOZgnwG/YoentTvca8xQt5QyRNgme4A7uYVRiEXElSHzFLNxvjxReuGm91HF9nd9P4d1K/dhG8l9Jj79rZJggjKlOaknftb39rCLQvfqWI/+YW7HNPKJ7VrplMmgtEAL5+rpZmnJmYgpBBSb9qJk9CuNvVKte9UVSbLKvtYThC0Vull3Cd9+zj2K0tuvS6YqseMtPRgxZsRKSVpDsxmF9sSuONVP2NXmFHQekNiS5b41Q3RLF+GlPLiDg3t2KD0Cu3u5E3PLypzFit7wnLTvMGcFOtK1LElXcns5lCkoKKRbqQKcDlUhA+FvasdU8mR5SgeVCAAwa8lcnFQU68v8Sblsd00I0j515N9DU5+zT3mTkUQCYtwfxkHeJ38pnlSM3r+kIiU0d9z9VWHWqrAAVyHNhVY5dAYR4qeo6Gdv7ksMyiNHuiHIHRdelqbQWoqsGKc0bzsbHaaQqTIJg1AOaMqtWsEfw2Fs+u6aRIVb6rd/KMhDzWSdfQL9GDfWSw+GYznUS+IycABZzA42uuD5eGAJeuVJaQcZxAj+4eZ7X1zYqvTJhFdFWHYzBfSXXXA2wMXplcUN2UTWgClAt9GupviZAd38LO1oc+NVVClgUY5V+ltvKV2wUVN4tj8gKnR3R1F4YHPVfil7sTzd6bbJlGt42vBZ658cY5sRwcUAJM8uneuFFVT7KSeCA247/Mtmi+O5lckVGJHy+rIM0IdStlGFOX1yk0wJ9zr2lZl3U5Lg17iAPFOkyzde/NWGMyfHcqPE+mJX4ABx/FjvdjtSpZFuIKxGeSU3aUtG2hIOCCvxbzr9s6jBGqaDVTaaobRRCe+p6celXP/Hb3QPlhILnPWtdD4+STJ9Q1ruu39SqFhvAWXBM52TU6bo8eM2cIessvUaOXagb97XV5OK+p6fsHJOOwcTagDhK/rWlYjoqeAUVLI2VHWkarJA9jvt6FYyqOwL9laF0/20YYqQDPn8Q+erYTdGxY6ZcH8QeGOdMhMHucKO53TDxdV5CdHd2rdtUQvczWdVr2/WpDhSWe8Lti93kVsXKtQTpgFwuYXIA+wdSFm3OHkkse7c8FrVp0UZK0CjLj9pEu34Du1+DZ1Wzd/SNWEWAOgSCDNs02k/Ha5mLQKwBWamnSlhBo3rMef2k4xbLUqVdoG/9Xi6i/D9NeCSOcWA9mn68HfH5N0Unwp1RdD61iP4HUD+6RSFM1HiDbmwlfwUN9nM16M7HgrcZN8vUIoLqI2o04mrvdu9nRsFIxadOBeJwb5VKjVgQiwDUBdkiTP+2nYKEcoE7bJwh8c5ILVJMTFgrzTepoyh69fwlHDE7IK9Qu16naeM1AIK0hmsfoPdJ3klfC3WQeYYhmxdNKmgjtOVCsAUA5GBk2F8cLxIW8xPFFqMh9FRJbqvpaH1l/2ek+gl+HV3gRhjYPfaFuUb6B3S9Y8rPpZzoOYmuID2NpOA+t99W46K+3BzExnnlnWar81WprpVvR3UY13Sft2CIsLblkxOtksn7ZsFO7NuJqdgqYCscsdtBCYRkqbHHDtWu1h7VUih1RS7uRpTkYndhU6EgonpsSlE20OBLMRhkdJbwsqd2xpb81/wxRx56UfkaDbGJbNgOQFm/pmLub0r/m0SA2R9nTET5GiBqvkbpj9D//ftiGiWHMfYtac6gTHIgJIY3GCIF+KTH+cdV1YRUoWz90Ifp1VTO/IdBFRV4vWZqvQQ1UfhREwvy+wL7wgRi+TvTFapG2OHngUqZrgJPQKurOzb2R7cdVOlGCtbROTA23lY5uAE7dW9xcm5tAj1lAXaJ8vxvVjlHK9+LmBBpZa4EJ9kn/WKp/SHfDzSAIBAy0n+Pu8BxERGbRT4EmAAhavxk+EprlAGTQQwg7uEw1icep/fO9pzmZfNIDHsUXZF3vgdnOdKmwuxM2gjSKYcODpzDIWzUbR43ltkNaYONjmvpnSd0oM9bOTHt5j1G5Z9ZV1cqDmOW0ShDlQLbxP6P45G+JbcH4GplYKvz4iowtwo2i8E0oAWKKJRdm3M0Yu2WAPSJq1mf6JrRv0cZpNimG2YBSFJFcRdxOhAAdvWuAG+C3ITuW3bd+toYBQXSqjhjpQYcXHJyqmKw869WBX4EbEji2utQaH0Vm9tWsuMS272HCIEkkMS4bXQYE7AKk39x35gz4snIWQNgWRfJDrx8hewYzvfm4Uq5zD4AorUZYqyfHphbxrWPGUvSwP+4BNe3ulXLi2r0DfioZkbhFV282cyHgJSR+6FbOdeQ4S4c19h+PKByq1uXDRSXC7FGpLj5eQFJg7/0hRJXAhxXZ9+CHnQjp7jqGbwDJm0P/BcF0U67e0DJrFxFciREgoPhbfWitArVGC7xf/P0nNHxnMQrn5ZtmVO/5wH79t6ZCTaiTvLdMMyHML8ymubVWkG9ncX+1ywARre/Tfo+5IUvA9xb6lwG3F3kKHv/BkBBQjhH9sgNLxNck/k8PiXy5CJ/66AMskUEaMRJMAFfz+qdwlaBeuutGRjBuXpdR4pFPrKHmmYfQhaOLpiqVw/zhAEMIyhlXKPj1vPqI46Vwipou8MBnb8gzVxSwc9YSHMPBj21VlMLZkwSbkAuwdIIkB+eNfvTsL6Kow3DRrl3VEdamoTFBD3CZigeaXlrYtCazdjXSQ+UxBECLqE85dUz3Qh7uhC0sbWhLk96sE4pnrFn3DPoYhC/2aqX90sFZH21drBs75VrZGrGRw96FimVnkw8O06hYfqOInQPbbKQdBXD/i0cF1SxXtjMzUJWtE1VBoAUiTtX8wCzEMzzoTf4vODBgWNX1bVrcoXi0d4zE3mTlO+4gRm9Bea1ACC/cyGIyKRivrTd/pZFET47iGVWMHgJnENDxCzoKuWFbXFCsrDFKKjr3PS4S3UgJ/3tO68mF51vnkeSxf1uABwwD+D2Nh5pf0YscnFkUklE7SpbyJzRSj6NOqHwb4vJkHsFtXjDBUukvpv43zwB9LLwBR1mnvikG3a+r5/lzMDOtJBI3eeD8OoSJw/QpfDVJdk3efVQpwmD6HHI2GUtkPj6Ib4unb88jnB9wZ+lN1YZjvcOPZWUehjSvyjoq/+nZTodlPnkwLpm7Rgl/08w56RcMdn7ch047DhpLx1QIVaVCMClz9k/mqfDibmhkfz9laaWCNbxApnRgKFtxI7Vp1XzyYnIXXDCdfidsWJRqQLw2hjcB566RHVpr8vx8AdlWCBTwdjzRKqTwC5RKJJLyEf+AHhLP0uyCPTwLrpqFsCZUyN16QF3Ue3UuRUcAlEBIWaBpDPlkHNOQyPh8LGedzA5XewYFiMy7FF7MBHlqk0Y7WW2jTzRh2OuASh3Jh4rrxgyYFIEkVnQJxZud11qjaN07+EjX2uMh1L6f/bPOSBvbuatkeWluk6N4JFytj9z2PCkU/OO8A4keCwssMj4Io5XaAJxgdWJoZbC7Tj/bziKp/blAjuS4vDndzW1PDdGZ2H4gQvhXChQAFnOctiQGCO5U7W1mlP1t+aP+LXHvykvETATDoOL0hnj4IWTBDJm7/XNX/KGxPmuf0pVnXZ08CoklGMSjaxk9elKRloLmjebt6NT7flbmMprU9kpzJIFofT2I8Jp61bEtXx8gSY7XRMkr0JCKraWGhE62bztRbcTXUk73UHEiOFuDEZe3NvA0KIeAe3mKsWfJOzdlfAkyH1w+btnHw/U8fRmyHJR5KcLFSxq0vSK8/dCj6+7YEU0GB8SW+afmXmS3AlT260CzxMlc1yxgCxqvDdUdk/zEoHSLhNxW0oqVULK93rRXzJHafBtRfKs2cB1dKkvrinHB+qH3m1182f6QX0KPanpQdPXBLBeLlrHwWuHuoja4zWvpPYrTy7s4r9FV9zZuyHKdqb0Wp3S26oqOXb3IlZoZG1DfLEXmOah6M6hAa/bWt6lF7kd2xMHwH+4qn17QB2YHHiDX4O1PGJU0bAl+DVyXr2+C2hp15lhsWSrQ+GSB2gyNSLqPie37lwbRpfFYZSvBFAkdtXolaeptvAiLM7/LuzKF8mA/KGP+GzlqZ1iDN28lNSmYYFHv/iQWItHwRzfBGJXtaS1im9E0y3n+SiW6OYg80xcs4h0Q8iGr4CbaBABNZly/ig8NrBC49tXFoWZVaEnP3MEu6zZ6QrmSZkBCDGb5fZDpBQlUI2ecBoPxoI4lIak3y0EjnEVACsjnfP1XU8BSpobOqZRZi/LEbIKNGnL2XL9uf7cP2U25oq3qne9ud6MCcqC7SHbsYYBq9CH+jvKmFkbwlEz0Pqbd0gKKiCuibvJnxoD0irPL1Myg8KnqexD+pfucUchtH9jzj/xzXvERbsCMq9yMw8ipKB3cfRxfa5HTmUNapyXuzIJekjOrK856oU/jEgD9Sy/P8SZ8X5Gy/bp/Wl6uI1LslePH3ziYYu4HkOeWPoG/5QsfvVn6xpxCn6A2TycL2owell/EUskdLlgAsNUsRwaqtj6C2x5mptow8hwWUadoK9wB6eykE1vYRd2aCt0hSIuhWdNAVRZwp8aucK7fLwZ+N1j2fucrfQ/6ilFfgckOKRX4vcyBWqsqceWCach4pfPk4GHY6Iav1zvaX5RVxKGfokc7a2tjqNdpQit4GtzgnNx+SOD80Hy+tDdv4kQHw8rlNI/8CooD4Nm+wiuntHg+CydNXDtbViCuAZl1Yc2SveZKTyTf4uSf6qRnDnEN7cjk6hUx2HdvdyMF7UMb+N34CiFiRbEsQJoeeqUDRWc1Hrrd4ktOEWEH6uuqgtXBg/NPldXarew72JMjS/LZX8EdhUECQZDko7hpOe0vtnNyyefV2R7QtfgJOn/5GlxGBMIWgII+JBxcNpkjngy++p7e4BUDMbKqjKg4vpzu2I4rl66vZFqsrkvyhlEC3iICBYoBcVJnM3EqEsglKIU5nTQVvEuUbITEsr34ALWaQG9rmVr7kDsxArFSOu4ZR8ml5HnhtV8SEZD8SCxwrmqGcvmK7DYZZG5+vVLuluRjommJQVaFAZrSFV22+xXconnJuPfPw6Tef8eXdjFlB4Gsm6iAT2fhHiWgh8I34FWs4d/ATeM5s5rlCKqTYwYNA8LWwgqQbrYMSkQrKQ5Sn47Z3/0WhrF3EQ9kN75x2ldQ787wIvokSg7gFPd/Le1lGqPwBWBxlfIf0Ijs9PqdCSnh6vS5G/vP1LSgq51HX3GW4e+GIQdkvHp1WZ6kxGGeqXQFbZE35vQrUVss7TGml/pMc3tcg5wGiOz0ujIGCfoUAmQ9fk+0hvRs/EO7xd3KVcmQa7VNaYFlaQBcBHXyruCyosp5pT8pg1pIhFuey7pS2nA5cR07iW6e3/bd7N8l2BnpMQ0Z7y5z/62LWI+MgQxVhYSGgquvD7yiso2YTy0K2Me5gy/4pIY/fOdI76eOf1fPWtKJGk93y0UDb9fYW1QVpx+CdtdaUQuI1h/EoDjQ3KOBOFaqG1ZLEmQZStMY40f+GCW5eU/PCLo7DFT60GrUiz2UklAYvAekyJ6RaaJC0q5KAXcq8G3UJnDLfCzdX8qpf+rh4rjWqaesmZ0pEskSrkz+t3/4C7+pLGyiaXSMRzfpTamKmlJ4rYvuU9aAIHzwODMZnd7BRMa0q9IVaa5w55twqqkgi6ZEp3HK0CEwgQpUK5ELDuwahzqaPIVw48Iq28fiIkUHjOfSjTu6NnbkJj2jd35O6nLFMAmM86lfjdDQuBqKVLvzoZ1vD5e45ZSfwAwStzKZyIIkmVPsH2hUAq638X9ceLEHSQBwjX8pW9H5k2NEWzZpC2xpqy4L0PmzY2DzacooJwa6nvUWCF7mMud4h668xPwjWoILL/hhoHZ7EPJyVKcN1VmNSp569ZRVuYlwfYDkRnimOgD/d41ewQb3ul8nGWcyiSvdXQPFl+elva4W/7Z3CRAhVGJtuXUr8xRbQOVf5h5R3KWyIbdQiJ0+7G78ciuAZbKzixA9fXIYLnhlweA1b2rTy43CXpnKINYl+PfRVd9zqJPdXNB58RJxJ7cBD5Z0upLkJJ0tQBp4ES4vcAiS0Ea6AwUqAxGnxV97VsFU3cZigs8dmTO6+j+fbLo0MF3tYyiAkk8D4wkkPyQ0vSYGgS2w8gpkCeOLTCSbbSiAI8FCL7SR6J7ZPqKRSoWIzzdk5zAJtw2VRydWHZ9gxpf1DQAQqBegLLTXA0JN62UpIlCF1LUZIvIsCwFDJYs+dYoTBskjnoB9JAPwJ8gecwXfWUUmxl3vodScQ96pT1OPXBLOyGzy+D93FlWHOSudxmLDO7qXmfep1YfsENVlxeVoUEOfYCCq6yYZ8zdTnBBEkk5jqC5wMb0LMM/JPPJZIoLF1Pzl0hy1Z3F57M98p/9F7q2ZGe8Fp9Hr3gmyIDCmUZswdOxqNV8Jsic5BV2Kx4fbFOg4Ajcx9UkFneCBNBrowCXSoBDeM7HK4vj1CicMQG6o/A/AmSJmAeJkDU9Sg5YeRaauplS2cG400N+ut2dLZIOqap6+9iuN9xTCMzeDjN+4QXqMplup6JPYuHP424RIbCNiTl3oyA4SYzC2MQdN2KuhzDjZS6h9R1wKTVIDOtgifAtyvj3iajFrNBWwi4bGZ2j0adndmTtLYEAyjKHit95+l+fmhHs4e9bzh79pJztLIvWAfZHmqHZ8e7TsNHcxgPPe8eeK4XSkg6XD7NBjfdz/+acz8OnGDgzQW+3SOXCVABOWzLEOW2oYDTZTkoh35X9lp0LUPOOnZu/FUIPPEpSnmIBiADjcCHS58v0I/vzir7hBjfi0fxLnhz69xBSo9C/1NQB89XNJCut0IGTnH5lJuloYkYsl8wqKU0iGtei7gkmAJonHOcrrNmfkMizLCmjYeclOF3WS/55vQBWf41yUt9Q0m7gYVRPfD5/zxdzO1/xQybMBFGvtWKeq8v3sAq0rhtomQWdhsBrPWdKQbVTytCskc+jpaIVrQHO0w2EfyICIgV67CpXLMM3zgJuU38/m8O5zj1tpAIUuE7Me9vBAC/KSZb34MdOtc6A9aJJbuD5NjNaT3apXla2bXs8baRznPfSsZ+aPw2aU9A9K6p8izvT8/gbdlnBGdedAR/T/FkJNI5wwF2xTIhr/u4V720NtYBqG/ruBjy3MgvXhgmtREB/Psx+GWzWI/ikPEAmquXUigKi63/lv5YRWr/upTkcsZ/mughZvQ0uY5FgEB5w0j1CUsv3f9pgBUrmMUOTSwAMV0scgBfYZ0i2XVK3cPe2WU+VaIRkG+zssadOp4u1/Kg3OBMPmKvLJFoLHWVqwWY+hdv8UIVJTkYuq6s/YFDgUW6zjiKmFryyw1YN1jp1iLrg61QgpKIIGln3MquiY9C5+/5cU+KCD5v9RgNw7xl46GKfZcsnfl60NM7jsZssgkik/9UxqyPxzRNBfnlYJWU4oZSusWPtUAjKi8N6LsgsNZ6SNowwaqh7ZWS2VlID9Q+Jfmk/0x8KX09JhTTh8EfW8A+uM8wI89YLSWlx4EfUzMP6XCVTUTQ000WOjBKUjN3zBXP28GjMSI1SYfXhSnFcvATQ7fjOoqnXVdAS9hwjU6kb2unLqJdafmSZXMDAdqCROEaONT2DinWA3v0jP6mXBHKMDQrU5wuw5GSlmwUfCIy3TzjKyiRoIASa8mjTewJ63pltDsQlY7uYkBzCJQZN9UqfYIl9pMDw25ySYvKQ53+Bu1PomAnF63VW6w68z3JDhvtWv6MLDj4SbQ1tmEPyqExT1HpF29egNKlsSu2A8d6B0eBbenB6REkbZ0ueYaUGLLCol4vfctWaAXwuKQr2GzuAr92c2PGyLZgy4RwW8rPCzQ7DVy+r4CKuKKUK/+ssRGhmJySylk1eFA5XWLD2zT/rZrS0I1KUe5g5pNIQTHLpk89bPvwoIC8/oeL1Lw+R2AMomZcQ9WiVqsAvm/9pNln7gzl+0h6x1vvoVJSe/7jrZRK7CB+qSAcqb55d6VIp+fLvO3zDzxuZAU8l6DiPCMj71PKVazilPCkcUagBC1JLoRpTO08WgocJQCdLvN+GJ1zWcx00dUzuUpTjrmxCipRLQHEGLZsOL9ZOKL0N488GX4BxrG4lbCMSSiwvtoQvrgBtSdQ0aRCux1y9KKvJXDHxsmJLJJP0KLsc45M/CMGCSlL3Y2wqvNYklIxuQNb5IqLEpifLAB4aimsNmVEnnLT0lVzME8MieB6WUAgzdjLZWZfTdOqyCxA/0Kvg4S1gM9X6wKHO0lQ9odXwcQRFH6K/u5gkifkCEl5FWRGmYMUMRH+FggqdLrFqof221dchOWGoHxQcaFkB9RF0wpRFYhBWujNuI5n8vSvZy/gqGmlwNFjibU1/3cJQRF8XSWIvuDJwnr3zv+zQOAD7PIm51N7P+7AOI4lqp0OsqcSaCw8Y90hi3H32DAXpqnPE87vg9VrtzK0o2IDBjYa4Ow+P4FtFvJxaSn8zq5U5Dd9VXSisZSByW4G03WNKGi0v2dZJSVnQuW/M06pbtVgjJsIPAm1p5REoqwVtZy4Ze6BPMQ3oON2qyyeXeTmJZiK3+8di7IemLmpxtesGAXBI4NUSt5k0/DdyCntZJ7CyKkgpXhtbJ4B9xNte8up+2VL4d9dLqJ7lVHntgpj/Xk6C3aAg543UvykV0oLH0SkAEzwQ9e4OGn4neZDuWy9q+PreaH7dTmo4Mlt+p7WtUXbvrrz6263ZfObCjj74q2hizx/fzlCDSlxVwdFRBuxNHm0rSVC2ycSjfpU5JnluTk/WMbXJbhyWHgxm/wz/BIQ08uyYuKAd+BSMj+G/JZZj8zGC8t4WoIywA3c4HfNemkUcGAwwcrkFY2R/AThH2zu9fphuNYadINnMWfTFKbHTkwJvGuQhbWlaxvRW6+4xtb2H8mQlpicMWTpW5oBVLlAlgTV/RmUYqIfxDICT7GEbERkM3yPTVQLyUI+Zyg5Xg5svUlygT8QzWArv/+s3q00GNUKNn7S15RrFfTj2doXrcJw3VOFGqLl3s9hiDZ0aSr1FBeOtVOi5qM/u91KP81BsaXgTsJJSCeLghqTn6ONYSou17pPMYG9kGlzoVygKsuOlaUGFdov9IJ/4wSljHVfkW5v6N1hhHigOInc75NqO67uPedNXjlXHNpP10wuoO3uAvyYWEp9pN4fUR54OG2oXQhoVnxf4etNtJNZMQPMAo8I/YLz+NOiELiKD9YUZosKY1Iw8AxtFCXU4OdjvZ8K0RtDLFAwCZeKh4R5vAX5IkL6i1L2nCMymOXbmZWLWmeZaZUfwUvh0eQl26cvjU0JwT3I8SCb3U6u009OBFIj5e+XEfRLP0nLLlQZIEHfSSlJPPalH/aV7nALDzd/BBRjBNGU9nmFTCdazljo7I1fL3to96dQNwPNfmNdbYZu0zr+RlgiZ7ldkfpWApt6uNRyMtqSvR08YwlGXtJnPF/VYZXzvu8nR+9D32a33Ef0FbQQg/ulgRv1OgP131CrrGyzyIaupz7DWNfnVZJAJlmI37BULHcIhsKMEhwhnvxKmN1PO9XVQaKR8MQ7yW5hefgi69g4pxgOHzEpt0NKgRIlsWsu5wMMkaUAzac9I6Viyk9KnUNe4FoDj4sRVcd+5P9WYFbmSmlgsq0gYTYxDPCxqfSKlwELOSmGzOg4jdji1CUM7JAfr6vD6nJZ0Vw6PXwUh0hkzl/C9gCI5bF5wP1Db3fUfk1oUafi+Jhl09g9jLaSkY1skJrVxBQ3D5DAZcIZAT88My8VK0EeYAEnKlmtUyl7J//WBRTE4kRw/Yuczm1EftJqm7Rt49TaIdGqAW0rPIv2/NR6KpYvqGlhDOaqHSyn22FVvOnzSj0seaFGUWkHAR1mgxZ0+X2icyYM6GbkpvhbxPLWR1xwfo1KO1cesL3v56Xph6u1/jCC5+XnnwjWPf8r59zeemR4LVTebjawlGyD/b4ju225jDN5oTBUW7B/SGY5UtJ4hALLti7Het0AaulScC/zxYJEcRL9Yp49EvlGAHm4Y/qFN9OUBvKOHYLg30ue3yJ3zmqz32720mayhudBTP6SKsakWOoK3iwtL5GbyFe64KHFftjlC3h2Q3WboQh9828asuyGJ5zdlSZmLQLq5ZpdHqMv/X581REFPA4V99q89ssZu/x+xxnW+CjNxm4RD5sDI/TdBqOQ4bI/xQEv8DG9wPVJW1048+ARYqn/13CpJ4joeoeHg88eqwwvZwOoylXZ/fKNb/OP6CRv6/ABBj/iA+sosFEcB4SKKHSrpjMkf428Uw4e416ZWA801ELIU7wbHSVXjS0iRj/BOnXE5iFmE3okr7pDA61oz/WmiqK5H6jifYHnicVGb9kD/fbPN5F76m8n7XDYiajXe3/6TzJYlWFOeWPkRauMb8XsEXB2URjGDLF+Qcj0oF1HjHJLb40Yk8pj+yNn4gyM+6yKr/m299lePdYh9wIu18cv4P3k55V1UzuPR4PuHUEUQgv+8+rseRwlxK68apqDKUYlYXvxlNdrfRRWGgyetWCYTAoxB06pEIhvmQ8C7nsIW/9OFS393m542slEK3WP4GS0NEUAb6PY8ws3aZGvthBx+nvKgKG2eL2D49pLB4DIkcO0nm8hMQ6gf2CWUmjBKWTbcsE9g15dkiY2aqdlnXJqBS8ANuX+g2PmF6ryCuBB/2auBZ4kJoR3C8HJ5D7/NpiRjBvdk7p48qvk3oDQfxVN2W5Iktad4zCylmURRDJ0M57HsYsqMpXCCXttPnUfOsJvb0Y1iXkDd2guWjZq5sdBxzixW0+UFwSKoLMqwKQagf/YGFNZKWaG8yCOF4Jk4htMyrvosLadZdmSUdXLLdM1ElKUCWBihPg8ccvuLMrJKqlusFkGPLLr6nUgn8tEvWaQKX8aRaoI35vNQW7mlcmWS6vmcCqg4eAQGplArE1Kr5D8kyH/ViuraonUf4gu1VjzekOCW4UkqKceuRZ8UrBMAlxwdaCu3gGjH/3F25aKqeA/1GzbOy5xPmLSv+rwsDYJY9YjTXEcwxmAWqXAOiY/XQNDNjX1zfC5JJLzVWMJUBu1nMAA6WjrIJk9jKaXX6KtRcVu0+KMJ4Pj9LVNBUrZM5Q9O03scruAJBuO/7xtd0EiUt2ngPzXO025bb13HZktWMtJt6mauNpZ/3ZnL+bLDk60vwqiGAuah3bL8PdFNrtsf4yH0r1ghfpdlvanp92+8b6o68THLnuIo54UvHuWYyn5oiYLCk7NmBnPVgEnEdftUmkkH1Ypn5g02mbC9+O15n+/taCqEkymxF2Jc1Iygm6rocckhv8F1OGlPoE3L+YTPx1YXZ73cyDotyFxBKVS4Uhf7b++9PhaDqr35qk8Y3/ScqAUfFpmylWDbFEXFRNRy6oeKDFMU+R4tt2Vi+jqnqMcHwTBpOupoFmXHV2PEodSXjSuagDkkiY4vRJ+KIYlwoDixE7CpLqA/QwwLP/JECFM99QJrSdTfn/7wBYdUKhq7k9AxkPiqnQw4UBbKFTFvPRfSz1zVtg9hCnknGJJpyz86voRZs7Z5Ncl2zH4GhTX3uxssnfGEuKycpUUm7+eWHVeFB6c+icJc73HiyocZVzHgXPg97iU3TbC9v3EwoQNwGUq4ZiwDQyCcZdqT9g+3oWliemF2HOcKNlXJjQ155fsg2Mm/UyqFuQTbNYM4KxyMosRPsSc5suwQpyaI6G59fruuds2mG7bJPOH8m5ClFXhdu/hiDL6mYEnY6583tqaq6dXzhp8XeP7v9d2oGgUb/obQHWEblqnZNu1/+5XtFKH5gg04h8YOSZUZ/YdontNVAyTzguQifAsQKhodvWwlgzAqlxJBGYT56c+k7UthMJE5uoV+T10H4Ke5vzUQX+CjtEMKH/M5RRIok0hf6/N89GOJ4FkiaUnXHJnMA68j+8XUvQpOa5o13pkHwQuufbQtsCzelamHG+krFbJ4D5Z5x2ME59dZQ4wR10ZfegmHtGLvuWigQlJ4zRsuOcyhlCpJv9tyB7dU/j1mtavgP2MR/5KVMjoQSatXWHe6r0WoSJ25wRtI2k8H3JZqIHTbO2Z8OTtmBTAEoGABPjhlWwuY6QTvr9bmlSQkFV16+kNrXpFj4a0FTumDrdrJ/3r0nFGwTHiYGKKzY/cNTFt+Gz95C/uXWrd9O1DNm6lvx8v76YDKWF7qrmOXRAJRp+EozIxBDdnCFKlssk0lipcNK0Xf9gvvnlAHqxDACxpvxsjq16fitLK7v5rxQRa5GZ1i+G0UXq+ATKazL/itnKMdpOHSHud5/HhmVnPiULEQxHGBEKEKHZLBHEO1+qvgBvTsf8OnMndZ+HrxNoMEPP1qRQbOOM2rx96VUt4hACR+llkE8ewXwWKPROru+EWhJTWpLEMdhhWU6h3mkzv4nMK5xBqt4C118MhjZpESiXsTjqqdsT5D6POuu43cfYdboNdCviP+scm3b1O4RDwrT0i6i4/yL13aUpDb/xjtFF5XIJ9puGQ5dalVXtN8vBGpRQ0uuvhVNfqKmJV1tzYiboC2gVz/X7Zy0mvLUlzaAkpnnAbbEscf6QHS4j5P5NwxwC3UVaNsNfekcrkbyVDPiB1oKtyG79zlx+02xNNVwZlSF8heQAuqESdTcqFVdydLtr4PJurfu1CfpK56+WBnAoRplmRoWhZ7w+Kua+V4wLqVoe7YFH6IUNt8lpJlHSjLG8S5tzOMejv5QwMWyZCfpsQM5+Lq8sLLCdh9DBfdmmvNMj0/2VEYrdtuGtkSCVcuVT7u4mbmKJ/a+eKdPy+z9OoqGFXpWwEUxkBPu437dHmiiYR+FNEdcxPuUY2our0VESoJwSGbiKNm5HAeWWOC3XTlEyoJlJtX8+2PO47v22KEzX+RPuwqALE/XJMxhERTAOIfMmsArKTHaDWFAPoJVD5kvGMNW0aOZ4nxaLSX+zgItvHT8nBSB0vbOPN78ZZob+zAAz5bOrch4B1tA25GgukSFNymHWhVNziOgBKptwHl0VK965LS83R4h8WYnTOlpF+sB34/D29nse3B6epj5W8VRf4KpiOmf3GQXEf6zwNkhO3WIFpemCk0lejNduC5HcBtREfaAjoDzNFl4sAJNyhzlbF9qmaS7kSSFfJFTgMX73UKzust+KYNuGAsNdlRk3DcFZoDR3WZTM5tA6xQ4t2tdaQ5dbxxxMn1LXcNsnVUh6sBKH98ej2IxIt3HU8rqTF8Bs11rkC+JSZJVdiolB7otD9NzkxcRy5BH5r+c/+DJzccYcZIQ/fql3zeNuECtCXX6zfg06cfuD00/CutzHpZEjUvf9SVEbUgJCUsSnDyotA9T5MIwtxXBAzP0XT/jtuqn78o/tlVfOh60HqEuf85udtbF5cz/Yyl2zErYUReFmkIR3zjhn4grec/ImoaW6xY54GcsQKWD5R4Ynj2rlWvwjq2e5hjYaQB1Zd7Hg5b2LE/pwYhAEl3jQMmg+XHBwUaLLI4GLBIKDzxUXTNTL8zySpv5BrdbF0HllohnvjCTRftsPuwI4EPy/dG8WUByACqf+MCyCme/qLu4WRhWKI52hcgUsxw3+WrSGVOU6SzC6ttmEgzxZNOBBR+ovIF80tIIxS1sM6qxYz55QsDEHM/pHC5Ts0Y9ne9g4sdYufiaShOI0OM1zsQCxrwIXoXCdvn8j2nlPt4SqR3sIzlDs8hIPY0dD2GimqXmULJXhwN8/KPeyOdXA8LKLMpNZhouO6DjO2tJWh+ygiNoIPRGSoK+w09iSYHywZyx8A9HeNI+2Xa8mJpSTvXonRFgtWmMJTZeKYaQZMqCdO05WvzUzEAHTnzMzerVNuoUsvW/pSdkNcEa8txGmp+hZwFNHbqoLxmeldAmNiNTWIHEiqgWRvrFhXQnk1139clEAZ1SMaoXFWavNlb9qNvx/57mBmiIstUlK5KQ8ArpNOZ4Jt2n0FF5xytCzI3JybRA/25SSTG2MHQx1qmZAa71G/A+NwstXAgYC2z6CzDinb/89i6gf9ywC8VxIT24x/l2i27X76Tzr8kyIh8BSilOJgY0tjaT1vAj9KJ9YKliQ9XTVnDyQXwctMjpvklmcPbSpFh3OjIqiZg3mRQhVzP+sjPJY1G6p4MyMsq/Wo83n27or9zQcqcDSzjjqIL0uwX3+v0xoCJakZgEObB/3iw+zUJ+YHr64/W/H5d5VJvAyYRD61D2yYqVptzu+w/KwrM5XZfjbXzbl/VpCPuxMnzP3F23vCpG3hj9RsIfMEfeAAFZRoUmFbEaKQPMpKK0bKaJLnRhJxV/qtTfZSGTTG3AnSAmIs0asPTGnLxCJqGDBYuWoT5FSt74DWgTWXKBfReyVWOF+L9lb6b8fXsoXZ/fLWZNF+jr8frIgwMLqQoJm2vfJ9CPF2cONTXin2xWIIy4aONwWNgqeX6K9QYx6KzoFG832H/USKTPtcuvKY8d9vFNcWiuAwXhgX9eL0KsB/le+fAJsqCcssGyqsX6O8w6m15aksgaEmc9mI7uI3rmxHmLbdhccrp7g78yk+eXD6zj2wOQecTxLP5oSe3S8k3AeSsuVhZu3jmgti+GW3YTyYNxFixmGLmChrT7nOfSxVCHJVudWlP2rJohf0fr99rUFQLksyqGtjcK8RuoP7AFYswP3gaWRyqSA/bXAuZNZD9GKrbQSl/+AfcGAopd5aYtmbzvloxoHB8IztC1e9eb0n4tokedub6sdsY+mJkRPOQh32rftToBw2SfHUL4gX26bnkd/Wx8DSGGDFyKgOVAtwT6OPxtMfYTxQq/sFlGREXrBppLOpvA6mGat1f3sBODcvBL9gXxSLT5vVTLdlPxfZPem+vutVdSfvsterFMUa6kapnqgbEBjF6MZzyhv9Ju2WVCGkFzWVgXiaU2unfIC/oiCnbGZ/b6KGLVMBCyFTdkNaxmGs9vUS8JqTtexjVGSPrd8pglGXiwNXccHBrUIgPzLZoam5tcsAC1KqJ08rsXbRGQ87uULaRT0hUVD5e+QQUm4gKqWHu9yK6A6Pf4D9sIIMDAXQm3VD6RT6cnmz0QiBBJezc67ccIcL8bW/tAHHxzD/c4Uohtb2c2od0hGyVGHP2zLvT7JrzMy5tD6jaUr8P2V1vIpGKcyhOhCrNqt9CuWYGttIJOphrqrruz1wunYL1vKV9LncxJ/fMTw8df4HBJWqQq0dgfPGoDJ82KEcuZgsyR4SmwoadBH1braitFg+fihUdoLnNLx83uQ/eszoMhU3q/85QyZpoKoaU8j7rORb54w0cVRh6syVLZLNriwzXtpBN4MCmnixRhAUQxV1iqoMJ83mi/OwMH+yMWaobjDFBQQo+v6bd6R8TEOhw8KA4yNyOuN0gxdIr+jKF6nDBrJszB9UK1iUcjY6LbXgNyvDXrZnb0g30vt2bXnRzTWNjBzqesRvt9ZYlM/MLEq6ncgXLVf5/jXD9KQDa+ahrSpOWQWSGATGyfusN+0t25D65pUj1/U+Q+P8Y3KRLKL9TW39t9mX+cKZVxjkzQOxJckZw+/BlL/SBrh6h0dz8wVzuFJIqwpkjaSpxvnIA6yKFoAthQFjs98wSXpTwFQP/ZtU3cmDOGHIEa9PhiHHl6euG7I3iZLBV4jiwiGTgYL4y0f0cpVcEXIGWf7BZLu+IK0m/aJ1HaNt2iRXcrYi9vwL9WwUc6p7zTpW9G9DlVQhkKqM0HC96Pw0thNOXZ/1/e60tu/9VwVY/6SlQpnB5gl1nHfB0eTkEbq6LRTRQbPx0rJA28GzxJJAzbfu81awtmqjQ3xxC/fv1UmgM/wu8+1avBMHpYuLWNECg/M8VitMf3o8ML7I4R+vS6GzXRkSEztfDUtJnvQs3AzxdUoQy0oiUDJTB5z4Y89GpXGoamuJo5T2+beREWjHCVvpmzTAd0JW9AlHIXSpopl+Qvgs8usu+OeCOA0jN8u6mvCG5c1NDB48JIzhhKbMpjCELhDaBbkmqSkzk1wRotmGyxunxI2EXKnFkcTWRPn7KsiYJo2bkTNvYMkP93hh42099VmSV+0I06UVH4pz8V5VgDr1bV96dFKBrk6uv7ImXoZGx9Ip6FLW2k45PYCYEGr7nltYVZeQY4xwWHIyup+y+uZQaFXj5DOVEB/xUG0+blDpuht0wkfsQJmp62tilI1DXjWv5kBBfNizCnWzekwrAYBS1uWxMTdhCXKlyK9NSNDUjvIONmTTZ1GIVWTz1EpFmFDurlYCQaBpKJ1Thx4irfFWl9zjmvag58mnvffDA0SDZTFEzQ0WF9YW9zfCqAAlTotiagCmnsqWwn5+mMT5osecrl4KnYZEX+bTzapwVYwJdYcp3JmysQzCOcHDAejb5ICLEOTP8xF5j2cDegC/SDXcwmCy/ZoAIF73U47/M3fG8x3iWyckyv6h2JYZbU1gkvHzvSZvIJeIfWusuM04ihzPwgyZ9i7JDeSrY8ivwo9Dl1+w283xaUZJU4RzGgbm7DDfLa5OhVPxp3G0NVk1uzFlDPOyibMawpIFgUCN085jDHuT79Ir1EcD2Ll3mgiQK4JML737kvr4FBFfMMtJyN+eWE56I4Y9m641Vqe2axt7rUXUukxQv5LTLf/bvmJq/U/68hLCSAbQw1+jgcdoteeFnkSfEFGC+d/1g8B+PYLPLYSDZsW9/PxWxsTiyZ4JrT5+oEsa0Sq423CT+HIFgKLh9MROIPAKS4zNC4mbmDhQbcE0xhw71vob2XXbgzDO1ybmIo0m/IOpb8rxZG8yamcDvFH4cR3RsbJSbs6vGf2+2ZnrqPjCj37ikj5y4PWZ3CPL8/Kf4Mdf5aA+EizxZM5pG+PNekATrPZW87tMYq1k/rIR2Tc/CbIcTiI4b1/Xnyk+0gptmgbxrvOjcRibps3jOmNvyl6FCmFfyHMeeHDaBYS4N3wa6bNnMxuoMnTz+Bzc5wo3341VIAMtGh1uTD7SvN7ZAqLa+CPB/utaUGeMscGqjfLsghi1TmMsi+qG2KEQPAHx8i89ZvsUHeKgWLgjq05dPwtgkF5hfd2sapGzuF7ZvpKvCiuq0k4vZSjOKVeL9AIP66SiEDHzYl153Vg/suveLGbS8XkeT+BYM8nM+4Kj9yqoWCbjGGAJbBxCCP40WVVzNyUyvtObF18GcKVcuRXxocLI5T/vfB9WI44BC3iFKptvt3BXJlOQYZidIyOT5KB3BmhY/tW24LEN+JkqVaDwtghql3HgnOEWD3yNX6U1ATYqWIEIbmMNH1xDKcRa15qMqyvRI04fWuLqIyFl30Yaqfp+hmng90baAJp8RvhE5H1mU3Sj7An2kl9/+Mb5fZzjEO3PDpSl4GsV5Rm9iZQe8gAvpdD+ko9TwOjjolpuolrjKU86qULZsmSq937NHrRxcM15A7ueq21bKPJtwMik1f6C6zxOBRcuHmE2J5MnnVDxi5RdXFRk2RLIxRO3/lP1nJsaAqzSNFVi2e9gh3MvgbOFUqWYNwQyqhseUr3sOpff5LiIKivP43KmmkVQxY1KtxBJa+12woB1dTzVT3zhcnRM+mm/Brre3a3lfxwWRso0A5purjPppX9MRYGe5OQgul/1EPkr7ma1cT+myPiWWfm9bkQspXZHjlmfh6f83vIRGavZda8CqW7PYK7o9+huWORmUEQTv3YbXdqAbUzpa5qGNqyXsSfoRN3xqBPvqClXxIamN1X8L4C/TXtOmB+k4UaHyyOmJ58Z73uwmVIyHlQznkYU+bst0Pt1ltPA0YEhPXXTBGYnRB46fZZqZRhm4V+pX0f7WEggcAYy3Gu/7CZKEtVIuXjZ367pQXU9oyLeUNcaIhcF+oRABFqqZuEAijMbaN8xVuJiUI3S2h/Z0BCZc8Zm8Yo3IB1liBj8w5QUVuwpBtack3jHdqiyu/J71Zo6nC1jzBEP34SoaKQbP4zpnZWeLKWEjzSkSLYubZnWAO5Om9XJSjXaBqgNIoygj++QFdGbl7QJ4j/Ba7FLcwzl0ikmAT9DknBxVoF5q/sicK5HszX/OXhZX8CCnLQVC/NBAty9zT5ARyccoEiRZCEOLpIcQrqdaQxL8DVccJY73VjC19gNG0QdcwvHjaNi6EpxmPEILyiKLgwU2Zfa263PDRDKaIBz9u0bXbOJWd8NGoHEGPgJV3mcKq3ik9hV71F/UL/qtFUZFQjSgx3MczX3OKoxfR7VcpUMyQ1LsnQGQ0WD6nD/RId3peka5iS+/GCZVljlnvXoNk482Lp176PjbJP5K/ySv43zqsdsGTmIq0z3PtMiU6DfRCLFrfR7SxpG+YDItmlRk6TuSv5Qj3cLFk/GHxA6XvzS36uEvxYVr1w8EKQXymCCfzovQH/e5+HG4zPLiEi5DaTN893LriM1xrAopo1AFmOyrovHQfqiYvT6er/LlbWRBZpM/DbKEGCE8PN2wPe4PLcfsRElHaoh+WthA9LrCoYVy4zlITQpsPDk/4KhWi4E7lJXI+3wZI6Bam9/G+ThppB/6SqJRwAB8C0KKa/x2JDC5unPTSPqKXrJy7BE2QGTExk0dqum8xoa6xmXuQc5yxaNlHmFAj1dSe8nH8x+Z5psWPtTctbvlc2C5M98O98vFRIPUiCWhaSStpVXvi5cbfeNkLRxQUczAg29QoXkMXR7bR7fTLZJwR6XKkUngEN3chuhrdKmOcjidsXduxW76ZiHlC5m4KCiCVuNMnK/TzgkKR/LIOHnOwuJCVQ/mXG8hwgYK43lpstyj5F0lpLPAvdmlhDHsjrJFblJ4Y0g0noKpF5wHMlJJCb9Bd1BBI0zKFmA6+iGYqG2sjL157HloUTU0VzLI4b3o6Sxo9XeePfB0n8jrESTNHNQ+GoJZI0khpxN+lMaZAuwGDHMmLmX75DeZ5YEaiEecFdtEd/fxX0aSdtw9s/57gaCg+hu4HSiJpuePXJD0te33Lzux9ZkxkHeYy+XkYOC23dyESLEdZk9xQamPyDXEyHA+WUH/ZMS/x8ZaCa7G9hIuRoubXrjbNtK0Sk9sR5wpJdCgMGwUXuK1fQQMKvkQQzce1VS3wtddV26VRaDK8R22x7LDVDJo0k/PQr378EHtGglP8tGpHqnqwXSupKJmFhz3M1fnkGxYQUhST6lKUytfWoZ4WqGffQpcpQl8svHVuSFLHu1LebQ2EgMrZ1DWWrYjZn7PoeGjpINeriHz+Au+W1Ty2uhxkFAI5NCsUfpPCfptSUNmdhh21p3PrKNBL23W0Zou6/47ZjHqv54R3clpaz4Gs9YnKwlLQ1k4O0b17KdrMUiGiRhoavuQM+lQZazdYSoLa2iUbhIYhjaqFSiFQEFVf1JwupzsoqTYWny4BxV/nUF+uW4OAr+C2Vv0tWr6GaDbhuPjioX/kJ8kHI75DuXJFNV6PXTw4apbs7V3wCdigmQ4NMLufgzyJ3Qvz/2eMkG2UI+sr8WwJNrinGV0jsp8H6kFLv0gxmwN3GdQLJUNhs+StTUgVx8T+MUNz2yvSKKgh4WEnLwQGrFNC2ybNNEDtqQ2aWarUDkPa0mkPhkY0diJ/hWhp+HdhWbWXH5ofLRJh4D5490/y0GIMKnZGWeEZSptWrrZsZRjfZQaSx7iM9XvDIvPHg0QpkFuDC3UIa56dKUWObxZR6E8cjhxDt0ZkdUadB9j/+HdqIPM7ry6T3IcHCBjIgl0GtLQ2CYP/bePTNwt7j2wZGDpojtcD4C+kNMUToeU86KVFKlBz1Kx4zgLFzhxG/DsKU3V2bp1M9LClXapnyq44XcZyClZtngbG5hyvbw4JUMOjQal3NkRz9UEqTi3xCHF7RkLPQr4NNfMdKYgFuuWToiNQKsnPIG51nLVt4wTSPtYj+RK6vgvTDiNi6wwlVhcqtbp47BPa55mJ5p6b2BALPM45YwHwZaz79yq1bouXg8ESuEa+SKXM5UAvGW+Jiiv6BCezltnQcgd03PPvZmps5Z7SHwLlUnmpZZmYxUGRmXVrhNiadALVxdpFyKGZtcHBI03Y/2lBwR5DODKmI4u9FzVjExxOagzQ3W4KhcIQuTF26W5lRjCj80aggi1hdUllNtA3HXd4SWyL8ydrb7dkBE6j3v0EFulaOrJ8FfSuRjVVGpx4d7mOI8TVBxWiVdZsnn8ifnElTvor4EAK3pSGFmlBAV6wxE4YDOSKXVLwis4omur2Z6Ac6bH3EuYVp4wrWoG8ORyp9ytAzWD53MbCIPE9qjoeSTGzxamxzNjkapbHsQwK9xRdIjT95oM1NGiTsCtsz8HlAisMKFkh+HOMfza6u2e8tmVaoOwNcD3rgtwP/t/YyTt1kzE38XD+T73jMXb1YnX3PW0eDC5XoS1bBZ0IqkrrBS74d6iURKRVuVN06LjyFWsL76lcSHTae7UJm5XlsEnhnkyBbodlXj3Mi4Q/ESrAtAb2QXphMzdyE1w4geSilGFccK4Z1tei6fV10egvFjCAFtmmrLqny/8frRWLzYJovumK4B/4D2YXE00ZQg8TxIhqIPGBzlZ7RApOTfgjozYBKpPSBaCQqp2r+cr0v3pjEW28pniBRidX2wg51vaRZGLs1fteApnMgkCI10WpCKXXi41mzEOVCG8TAcjMQ0J8Hzwj1oFesbFIZuRd/z2l7vvGNHJ8GeAkkkyR/hXSbMLULLFZuvBkeelGd33Ixr650p+0H2KF+XtvmMK/qnnsCDX8NDjxL8i7oGAeIrx9wKGkceheGCMEGO23tda8HPVrSjiXzliHXcrKHto6qeIPH066b4czepVNpHXMugwzLyhMh9snKIQQxy3FtfsWJgje/LZGRDlFJIOP0ou3BDESWx0mLQaQ65xf4O2D7YrywsHhIvN2HRvyZc9Kiu+Bn59GH4hg9WipC9rWcGOzkKX3mAv5Z0aFc7HCLYQYsTSj4vtIVW0zo5mJJVP7fCqSzw8sIqnN0IW7DrcpdL9XRbms8AIdf6qGnC5nDP7D9RFcxzo0Y3Aaiezd/rpFgn4Jn8QHtuRjFZjluMbBgh6d4Y3m0yTiaf3Ydim6rUi/Gqo+bLMPNW7qdda5lnmhfiUM/f2laEG1SkLAVK3tN7Wcp4L36txibh8V+5sxIA/QdtI4pZxZ5HBiQMmjddvEzSNRw1kKo/tHHrGhYYKbBar00C50upBBK7dRhpM5dHo4HgFUpNBG2PJAFVotHWjuMiC0gEh0sUYvbN5nkUQQ0kgVq6JwXVaH0WxSEPgXKJKXz+Q2uN1HcJnoUQnsPKMNSV5BPL2KuHKrVCw6h2YBJ6d9Zlt2sIWC+8ubliH7pddbaODsWFmO8nWAME0ws6qjXLd1sFXVipZHk+Nkhwu3FGUeAysfLHkyItfXByY4XTzPwB/x5QlrwsJuNDHtgvk0H62DBtupjczDoWgNW6diAnrn306cfibJAtH++dfGGKMyNDJzQXeAmKTHrkzKrKQIYsPjnlSw+LHvsfTGeWdPb8DnmT82EBx8f5zcmykelCqKK4doxsWSVO6q9xQImoBq+Fie1pTy82rYbR7wTmkSIPvJo6N5FlzT7MuGIYFJPOKaxEytEe3O+bABq/SV3TL+okt4njehdpdsBDyh1fRlcRzPlpXNNeT9KE+UsorMr9bb/rWXliyj4x6NjeYl9n2cYfP2ueisvIfBZdIJHjmsy2rfjzsc/1yMWGJFnI1W7wGBthKan9CbNyR5AJG4QVwuka+ltIgbTGXm80fir5sotsyRv1cDAWos4Wc0mtcZKUblUTsTR1PTREeL7G9EERqkoC4D9PGGwdqYl3nQoSgzNt203NPUEJsbuemg/jcfqGorE0RoXObxOnYI0nDpT3FfrW4fpEYpvEM+NJktvZS1IKIZKxeQH3dLFjejYq9L3eR2pNS5Ca2ZqvoQieWtU3kAN3gaVgveNDzqBqv0KvuWIyCCIaJiAT0AHqcxR9jSzEPJUNKGneJhIEscG7TPLBVEa4nZ/naIEhscsASOihWLo1imOTedQvshyhQQXRKwonBu4usj0UeKXJX5wZJD3Tak/IQgNCTk9NLSKRVfIbIPQTD4RH+G3r2Ig6JGkNdWL9cXkd1inEGn/BNTS3xWELuL6PR5e0TzQEiJOA6XxWoeDpQpTMZRJCjri43MDPPOAmx7FU+waLF/kBvbm4TgBKxO06+t8KwxERaNkkJ3Q+BEHh2l/n5nai7Rxx2s+mqvkLwTsiOIN+jmqfy2F9U/fRJmMu+OnVL7j6EL05GKotWV3Xelx2zec//W+A1tFxb4jX4JKjVAING9dLibT67KDxoDnC4bLvdjEzw3wUnOw89Wgzmn5Rxu7Zb49Xm0IeQPikjUO9yX+lRrvwj5X6FfSEZhIX5CxyrfWSn2SkxVfI/LAYRdxgQc5YQR0siwpEpOXgS3XO4hk9H9PG7YXRk9tOp/VPMf328LkPIftwrfsPTD8O7QZ++SGktS0L4LmWqE3MKlHm/2Q0hjyuLMEvcdKDDpv2xqfiZ7t8uyRCI0a4SK9map0/TDYfWJKSxAZsWgL8dUB9jwcXj7TKhsq1q4r/NSdfvWbugARSJbmNo2sY7Q/lsyZ715l9on9h8ip18VoOq2IEiaxwJAW1qUkKCLOcmWA/NTJJl2v5IuCl4HP0I77Wya3Q3Xv3ihmud4rgkMo+KDBiBG5VuBVYPw77auxd5XZRXAonXchirdVwMRQrKwJXKjiGwlMd9eZyrehJgRKYLS78lZ3ZDUzYGm8hRyFpYRHDffKUF5rm+5Z2Eq/dP2+f+thcVNaQG5I68sWBCnxHaY50uaXTM8FZbau5/vjCTI+F8p5b/d33JusoUKLqZrzNZsahI/gTje+dmP+vCDLQ9QklaC3dGwhMnk8s618Wgr8H6Rv8A3+PoY5VmreHhwvc5qh0lxZitFLab56y44GlcKCOTmoHPjVbuFo1//FeQNJmoDGRMcXeux13hiL7iVOkXcK4Nb76E7dbMBlK4L3FJ3rIUoWbLxNbg6q+t1P4ymsEF430q9QEh9w9Nw+CGshx3A2AySTI7Drcqrxb19QXlBCgnbDCI4iWAOLdRkXEifAYiaLyL5qfQS0jP5lcVeOqsNpnNQy6a6EYk5yToUBJnOuMlCN/6DYO2SiRNTwZ3bcYUgQbQEJzZXM002BtlMjPV0XxDhGQrmviP2fkdcrJQWeffX2nr/4IcZGYz+EtRFphQ3609WihoM+8QsCL9NYD5zkUBcmnV71l6qyuptvTFP7HdjP+yMtrtYZxZ93rxv1fnkSGoTlE0tRux0xdf+THUYrCLMZtgsmhAkJ9Ry37yunIQb9fQ0cLecnTeWvfhJwDf6g/65Be4rbHUGvjEbQiqMyMSFPut//LLxJOM7gp0P6BGotfKojt98GzAY5rxwWwrdoOM7facJG12dw38uVhsgHSlufx+9Xy+00Oz0/tFJmHSoBP+QI784GUrX2tB3fCvxWlY/qhHjB/TvNtbZ9kyN+1LsU/EMlO3/1ab35W5YCKVT/7qSctq0Q5rKfEH48bvvP0Bbbs+XsxlfEEFDflDLCDKpZe4t9zNJAkFcYqjxUvtr2TT5gcFPtnQ/SIYAO4ufXViYqN2vO3V5z5hYmwSBl1MRqDA3YpiBt7iAZbGRMMX7OZXasTYo2cLX/VQMWWEmUgonDPdv7WHued0Xj88cI4heLPy8pkPkfkepjtc/YtR3ejUb9ekmXjPWjxqbV3YNaOnIo6qh5eVmYnPvwBHPKunM+uCINKcBavbIYL3sQHoEtmxG9hIIJ1Qa/5nIF2z80JcomhQnmQfSsRk4MkwY6AIRXw/Q1sws7jagGKHR11iRJzHLzPkLWnEVhLtVD+a/dc79CsBS22xSl90USRQoES3fVgShXeU8mJmXTXXuKcyhCorGRvwYL/2Htgk6juxICdQg1k7eFdQc/SSVdInfDmeNbA8zNw1MqyQ5TGSHZ5k08MjC0jmXOKgddYlCFjjorbGmZ2hBBjTavvZpN5ElROxXYkt1B4tW2UPfYgQwiMWMh0jxAqQF8VF3KjN8u560gnklF8ufEQfi+YeZZWiM5GEqjQMXfpv2q1M3m/2PgsmZX0+e7goYfeMa4YXPT3rL5jv2keKZQZSh9rU4V6zOfQCaJH23lqb+De8vM9F8vNN3xWYZSlgpnQWv3e/mhug24dfP9ON/ZZ+lAcmsZqF0dzLBoqioDHMso4t5MXRHHs80l4NoDAVP+Pti3YABZYs7fIBQf0WrREIKkM9jZYjDjygZ/hWC9UE2Q4gM9cucfDf4T4SKO8lwRcxY74v+iq/ht6/v3jFIpPbjWEsMnG2qOdLLeHlLcVeFnkcLOxnD0dUzwvWd7PLx8ICsyuJ+hytRF9wrjk1u+mK0M7afj++C7RVbevEcjBX1r/zvdTIv5xh79uwFdPBYokTfLtpk1ppNX4AqwPt+G7TcabqYbdUwONMYwqTTx4APNNH5zW1SrR5xrCvLs49st2/JUodAPdl1FHH8YAcLYIb63HJBDrYu8mWHV8YsAyDbmoDyxi4MlhGAXBR87wyOg5DVBbQmdd9zRT/1MV06C6lVZiRdz8pk3jItDFp3A19urlm5s0pKufWl3/qtVWVyM7v4wA5vsL4ZANnKhgk/K2GUE+6AyLBnmKK22nDin5rlhQ7eoLgT2kipUM7lzWCkg1MrY8GUJMVzet8NFBr6NzUyKXf/m2/WgeKf7HSWRHm2lqdvxfiXk7ItVxQu1EnDpYqb79f5cL2VCtk0wSZAtQgSemwEZ9QjIZgjucEd5/CNlATPL27TrUjWn6TLZksbkJtVZOYmAWdD0XOl+qZtLJKsPXxiiGtarJmnGf9CK8OPt502+dbsE0OyzZz68nlg+FYhcMcl8nfeMiuTlF4/XYj8VY3WkDW0FoXHa1uWDsG/hejJ15fl9K8kOuSB66k6ji7oM2ahd2sn3GNKgB61eI4iLM9ORVYwzGLTig9Ryb2TmNoxQR47AdeJXAHXhw0mT3rX2yaRFn73bzQcRYKBTl1yEBe4F+cc1ZZN2C0axEO1wkfNPfD+FyrxptvgeZd4s6waLonu21wUCWMumuFP9EsixevVLwZWx23Nstw7usC0kDuMNVSrCqHniFQx2ualjrB4Raq+5VHLzPn2/BCmzjrGXxWJGkqJ68gLFcHp1v/Yr9RkOdF9CuLWX9Um72uJQ9WCcr433DThlcm5YygXxSmrwCxRfXp44AMxeo1DlCSJlg9eZeBE+qJQdH0c8pMhPTebkW8ji0Ni2N4eLu77m/P6+A+yD7ysN+l+B8DdzZrqo2WW/0Lk2B4x908TEpezbwBFghxcMMwTaXutMCYDOL3/5OsCaW1Wk0xF+k6oj1M/bqrvM5Kb846tC7qY2R9qp4mFmD0GSWXw9RJbrYBN8vW/bvwiIxCnKW0TKZorvfoJIQ7H0O2uQQmvy0eIq6Yf9DmR87DdTZKJRscjsxCm90d3s3SUrrRaAzzvWX6FH+Z2A7Wd+YKeW/fVHd/J6SwOQIDoUPG7YyYovST0O5NF/tF0O004+i+e//hV+q4u3xdnTHH4IikxJAbMtjAoFMnJ1t/8/KS+8tfpWz74R0hW23sb3Gp3FnkSk6JGxbuCZCVaSqyDrzEq33EENG4Mrs/UFWVdm5/ajxeRhjnLYNTO+7OYuSF6m3Rbp47GojqCdBVTxNk+bRVf4mCfbnn6Icq7pzV8UN1MFhf8qdSRUxZk7bFsCwnFrdXC+Ssk+jfCg1VhzMC7xMf0G8tdLf/r/N73iV0tWvm1E8U13RQZaRkx1kgmJKNSHQIJfb7ZfqYOBBvTk1FOBVI3BKiciLN1Ex2EcuoNYuikTqoEMLwKR0jMk/e5L3N2d0zUvlmkhOqR2MwvbWxOdHTOWJh/SmrUZyp2kEF4DoTTV52FkPPslogqR2g7LOkwHzjOteT86OND3J23bQF3EnsK6WyrXwmwBBBGy8e8+YHBeNJFvmnetkWDLOGbApcvlsPL4X3uU7TFuRNeh0PBlrCdpCZojCkYLEGPnls8nSkrJwBc36gydx7rs9bwCNO9wQWBUsILKUSFeyOGWlx0A6JBM0Gaca6YBp1WtC4raVNRXhYAlFRFiDAH0S0ZmiWRkcVcaCiapZAm7KwDMevmqKgMAGolQnApirm1sPtAqUIWuYNppK8I6ByIcpjgUVnmc1uVXsDi10Lo+VlPyFGUtNdIvrpyzW1VK5iy/xUX3kHzjurzK0if3O7AoW73i/gvQZLEC7vWa6tDuwN3kaXINNJhsVoQmzbtESOHXGR+pOQ6kYEixXMbLDX/9HK2riSMzgrcYB+0zSIKbPdO+wDEficWNMlrsfYKTkLrSrgQPG7/qdTZUU3SHy4/ZFRx/4HOcKQX2H/Oq2e5P8x/MYcssTe5S1f/mzvBcov9TNAfYs2/273FgXh6d4M0eCcZI8DaIUTrloJp7EQBXzeTv2ef7/Vf9C9N8ja1uHAHOicp+3QpwBVGt10RHcAHu1sQCCAXDDjjBfjVorLrtUE2O/tKDtGVrkYArAE7NguQS3qsH+Us0tDAufafOcK3BgUaFZisAsPvXxcEAMAeml+eRMOvWNb3mPPPwq2stKNydmOmnrhgHVHLUvFa7rfl2yO0RYqUQv1vajmv1fTE9ySiMrxRka//cpcQZQCxO6mtHuvvqVnYGQyFoeOPT9v1RMXA7ANMcL7UPqvDVOPyTvSXlPNXPZgoOEEDtbswDY7DTiFjHHi/C77X8Iuc2ptjT9DpWu+jqfG9KaCmc9b531OBFEHsBtSqMDo5t6Gz52RLAmOHE2v/ovVbD1YRVSx153qd4a3skhvfhhXP4Ra3AroITugsXPJ43QxcnGX6rCjjUUBGFoqjN1benomVvz/2eYbAqbQTD8BkgfK1EoGsHbHCI0Bm2zGHp2JOmz9Y3Vncw2W46HgcuKj5ED/3yd7uGcP4ab/FVC8vtwkz/QsWADCMCQNb4X7mIGP1FfDadAGyL9inz1p2IsTyVncF+/O7h8v7AsKj+8jslBpGk+kVWzHoV/Gl6j6Mt3lGGjw39NQbxxlpW3gALic/KemEH8M/wvadGFxd13VlkXz291s8Z37FMCJS/3czVapoge1XW3soYmPt1PLt/lh1KyQp7Vl3MAwdSSI4ED3ZEBIwa70BeUsx64jumD9i04g2o/Ez+0/a1gQgRR4DfxLY7/ncQqyLYvwK1lFa6SbLiN8ldugPvEgqhB93Baap3pWXcDNQtUQNalico8iEWCE3q/uHFUMrYOTKS1xQIIcEuVxwB92KfS6q7ewAkv2WAD48ZEIiAt9FUlex2sqqDuQUk9JefyxXkWAWdPSLNr0vI5RMZrJOWR4nvEPchr8k/O/iblSzxb2KO5JubkBs9ubAx+1MBkDwQ43w7bj9NBN+N0MO6s059l1ZvwqkO8yFC/b6VSU0se64qAs0FLLMo0Y8k5ocbIs28LP/rkhaQyIzgJx7CLABBlgkeOEEDEOCbw9R3HYo22DXvc4U67Vl0dXpzmLe0r0JEi1rqA4567JEtSEsozxaIvieGp889jV+Uo/PQdOxQ+ENIYGA6RibT/UmxdAG2rp3Xk82ensLdWoSp9DXT18XU84wThKnyr3Y2ROoh3zUBmRUo24cyKixh6Kne1a3oq0XRU+iVaaN8muazAxcPpUM26OX7N+8vZoj1gEnx6IqOhZDQFLvvTsHe4OkqdZCJAdUBkc+mRQHUVcTVKPrlbDSg4dNixkOQEU/jF8c3EO3yoKeNQW8uAMRCV0LXh2BVoV8tIyIb27mCi73hXell+gwRkuMa3RUvbaF7ucO0J77CP0eSv7tCPQ7CnGHDwBMkGICfc3CPHE9u0QIuf2v+ueSOTdJlLsPEzlk8mmsSLrf2iJREDkedQ+Tl/MyOFjrmawFyNQGolFpGylwvgwV1kxeBrAfS609OIwKrbswOsfC5kKsp1ILsglfyqRhdEiGegEHR54DMzk1V93+/rLRgz/MD9dD0oV9WwgCfaB7hasFOEi545IEdw1lnT1bXS7b+hW/1MUiK2LISTk7dgGoIc2JK80xfj2O58haZIKhG903FrTzckb0EhBlwo8odK1KEO5lhNZqimsDxs/ChmXN+H8AIwLarOLkYE/f1T7vin/QxBwOemFQvaaDGhRJG+aZ6u2E5rTF2GFTOMm17TFs4hMBAApr2dFHL8vAH+DYXCPQd6oVdGTSa2OUYMa390Gz5jlajDPaXKV4xijHIhSBRAiEIuB0LcWk3NYUG3gyeZkgDNmuShNIIDfqjZlwHvaB3HqJLTFDmHNg8DOzaf5i2bUZVfVTIrGuX6r9f4tzXxOUFw8a4sM5NKYbZi9JHMLDdGz47UbIfB4Ce4Ks8xeyibfB+nKAdT1pWWgTrpC1Etjiufs8DNw8U65/VpXHeNdOprVA+6UTVgzwj6ZBeHhr8/F5mk2GMiIBd0F0gGoWFBOuIvjeCMPnPLMBVA1FQANYQlJZDO8iyIyhHWBLgxPNsO2Wm6dRbpcGUySYpBDSOVaPx9YP5egYKU6EO8ZIrUkamibcOkMv1NmQ7r5HI2qfN8TNhZnLdCFUxMEicVi2CgcDnKW67b5fkTxn0wpQgcP+uWMY6B7uSnI5XUmOjiyOd53DBHIeEmllM2apcp5JDOTfMjzH5y3o2cDqSetPVud98GeSY7mcVJvgt0be4Hi+FJ0VFDRuR0ylrBS0o+3IynxiQNLLV6ggEwyke95WQe0pQrxM7Y0Zky5j/v6csrP3/2I8szYPxLNKtKSboAcTMGcC88hNM7ZZkSIAjR2/af1vjGpWPW7XUaX8RJivpXxsVPqSYwIfGnGw5CbTpsCVBIivLJr4TzkAanYowV1vgHyEmJHmfnRy67muH4JYEcGgn3uN4CBRy/EweOFU+NtO9BFbyw6uZdzQAbMT3kzfvUXYAdGZSrHuA4tN1u5Jxp23zXwTZ1WvJa3ZYRwqrVpkH2NvCckDlO5pWe96WP9cYoBkAt+CrF73rGE3uk08I8cafSN8ELHMfehfR0v0ZMvaskNIomIJeFxez9J5f1gv0j9p9NU6g0UT6qP/bfR6z+kW9exRrymqGoDd0lsoH38phKPF44NW497DIxbfbTEJYEVwlRdUN07PZIvQRELZVopfBiUYNvb99CrNJVVPERNYfpqsU7NrmHbI8HbawL9DI1o0c69KZQlDPOcYbhp9WuKZTWVLMmxJq4q5nW+pHLdFqIkOWtqU37WUUAdlf0EIylLfWd2XZTWUlUitORnmGigh/CILV9g9nKMZwTwyz0HB++t5/x4Dqf8RL1Hr8KNOGtMSDd+Z/N8SwgV/6Ucp47Pd1i+W6D0WtLWoFHbSS7KqI9xiGJ/C1+ia52hZ+63v+vqWFdCyIe6jmbZgBaoz5roHNjxb6sDvMu1rc+6tCm+dx84krPGlP71KkO/xFnCkkeLwPMYLRXmTJmriXe15AxhlGKsZRTx2fp8w5wyhqjypnouYwgIDEeBPmGbrp+augb4k4kcKKCVD0zw9/AEZVhHf1TD+xyDgXsv+yWxUgujrdi0kkzFf0F1xOjCCM/ZX+JQX6XHeY98DybfZQWLTdp5SNHTYS66f87n4c66dDT48NgZ2OTBp/8NMXhSCV2vhbr2w5ALyVJbCw7eCWd1Krd5t3pLJ6gqn+hGUWRGulYYYHAHWMOF0Vq5Ez3KiiDj3hoh/2GhcMzsXu2KVwZP6dmuHrJoYBJLbVgWZH5ZPf/zjYPLqPf5HYio97CgxxEqC9r58aLJUnqFsLrXzdtFcUqZXNrQr4CAx0jtR5ZSW3n9lu+lEjtV4A/qCxFarhkY5Jd1DLxjOMnxdZ7/D1c8mv+jbwtYvfAX5GE1nU72Vf0G/JMolEz/PNI0UqqKx88HK9eebNDzSQ0l6VcZgbKTCeFaBH3jQ/XG3I3fLJyKWERCbt/saZp9KLz+R5L7mJVuxBEB+3I08DsOIqGezH6eUsSy+0to98wjtLw9wXAd3nut9/CBdHoCawxD2miC3nbK5dlb8TV9RzCWyihKkLoqcFKshRkX0Ch3Q6S8P/jmbM12MGX2+Ul3Wbgk8Hj79BBawbHlpAGjxngyb6RYfZKn373LB3OF9BNOD4HCTxQr+338m+IyO87YJB51Gucg8fJflRbcUVrOT4ryxK2uXdJTp6LtEbhCk+UyoBs4xmRZbzK0qS6A9NEXrChRgO+fG2xf4vobZj7WXH232hBvtoo+TUnwazj28A1CFsUvbcmv5dt+zURpYBfuwtSfEaR9gqt0gnfqA3k06teaLlIM82sf11Qy6aKQrziG4sWgWPTACHSBVoPMT1jDirINTn1MfpJ4/NyxHCJvSFkuNUkr5A5l0mPonGyYR6qnOB+G+y64AxmcT26uvN7Jipa3KpO3rJuER8c4tjDa734Mm+qFhPhlqmMmPon7l5guamsFkq+esMFAR+3IzeF/XZCC9gHhSc0g0pqF8zPV5tK9xqh6C2pcSO8Gxxj+v37KnXTv+dkzKjg0SybsVS7aBAv/ZMJjgUSNtoqxk4ZInMpZp7DLPToWkvS8IZxgMI71AUITVDHfY6IslcN6Chv1YHdnO0e630qT5Z2EtuGFf21WysDWXBtZSpVW0l9X6IRKQ6no+LLMtphJzvvhuQGozp5a5YEDTaP2w6EqAaou478TxCgJL48uCzKLIyyE/vbr75oDu6LFw/3AIvLEjk9c5Ykas8a81v0K4kRSiDUlX5szSp9BbmbwRvYBJZOjG/P68JGhum0F3pH5dkWYnNK0M8ulAM/1cAcykLbvllLITsbjIjf0JqBREzJVb2DTWu/w0jAETYOXveouaeN6T3ujrj9yWiqEdabIRbOSqtxVf7EAMBXtf35y1bnFWgsbY76Dz3E5llxeBLHMpbTZeeBaLNLGCd1IkT+cq1efVZeNFIJ3jtCsFebA24LZcky3HGLrP6j/YHAw/VxDnRlIrUzAD9vUOO3eRvdeYPGkik1Jc2obZ7/wHi8fATgqvsvQZltUHiMgbN993OO71/UhYk/6IDmkd1RbbVC4xstlHwPRD9ayy2X6ozmJ0/8xjg0uTqXCDUWkTQP+X3vt59EvOpI55BDp2q74HJyuo9dpE84coDPh9UjHiAcz981eE3WkqCX8EKQr2m9YcHb69VChf0T+Q9B4ppvNhpV10nrdga3VGZa11h7AXHv7cpT4mQkMjPgZE7OQQuc3X5uaShhyYBNznrkILh2ZChCUKMmho7IbWmVaiS4sO+Mxxlh19x8iJ1T+X88GZVWLbng0O4wKyVDoDF7dSncAK4mR73Ly/9FLWem0KqyARm+NbPLQnTepsslze2vixWmbLB+v+FfH7ZQkqT7tnMVV0olt/wQ58OjlAKJSjW8RV/KCW68UyJdTAxbChmCc0U9xq0Hx7NXLtk6re544Qbsz45ck3nybOF4FMAlA66L7Oog11ykxeGTqgKWsIaoGkHuh+Ze+KzU9ILS8SLzzr5LgQSPWtEwBqqvElWJY7ADWLaV2JRaJODSndixyGBzv9QiWgOZZaSb7V1vKkJd/h0vEUllNai5cIDkG+fLmqk5+GmZD4nlCKoUI+ynrCBljRK7kCaclUA4mUuAcaaN3JXjPM5Vsat7pcwnwGbPO7yay1WZm/qWMNcWtERNC4g8bC3dEpTCNavmOvqNL2symcwWBEecNiZejaYBF9yNSxFht6MzC5/LOhmf1Kv0M562O+xC5WEdL2yE5bjoEdRNYuIDdDlz2GzB5ZGELf5nFpkAurhh273arATn6Y2f2Jal9Kkn/XjWOittkmD2UZg7mAb6QYEiatZFieWaDW/ldVtUqud/R8V/BBAH2Ai9BT0tXiosuDQ2u/kCPqwInfZg+ugz6qocX037ucV5cZHixJdtWO0xBHcj2rxPqum7U1b/kFnds8vjlZTdjwKyEuPv94pHhjGVR46hhflS96SYKGdgYoIszjIkP2bCgysg3etqFXmUDzr4kd5ONo8gQg79P9vzFpXFQqN4t5IOZsg5bZ7bcbUV1/dsSGxYmsuaFl0I15Us3TNUM9sInaiLlylicsSGfc8qJD15RCOuNtqMHitZaCQRcgYmA+GFXAK8KXFRGt9g4emsGVKtSC3N2nODJb97OluSmnkLl6sGRn8Qmk73WFBPZyPKGXewA3ov+1pS9YqEZQp9E0MqQLtdb87WJTGAJmm5plVxK5nf/eKURnd5589aKVkyfeCFGvajDee7rQQGnuVWhoe7ga+A7hh0/TQumj1sP1Zjjevbkc3PbrFB4L5ghCbJzRO+1hnathlV/gcOPshztnxHaYGGlKYF2P1Xt4VBtVNfcnVN4dIM926154teI/8LEnUBqqf3IEJZHbEnH82WGipsDXVBP8oKQkbDirfqW0KDuvzSrkdkuaSO1LtTNAoxzAQJeQQXKns9CAfuDLlSVbRJH3mPDBTTjPBHJrH6wdwYp3y5ZDmPlvnnI651CA1lg+v+d7AmulkV8QYSZkOsdtuZu/grVUL6zJ7dJpOSn5I7Gn2CqPaHisEZmyi8d0Lgh6DeDbqjrdNg/REhlNrKzEH+iRwcUVN/JwnNbM8fFTuk5yWrKMGh+MeJBOFyWtp7x6XiP/SbHb/HuUkU3UH5DrosQrSYtS0ywSXlGPjQ3on6bTG40VSGPg7cRu2xbrxYMf+IuZ2wW6I0vvswzPKsoxg49J7vXq49Uo+JVpu2HQy/G3nMr8H/q93Hz51ThjvmveKAi/235XuLMeBLhHgL7Kn/WVUrASq9xSIP54u47OyRXMB1eFisqFvwP9ILGFCgJB407DpCJ8Fx8sdNA/HLJ865mlW1Z6oUdGbSPy4LGEgWdBBua4gBZlauMLkdNdaDYl8PiygIVJVa1op28Y3onZR4C2OV0Ag2qX/IrgCmv3NZ2PpbdqLQLwTKnsQp13uyR+QikNjY9qI7FPJ2mvxozHiYgxCc7wOZFEk1UrjwIwZqZYYdAjI6UrBpu7clI0076Cg2qe2YE46gadSWS/2pvIvqH3aBe8fscWwVgUzI10WAVhT98/GvE9BxUFS/JIfhuolNRHtz1AM/7nSRYnJVtYP2iqxkxvu+GPFlTAaUASa9E7HWlW1ERcVtIEdkkeDO61pfyzu3bMfe8Gmsd6uwt2ubc97/3kzDtQPmGjAXCpL2tcvFyrTdLEjqlstj+8Bn5B/9aLgGi9QDtnmpKBqgN/defLY7Rgj0ZfVJmF8l2GX6LMLu0zyHPo1BHL0+OFJnHqkKtZct4jI/1QDh9GENr9J+5aSuZNCQ0ex0OV2Taw3yjlabF5zl54TcrGAYMsft09Rmrqk2d9DAJHXITKv1IBcM0mv0Fmd3Kft12RavqFQOvA2BquqQ/KTIAHFfqmEjWamM0sCUqkExBcgto8Wdzf91h1etHQEBPE5DD5pryvcb0HNSsY8qEKGen/PqyI9HvEBOhqSnIl24Q3QuwQsfkQ+QGWus4WAe94E+TfCJenRqrlkxhQh17dNomjT908X2WueAvLW3VirForgXab0ZsW0FZX7c4g/4NLOfcw4TPn52PWGh+jH7N0zU8qygMgiqjZGxMD+XwvcUMc7BDtPtxmCrRFXLErss+V1wkCj26llRiw+DhQGxfIETXEdInF998yuZNl8bC7lwDuSnW4BAyW6cO5RdF1zW1DLNsQl+uGTro6oGQTxr6ua9OVjpLdOC+JwupBpa+pG3UYmxan5Y60F6yxqGk3iZm84agoOYaD4dutUG3Q9OIcRTTk87hzx9LdgFdr9R9Rjfj50t7QvUSWm4ZD42fPh/J60gerd5vDWTHq8+QMvIVwZ/lyPb7JdlqEaLClmIpnK+tVQ2DLv9NOov+VwOADI3gT8QaN+BZWiFiLd9HscDMUcE3CUD5ohAl86UG42lEeKA/9t4cQqs0RoWbqTJLxJ70C2TK3Pj8deQgR9oda3NEaIuI899vrSMlxDspedabhOm+KqgOOzlov9A0A37OCklp+38+VIIb3MwUtA3ZDaUbf7L2e8WcciAm2iGV71tUIOlbHfKkzgLk/GCpruoMYBwhPn3f+6KCLWk3D/jjEsO6B3WZdLBlLyphUJklLT5o+3+YBxsF3E7aG8PruldgFaEmGTqdL5vL8A56/QzmXx47i58C8kXURWBikRsutxIj5hCK2XWgT+N+xLn0HpJo3CMRNZx7MuWFgEe6yKvmZ/qxjfrnGKm280Bdf8HXXjNIMS6ajDcf1ubH0V33Ah2mXYG/FDY4zGlavVBH75YcQJ37/c5i+63sKZCLzjRSZyRmS4dufuEs4bWdVsIPkILFkDg8mz2bGCMOnuPSHBZVTxIt2YZ2oJjQryMPqSuIVfv/nHF7VrHi5LGWXtFPe+Es6pCDuD2DUeOJ2brg+jsiM30r1I2sIamSHcOaUoglJd37DPi93QSfGtreA+YOsDiJp1rVw3dAa0CW0WOXxSASkcU41uhZEfpYOdUbSJej/2InYfv0dW74zXWcvWsMiSbDEfzHjPtbaXgG322orR0OUMHMIwrkMDgkwp2SWk1RVS3OJc79ezBnEqWcA8fYBNOSq9e1HIC4KFlu6iv+7zMApyIXxpCiJrjhignzWU/2z1PV21CTqL6gp9Nxkl5WZHITyh/sAMbogVcYOm19IW12FtJ51xhHFiwOmqebMlMwojz8I51EnN5JJ6gvYxRKbNpPVfxWMLVY8J0OPdsQBhq3BdJugP6Rlau2Kh6StR3gJh/5TZ23Rb4VfnPEfveQIRavXOYF9699yPJehQrfQh1A9slEdKXij+DI4+5g6GwadicPL2Ti8C0iaPc452je8IUsxzQFvljrshI8Jk/6/PPM/7G6go7LwlBMAWYHWMdzmMcw5RO43jWPHkrqj8HwN4ENIn2yg42GI/ay17+Q+Pm7cMc2GfeLHTvCsmV2f1ptLQziuHLE+mm1idpNAqOyPDWtMMMbqBY+daDE+VvnVyqLhpLA6WS80z5FsJEhk2AaXYxa2gzi3V3EMpOCFSOzCvPJPbltbtjt1NoglQ70EleeA5HtrJV5slY0/PaFJBho3kUTnFe3fbspwPfFXgXV51r9JE8y021cKV8Tl0vejdlPlaAagmaPwNz1wT5jRVXci77FjsxjSoW8JuS+horXNdl/2X7Gd7Srk4ubp8YKCZe0Z0Y/ChBWrIs9JBbCkh7K2KV4+YKn/+kNYA4jBaogstE0YmX2QUUJ9FM0t9si+1SEBefNzNiaI3HQkhavlcv7sZQCgs5pue5wmZLj4r2W+1r2CvY6dkAKiVMqS5MGeawoK7BpPf7C+K0wE+yyceQffPCggPbVM91ZW6s5J+aw02AFAGM8d3SoYMPWnwz7/eTYS+gaHPQC9cfLpJD5h4+VMr5k1UIKrsUCvIS1SM1Vs9D0UX5g22gRKx0NzTlv7xgb1tcksg5I/1uguDtfovUrg1jLEY3s66GcbGUyBfCROzBxHU05cFOPBB7Huqmy9yuxLvYq5SYZGKByj5l05kr9BHXMNOZuHHWFZvLNNQGsbYNsZOluOJOoSeLqOqJ9Rl1yWlSz21kHSYJjXXK3rU0qSIHs/MipB/F8x3mm7V7sOE9Q/jXMJadrCxokdKDP4IvHJhULSuPaFaPnqc+5/oexinWDQrbgP2GA3HqPeBrm0LSohbIY20A0g7byX8oSXO3jl+H3/8hp8SFCU6Dk0r3qm03znJEazEHZj6hO/YNZz3faFBP24eutz+26oiLFlZ7AuGX/kydi17GG5+GIVPtLTYEogyQ+/EnZmhg+xkToZG9YWitjoc8IOj0mSel7rGToiwtbjbJf/L0p+vB36XX3CkpNyPHrRrvIU5ka/stTXiVVVW5X2TluzeLa+Krfn/BfSAXoO24WMr4p/teTIypQEWn/EA2Mb/mWujVhH7IiIwGEQ0PAnGOtNPBZzvmNFctzZZxg3MNgXuZsgV9giX4jSs+xVH2S8zEDrgoqf7Md7Tyw7fp5hIgODIvxA8w5ABXXHj6cxzbHfTVla/cnnWI5kZtrGgXcCIP72M8+TUV3cNO16tT/Td+yavNEUA+WxGeEQEXC/1t0351yfWcW6YBMHnMz8uzN5y5aHUsPBngboruLNozLWwRwUMzh+cJ/ceSPByDWXf/jrpNPJ4kYl3+ePy0y3u1GY+55xCD28xrneXq31Rzyh277UkAd6SxDjysxS8O/0T1hJQ5qBK+Qndry/QFz2Fruhggr/81/SgmdKcjUDcYw45WTCiByb9NtfftPCj02rK8AQffGW0qThNeIuFg25s233MU1npNtKJHRdolkpQBgfXu7R+oTbpDRwLZGiNX7LEX7KEJw+FClYzYlQrTffs+a0ggf+CpgCl0igPeGnb2yNgphYQ9lJfd85u4SQSx0ldY2jvb4vkDrg2QF2hXnZKKTgdY1KE60IEjptpgzGe1g3SRRrs/vgDSS3sSaO9xfySqrL3ZyH/Ch16XYkcGU5LaqPJ0M9RpljiMqcENHx4S7dmhtxi3vynGweNEV7RYMGL/0538lRf6+mL1tR70oBRXTANKQSJGMtz7YmK2Zf3ej8PHP0uSOdr30EtbWb1dp0GP5MpcpFs8FIqTzLlOw+G0LC0UOyLVgFVll12HJ/ncchnSMjk2LM+h34P882qwI5G0DiycAGy7sRL6Rw4mR1aKweCUgl6ls+iehg0tgehkktr1TeuEiFyRW/5yRqaZwisQOQur+4TptQNFXb1nXWxfL/2DZJ542HDjF4TnAGSXX59G4iN90HBL9UrX/o3l0vvfuqeG8oETyjGptJkV9RgNdcXfgIEqu/xuUkZBymbqflWopaCh3brS6JB4q4Ewd+6enDKwg9HelprdgIeD41oJewxTnNbQId5pNlhFpBznuuC+VTO5Y/n+qkV/s6ZLsj9/ZbRojOBjwkjlCisYM7TAWuTtaWohluyMzo08sb+iFp20MEVQp//C6FfV96Sd/MigbA5CxHzswlZusjOwfYur7uMuHLiICprsRuuDfjEqPytixP+qtKk6+MhvMeO8L/uylLQav3GMwlJswkOuF8Tj0cOgQigfIt1LPle18mlaDc3nyYw5mLdN+Bbd9lTeBJTAhy9VD/clu42A4YX/2IU3OoRfUenGFS7BuiWIvKcptqmCg2BR0m9Wn+U20OXvf0rMvOObVXXOkIdQBiIyn7TzXORkGzIrusORlgmmnjp7ouMQTqPXwesTgFIkQlaP+yWHcI9Pu9XEgjZAComRrWkNOhlkvuEFHhbL7iA5C3kzOz0Q8rw0izSEsvN9bROwOolwiO9gKT5eu7TpVzejqHK30v2Mh6RvpdTrqjo5v2vvfR8gKQf40Mq6Es3QraC1FMi6qsIB7oW11oR6N3MmTwF1us4cGzsOxboB5NzW3vLlmAPLnKuvbigh5XI71x0S2RwPuK4eSoqVHSadJqcFB+0kMzEN+ldFHoMN9bxFqAZ7tgp1MCrM335TKJhHyt29qY5SZZJ8wq9/okopiEB6hQT4wzcUEtyU4TEVy6oUuhT8nnNupWgbhiyW6/PrMd5XcTMDSeeA+QjC/0wiCEHRvBtci7kLrMJElXzK4W/vfh0aks/vyZZfWl6SrYeMgyIR9CqTVHFDquyqWuuIYbKqAkiqvQcJgyWacdyJSnYNnLHIMi6LYln9Bzpkg5v3kIlNmEk7ChVvkSABE+V2vNUXplbI2nA9Uqe6wd/o/Xac7VNWADOEJS1kHYkVC/KtrHSyfzYVnU4Iybt6v+TBzT0PgGlIwWHWeXb5+ffjjzn05YeeHNDlLvCIFxvz2c70+YgY3Q+/425isSV9ZwxulLxPXrGulBuHhLBv1DnkKTolhrBnc57C9CaGTXfuQcPoJcbTDxGkT/SHZ6sHf7AI4mvvEcHrNyesBkStFfr3M4pi/uTeTO8bYb2O/106Bgzo52kwcRxNBVt7ZDmOfYvtr3v0ADFqQfUvwdn8W7jSLJsCEdhAs7P3a+U7leHCvb38eYG+CxqoMZjuk3tQ7S/BmJ2m0CzyrM9lFADmJhMVy2Pm1TDtUzN3Gz2ouu+TJ8TuO16MhIvT2NE3fCC5c7Xh9NnSTNmcjl2pUY/9p1mraz5CXfbb5P4W8ZRymcRoueTtFzhJMjqNISeamLfqDi3o92xL3pIv2LayjixkIdcsXzsXzWJJitku/m3KrnKiCLTd3LMzE64os3ch/d0+KnH4DRlJVQDFkx82AtOR19FuhixGnS/PoSq4j5UT/LSJhzvv5okjWK3v03qm6mppwjEcwcGmMFmUoyhjBmpjDqg7gE5Tk5lTRw2SIVsWUqHXNQCsmS5fPJ6LcMUD7imLzYo/+yHofNtIYAY+6tB+x60wF0oTj8f38GzCGUKcIq1kRQE+m/jkK6egWPOxZLhPKCj9cQ4vZ6uBjlP1zBXeA56oNYdZX5ZLOwbFskjUnAhkZUmGpJuf+dpu5GEVGv/YMVlU+p2C2XjxvpmFjm4kkJk90PO1jE0N7KnVWVmVNPXxW7DQ+LXlS1N79REuCB2mL/sYskMRMwLjgQfCGHjvpe3EoUU+tvNFZw7H0QGyd/KMvxd6cc9OgIUMCUoDOEYVLnUK5KOR7sU28urcPWgAfMZ51dIsswwZyDz+Hvrf4GPaUT3bqPmhhCRc1cGANU0N6Zm3ab//nv8RexxRv9nm7jLZgLseksVRUxr8kwNblYfIpFyIFTY22JjdYv5fT2m+5GS84w3fQL+lj1z71I+DjkI4twUmK9c23ckmJqSpTBlJMkJJ+Vje664Wy+snKYo3oZCvEJsgf5YriW2WSj4sTKddh4hHtFB2sou48cMgMnkevqSRRtoXHVCdwMsMeP+lBrjH7WGIaa3A7DVEvpkLBK8rWidbOK0+rDmys0eFnl1eAYt42+/7lQ0UJXozRzcSfhhQ2XN5Rw6fILm33MjqjemTUKPMR3MwX7vH1q8kz1yeUvS8f/XMTictkrxHDRfkxys7C0dDK6JnhuVALAO2nQGyIGoB/joy2t915AeRU8RwPz0IqT0fTc51uXvQbLmlUyHJJwnI3AV5hKDkrEdam7J+5wfJQV+EbFF0hy+Q6Es7GkJkFoIKaC/3Xm6HQhZhXZUyjLKKWho42TA7w7lkRFn6LQCzNtmgoh5TsPyjzr5PnIFyYM6GPzxGare6jk+8U4PTqlypzjStiEI8TwxG9ggXH1vVPobXpjVR92figxhIC7YdR9lL6e2Erw9tekvyQuRVUSaTEOxOFjyVMMbYINHNuWTz5sEZ3t1Lyy5JpaOl1dNhpqFhtpRQSzDoNuVbgfqDRrQ5n6TPkP+Vj2Iu3BWSYbntjfyEnB3KM1TNFqjAZI1syD4WCkzu5dvCPjBNRJ48wGQklmeas64mToopg3ehHeCVXKwL3nqtoE3dk+OXoCNurumEQyJtgGq5Et8N+kaWUjatI6uJ6x3DnxOLtrynhP+7wRBYmYEWT86eHEN6Yc6f8prj1eRUe6dyQZh9spZdGcU/TmzlrEE5XcEX3EJVb2ik9J3U2DtbN9mgrJYel6N1C8TBJCzDvYNDOI0OaBrBmB2EJ7B1Y1iJhwEHRs6nVDWMytQa9QxIjCaMYQqZYcHK44iNVUhCDZK6pgckCnXqJf7z+KRewqG44Jv2AUoca9XyKpKbLHfpS2viaPjo2TDBkbL/GLkeeCH75moAovHO7MMOBSfFpfaglCqrMvCbyUSs5o6/gXZgs6InAjPxhoDbW6NUbLxTGtiiRA1/UFMIFh84bBNlPYwi4IwdtXHXdMpMiKx0uDx7Fjef4O6H4JJ54JV6NaqDFSm5I7Ez9qSVKthx0VOO3y3+sFHBZlkWozqFDWGSC8AO30xJMURMTEUv76+lJ7I0yjnp+S0pDiKU2Kt5gJCWjEe6dBcBS/RUORVV/rcWC1V2TvudFJo3C7n4OaxHS7Vlovi1fVtXDhZXeFXtgRRY1rCQJSWZEvZNn1Ik0VqaIig7fRdKoUCUjbc+cJ9e2bVIzrmph5LuyDfYT63YrwyjK2vfxBOlPczJ9Hts8FyYqHRsPgZKTiEyaxHQaDkngxHKgDUfCIiqu8tveROpjXFrKg+mlkisCZ2XmBCAAGcfJ+A5UON1b+/GELQQJKor2hThdxkKsbjnxENLrG+8K9X+iGe+3trrdmE9RspxPFcDRlTKD9sbrwCOJzF8qJ42oGctZe9vEYR1SOxBie2kCc9iNT36dpcW+cwl08eTun40qIwJSeaSqO4c53L2P6A6DTqD3RH4RSTsjhgK67GUYlSbo9qICB8zOalq9fQV/GBVXOqfxeH5FdTqskgvHPvgFYNG1Di1Nd/azRIUuJ7DcfzbtsezHmYeoXYiRwCJsAHafFwvf+DSrITr0p+8HZbHYSrNwmQxFIgorD5tQujNOhlL0AVo0OEiS7d5tN0QXjKsw9wqDwKouuOFT8jNHRiefFgWR+nuX5rH3x9HQabagLg+HnNCOvl1rvpP7Oe7oLtSObopfVsyQasHg+bg+UmJoJob2sLSzBQd7u7eC0lYbXEhyWzreSTqSttcUrtP8fB5Yu8jx4QdI8p2jMy6VTYLhYK3/2PP84JjdAkxzP0sgDaw79WQTtksIQZvtKBV3xtbFQiHL4lz9UO3jcJ42wAqVKTh1OHMb1YMz6WHkMrsW0wfCNEPxNpNcl3FvjVKpDtwkc6dfhZhzAfbLBqbgK5ypJJUi49YovzLCjjTv2dy9SRztlZd+JqHuOpyjgaXJZbUz0+oJkUe1G9Ne+S4lZUR/gGsWsXK7NhpVoN9C7pxuU7l0W55wwvVo1IsKjsmfpcV+Xp1lc8NGb0DRpUVOhQ2ss16DjyDazdZORbAd+zKFRcyFjXPIeiBScB3Y1oaVfYMhbEgJkqDtcIeMWxzEZp9Uz1a3zYRSXZaNyPHj0VYjEASR0UJ621pAGV5VtTXZS2+MtwbLMcHMgdSvtQtWc4idVB3XPQhZNBpJwyVEj9TFnKL28bsiKOo9Gka3up95sZbOZlXnDGN0zuMiMDXv4Dvp8or5wGxhpyOt58SFt/iFWF/KmJCS4tKMbUq+S7nIMjUKEpGxhO/0iWiq8mw9gRP96k6/e+vAV/ZfDGhSiMYojMjmaHoCa/Wt9AnigN/R6/4tjN3OTHGcUWmauMUQkRj1NccJsJ6DElE8+rbnZQ97DWXlnzRxVxWkmx0WGVIOoRkc3ZSu6gkK5V4lWARlBnnADdd9Axu09PZGw7OsPeDI1TWhc3Da51LsRatNbRda61c/ncOAUFpAio3mHX5IPWCIJGwy0E6fb0nHNQ07gpP6C/NUfS4efxt1z2Wr5JG0QFszbKpmFZRyvNhush65Adnf501A41B2NVxKoVpCq7KsgmujDk90zIsNDXel0z8vipZPk+g28O2JNSZpzjlg4DlXf6U6DpdvAmFhEllKIYa6KyYjUinuEdW/O48dzSuhtn4BFFAtK+8JSJmPfwC8IC0lXUBCu5K4phttBGs/cQV69Kn1Gxy6idyUDTApGFgibo0iWC6OITMSFW5b+Vc+VxGbGtCuHaj1kK4iXi9gTOV8UHssT5ZzPeBqubCiFwstIBEr5ZLlPmxxyMKBevPJNwqHmaR/FAQ2/fDBerXjpAC7WifgBn3e10YS+DJD8zd1GRx/8cz0NV9vi3ru7Jri6Q7zk4yJscjNQtEytzXX9S8rSJAJj+xke348sMXAmzuFdpO7v3+OP+Zp/HTY1sy9BOKjKnIys4lmLlMomaWqKZ1m8rrpfo6gFEx/v/ofQHSvyLI1E2lyYi8GdNXajI7HuxQSmnPYFtN7LPw8H/e6wbduMwzdbKxJ/Er5h3XNWikCIY7b3zo3OTSrBDynSvKs/RXccZouWy39G2TcKpMb8AQyt/5jC5HLzLTy24yGtXSr6RF+Kr3W+gWOvN4Xhfo6rMeHEAv+bJUzju1Fgdv2t7k1NWasn+yohJxKUIlDgvnfMgsP6mgaeT5cfxXMRVGNV92u3cfAfvXOZHt+E3MPtCuEuPxwUZUkQmTu2V1p9RVk7gk35l+WM+Nj5WreYmEHPqIgtyB10i0S9r7ttcpenvZJ84Z/mPr+7qUKPXg8sLeK5H4WpMbmbFXNeayrOVERqX2mpU8IhIMSsmrcp52+3Vs2VHx1qLD6Z7JZ9bYkGJ2ZpSZyXZ18HgzJBIAh2fmHvLb6TDzcckKKymqGyM5bIuf+D1ieNcrW0qQJ/fEYP0owLfQBy4Ngt8R0pHoT2YhQ+aOIdXbbTwp4Yw72X4inYvAKokevAVyFK3bK8gTvI6CAfxRDIhpZNdIAix+YrS7CJCfL6Bj8H11zkiupLHGXjfg9Wfra2uDh5n8UTFUZ+Ms+VPoUXi+35EsLhjmC6NNn8qZKIhJiU2OIOzUNXC6BK0D4yKMt8rqD8Dm/J5+YR2XFlZXnIhdOnzk8Sm4mxY2IFDuxZIBajg1v2yhrvBYwiMO+EjiIxsu2lDr8N/qCGHa2hplMFXtH409IEaoIWeo+IvtkBP/iWLCinIaRSEZ9sYT5kEjvbjiUb6i2bjO3sDN4x9l3Zr7s+UhAHjGgI+GAOJlKQFm2P6MtD8d12PbGRxYpjxg6vu7fMhRJ1NsCc7T9Erl5ZMnE/ECCA4hBmZE0O98iJJuQtV6v3+Hf80v79e7CgB/l8BqzKXbMuFVg4fl9QpeKcYKCAHNlFYkQ0z/Ec9hUak0TAIE08SJW7AmECvDvG5p3nJ9+F0UcWcYTaNGNZFdhPYvn1ye5BRUvt5309zPfGWYIv+ysZrkRN/BNEaKHjwAaoIi0kJpXgLvwEnyy0vGVRRxFoRwfC7WyS5wnAQK/caBUu1ZH4v8fjB2dC4WWBCddlaXOpVLChadDGkr29bMUYbVQRGNiugVXpQp7MZK4BGDKZPBD8rTfTh+AdUarSd8Jt3s4j9HkH2tZ/BbAcu8l/M8V3l5h3xRYuCW8aW6shAig4Hk4hpF/Eht1x8kfaqIWVkk6ib9IWgxRmMg6OMM2NwxmURfuC8L+fye6jdeAxe3IC/cLKA/dp2QQQ4cCtV3o78ymk8koFyw79EuuOZP0/tDh0gXts8zWdzAL2qahAQ2eE2lNpI7uWZZ5w2YGk154IU5XbEmL7k2muE0I5Ad1wsqLKJLVjg/EPbf6rPkrgJYS3ieVojTF3ZmLvNleiKoleWVdPb9rfx7HhByl88pSZaGHogbRXzjKYjVb+Ayw35UVmnpq6V317xpnG05PfY6T4jU2nvG+K0nElMxVg+7yUzQCsDZxU6YtE1yz7Et8Zg3Zbj0jXzQDhOmLQNyLF4hc45cKS51yASWDPnNZ2KlIrTacqxjqWmk7Rs3fHnTqqombjK8obcm+K8ZIdJGpHltZQz0fMawAawT283Ifsqzz2ou5u75N5MHd1TFURv/6cv7qDbypnawjIPX9B2nPNu4nztiHowXKFJUY2IkqjEbtVl0zcEX0hsm8HkLoLYY5nUt+Z91cNOuyEQ+D1vQabSLu/aJfDRK+2GuU23/8oJgRknaUpS3H2LCQCKZqfdeZjlKJ7NPu6sJoSihWtf9heWk2C5nC8ZrL74/OmrJDUQ/6DYrbSUmmMV/h25chAffgqBDx/v9I8m19y0XOm5Kx27tBHUqqav7Md/fZDqWOwGBMYDdPPA23aIjmF9MfEJQIcRnSxBHPlGMZ6s5AbNBcKuqjBXNTvj/fwy83yRkU1/7hkY/BJHMPkKjJwxrpUkQQ6+RCr695FFATiPWoemxjhC2XpYWf9zZdTZlTedurASrghIQhUe5bkx7uYuiYMNO/BwF86LEVOC+ZsKqjV3ClPMgDLGxpUHI+h42hQH+ydMB8xHQyo0lmBaOWhYcQ77k3+BgOTX/68nWclQRrtWYCa71Wa6G5iZLrov/+OMXDQn9Y1DUAl5fn76aC+1BxyEiAWmazmi2CIGiY8Db4o94BgK6BqvcnYAPD32VXeVP1pANQO4Swr9/YBcIjXpltTLfUopVW8JvAW1IuHCtF8DKIZgc+vfqzibNz0T8qavB4jIoLwHDqoz12k2zMFuh4VhMg/ojToImJA83LvwGBn/rnThibymrARBeEpVrivMObINFkK/pAn4jzV0+KMDEUwJ5ljL0vuLqSfEtUBJPkZhUIFkfPM/rIGa/hrn7QZlN4nms2f3/iWom/hPzPC/g4z+RH7on8Tb7PLnXMEGyayrG5TKPKz26mEcTvRADmXeB4yASDrENnbBZo0s2pWkCT5QA6leIFS/Niz1O6R5QuTpUPQuvoiW4PDUTG1f4tzTCljUM6sacjuNkoqUWWZxy7U4GFvVthWBGcPbMGbM1tyrlnhUi+8suato+VvXxoQJN+3wb18cZn+hm+vVdocJ0zae0ZEiXGjcnd/sW3XwR7IV8rX79AsFxAYkKqBDcTW2GG9b9jpKcgpAJmgfb36CrKyf18QaO8TVGSNT/YKX0XMZgLFc85yR1Tnvolcg0Z5xFmdridrB6gU5nIBxQ+EPnWJJkFDftJpBx4YbmsVHjAZxecLa9YrffOjDbNZganTW/wylmR8Q8wp/OoCo7nA5ItHsZjkzfLjlxOjPhwvvQxwRK2xaCYw67DXoU1WL5JritPM8quCeRz8/3N7/m6r7Z8YasV4Nl76ku+8cAJv37FoN1FfkDELKTylDjsfUqgjCYcZq3KoE15l/CDzinmMxShDfMzdkqPCeeMG6AQfCq/wTz0fkVnvkNc1x7QYTjMvxShYq1zKNzNOfsbVqOmMLcmVgplo1gbA0qbmXbjZD+FbfpbjE+FwPbsxKb39qT2RD59y07Uo6uBtttuRAENlfMYCibK/TFewNj5CgJWgAq4pk3kDRHWtGYiwKrzxY7yf5CiUI0wqelSFjGnSfiQ2lyqvmO1LMWg1WKXfnubJqNzVLTN8EpcdiSdcM4of9ZHTcrl8yTlChYUCgr3o6L21QQovftVpAtx/MCx79RwdPePtUyXoYQJ4BAjf00vjCaCIZIYBKom+0sLIm/NTK81m9TF0MndEQquJnRPWRFj6w4DwJJCpuGn+IE24gcnt0Rcx1bHoZ1vEGQCwru9JKaqBMaQLkU9QlApS7kuiXaFEldy289QOcrZ1FQYy/bA2CP20POxi9EeqV4vsMIwIEkctPwgTOg57qUCObs7aEq0Suk/4RB8JAPCftq2kJ6EJlb/bOORTteRqubFhY6OUgY8fV+69CYm9UN2SkQt+nReah9/nr7MEwnBnoZlXd5mlPO8lMZJv0VzuV0gahazEUmbbuYNp8cste4CkFIn3zPowSCJ6KfbTdCGOF8TglQ5cEbBD0pZSvoAbTk9XqLOuhGg+39uwbqLT9KamwMD1Siiy/oQMrvdi3xwq0Sm7XVYEttfMNkB3KzSSj7Jq7k1lLBTRnPArYeks3cQjm2ysa1IUuDF8AUQ9fcVxYUKn0ZZJI6jAcUw13IDs55D6ecXiupczd4gAVhpTUTY/bZMzqdiHeo0D5Gq2hSNAh8ofYmMHdpC82orVP8vLEO7G3gCnG7stylzmMCjzs5VTvm6u5/h3lOYR85xr3aXZv2rR1xhHSgr255ZODRJiMRrJSchgPPg2NF0MFe6xySQjhSFNSbvb4q3zAuuUAWR/zSQEGpzjLuPpFg8uCTKGE7UuGM2mZxn8AqjvTed1gx4WEBBGAh4u+IsLMEPkWu6TIwTFHqtVDZn2ntm5tIekR21mBjr6qXMGy6s7TqERabf1XncOG34Sr0GvPUHFOk0k/ZaOE/aV/wTW6JI4A3HawGJmpaZH+fapwQePakJh0F7qP/MmpPphuA/FmBWU8PjZJfR7nJb7K6aFaDBXkX0EpC5vWk=","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"d97a0ac30932b6cb4767309e679cd78187160cc6","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file diff --git a/PROGRESS.md b/PROGRESS.md index 91edf33..8edaca6 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -71,8 +71,8 @@ All dp-NN backlog items are implemented. The active reconciliation is staged on **Working on**: Draft PR #23 reconciliation and Wiki verification **Status**: Panel changes are preserved on the reconciliation branch; Qoder Wiki pages are migrated to GitHub Wiki and refreshed for the final batched location API flow. **Current file**: PROGRESS.md -**Next action**: Complete exact-SHA review, then merge draft PR #23 when approved. Resume Mutagen only as a separately authorized deployment step. -**Blockers**: PR #22 overlaps this reconciliation and must be rebased after PR #23; merging it unchanged would restore superseded test-guard and error-response behavior. No CI checks are configured on PR #23. +**Next action**: Complete exact-SHA review, then rebase PR #22's explicit `NodeCapacityPolicy` onto this reconciliation before any production merge or deployment. Resume Mutagen only as a separately authorized deployment step. +**Blockers**: Stock Pterodactyl does not expose node CPU capacity, so PR #23 must not deploy alone. PR #22 overlaps this reconciliation and must be rebased while preserving the hardened test guard, sanitized errors, and Wiki changes. No CI checks are configured on PR #23. ### This Session's Changes: From 975105c33e75d9a20ed621b0f24ec7b26887bcf8 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 21:41:29 +1000 Subject: [PATCH 18/30] fix: reject truncated capacity snapshots --- 02-SERVICES.md | 106 +++++------------- Services/NodeSelectionService.php | 7 ++ Services/ResourceCalculationService.php | 72 ++++++++---- tests/Unit/NodeSelectionServiceTest.php | 13 +++ tests/Unit/ResourceCalculationServiceTest.php | 83 +++++++++++++- tests/Unit/TestDatabaseGuardTest.php | 9 +- 6 files changed, 188 insertions(+), 102 deletions(-) diff --git a/02-SERVICES.md b/02-SERVICES.md index e11d9bd..81fa11e 100644 --- a/02-SERVICES.md +++ b/02-SERVICES.md @@ -44,7 +44,7 @@ class ResourceCalculationService /** * Get available resources for a location (real-time from Pterodactyl API) */ - public function getLocationAvailability(int $locationId): array + public function getLocationAvailability(int $locationId, ?string $excludeReservationToken = null): array { $nodes = $this->fetchNodesInLocation($locationId); @@ -57,7 +57,7 @@ class ResourceCalculationService ]; foreach ($nodes as $nodeWithServers) { - $nodeAvailability = $this->calculateNodeAvailability($nodeWithServers); + $nodeAvailability = $this->calculateNodeAvailability($nodeWithServers, $excludeReservationToken); $locationData['nodes'][] = $nodeAvailability; // Track maximum available across all nodes @@ -90,60 +90,17 @@ class ResourceCalculationService /** * Calculate available resources for a specific node */ - public function calculateNodeAvailability(array $nodeWithServers): array + private function calculateNodeAvailability(array $nodeWithServers, ?string $excludeReservationToken = null): array { $node = $nodeWithServers['node']; $servers = $nodeWithServers['servers']; - - // Sum allocated resources from all servers - $allocated = ['memory' => 0, 'cpu' => 0, 'disk' => 0]; - foreach ($servers as $server) { - $allocated['memory'] += $server['limits']['memory'] ?? 0; - $allocated['cpu'] += $server['limits']['cpu'] ?? 0; - $allocated['disk'] += $server['limits']['disk'] ?? 0; - } - - // Get pending reservations for this node - $pendingReservations = $this->getPendingReservations($node['id']); - - // Calculate effective totals with overallocation - // Formula: total * (1 + overallocate_percentage / 100) - $effectiveMemory = $node['memory'] * (1 + ($node['memory_overallocate'] ?? 0) / 100); - $effectiveDisk = $node['disk'] * (1 + ($node['disk_overallocate'] ?? 0) / 100); - // cpu_threads must come from an explicit panel customization or a local - // capacity policy. Stock Pterodactyl does not expose node CPU capacity. - $effectiveCpu = $node['cpu_threads'] * 100; - - // Calculate available (total - allocated - pending) - $available = [ - 'memory' => max(0, (int)$effectiveMemory - $allocated['memory'] - $pendingReservations['memory']), - 'cpu' => max(0, (int)$effectiveCpu - $allocated['cpu'] - $pendingReservations['cpu']), - 'disk' => max(0, (int)$effectiveDisk - $allocated['disk'] - $pendingReservations['disk']), - ]; - - return [ - 'node_id' => $node['id'], - 'name' => $node['name'], - 'fqdn' => $node['fqdn'], - 'maintenance_mode' => $node['maintenance_mode'] ?? false, - 'total' => [ - 'memory' => (int)$effectiveMemory, - 'cpu' => (int)$effectiveCpu, - 'disk' => (int)$effectiveDisk, - ], - 'allocated' => $allocated, - 'reserved' => $pendingReservations, - 'available' => $available, - 'server_count' => count($servers), - 'utilization' => [ - 'memory' => $effectiveMemory > 0 - ? round(($allocated['memory'] + $pendingReservations['memory']) / $effectiveMemory * 100, 1) - : 100, - 'disk' => $effectiveDisk > 0 - ? round(($allocated['disk'] + $pendingReservations['disk']) / $effectiveDisk * 100, 1) - : 100, - ], - ]; + $pendingReservations = $this->getPendingReservations($node['id'], $excludeReservationToken); + + // buildNodeAvailabilityFromServers validates complete node/server + // resource shapes before calculating totals. Stock Pterodactyl has no + // node CPU-capacity field, so cpu_threads remains a fail-closed gate + // until the explicit local NodeCapacityPolicy is rebased from PR #22. + return $this->buildNodeAvailabilityFromServers($node, $servers, $pendingReservations); } /** @@ -183,14 +140,14 @@ class ResourceCalculationService /** * Verify resources are still available (called at payment time) */ - public function verifyAvailability(int $nodeId, array $requirements): bool + public function verifyAvailability(int $nodeId, array $requirements, ?string $excludeReservationToken = null): bool { $nodes = $this->fetchNodesInLocation($this->getNodeLocation($nodeId)); - $node = collect($nodes)->firstWhere('id', $nodeId); + $nodeWithServers = collect($nodes)->first(fn ($node) => ($node['node']['id'] ?? null) === $nodeId); - if (!$node) return false; + if (!$nodeWithServers) return false; - $availability = $this->calculateNodeAvailability($node); + $availability = $this->calculateNodeAvailability($nodeWithServers, $excludeReservationToken); return $availability['available']['memory'] >= $requirements['memory'] && $availability['available']['cpu'] >= $requirements['cpu'] @@ -202,24 +159,7 @@ class ResourceCalculationService */ public function getLocations(): array { - $response = Http::withHeaders([ - 'Authorization' => 'Bearer ' . $this->apiKey, - 'Accept' => 'application/json', - ])->get("{$this->apiUrl}/api/application/locations", [ - 'per_page' => 100, - ]); - - if (!$response->successful()) { - throw new \RuntimeException('Failed to fetch locations from Pterodactyl'); - } - - return collect($response->json('data', [])) - ->map(fn($loc) => [ - 'id' => $loc['attributes']['id'], - 'short' => $loc['attributes']['short'], - 'long' => $loc['attributes']['long'], - ]) - ->toArray(); + return $this->fetchAllLocations(); } // --- Private Methods --- @@ -379,9 +319,21 @@ class NodeSelectionService /** * Get maximum allocatable resources across a location */ - public function getMaxAvailable(int $locationId): array + public function getMaxAvailable(int $locationId, ?array $locationData = null): array { - $locationData = $this->resourceService->getLocationAvailability($locationId); + $locationData ??= $this->resourceService->getLocationAvailability($locationId); + if (($locationData['location_id'] ?? null) !== $locationId + || !is_array($locationData['max_available'] ?? null)) { + throw new \RuntimeException('Invalid location availability snapshot.'); + } + + foreach (['memory', 'cpu', 'disk'] as $resource) { + if (!is_int($locationData['max_available'][$resource] ?? null) + || $locationData['max_available'][$resource] < 0) { + throw new \RuntimeException('Invalid location availability snapshot.'); + } + } + return $locationData['max_available']; } } diff --git a/Services/NodeSelectionService.php b/Services/NodeSelectionService.php index f5810f8..09050e5 100644 --- a/Services/NodeSelectionService.php +++ b/Services/NodeSelectionService.php @@ -86,6 +86,13 @@ public function getMaxAvailable(int $locationId, ?array $locationData = null): a throw new \RuntimeException('Invalid location availability snapshot.'); } + foreach (['memory', 'cpu', 'disk'] as $resource) { + if (! is_int($locationData['max_available'][$resource] ?? null) + || $locationData['max_available'][$resource] < 0) { + throw new \RuntimeException('Invalid location availability snapshot.'); + } + } + return $locationData['max_available']; } } diff --git a/Services/ResourceCalculationService.php b/Services/ResourceCalculationService.php index 53268e4..32d8be7 100644 --- a/Services/ResourceCalculationService.php +++ b/Services/ResourceCalculationService.php @@ -82,8 +82,10 @@ public function buildClusterSnapshot(): array } $snapshot['locations'] = $locations; + $knownLocationIds = []; foreach ($locations as $location) { + $knownLocationIds[$location['id']] = true; $snapshot['by_location'][$location['id']] = [ 'nodes' => [], 'totals' => ['memory' => 0, 'cpu' => 0, 'disk' => 0], @@ -97,6 +99,9 @@ public function buildClusterSnapshot(): array foreach ($nodes as $nodeId => $nodeData) { $node = $nodeData['node']; $locationId = $nodeData['location_id']; + if (! array_key_exists($locationId, $knownLocationIds)) { + throw new \RuntimeException('Pterodactyl API returned a node for an unknown location.'); + } $availability = $this->buildNodeAvailabilityFromServers( $node, $nodeData['servers'], @@ -116,15 +121,6 @@ public function buildClusterSnapshot(): array 'node_availability' => $availability, ]; - if (! array_key_exists($locationId, $snapshot['by_location'])) { - $snapshot['by_location'][$locationId] = [ - 'nodes' => [], - 'totals' => ['memory' => 0, 'cpu' => 0, 'disk' => 0], - 'allocated' => ['memory' => 0, 'cpu' => 0, 'disk' => 0], - 'available' => ['memory' => 0, 'cpu' => 0, 'disk' => 0], - ]; - } - $snapshot['by_location'][$locationId]['nodes'][] = $nodeId; $snapshot['by_location'][$locationId]['totals']['memory'] += $availability['total']['memory']; $snapshot['by_location'][$locationId]['totals']['cpu'] += $availability['total']['cpu']; @@ -313,13 +309,17 @@ private function buildNodeAvailabilityFromServers(array $node, array $servers, a private function fetchAllLocations(): array { - return \collect($this->pterodactylGetPaginatedData('/api/application/locations', ['per_page' => 100])) - ->map(fn ($location) => [ - 'id' => $location['attributes']['id'], - 'short' => $location['attributes']['short'], - 'long' => $location['attributes']['long'], - ]) - ->toArray(); + $locations = []; + foreach ($this->pterodactylGetPaginatedData('/api/application/locations', ['per_page' => 100]) as $location) { + $attributes = $this->requireLocationAttributes($location); + $locations[] = [ + 'id' => $attributes['id'], + 'short' => $attributes['short'], + 'long' => $attributes['long'], + ]; + } + + return $locations; } private function fetchClusterNodes(): array @@ -392,6 +392,7 @@ private function pterodactylGetPaginatedData(string $path, array $query = []): a { $page = 1; $data = []; + $expectedTotalPages = null; while (true) { $payload = $this->pterodactylGet($path, array_merge($query, ['page' => $page])); @@ -402,15 +403,29 @@ private function pterodactylGetPaginatedData(string $path, array $query = []): a $pagination = $payload['meta']['pagination'] ?? null; if (! is_array($pagination)) { - break; + throw new \RuntimeException('Pterodactyl API returned invalid pagination metadata.'); } - $currentPage = (int) ($pagination['current_page'] ?? $page); - $totalPages = (int) ($pagination['total_pages'] ?? $currentPage); - if ($currentPage !== $page || $totalPages < 1 || $totalPages < $currentPage) { + $currentPage = filter_var( + $pagination['current_page'] ?? null, + FILTER_VALIDATE_INT, + ['options' => ['min_range' => 1]], + ); + $totalPages = filter_var( + $pagination['total_pages'] ?? null, + FILTER_VALIDATE_INT, + ['options' => ['min_range' => 1]], + ); + if ($currentPage === false || $totalPages === false + || $currentPage !== $page || $totalPages < $currentPage) { throw new \RuntimeException('Pterodactyl API returned invalid pagination metadata.'); } + $expectedTotalPages ??= $totalPages; + if ($totalPages !== $expectedTotalPages) { + throw new \RuntimeException('Pterodactyl API returned inconsistent pagination metadata.'); + } + if ($currentPage === $totalPages) { break; } @@ -421,6 +436,23 @@ private function pterodactylGetPaginatedData(string $path, array $query = []): a return $data; } + private function requireLocationAttributes(mixed $payload): array + { + $attributes = is_array($payload) && is_array($payload['attributes'] ?? null) + ? $payload['attributes'] + : null; + if ($attributes === null + || filter_var($attributes['id'] ?? null, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) === false + || ! is_string($attributes['short'] ?? null) || $attributes['short'] === '' + || ! is_string($attributes['long'] ?? null) || $attributes['long'] === '') { + throw new \RuntimeException('Pterodactyl API returned an invalid location payload.'); + } + + $attributes['id'] = (int) $attributes['id']; + + return $attributes; + } + private function requireRelationshipData(array $payload, string $relationship): array { $attributes = is_array($payload['attributes'] ?? null) ? $payload['attributes'] : []; diff --git a/tests/Unit/NodeSelectionServiceTest.php b/tests/Unit/NodeSelectionServiceTest.php index b576e5a..4b9c94a 100644 --- a/tests/Unit/NodeSelectionServiceTest.php +++ b/tests/Unit/NodeSelectionServiceTest.php @@ -352,6 +352,19 @@ public function test_get_max_available_reuses_preloaded_location_snapshot(): voi $this->assertSame($expected, $result); } + public function test_get_max_available_rejects_incomplete_preloaded_snapshot(): void + { + $this->mockResourceService->shouldNotReceive('getLocationAvailability'); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('Invalid location availability snapshot'); + + $this->service->getMaxAvailable(1, [ + 'location_id' => 1, + 'max_available' => ['memory' => 1024, 'cpu' => -1], + ]); + } + /** * Test empty nodes array returns null. */ diff --git a/tests/Unit/ResourceCalculationServiceTest.php b/tests/Unit/ResourceCalculationServiceTest.php index 36693df..f16a461 100644 --- a/tests/Unit/ResourceCalculationServiceTest.php +++ b/tests/Unit/ResourceCalculationServiceTest.php @@ -39,6 +39,7 @@ public function test_get_locations_returns_parsed_array(): void 'data' => [ ['attributes' => ['id' => 1, 'short' => 'us', 'long' => 'US East']], ], + 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], ], 200), ]); @@ -389,11 +390,15 @@ public function test_snapshot_falls_back_when_included_servers_relationship_is_m if (str_contains($url, '/api/application/locations')) { return Http::response([ 'data' => [['attributes' => ['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1']]], + 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], ], 200); } if (str_contains($url, '/api/application/nodes')) { - return Http::response(['data' => [$node]], 200); + return Http::response([ + 'data' => [$node], + 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], + ], 200); } if (str_contains($url, '/api/application/servers')) { @@ -404,6 +409,7 @@ public function test_snapshot_falls_back_when_included_servers_relationship_is_m 'limits' => ['memory' => 1024, 'cpu' => 50, 'disk' => 5120], ], ]], + 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], ], 200); } @@ -528,6 +534,80 @@ public function test_get_locations_rejects_non_advancing_pagination_metadata(): $this->service->getLocations(); } + public function test_get_locations_rejects_missing_pagination_metadata(): void + { + Http::fake([ + 'panel.example.com/*' => Http::response(['data' => []], 200), + ]); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid pagination metadata'); + + $this->service->getLocations(); + } + + public function test_get_locations_rejects_inconsistent_total_pages(): void + { + Http::fake(function ($request) { + $query = []; + parse_str(parse_url($request->url(), PHP_URL_QUERY) ?? '', $query); + $page = (int) ($query['page'] ?? 1); + + return Http::response([ + 'data' => [[ + 'attributes' => [ + 'id' => $page, + 'short' => 'dc'.$page, + 'long' => 'Data Center '.$page, + ], + ]], + 'meta' => [ + 'pagination' => [ + 'current_page' => $page, + 'total_pages' => $page === 1 ? 3 : 2, + ], + ], + ], 200); + }); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('inconsistent pagination metadata'); + + $this->service->getLocations(); + } + + public function test_get_locations_rejects_malformed_location_payload(): void + { + Http::fake([ + 'panel.example.com/*' => Http::response([ + 'data' => [['attributes' => ['id' => 1, 'short' => 'dc1']]], + 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], + ], 200), + ]); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid location payload'); + + $this->service->getLocations(); + } + + public function test_snapshot_rejects_node_for_unknown_location(): void + { + $calls = 0; + Http::fake($this->clusterSnapshotHttpFake( + $calls, + locations: [['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1']], + nodePages: [[ + $this->nodeWithServersPayload(1, 2, 'Orphan Node', []), + ]], + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('unknown location'); + + $this->service->buildClusterSnapshot(); + } + public function test_snapshot_handles_pterodactyl_5xx_gracefully(): void { $calls = 0; @@ -540,6 +620,7 @@ public function test_snapshot_handles_pterodactyl_5xx_gracefully(): void 'data' => [ ['attributes' => ['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1']], ], + 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], ], 200); } diff --git a/tests/Unit/TestDatabaseGuardTest.php b/tests/Unit/TestDatabaseGuardTest.php index f94ecb2..95d6b9e 100644 --- a/tests/Unit/TestDatabaseGuardTest.php +++ b/tests/Unit/TestDatabaseGuardTest.php @@ -25,12 +25,13 @@ public function test_rejects_existing_arbitrary_sqlite_database(): void public function test_creates_isolated_named_memory_sqlite_database(): void { $database = TestDatabaseGuard::claim(':temporary:', 'sqlite', 'testing'); + $secondDatabase = TestDatabaseGuard::claim(':temporary:', 'sqlite', 'testing'); $this->assertIsString($database); - $this->assertMatchesRegularExpression( - '/^file:dynamic-pterodactyl-test-[a-f0-9]{32}\?mode=memory&cache=shared$/', - $database, - ); + $this->assertIsString($secondDatabase); + $this->assertNotSame($database, $secondDatabase); + $this->assertStringStartsWith('file:dynamic-pterodactyl-test-', $database); + $this->assertStringEndsWith('?mode=memory&cache=shared', $database); $writer = new \PDO('sqlite:'.$database); $writer->exec('CREATE TABLE claim_probe (value TEXT NOT NULL)'); From d65c73d954159e5f4b2298af78e2cc075ea8d4e4 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 21:44:17 +1000 Subject: [PATCH 19/30] docs: align strict snapshot contracts --- .../Public API Endpoints/Availability Endpoints.md | 10 +++++----- .../en/content/Core Services/NodeSelectionService.md | 10 +++++----- .qoder/repowiki/en/meta/repowiki-metadata.json | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md index a3573bb..c0ce99d 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md @@ -51,7 +51,7 @@ Security --> Response["Secure JSON Response
No Node Details"] **Diagram sources** - [routes/api.php:17-22](file://routes/api.php#L17-L22) - [AvailabilityController.php:22-52](file://Http/Controllers/Api/AvailabilityController.php#L22-L52) -- [NodeSelectionService.php:78-90](file://Services/NodeSelectionService.php#L78-L90) +- [NodeSelectionService.php:78-97](file://Services/NodeSelectionService.php#L78-L97) - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) **Section sources** @@ -74,7 +74,7 @@ Key responsibilities: **Section sources** - [routes/api.php:17-22](file://routes/api.php#L17-L22) - [AvailabilityController.php:22-52](file://Http/Controllers/Api/AvailabilityController.php#L22-L52) -- [NodeSelectionService.php:78-90](file://Services/NodeSelectionService.php#L78-L90) +- [NodeSelectionService.php:78-97](file://Services/NodeSelectionService.php#L78-L97) - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) ## Architecture Overview @@ -98,7 +98,7 @@ C->>R : GET /api/dynamic-pterodactyl/availability/{locationId} R->>M : Apply web, auth, throttle : 30,1 M-->>A : Proceed if authenticated and within limit A->>S : getLocationAvailability(locationId) -S->>P : Batched calls to list nodes/servers +S->>P : GET /locations/{id}?include=nodes,servers P-->>S : Node and server data S-->>A : Aggregated location data including nodes[] A->>N : getMaxAvailable(locationId, locationData) @@ -110,7 +110,7 @@ A-->>C : {success, data : {location_id, max_memory, max_cpu, max_disk, node_coun **Diagram sources** - [routes/api.php:17-22](file://routes/api.php#L17-L22) - [AvailabilityController.php:22-52](file://Http/Controllers/Api/AvailabilityController.php#L22-L52) -- [NodeSelectionService.php:78-90](file://Services/NodeSelectionService.php#L78-L90) +- [NodeSelectionService.php:78-97](file://Services/NodeSelectionService.php#L78-L97) - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) ## Detailed Component Analysis @@ -219,7 +219,7 @@ ForEachNode --> |No| ReturnData["Return {location_id, nodes[], max_available, to - [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) **Section sources** -- [NodeSelectionService.php:78-90](file://Services/NodeSelectionService.php#L78-L90) +- [NodeSelectionService.php:78-97](file://Services/NodeSelectionService.php#L78-L97) - [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) - [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) diff --git a/.qoder/repowiki/en/content/Core Services/NodeSelectionService.md b/.qoder/repowiki/en/content/Core Services/NodeSelectionService.md index 3152dfc..5db14a4 100644 --- a/.qoder/repowiki/en/content/Core Services/NodeSelectionService.md +++ b/.qoder/repowiki/en/content/Core Services/NodeSelectionService.md @@ -63,7 +63,7 @@ RCS --> PTERO - NodeSelectionService: Implements best-fit selection using weighted headroom scoring and filters out unsuitable nodes. - ResourceCalculationService: Provides real-time per-location and per-node availability by querying Pterodactyl and aggregating server allocations and pending reservations. - ReservationService: Orchestrates reservation creation and calls NodeSelectionService to pick a node; enforces pessimistic locking and idempotency. -- AvailabilityController: Exposes safe customer-facing endpoints that return aggregate capacity and node counts without exposing raw node identifiers or FQDNs. +- AvailabilityController: Exposes aggregate-only customer availability plus a separately authorized admin endpoint for raw node details. Key responsibilities: - NodeSelectionService: Evaluate candidates, compute scores, and return the best node or null if none qualify. @@ -207,12 +207,12 @@ Flow highlights: - [ReservationService.php:43-124](file://Services/ReservationService.php#L43-L124) ### Integration with AvailabilityController -AvailabilityController provides safe, customer-facing endpoints: +AvailabilityController provides separate customer and administrator surfaces: - getByLocation(locationId): returns max allocatable resources and whether the location has capacity across memory, CPU, and disk. It does not expose node names or FQDNs. -- getNodes(locationId): returns availability data for the location; while it includes node arrays internally, the controller’s contract ensures only aggregate metrics are surfaced to clients. +- getNodes(locationId): is admin-only (web + auth + EnsureUserIsAdmin + throttle) and returns raw per-node availability for internal monitoring. Usage of NodeSelectionService: -- getMaxAvailable(locationId) is used to determine per-location maximums for capacity checks. +- getMaxAvailable(locationId, locationData) reads per-location maximums from the already fetched snapshot, avoiding a second panel request. **Section sources** - [AvailabilityController.php:22-69](file://Http/Controllers/Api/AvailabilityController.php#L22-L69) @@ -297,4 +297,4 @@ Operational tips: ## Conclusion NodeSelectionService provides a robust, weighted best-fit algorithm that balances memory, disk, and CPU headroom to select optimal nodes for resource allocation. It integrates tightly with ResourceCalculationService for real-time availability and works within ReservationService’s transactional and idempotent reservation workflow. The design ensures safety through maintenance mode filtering, hard constraint enforcement, and clear error signaling when resources are insufficient. Customer-facing APIs remain safe by exposing only aggregate capacity metrics. -[No sources needed since this section summarizes without analyzing specific files] \ No newline at end of file +[No sources needed since this section summarizes without analyzing specific files] diff --git a/.qoder/repowiki/en/meta/repowiki-metadata.json b/.qoder/repowiki/en/meta/repowiki-metadata.json index 8ee065f..0a06004 100644 --- a/.qoder/repowiki/en/meta/repowiki-metadata.json +++ b/.qoder/repowiki/en/meta/repowiki-metadata.json @@ -1 +1 @@ -{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-90","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"227-265","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"444-513","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"d97a0ac30932b6cb4767309e679cd78187160cc6","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file +{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-97","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"223-261","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"439-545","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"975105c33e75d9a20ed621b0f24ec7b26887bcf8","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file From a349b2a16820229804f5cce2c44134cc50d82ad7 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 22:03:11 +1000 Subject: [PATCH 20/30] fix: reject duplicate capacity records --- Services/ResourceCalculationService.php | 28 ++++++++- tests/Unit/ResourceCalculationServiceTest.php | 63 ++++++++++++++++++- 2 files changed, 88 insertions(+), 3 deletions(-) diff --git a/Services/ResourceCalculationService.php b/Services/ResourceCalculationService.php index 32d8be7..5496d10 100644 --- a/Services/ResourceCalculationService.php +++ b/Services/ResourceCalculationService.php @@ -236,16 +236,19 @@ private function fetchNodesInLocation(int $locationId): array if ($attributes['location_id'] !== $locationId) { throw new \RuntimeException('Pterodactyl API returned a node for an unexpected location.'); } + $this->rememberUniqueId($nodesById, $attributes['id'], 'included node'); $nodesById[$attributes['id']] = $attributes; } $serversByNode = []; + $serverIds = []; foreach ($serversData as $server) { $attributes = $this->requireServerAttributes($server); $nodeId = $attributes['node']; if (! array_key_exists($nodeId, $nodesById)) { throw new \RuntimeException('Pterodactyl API returned a server for an unknown included node.'); } + $this->rememberUniqueId($serverIds, $attributes['id'], 'included server'); $serversByNode[$nodeId][] = $attributes; } @@ -310,8 +313,10 @@ private function buildNodeAvailabilityFromServers(array $node, array $servers, a private function fetchAllLocations(): array { $locations = []; + $locationIds = []; foreach ($this->pterodactylGetPaginatedData('/api/application/locations', ['per_page' => 100]) as $location) { $attributes = $this->requireLocationAttributes($location); + $this->rememberUniqueId($locationIds, $attributes['id'], 'location'); $locations[] = [ 'id' => $attributes['id'], 'short' => $attributes['short'], @@ -331,6 +336,10 @@ private function fetchClusterNodes(): array throw $exception; } + if ($exception->getMessage() !== 'Pterodactyl API returned an invalid servers relationship payload.') { + throw $exception; + } + return $this->fetchClusterNodesFromServerIndex(); } } @@ -338,17 +347,20 @@ private function fetchClusterNodes(): array private function fetchClusterNodesWithIncludedServers(): array { $nodes = []; + $serverIds = []; foreach ($this->pterodactylGetPaginatedData('/api/application/nodes', [ 'include' => 'servers', 'per_page' => 100, ]) as $node) { $attributes = $this->requireNodeAttributes($node); + $this->rememberUniqueId($nodes, $attributes['id'], 'node'); $servers = []; foreach ($this->requireRelationshipData($node, 'servers') as $server) { $serverAttributes = $this->requireServerAttributes($server); if ($serverAttributes['node'] !== $attributes['id']) { throw new \RuntimeException('Pterodactyl API returned a server for an unexpected node.'); } + $this->rememberUniqueId($serverIds, $serverAttributes['id'], 'server'); $servers[] = $serverAttributes; } @@ -367,6 +379,7 @@ private function fetchClusterNodesFromServerIndex(): array $nodes = []; foreach ($this->pterodactylGetPaginatedData('/api/application/nodes', ['per_page' => 100]) as $node) { $attributes = $this->requireNodeAttributes($node); + $this->rememberUniqueId($nodes, $attributes['id'], 'node'); $nodes[$attributes['id']] = [ 'node' => $attributes, 'location_id' => $attributes['location_id'], @@ -374,6 +387,7 @@ private function fetchClusterNodesFromServerIndex(): array ]; } + $serverIds = []; foreach ($this->pterodactylGetPaginatedData('/api/application/servers', ['per_page' => 100]) as $server) { $attributes = $this->requireServerAttributes($server); $nodeId = $attributes['node']; @@ -382,6 +396,7 @@ private function fetchClusterNodesFromServerIndex(): array throw new \RuntimeException('Pterodactyl API returned a server for an unknown node.'); } + $this->rememberUniqueId($serverIds, $attributes['id'], 'server'); $nodes[$nodeId]['servers'][] = $attributes; } @@ -499,6 +514,7 @@ private function requireServerAttributes(mixed $payload): array } $this->validateServerAttributes($attributes); + $attributes['id'] = (int) $attributes['id']; $attributes['node'] = (int) $attributes['node']; return $attributes; @@ -532,7 +548,8 @@ private function validateNodeAttributes(array $attributes): void private function validateServerAttributes(array $attributes): void { - if (filter_var($attributes['node'] ?? null, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) === false + if (filter_var($attributes['id'] ?? null, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) === false + || filter_var($attributes['node'] ?? null, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) === false || ! is_array($attributes['limits'] ?? null)) { throw new \RuntimeException('Pterodactyl API returned an invalid included server payload.'); } @@ -544,6 +561,15 @@ private function validateServerAttributes(array $attributes): void } } + private function rememberUniqueId(array &$seen, int $id, string $resource): void + { + if (array_key_exists($id, $seen)) { + throw new \RuntimeException("Pterodactyl API returned a duplicate {$resource}."); + } + + $seen[$id] = true; + } + private function emptyClusterSnapshot(): array { return [ diff --git a/tests/Unit/ResourceCalculationServiceTest.php b/tests/Unit/ResourceCalculationServiceTest.php index f16a461..49e13c5 100644 --- a/tests/Unit/ResourceCalculationServiceTest.php +++ b/tests/Unit/ResourceCalculationServiceTest.php @@ -332,6 +332,26 @@ public function test_location_availability_rejects_server_for_unknown_node(): vo $this->service->getLocationAvailability(1); } + public function test_location_availability_rejects_duplicate_server_records(): void + { + Http::fake($this->availabilityHttpFake( + nodeId: 5, + locationId: 1, + totalMemory: 8192, + totalDisk: 51200, + totalCpuThreads: 4, + servers: [ + ['id' => 501, 'node' => 5, 'memory' => 1024, 'cpu' => 50, 'disk' => 5120], + ['id' => 501, 'node' => 5, 'memory' => 1024, 'cpu' => 50, 'disk' => 5120], + ], + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('duplicate included server'); + + $this->service->getLocationAvailability(1); + } + public function test_location_availability_rejects_node_from_another_location(): void { Http::fake($this->availabilityHttpFake( @@ -405,6 +425,7 @@ public function test_snapshot_falls_back_when_included_servers_relationship_is_m return Http::response([ 'data' => [[ 'attributes' => [ + 'id' => 101, 'node' => 1, 'limits' => ['memory' => 1024, 'cpu' => 50, 'disk' => 5120], ], @@ -608,6 +629,44 @@ public function test_snapshot_rejects_node_for_unknown_location(): void $this->service->buildClusterSnapshot(); } + public function test_snapshot_rejects_duplicate_node_records(): void + { + $calls = 0; + Http::fake($this->clusterSnapshotHttpFake( + $calls, + locations: [['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1']], + nodePages: [[ + $this->nodeWithServersPayload(1, 1, 'Node 1', []), + $this->nodeWithServersPayload(1, 1, 'Node 1 Duplicate', []), + ]], + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('duplicate node'); + + $this->service->buildClusterSnapshot(); + } + + public function test_snapshot_rejects_duplicate_server_records(): void + { + $calls = 0; + Http::fake($this->clusterSnapshotHttpFake( + $calls, + locations: [['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1']], + nodePages: [[ + $this->nodeWithServersPayload(1, 1, 'Node 1', [ + ['id' => 101, 'memory' => 1024, 'cpu' => 50, 'disk' => 5120], + ['id' => 101, 'memory' => 1024, 'cpu' => 50, 'disk' => 5120], + ]), + ]], + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('duplicate server'); + + $this->service->buildClusterSnapshot(); + } + public function test_snapshot_handles_pterodactyl_5xx_gracefully(): void { $calls = 0; @@ -731,7 +790,7 @@ private function availabilityHttpFake( 'data' => array_map(fn (array $server, int $index) => [ 'object' => 'server', 'attributes' => [ - 'id' => ($server['node'] * 100) + $index, + 'id' => $server['id'] ?? (($server['node'] * 100) + $index), 'node' => $server['node'], 'limits' => array_intersect_key($server, [ 'memory' => true, @@ -824,7 +883,7 @@ private function nodeWithServersPayload(int $nodeId, int $locationId, string $na 'servers' => [ 'data' => array_map(fn (array $server, int $index) => [ 'attributes' => [ - 'id' => ($nodeId * 100) + $index, + 'id' => $server['id'] ?? (($nodeId * 100) + $index), 'node' => $nodeId, 'limits' => $server, ], From b078be96c81eabc6551682e27028d0a18d346063 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 22:04:08 +1000 Subject: [PATCH 21/30] docs: record strict identity validation --- .../Resource Calculation Service.md | 6 ++++-- .../Core Services/ResourceCalculationService.md | 13 ++++++++----- .qoder/repowiki/en/content/Testing.md | 1 + .qoder/repowiki/en/meta/repowiki-metadata.json | 2 +- 02-SERVICES.md | 4 +++- PROGRESS.md | 2 +- 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md index 9a647e3..605b270 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md @@ -116,6 +116,7 @@ Data flow highlights: Error handling and resilience: - pterodactylGet() sets per-attempt timeout and connect timeout, retries only on connection errors, sanitizes exceptions, and throws meaningful runtime exceptions for rate limits and non-JSON responses. +- Node, server, and location identities must be unique within a snapshot; duplicates and inconsistent relationships fail closed before resource totals are calculated. - buildClusterSnapshot() catches failures and returns a degraded snapshot with an error flag when Pterodactyl is down or returns 5xx errors. Examples of usage patterns: @@ -232,6 +233,7 @@ Common issues and strategies: - Rate limiting: A 429 response triggers a specific runtime exception instructing callers to retry after a delay. Tests assert that 429 does not trigger retries. - Server errors: 5xx responses are treated as Pterodactyl being unavailable; buildClusterSnapshot() returns a degraded snapshot so consumers can degrade gracefully. - Invalid payloads: Non-JSON responses raise a runtime exception indicating invalid payload; tests validate this behavior. +- Duplicate identities: Repeated node, server, or location records are rejected rather than overwritten or double-counted. - Missing node location: getNodeLocation() validates presence of location_id and throws if absent; tests assert the expected exception pattern. Operational tips: @@ -240,8 +242,8 @@ Operational tips: **Section sources** - [ResourceCalculationService.php:157-195](file://Services/ResourceCalculationService.php#L157-L195) -- [ResourceCalculationService.php:452-498](file://Services/ResourceCalculationService.php#L452-L498) -- [ResourceCalculationService.php:410-424](file://Services/ResourceCalculationService.php#L410-L424) +- [ResourceCalculationService.php:454-571](file://Services/ResourceCalculationService.php#L454-L571) +- [ResourceCalculationService.php:421-438](file://Services/ResourceCalculationService.php#L421-L438) - [ResourceCalculationServiceTest.php:53-139](file://tests/Unit/ResourceCalculationServiceTest.php#L53-L139) ## Conclusion diff --git a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md index 1774501..3750657 100644 --- a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md +++ b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md @@ -109,9 +109,9 @@ RCS-->>Caller : Cluster snapshot or degraded snapshot **Diagram sources** - [ResourceCalculationService.php:26-141](file://Services/ResourceCalculationService.php#L26-L141) -- [ResourceCalculationService.php:291-384](file://Services/ResourceCalculationService.php#L291-L384) -- [ResourceCalculationService.php:426-450](file://Services/ResourceCalculationService.php#L426-L450) -- [ResourceCalculationService.php:452-498](file://Services/ResourceCalculationService.php#L452-L498) +- [ResourceCalculationService.php:313-404](file://Services/ResourceCalculationService.php#L313-L404) +- [ResourceCalculationService.php:405-453](file://Services/ResourceCalculationService.php#L405-L453) +- [ResourceCalculationService.php:454-571](file://Services/ResourceCalculationService.php#L454-L571) ## Detailed Component Analysis @@ -134,6 +134,7 @@ Return value: Processing logic: - Fetches the location with included nodes and servers in one Pterodactyl request - Groups included servers by node and fetches pending reservations for each node +- Rejects duplicate node, server, or location identities instead of overwriting or double-counting upstream records - Computes effective totals using overallocation settings - Subtracts allocated and reserved resources to derive available - Aggregates max and totals across nodes @@ -147,7 +148,7 @@ Usage pattern example: **Section sources** - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) - [ResourceCalculationService.php:146-152](file://Services/ResourceCalculationService.php#L146-L152) -- [ResourceCalculationService.php:226-245](file://Services/ResourceCalculationService.php#L226-L245) +- [ResourceCalculationService.php:223-264](file://Services/ResourceCalculationService.php#L223-L264) - [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) - [ResourceCalculationService.php:500-522](file://Services/ResourceCalculationService.php#L500-L522) @@ -233,7 +234,7 @@ Integration with reservation system: **Section sources** - [ResourceCalculationService.php:359-391](file://Services/ResourceCalculationService.php#L359-L391) - [ResourceCalculationService.php:426-450](file://Services/ResourceCalculationService.php#L426-L450) -- [ResourceCalculationService.php:452-498](file://Services/ResourceCalculationService.php#L452-L498) +- [ResourceCalculationService.php:454-571](file://Services/ResourceCalculationService.php#L454-L571) - [ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) ### Class diagram @@ -334,6 +335,8 @@ Common issues and how they surface: - Throws a RuntimeException with a rate limit message; callers should back off and retry later. - Invalid JSON payload: - Throws a RuntimeException indicating invalid JSON; indicates upstream misconfiguration or proxy issue. +- Duplicate or inconsistent identities: + - Throws a RuntimeException before availability is calculated so repeated upstream records cannot distort totals. - Missing location_id: - getNodeLocation() throws when the node response lacks location_id; indicates malformed upstream data. diff --git a/.qoder/repowiki/en/content/Testing.md b/.qoder/repowiki/en/content/Testing.md index c41848d..b25b085 100644 --- a/.qoder/repowiki/en/content/Testing.md +++ b/.qoder/repowiki/en/content/Testing.md @@ -180,6 +180,7 @@ Focus areas: - Real-time availability fetching from Pterodactyl with pagination and relationship extraction. - Error handling for rate limits (429), server errors (5xx), malformed JSON, and connection exceptions with retries. - Cluster snapshot aggregation across locations and nodes, including utilization metrics. +- Fail-closed rejection of duplicate node/server identities and inconsistent upstream relationships. - Self-exclusion of current reservation token when verifying availability. ```mermaid diff --git a/.qoder/repowiki/en/meta/repowiki-metadata.json b/.qoder/repowiki/en/meta/repowiki-metadata.json index 0a06004..4044402 100644 --- a/.qoder/repowiki/en/meta/repowiki-metadata.json +++ b/.qoder/repowiki/en/meta/repowiki-metadata.json @@ -1 +1 @@ -{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-97","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"223-261","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"439-545","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"975105c33e75d9a20ed621b0f24ec7b26887bcf8","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file +{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-97","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"223-264","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"454-571","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"a349b2a16820229804f5cce2c44134cc50d82ad7","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file diff --git a/02-SERVICES.md b/02-SERVICES.md index 81fa11e..eab2645 100644 --- a/02-SERVICES.md +++ b/02-SERVICES.md @@ -97,7 +97,9 @@ class ResourceCalculationService $pendingReservations = $this->getPendingReservations($node['id'], $excludeReservationToken); // buildNodeAvailabilityFromServers validates complete node/server - // resource shapes before calculating totals. Stock Pterodactyl has no + // resource shapes before calculating totals. The fetch layer also + // rejects duplicate node, server, and location identities so repeated + // upstream records cannot distort capacity. Stock Pterodactyl has no // node CPU-capacity field, so cpu_threads remains a fail-closed gate // until the explicit local NodeCapacityPolicy is rebased from PR #22. return $this->buildNodeAvailabilityFromServers($node, $servers, $pendingReservations); diff --git a/PROGRESS.md b/PROGRESS.md index 8edaca6..88890cb 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -77,7 +77,7 @@ All dp-NN backlog items are implemented. The active reconciliation is staged on ### This Session's Changes: 1. Preserved the dp-20 panel close-out without restoring obsolete deployment guidance. -2. Reconciled the location availability path to one `locations/{id}?include=nodes,servers` request and fail-closed capacity parsing. +2. Reconciled the location availability path to one `locations/{id}?include=nodes,servers` request and fail-closed capacity parsing, including duplicate node, server, and location identity rejection. 3. Replaced caller-selected SQLite test paths with the internally generated `:temporary:` database workflow. 4. Migrated the retained Qoder page set to GitHub Wiki and synchronized API, deployment, and testing contracts. 5. Published draft PR #23 for exact-SHA review; Mutagen deployment remains paused. From 1382e8398b0a592ec7f3d454b60c5c568f0e3a3b Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 22:25:23 +1000 Subject: [PATCH 22/30] fix: verify complete capacity pages --- Services/ResourceCalculationService.php | 67 +++++++- tests/Unit/ResourceCalculationServiceTest.php | 147 +++++++++++++++--- 2 files changed, 187 insertions(+), 27 deletions(-) diff --git a/Services/ResourceCalculationService.php b/Services/ResourceCalculationService.php index 5496d10..8ceb6c1 100644 --- a/Services/ResourceCalculationService.php +++ b/Services/ResourceCalculationService.php @@ -336,7 +336,7 @@ private function fetchClusterNodes(): array throw $exception; } - if ($exception->getMessage() !== 'Pterodactyl API returned an invalid servers relationship payload.') { + if ($exception->getMessage() !== 'Pterodactyl API returned a missing servers relationship payload.') { throw $exception; } @@ -408,13 +408,15 @@ private function pterodactylGetPaginatedData(string $path, array $query = []): a $page = 1; $data = []; $expectedTotalPages = null; + $expectedPerPage = null; + $expectedTotal = null; while (true) { $payload = $this->pterodactylGet($path, array_merge($query, ['page' => $page])); if (! is_array($payload['data'] ?? null)) { throw new \RuntimeException('Pterodactyl API returned an invalid paginated data payload.'); } - $data = array_merge($data, $payload['data']); + $pageData = $payload['data']; $pagination = $payload['meta']['pagination'] ?? null; if (! is_array($pagination)) { @@ -431,16 +433,43 @@ private function pterodactylGetPaginatedData(string $path, array $query = []): a FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]], ); - if ($currentPage === false || $totalPages === false + $count = filter_var( + $pagination['count'] ?? null, + FILTER_VALIDATE_INT, + ['options' => ['min_range' => 0]], + ); + $perPage = filter_var( + $pagination['per_page'] ?? null, + FILTER_VALIDATE_INT, + ['options' => ['min_range' => 1]], + ); + $total = filter_var( + $pagination['total'] ?? null, + FILTER_VALIDATE_INT, + ['options' => ['min_range' => 0]], + ); + if ($currentPage === false || $totalPages === false || $count === false + || $perPage === false || $total === false || $currentPage !== $page || $totalPages < $currentPage) { throw new \RuntimeException('Pterodactyl API returned invalid pagination metadata.'); } $expectedTotalPages ??= $totalPages; - if ($totalPages !== $expectedTotalPages) { + $expectedPerPage ??= $perPage; + $expectedTotal ??= $total; + if ($totalPages !== $expectedTotalPages || $perPage !== $expectedPerPage || $total !== $expectedTotal) { throw new \RuntimeException('Pterodactyl API returned inconsistent pagination metadata.'); } + $calculatedTotalPages = max(1, (int) ceil($total / $perPage)); + $expectedCount = $currentPage < $totalPages + ? $perPage + : max(0, $total - ($perPage * ($currentPage - 1))); + if ($totalPages !== $calculatedTotalPages || $count !== count($pageData) || $count !== $expectedCount) { + throw new \RuntimeException('Pterodactyl API returned incomplete pagination data.'); + } + + $data = array_merge($data, $pageData); if ($currentPage === $totalPages) { break; } @@ -448,6 +477,10 @@ private function pterodactylGetPaginatedData(string $path, array $query = []): a $page = $currentPage + 1; } + if (count($data) !== $expectedTotal) { + throw new \RuntimeException('Pterodactyl API returned incomplete pagination data.'); + } + return $data; } @@ -478,7 +511,14 @@ private function requireRelationshipData(array $payload, string $relationship): ? $relationships[$relationship] : null; - if ($entry === null || ! is_array($entry['data'] ?? null)) { + if ($entry === null) { + throw new \RuntimeException(sprintf( + 'Pterodactyl API returned a missing %s relationship payload.', + $relationship + )); + } + + if (! is_array($entry['data'] ?? null)) { throw new \RuntimeException(sprintf( 'Pterodactyl API returned an invalid %s relationship payload.', $relationship @@ -500,6 +540,14 @@ private function requireNodeAttributes(mixed $payload): array $this->validateNodeAttributes($attributes); $attributes['id'] = (int) $attributes['id']; $attributes['location_id'] = (int) $attributes['location_id']; + foreach (['memory', 'disk', 'cpu_threads'] as $field) { + $attributes[$field] = (int) $attributes[$field]; + } + foreach (['memory_overallocate', 'disk_overallocate'] as $field) { + if (array_key_exists($field, $attributes)) { + $attributes[$field] = (int) $attributes[$field]; + } + } return $attributes; } @@ -516,6 +564,9 @@ private function requireServerAttributes(mixed $payload): array $this->validateServerAttributes($attributes); $attributes['id'] = (int) $attributes['id']; $attributes['node'] = (int) $attributes['node']; + foreach (['memory', 'cpu', 'disk'] as $field) { + $attributes['limits'][$field] = (int) $attributes['limits'][$field]; + } return $attributes; } @@ -529,7 +580,7 @@ private function validateNodeAttributes(array $attributes): void } foreach (['memory', 'disk', 'cpu_threads'] as $field) { - if (! is_numeric($attributes[$field] ?? null) || (float) $attributes[$field] <= 0) { + if (! is_int($attributes[$field] ?? null) || $attributes[$field] < 1) { throw new \RuntimeException('Pterodactyl API returned an invalid included node payload.'); } } @@ -540,7 +591,7 @@ private function validateNodeAttributes(array $attributes): void } foreach (['memory_overallocate', 'disk_overallocate'] as $field) { - if (array_key_exists($field, $attributes) && ! is_numeric($attributes[$field])) { + if (array_key_exists($field, $attributes) && ! is_int($attributes[$field])) { throw new \RuntimeException('Pterodactyl API returned an invalid included node payload.'); } } @@ -555,7 +606,7 @@ private function validateServerAttributes(array $attributes): void } foreach (['memory', 'cpu', 'disk'] as $field) { - if (! is_numeric($attributes['limits'][$field] ?? null) || (float) $attributes['limits'][$field] < 0) { + if (! is_int($attributes['limits'][$field] ?? null) || $attributes['limits'][$field] < 0) { throw new \RuntimeException('Pterodactyl API returned an invalid included server payload.'); } } diff --git a/tests/Unit/ResourceCalculationServiceTest.php b/tests/Unit/ResourceCalculationServiceTest.php index 49e13c5..da11d1e 100644 --- a/tests/Unit/ResourceCalculationServiceTest.php +++ b/tests/Unit/ResourceCalculationServiceTest.php @@ -39,7 +39,7 @@ public function test_get_locations_returns_parsed_array(): void 'data' => [ ['attributes' => ['id' => 1, 'short' => 'us', 'long' => 'US East']], ], - 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], + 'meta' => ['pagination' => $this->paginationMetadata(1, 1, 1, 100, 1)], ], 200), ]); @@ -315,6 +315,23 @@ public function test_location_availability_rejects_negative_included_server_limi $this->service->getLocationAvailability(1); } + public function test_location_availability_rejects_fractional_included_server_limits(): void + { + Http::fake($this->availabilityHttpFake( + nodeId: 5, + locationId: 1, + totalMemory: 8192, + totalDisk: 51200, + totalCpuThreads: 4, + servers: [['node' => 5, 'memory' => 1024, 'cpu' => 50.5, 'disk' => 5120]], + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid included server payload'); + + $this->service->getLocationAvailability(1); + } + public function test_location_availability_rejects_server_for_unknown_node(): void { Http::fake($this->availabilityHttpFake( @@ -397,6 +414,22 @@ public function test_location_availability_rejects_node_without_cpu_threads(): v $this->service->getLocationAvailability(1); } + public function test_location_availability_rejects_fractional_node_capacity(): void + { + Http::fake($this->availabilityHttpFake( + nodeId: 5, + locationId: 1, + totalMemory: 8192.5, + totalDisk: 51200, + totalCpuThreads: 4, + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid included node payload'); + + $this->service->getLocationAvailability(1); + } + public function test_snapshot_falls_back_when_included_servers_relationship_is_missing(): void { $calls = 0; @@ -410,14 +443,14 @@ public function test_snapshot_falls_back_when_included_servers_relationship_is_m if (str_contains($url, '/api/application/locations')) { return Http::response([ 'data' => [['attributes' => ['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1']]], - 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], + 'meta' => ['pagination' => $this->paginationMetadata(1, 1, 1, 100, 1)], ], 200); } if (str_contains($url, '/api/application/nodes')) { return Http::response([ 'data' => [$node], - 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], + 'meta' => ['pagination' => $this->paginationMetadata(1, 1, 1, 100, 1)], ], 200); } @@ -430,7 +463,7 @@ public function test_snapshot_falls_back_when_included_servers_relationship_is_m 'limits' => ['memory' => 1024, 'cpu' => 50, 'disk' => 5120], ], ]], - 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], + 'meta' => ['pagination' => $this->paginationMetadata(1, 1, 1, 100, 1)], ], 200); } @@ -443,6 +476,28 @@ public function test_snapshot_falls_back_when_included_servers_relationship_is_m $this->assertSame(4, $calls); } + public function test_snapshot_rejects_malformed_included_servers_relationship_without_fallback(): void + { + $calls = 0; + $node = $this->nodeWithServersPayload(1, 1, 'Node 1', []); + $node['attributes']['relationships']['servers']['data'] = 'not-an-array'; + + Http::fake($this->clusterSnapshotHttpFake( + $calls, + locations: [['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1']], + nodePages: [[$node]], + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid servers relationship payload'); + + try { + $this->service->buildClusterSnapshot(); + } finally { + $this->assertSame(2, $calls); + } + } + public function test_snapshot_with_single_location_single_node(): void { $calls = 0; @@ -543,6 +598,9 @@ public function test_get_locations_rejects_non_advancing_pagination_metadata(): 'meta' => [ 'pagination' => [ 'current_page' => 0, + 'count' => 0, + 'per_page' => 100, + 'total' => 0, 'total_pages' => 1, ], ], @@ -567,6 +625,21 @@ public function test_get_locations_rejects_missing_pagination_metadata(): void $this->service->getLocations(); } + public function test_get_locations_rejects_truncated_page_content(): void + { + Http::fake([ + 'panel.example.com/*' => Http::response([ + 'data' => [], + 'meta' => ['pagination' => $this->paginationMetadata(1, 1, 1, 100, 1)], + ], 200), + ]); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('incomplete pagination data'); + + $this->service->getLocations(); + } + public function test_get_locations_rejects_inconsistent_total_pages(): void { Http::fake(function ($request) { @@ -585,6 +658,9 @@ public function test_get_locations_rejects_inconsistent_total_pages(): void 'meta' => [ 'pagination' => [ 'current_page' => $page, + 'count' => 1, + 'per_page' => 1, + 'total' => 3, 'total_pages' => $page === 1 ? 3 : 2, ], ], @@ -602,7 +678,7 @@ public function test_get_locations_rejects_malformed_location_payload(): void Http::fake([ 'panel.example.com/*' => Http::response([ 'data' => [['attributes' => ['id' => 1, 'short' => 'dc1']]], - 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], + 'meta' => ['pagination' => $this->paginationMetadata(1, 1, 1, 100, 1)], ], 200), ]); @@ -612,6 +688,24 @@ public function test_get_locations_rejects_malformed_location_payload(): void $this->service->getLocations(); } + public function test_get_locations_rejects_duplicate_location_records(): void + { + Http::fake([ + 'panel.example.com/*' => Http::response([ + 'data' => [ + ['attributes' => ['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1']], + ['attributes' => ['id' => 1, 'short' => 'dc1-copy', 'long' => 'Data Center 1 Copy']], + ], + 'meta' => ['pagination' => $this->paginationMetadata(1, 1, 2, 100, 2)], + ], 200), + ]); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('duplicate location'); + + $this->service->getLocations(); + } + public function test_snapshot_rejects_node_for_unknown_location(): void { $calls = 0; @@ -679,7 +773,7 @@ public function test_snapshot_handles_pterodactyl_5xx_gracefully(): void 'data' => [ ['attributes' => ['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1']], ], - 'meta' => ['pagination' => ['current_page' => 1, 'total_pages' => 1]], + 'meta' => ['pagination' => $this->paginationMetadata(1, 1, 1, 100, 1)], ], 200); } @@ -742,7 +836,7 @@ private function insertPendingReservation(string $token, int $nodeId, int $locat private function availabilityHttpFake( int $nodeId, int $locationId, - int $totalMemory, + int|float $totalMemory, int $totalDisk, int $totalCpuThreads, array $servers = [], @@ -833,12 +927,7 @@ private function clusterSnapshotHttpFake(int &$calls, array $locations, array $n return Http::response([ 'data' => array_map(fn (array $location) => ['attributes' => $location], $locationPages[$page - 1] ?? []), - 'meta' => [ - 'pagination' => [ - 'current_page' => $page, - 'total_pages' => count($locationPages), - ], - ], + 'meta' => ['pagination' => $this->paginationMetadataForPages($page, $locationPages)], ], 200); } @@ -847,12 +936,7 @@ private function clusterSnapshotHttpFake(int &$calls, array $locations, array $n return Http::response([ 'data' => $nodePages[$page - 1] ?? [], - 'meta' => [ - 'pagination' => [ - 'current_page' => $page, - 'total_pages' => count($nodePages), - ], - ], + 'meta' => ['pagination' => $this->paginationMetadataForPages($page, $nodePages)], ], 200); } @@ -865,6 +949,31 @@ private function isPaginatedPayload(array $payload): bool return isset($payload[0]) && is_array($payload[0]) && array_is_list($payload[0]); } + private function paginationMetadataForPages(int $page, array $pages): array + { + $perPage = max(1, count($pages[0] ?? [])); + $total = array_sum(array_map('count', $pages)); + + return $this->paginationMetadata( + $page, + max(1, count($pages)), + count($pages[$page - 1] ?? []), + $perPage, + $total, + ); + } + + private function paginationMetadata(int $currentPage, int $totalPages, int $count, int $perPage, int $total): array + { + return [ + 'count' => $count, + 'current_page' => $currentPage, + 'per_page' => $perPage, + 'total' => $total, + 'total_pages' => $totalPages, + ]; + } + private function nodeWithServersPayload(int $nodeId, int $locationId, string $name, array $servers): array { return [ From 0afff90d2481ce2d1bd88f959433eab677f664b7 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 22:27:15 +1000 Subject: [PATCH 23/30] docs: define strict capacity boundaries --- .../Resource Calculation Service.md | 7 ++- .../ResourceCalculationService.md | 13 +++-- .qoder/repowiki/en/content/Deployment.md | 2 +- .qoder/repowiki/en/content/Testing.md | 1 + .../repowiki/en/meta/repowiki-metadata.json | 2 +- 02-SERVICES.md | 57 +++++++++++++------ PROGRESS.md | 2 +- 7 files changed, 58 insertions(+), 26 deletions(-) diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md index 605b270..dd5b206 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md @@ -117,6 +117,7 @@ Data flow highlights: Error handling and resilience: - pterodactylGet() sets per-attempt timeout and connect timeout, retries only on connection errors, sanitizes exceptions, and throws meaningful runtime exceptions for rate limits and non-JSON responses. - Node, server, and location identities must be unique within a snapshot; duplicates and inconsistent relationships fail closed before resource totals are calculated. +- Pagination metadata must reconcile page count, page size, total records, and accumulated records; integer capacity fields are required. - buildClusterSnapshot() catches failures and returns a degraded snapshot with an error flag when Pterodactyl is down or returns 5xx errors. Examples of usage patterns: @@ -234,6 +235,8 @@ Common issues and strategies: - Server errors: 5xx responses are treated as Pterodactyl being unavailable; buildClusterSnapshot() returns a degraded snapshot so consumers can degrade gracefully. - Invalid payloads: Non-JSON responses raise a runtime exception indicating invalid payload; tests validate this behavior. - Duplicate identities: Repeated node, server, or location records are rejected rather than overwritten or double-counted. +- Truncated pages and fractional capacity: Pagination counts must reconcile with all returned records, and resource capacities/limits must be integers. +- Server-index fallback: Used only when the included-server relationship is absent, never when a present relationship is malformed. - Missing node location: getNodeLocation() validates presence of location_id and throws if absent; tests assert the expected exception pattern. Operational tips: @@ -242,8 +245,8 @@ Operational tips: **Section sources** - [ResourceCalculationService.php:157-195](file://Services/ResourceCalculationService.php#L157-L195) -- [ResourceCalculationService.php:454-571](file://Services/ResourceCalculationService.php#L454-L571) -- [ResourceCalculationService.php:421-438](file://Services/ResourceCalculationService.php#L421-L438) +- [ResourceCalculationService.php:487-622](file://Services/ResourceCalculationService.php#L487-L622) +- [ResourceCalculationService.php:426-470](file://Services/ResourceCalculationService.php#L426-L470) - [ResourceCalculationServiceTest.php:53-139](file://tests/Unit/ResourceCalculationServiceTest.php#L53-L139) ## Conclusion diff --git a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md index 3750657..0e4bbce 100644 --- a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md +++ b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md @@ -109,9 +109,9 @@ RCS-->>Caller : Cluster snapshot or degraded snapshot **Diagram sources** - [ResourceCalculationService.php:26-141](file://Services/ResourceCalculationService.php#L26-L141) -- [ResourceCalculationService.php:313-404](file://Services/ResourceCalculationService.php#L313-L404) -- [ResourceCalculationService.php:405-453](file://Services/ResourceCalculationService.php#L405-L453) -- [ResourceCalculationService.php:454-571](file://Services/ResourceCalculationService.php#L454-L571) +- [ResourceCalculationService.php:313-406](file://Services/ResourceCalculationService.php#L313-L406) +- [ResourceCalculationService.php:407-486](file://Services/ResourceCalculationService.php#L407-L486) +- [ResourceCalculationService.php:487-622](file://Services/ResourceCalculationService.php#L487-L622) ## Detailed Component Analysis @@ -135,6 +135,7 @@ Processing logic: - Fetches the location with included nodes and servers in one Pterodactyl request - Groups included servers by node and fetches pending reservations for each node - Rejects duplicate node, server, or location identities instead of overwriting or double-counting upstream records +- Requires integer resource capacities and complete pagination totals/counts; truncated pages and fractional values fail closed - Computes effective totals using overallocation settings - Subtracts allocated and reserved resources to derive available - Aggregates max and totals across nodes @@ -234,7 +235,7 @@ Integration with reservation system: **Section sources** - [ResourceCalculationService.php:359-391](file://Services/ResourceCalculationService.php#L359-L391) - [ResourceCalculationService.php:426-450](file://Services/ResourceCalculationService.php#L426-L450) -- [ResourceCalculationService.php:454-571](file://Services/ResourceCalculationService.php#L454-L571) +- [ResourceCalculationService.php:487-622](file://Services/ResourceCalculationService.php#L487-L622) - [ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) ### Class diagram @@ -337,6 +338,10 @@ Common issues and how they surface: - Throws a RuntimeException indicating invalid JSON; indicates upstream misconfiguration or proxy issue. - Duplicate or inconsistent identities: - Throws a RuntimeException before availability is calculated so repeated upstream records cannot distort totals. +- Incomplete pagination or non-integral capacity: + - Rejects page counts/totals that do not match returned records and resource values that are not non-negative integers. +- Missing included-server relationship: + - Uses the separately paginated server index only when the relationship is absent; a present but malformed relationship remains a hard failure. - Missing location_id: - getNodeLocation() throws when the node response lacks location_id; indicates malformed upstream data. diff --git a/.qoder/repowiki/en/content/Deployment.md b/.qoder/repowiki/en/content/Deployment.md index 559fff1..8dcea68 100644 --- a/.qoder/repowiki/en/content/Deployment.md +++ b/.qoder/repowiki/en/content/Deployment.md @@ -144,7 +144,7 @@ Operational requirements: - Scheduler must be running to execute cleanup and alert checks. - Database must support transactions and pessimistic locking. - Network access to the Pterodactyl Panel API must be allowed from the Paymenter host. -- Node payloads must provide a numeric `cpu_threads` capacity value; missing or malformed node/server capacity fields fail closed instead of advertising unverified capacity. Stock Pterodactyl does not expose this node field. Keep deployment paused until PR #22's explicit local `NodeCapacityPolicy` is rebased onto this reconciliation (or an equivalent trusted capacity source is installed). +- Node payloads must provide an integer `cpu_threads` capacity value; missing, fractional, or malformed node/server capacity fields and incomplete pagination fail closed instead of advertising unverified capacity. Stock Pterodactyl does not expose this node field. Keep deployment paused until PR #22's explicit local `NodeCapacityPolicy` is rebased onto this reconciliation (or an equivalent trusted capacity source is installed). **Section sources** - [DynamicPterodactyl.php:48-75](file://DynamicPterodactyl.php#L48-L75) diff --git a/.qoder/repowiki/en/content/Testing.md b/.qoder/repowiki/en/content/Testing.md index b25b085..9a8c2c4 100644 --- a/.qoder/repowiki/en/content/Testing.md +++ b/.qoder/repowiki/en/content/Testing.md @@ -181,6 +181,7 @@ Focus areas: - Error handling for rate limits (429), server errors (5xx), malformed JSON, and connection exceptions with retries. - Cluster snapshot aggregation across locations and nodes, including utilization metrics. - Fail-closed rejection of duplicate node/server identities and inconsistent upstream relationships. +- Page-count/total reconciliation, malformed fallback boundaries, and rejection of fractional capacity values. - Self-exclusion of current reservation token when verifying availability. ```mermaid diff --git a/.qoder/repowiki/en/meta/repowiki-metadata.json b/.qoder/repowiki/en/meta/repowiki-metadata.json index 4044402..7023c1e 100644 --- a/.qoder/repowiki/en/meta/repowiki-metadata.json +++ b/.qoder/repowiki/en/meta/repowiki-metadata.json @@ -1 +1 @@ -{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-97","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"223-264","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"454-571","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBW0kY68nN6yH347gACSKnGW/GaWsrfe1qmD5Vs4yiF9Bg4+cNg243x5/lrCPGe0ZLa727Kgt90Uf0qPTmGz2CCcagpDlxGuQ7KqPUQcnjLaS5faJVmqkBWfw6JX8uB8qtdCgeBozoNT8CS3Bl+VaFcrfo46PhuL+4MV4UlG69rB+KEYv2FlCDFDg9dsS+3XTkwBCvSqfvBNpmup+JH+w/q41CDiYfTbbURVO8q98JASJEHxb7rNSya1EFRu03Dndw5/hcunp6sW3i/mUBf3rxpXMRj7LhAAzagrVZYsK5LpuTLXislaMmRF+QNJZ+IT2lA/DQouhtUWc62leDrTc90zHDuF0e3jmfC8eu07DCVNzcVaikeY2HvQANYSq9rcpC9dzQDVFpKkVZPyhummuPO6U99ZLXQfwklIsKdCVTSZVinDVknwHBRxCYkuHbrR8PCWVfl3nrZOl4z3lC/mgPD7igYiJ64AUnOrpRNW3FBxgRf+8BvCrHeO/WIMVcJAbwWpx1XZdbGR+ktnHoWF73udn49QqG7nwtZCHkmejnF7RE14lQ8+LnaecPtPbDVehaKMSZUoX61sD47oraIoF5YU4E4zx2W6+7KWhB+NpL6ko1IG+UcHaD4hkEfJeD/2SeBD7vRpayej1ACgV5vne+TGzI7kZjsnKCjMqmxL4YD2RzBYMKD6LQL6+ubIXcmtFJAr/Qf1KdnxmlKveyXnZvX/ndj/g4n7iBoa+G06u5nlxnDftLOS1UX5Akt9Sa4ReIpPgc+Iu4fZiEvIogShhlx03pJAKPKeqY42rc4Hmh/zj2ffRkETYofbIvn6wCSpMGtQgaNCIsoTBzZqBh0tM7Ms2F9sOuNc6VOVytLWrAGs3Uj9mAw1cTz5V3dDkS8Iqc+2KwYHX1PPfXqBnFJ9XWfpzrzj1AUpLdt2Z96y1BKsDO8FeK7GHaIwMaAh0x3oc2MEQ48zBkemSFRqIbRb6rRjJaXwqbblx57l65FhBcMxFJxsPldnLySuNmXFfz1BkfSZ5DNpDxfbRaWAgJ5iptfMKdXbJy30ubNAJBkJhH4W4vLOQclfbDxGrO05ifqQbqraigV+gsHDqbEOiWWDQntcPu4du6DA+lClzPznkDuMn7ja/xjWhR8ohc2fY4GLWlOImAZLQEAyJmjJuZjDb+wqcLkwv/j9SeZbOJGELa6Y6Cr8itehW5lwWc5TsSfqavSxmD9CM2kCWNa9KxKdXaIxsUdn3AszUAdFlaPjG1P92QEIZMq5VR63US8SMFRS/lg2Bu/R10wr78W2ugpCg5hl4fZ5p/1vmKfSOK9ausuHQkeqqTABqn+iCT1Z7fU7QiEJ1KksgoDFkz8d4juqNhT7IjgBmnKpjlFLoMF070nLjTwO0MpA2l6ecAQhNFxkCTTgbwRAIdm91gS5JWtJnfYT+O23P17YXLCRKgLW9r5xM89j/ujErpG3/BIYXQkGGTGjTpO/lzd6VuHMlCDRwq73TZwT6AUgKKmb39ODafcEgXDC0Bwj49ZcUbc5EUw20RKYOccxNuKtBfilv6f7hbd8Hu0elrwUXFysMGHrQEIp5zXnFc3NBoJTtz5sGtxvwxy8KxeukwOhTloRknS/PinVWgDSl7tIsvU41/UPsEcjYzvczZ7nHfW+gpamwJoBNcYBOgGuCXoh+r/X+5NP4J0E8n/b2wCID44OPvacVG4V0qgjxQD4xvuliHGhoyte4iUvy5yOLrxbtwVmw5WBJUPAVwPgvGGRdqqVGnUW9k5T6rUGgAYhhHc5FTr9y4OibhX47uWd5eEv8IHnOhQT5/OyBAM1DOPcI1CQf0W6Pe/UObhm1662/8HXjlFAWsAJiyHi+I4iqPHBoOO9+l5Ng9s7uFUXtS6a2de/JIymAUP30+H8rrNsAGFKDIDiIVgJoPtOqSM+8eDo5CQvS/Wtf9VNIbJ0jbt8M9D79XxKedIjsFMGtgC4JPtycHOsQu3VsEvlFdhN60jr0Dd8w2Fa1hkc=","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted:qkTEybd9tQzuDstX5IzR1CXs/trJv2Qp8kaORmGdEsjOxLytJAqUuHjP06XJn9y+iXOi9CHh5MccEBo3czEUCbEI3xi3jI2FX0U5Hb1shR6LDZa4SKyGHNVixTBNySA00Nc7Lz+raBGyJ9EnF9lGDKWB1J0M+K73LX1rF7N3R69cErBcAhuvCBd69rsyUTTKSXgEpXu6a6WBUCYLToWdn12p9VWVvjTtcSe6lRUrzgs90/zIfQVq9RYyW/9LbF/T1JjqYM0NGvS+uZhPFi3p2U9QVLIuGWoSFWeMUW7i/mctoN1NLGsU3TIOSauX990uB8YSEC+j3CLEU0RFn/c5OsWoAXtfngYrjb4AGHl2NEDSkwlciQRkxkMYxFEZyYcHT8Gpy9mvFvx8bbUg0Pz6UsIgth+Wt8ksCwhqUfDKRSDFIXTTfvORPKTzfkyLwlHIqFcgDPVkG6zJI8I05IjUlXG5jKJQFuSvTIn3yJqmp7ZhvKQoeYLzB31v5M+ZOkDLxB20IFzyEJJaajhK2ne42xddTRga+uACLExPlaXQ2RJgP7aEh4BxFflfEZTJ34EAFDODWNpg+cS/h15EWTsUaCG4uC1kiMBrOd2ozslPb/B4Edh29LEeX6942jquAGPtDbui9o80AA5R7YrXIWL0yCvKlGIvVQkiQRQKUdaVYNvT3BlqJ9Ka2WMvnXeD93o7uFgQDqkb92et5LlCLAyZL2hhn/HVQ2au4V4WnXgjVYGwqLpihYFplV2o6Ul5PDnwJGD69mAO7aSGG4TBaz1vo7thcxfYaEN8buhL/QRsNVzwqTeN25dxKdYd+zBxU36BMRYfjftV5aUHpmuuyJJkM5VRKQ6BjVw6woeWtQG8FgIoVUuFHpxorMTccI2C1mpkmzgRNMXQ85uoPlKkLHfbtEhYmKBBI5pISQM9VE6ya4qmYS3ZcA4Gby+GuS+2myO7b+pIgX6Gq8Edw5WSPn2Ei//99pnHyVX5UPawG98jbNRlrQs2TtcrBTUT98D4BYcMA+ktxGDZix3F4RcLx5/elIhe124f8f7S+X8phIq7uGTw+ZxP8gQsdLdGaOoF3tin+ZOK0iHk3oIa+E7zaPMUeNmQcixZRtKa4oIeo6dr4zHVltAOiLtV52OQDsPPCU8HwUO9GFXeTYlUMXhErji/Bg7K2iw712B/4pQW0+0M4atRKpXUCf0AstnGoCz8LlV+hEsMY8AS+k7jCk4TW4pv758c4geH+8hGXMLUSEdVybYs2P4Vk4c8nAaIEP6jWukiDhIps/dyb8RExWg5BKcfGJZXTWi3TBQKnGIqc1JgXXJUAOfGwP87PHb9WxxWsvl+13KF6/JUV2RuX8NWSAmST2z9I5whzQnfem7CCc2i5yO6yqpJbPOt+hpYlqFYp/yd6gkodn84E4+o9G2F9NamhIk1rCcqX0YoYhYX3he3rU49QIUaNev/DsEKQc3s+K3yH3L969uk8nvcFIDEREP3Ke/07RicsySihmrgxJ98Ld4lr2V25uD69/exLybGUdn2dDcVBUfI6jWrwipyYCInTV+f2WDOy/ki/Kv/G4WbDZhIXn006l1s0GcFML1GXUTxXmJY0ku4dOxbpkSooJ7fw4n3y6hHWfG8HpJT6bxgFd00CbYoe/b0gzXvAaWW8vpkN1sYSWr1kqeYKUzdSIW57T/K/LOKTHdgZA+L0R1R8CEvL/ecL3GkHaFg+gEYwMpDWhf5rCtDxKebVIATR9aw07hbWczXdZwkDXJlVd5V5vdgORzxjfzO/OFC44ruOlxQSlTZLyulYQFp9dHxHnHSP0L24zQXaZKtefy8cnmOapkooReZ+wZRWiAb7fxmo9D1teGxlOU66NKDFzhuXbd+HpEiPqGRF9y08wPLPou9goHOa/JMQmjgWBUVuQuDbR+a74MSWaZCcIwojBJ/uBzCR1IFP2H+BJDuKSrdeLDMuW5EJu5KRZ0B7R+zFnwOxiZ9EYJTIFO4DXNRb9ZL4JZaZJDqwUUgBM8pWHec/4cM+iRi7hh+rkEMQRAMyGpem2L+oSpr2mWWzpe8wQhlaZeVV2sbybXQ/c1TEtK34eA4FlFqimXo12UKrmimZi1mkAyuF98LXH1wCLNXeJVLWZOMKrSl17JGy+Rgsx9dEnAmdAOt/ePsBXXphzaiSY+6GMqmtIINfcgpsvFLf7VhdP0yeZ+kkaT7kJ6yYu+EvJqw32jYBjw3cBy03f0wLMX/dMHo6VPVsef8AiKqBBoTxb2uWBbY31nXY9EQgRoYajhQYdmKkqEJWTkgXQTwQDHnUdrR69KAqK1wYfDX38GDERT9ibC6fXsUZGq+QgGm8VZHTsFTnVWZUi9EUCA1oH4p8NtjCRKQE1dUmCiF/sMRKwCgiHZ+WmKV4ixhHV51T5RAHQ1fkcqc+hPFcd9uEqHPrwvlORQ9jh5rDbFRNCijsw17TiHm3NlZIZ6TOhCPiPO7135f1/4QfMvhj8NftvFreT17bU7G6ZhUQAvh6EcXhWZ2LDqZR6Buji6hu1u+6WgCFFNo+TSLl+h0xhKxqKlA0H4FQImLcJdXn4MBTrmQhqMe5H1iyxIN8bhT42s42eS/2IJqrvjiLVVNiU9DbRlYBe5TsLfZuC9GQsWYHdHB2KAAAceRlYBlwnnnVPexQl67P/G9sMfPJkJP7aduEQc+ikG8og1weDdx5GYauM8O/D1cxi8/7lTsEtDIGXuCC5OOHBs7utoXRrzgtS/D2kgNytqDqSaHVKaNy8NDlNMYbjHbsr4ffxNCRN6Pv2NPi1RODmwAvliw6D7KLOfoqACJKyBasvMnWyR24InlREQefIeRrWJ37pr9Vq55Q3FhvhZAc8rPO+f3plstLlPFQuqz9RWznCe1tPE0niOz5NHBZI9lhIv8cOJgZRzQJnMNAIPVderB7zfqLtTAiq8aipiVreV2y2vrLz0b9lyC8yWPsQK3aseiv9yw6i9ehl4z/sHroeApfLHdyEscUVNJXOvapP2qTfZ9jk4hocuqydv/duI2D65jyGlk6QuIPkjjMcJ8zaFur7eFq177IRSKIy0XT5XPXjUFSsnXp0ChOnfbgKyNvD71SvzQT7GwZI6hAH67jxNZKymIWPsLwAFOl+M5XOs8X9EnYbxKTReoFUvgerc0IprGMeJ16tH14Yd0i/HHak13ShbBkqSOrBhhWBRCCGt73qsgdMPKqQaZAihM6hzVtV0uacQePDcxX005Zjorr5rGsmt6BTBWli/TnwDZB3Ttch1RUd2LJTCCIf05zCDZAtrx3zbm5Zoti5VWjScQta3sIvXlpHyQkCjB2varsGqAsAM6xbX6bHqsYlZCwlk1uP/VKVdUU65hWydtK0mJCHJsMV/H8ph35q74Pd6y7yvcwg6oKZCuQCA+Cd9TiyAc3Nt+wXdMFlMxobEz1J0fL8o1BKpsKI1yNn3xff0/UITO4WG/FJ3ryJ1ROrErGmcxjYSgvBsYrkhIUJRMx67aSnqHC3oQ7SWeFeJrTuyyrHD99crFg1wWW/Ny7Jkko38NzNnHHArluH3t678lUA+iwYkFUmGoEtS4GEav6aW5hU2cvXiL3Sgog1Eht3LcHBLRR5Bf6n1QOINMP3Japm34G7BaoZ5TNwpgoVoJL4/vUu1ncx7WYfgP8KlUhUAWtI6NFt/vMxjZ9vhCM4Pgn6dQLn/vpc6aYRsyEZChXu0wLqM9O9zLbAQ8qEOA0e42gpKoXjDUYBnNFu0Z5xjiaRu4B0LT64hpm/n8NvjzD3dL/9wv6xCTKdt6T7PmeIUrpxi1OcprTww1m+Op0qyeOzKRfWHQl9S3dREaZ4AXqDFETvCYFD/VJ3U5pXRr93uIH89E9eoGaZQbr31j5m5aYERY2ZXF99fhxPSyd4rranhUy7m67NgGGaNgdqnH/9rR1NPpFb1xUwymj4NoSg+innBL7DfFKsWMHumXC3b+C5jvg3WudMgI0+ODGO6MoYDiERrxIidOP5q8ZN4Jfts8pGffE5/sd8zNMP36qD4t8nF/pskZsgdOVcsUzPmuB86IFlV9bD4eC/RdmJS/lHgmgQ4eTpFRNADPwqz9vkoPtQurxMYLqnrF7LElAIGXC0U6k/oyDz7SKDz27N5B7ryjSs0IVLV2Gy7ZncOKbEyj9CPNXy9vR8rAIDrFLa1QNw+FwYgPu+RoyTDJ9S55NDjpALze3Si28hXfGIoA0HSvM4+r1S8EfRrQmWs1o+qBh1pDKt9hnFpqLjq08Kz/UarsuU/dKAxkzP6FSPHWRYY3YCd6U4lJq9LL12d9FcrgYIz72opWVgWq5BNezdmM5foqsAFgDujPmGbB6YdL7kTyt0rcxMBkjlP56SnD8hLaBG7oTkf4GCzquMcMhaFf1pklIKJi90kufl9CDN0eYHjnF+AzeLf1p/Ruq0IehmliQXA1No4mXjiA2qU1BnmzqTNCyAWN32S+fAkeEfSd+AdD4sMJSSLUhNwaoTQr3qSp9Q0qW2KZGchDCBDXE4mTCyxPNDnHCSvmq+ayDviJacujoKbZNnuuZjgJ5eitj0nuD0S7jD/URAoUq8UAEzo1qq5eziSUw6z38U0v97ZaU0hohyYSgjBAv+umzJOrnY+Wu7SVW/53kYb8GpMhwkgdvQRKZcBEUuR8o2LmYWilmZpKyH08poYLj41wtsUQaVqhgItvECi6G1V1MRg9BzvvHSGxU3jglpZUgzv4dhYrUxabLiVdFRLyAtZ+nx5YSidIxtStPEnWKIR27k0BIsYLP0yO7npcBkx9v7urwM1oh8q6o9mtPT140KgBqUPMRKujN1Qiw0kQ1BM6TddIsUWMS4Jr6oH//jZqDqOM1BgFjEzXhdWWTnwHe8Y1x35EGBfYupFepa8/H/6iB8HUnbLcEg0sS1Hla0OHtaut4N6i/rJNlfBAYjK1tyDv/cwm/bEClj0JzLRWKjf1Ae/1b0LYWIDReal8V5YqrdkB766d1yx+xZ+oU0c2wAn4ij+Do6RRtrV4lTFGs/PNS9CpiYS9yt6xXt+2rFuKuWrDxwLl5krZDJKTvpO0s9aF7jjljsDfcaKJQQTlTkL0h1z/KZxm41bg+KcbsyptkUR/8Xti/fBFOUSBOUd2E0ppEA8/r2pxLlIYaIQb4dYsI3bqvONiFviW9qExQQZ2RYJ9dLDykZiujhQ2nEJQOaCc7e+NViygsPHE0NTb24LIPbnAQX1W1PCt8RtndICZAJI60dVMni+ctjifd/hwY0Llgl7d866veLh6q/YZn2f2qBr6ms+ar6mIrT0zapYhNG+hLWaXxThodnNG02y4Ifd9wFSEkMOqaeMXxCBRquJ8QoH9wSd6nYO3VDChhkPpqdATuWj5/hI5SUtcmDOKTe9FtpP+sSIII8thsMraMi34XovbHYPFdAwrSy7P46GbtrZKTG4gKr3ZtlGIMFlYEPeTPL322mNwjrj92Xtiv99blZVyVShhhNHlHvcFPjXvVWiI3iNMcdDs6Q4ZRSjkLTxVaZcFHL7S6/fj/TeKcISQMVvW/+80GI7791wFpgzGt2UfMHcCakrxgxpldcwlqSTVsMDRMkWaQQzsqaODqL9IZoMYyGJweawPyIFbCanAUfBpoJJUHrPCPVTzsG+5TupSkaxAqSmonKiCcqUA4Ra7rc7B6H67hFyaqzDcQ0HnObKpJp9Z47+70k1bqqE5DzVn9jE/pXNBplDGe2EN1ElmWGZ7ZFl5RSZeNxhCZ90+qOFe0RfYZyk0g7qi0KDnSmIttTqBNXzyktDJhs8cqPvs17y38gAjI9Q2RtR4ShU++7m/id9sSjv3xAHhawuUdS9Pgj+OO554Xezol7Wdn0kx+oTnVEZsOUDtV+8dx9M1X+b3yhEONQZQnpkLzz5trviuVmzgLKxgopFB/Hmh1d+E4KOHkV/SLfy+a1bz2FXqUzu9fX+oRKLKmJJD5Y4sp+/gJSH68oriVKGq+hvF4F/RBmkKMXwE8KTw1LUFl7dMvkMuAKoNnklEyyyVdKit0vtj00CqZhG660jA+5z41hadJqUZ+lK+ITqJjvUrjmKOzQ0q/CIIJETrpCfkjXZmqb4Ebz47DJ16umz/a0IWN/tiFyuwoxzvdGEMGKQ7o8Pd8BciB3LBnFUoHMtR0yW0jxctOzrftPZ/vh0JSHOp6ux72Vh9AZgi5TphCRvcpKlba/I0IyYzkevNboCRgYQP+Ap5rj+93nXiGWTfRk2mSpyLral3GHzhAMgl972OIpcT5/Jm3DX9Rt5xScquys2wJ2dVY8lhiPPr8zMvy0frQL7I5056M0eQjoInwws4fIZtBfEYy+ycrVnZDK6EIc1FdGItERZL7gIhphZ4dcYXtj8cRF6l2PlQ504mB2w/WVH6zE9naxlibeNF1JpvRZ5pKl2Jna35M+axy4dgC7rhji2OIE6pjCle8ZW5yezeopFZ+gelvlQrNqVR8pA6lGoPp/VixuWxbDG0MqAYPN+4+UqdXGvEF5VGcjWCJwfE31XaLZNL1XKfqzBuEAD6R6SuRb4ik9jhKDmCOvYyF2y2jxovEJKGv2qQ04poITEbD9Z/VoGI6qH+Ldfx/pHSxxYj8QfadppQBhfWROJ4HaW65WXESK7kQnLKzIcRk97zLXiBUAfDnoROqbd+VzlfnXGEogSfskcNcyn40WdRAZ9EkO3qWeT8L7eGa70tx0EDmSfkv4EUZhKMKbJwsAyedmc/tmVQyk2CVQCzgBMW5AdHgfkaHRTqiPuRpkSnVVCfi5yUcfdgKeU5eho1iFzrBJ5FWc4LtiU88uOOFewUSqski12Z7xAZDF9QH4eDOcWEIRwy8nzflI0C18Hjz/AVBfeKxfuVf56MJD1M9b5ZyKgXF2uv+2rtOC87aqaGDKkmG36eWMjUpj55xm0OrxhnFYb4io1c7Ar9GHOTCp5d9T8b8AlmDghYu9Q4BS9eu1fC5mk2qntj0gbtITw9yrm94mnFR3epFBM5VimXsIKyfkN6vaxi/VYxLzs/m8P2/iMz5YhDPSpEoE6dtGi+RYFQoGfmf4Kp51MvhxKpBWzIKUZ4oVo3bSR/xTtA8g7m2Cu9TmGyGzoRsGZVWPwenitAOr8BK1F2gZIetevGghmmjb+dsTllfsZSkAVO+a/QWVxiylobFRc/EGg1uQzlL5YM9+6L/vwXg6zBN9kGoGj7BzOCNk1aNyPkub8+YZrb16Nj9GZcHqGJWRlAqG/XekCaEDdi/tUuwHPCTvJpmceD04ErapLgvVI42e6zgSXMnb4xQ8znJCFT/H85Air3ZAMw36GLTdxZbw+csNjB7990zjLDB1/gslSZrLuBFvtO2ciWE7AqYJd4YUlhLF4iLpy5W4Sw50GjAW444Fgp6oVJnQlL0tV8APr2xbLWp9Eo40IOgvMNVPwLP/v39jsXjKT+VrFgPBaEYyxNIKtx8MAUPhCaPKzpEL58BAo4j14o00Ma4zDTGbFWPXFfbTMBZtDjBD7n6z/GJZUFz61giQOlLsQ0APQW//bMxmh8FgqEujhae7IEDDgm98plwNfmKQKAv+nZB6h9iie1nTVLTm5P4ZSw+v3VpETskl9Bq8RT65DPNdkO8pqMBj8J6Xm51FlrR0ErRv/ynI11twA390S1F5cLg+OLAOx271Of6n2wxWTJG/peXEcAVfFaXXlsmvARiKku8WQu3W/38Uulrk1fg3setfivWSWv2nJvb6NLQyqX1aN5B4vMtm3Sx4oi+QCmHpKr4+n92EdLsHfZJa4Ldm49Lqk6CkD6kncpzbtAjIRTVUXcC/P5ujAwgZPyCyhiwkRJnc1ZBJmbF8JianRsBqhnzXpUBlsOObVOdyjLn3rFDaigXy90uf3vyrSJP1LBqN6DjEKFm3qQXpgmEIqfjLN1upGeb3/PrJV6ylEFwbsPv03ZZvlHP6RLo2fOotcZBh/E+EVPvXv5bzjYVWfDbV3wf6qnr5ZX0muxzBkYOnVp2m0mDA5cgkhI8pY8vXhQvMRBPQpqe3OPJmr1HySivFsIWnHbpSKfTYY9BJYLlEP7cQWwboEHAeXdMpmTx1IOUnJAO59nOml+xyOCSwelJo2W/nCTPuEEGkBHLjpogzvEBe7DZ8j4CjYynzKdd8UEVuXCkKvQhDC6HGQhd56b1uxmxh+Aq/w07/nYu1Y60vEk0Mbi2s0Jo5PpcOcG3ZmRXGJf+1csDOpm4wCi+iF84wBewgxdIegpjPTRopBHEPYH1MSRHiBliqdxf9gipweLAX6yLOk/N7H/gqXarYkCdZXxEjpoZauMfawkM7Q/wSjTKV/vi0en76dmnTHOQzAUjGfBEdm3DtJRZd9XNP27syr6nu2mefGeB+q9sHnNOIMkn8+ZBd5aQdVZT/HvT52vWseAb7488OnqKWAXinkPMoOpx151M5Dwh4n5aMVSqD8+cwTnrSlcuBO+tFrxdDhpCjOY4HRq3Bipo8A88g5OJPBxTCX4Ms9FSH21e/YFA14rMyjYfBMSz3rCdSYp1Ni/U4JT4mU5wGxE0/4djSDcJVd69oE4XKftnVrZQuxz1xKObEy3VSf0/4VN+GtRu9PClRTv63n1vWX4R52q3ibpWD1gSnCxUnMGcovNWSM3+syP8G5yZFHgH8sVuthC1LvODHAa1r1w1gzLAWMMQlYzXo0CRruV6bNDGlcp6KZkgbmOZDX1DWXkrz0r1sTmjTSM13SBuBW4EaNJFyvoV5LLW/yNcUDzhhwysPeGF5df01d+svZEAgHYA8Ogf2b0U7Twj3zx8IqyFfuk+q8TA4trDvU5z/fDNnZazo5r526djNB9+vNMRuxziw0qf7cZuJVMHR5+ek9t5JprtGyXisj7a0LNadiSdFxx5hyMW1SStaM64Aj5w9+m1wGu8Mx5eZ4YX6tXpnc6II3+8SQY20Ui9W8niZVOpr4ybqsaaHVGW9Qzxm6UJwSjtgOcWVb6RsO3i6ymooRxQbpZv39tLrxc42g4Vn8hb6x1i3ukKrvtMUvidfbdR15kWYyV1O5PcPXZ3UnMI5fJS8NhsFLE60UNzIga7p36e4W3b+hKghoKnk6JfRtSn7W2dtJgD+pJPhKOxuOLv+fLBT5FwIOHtDzSrdfQrIeiw1FAOmemg6VLbIGiZY86LzBOGzget0EKnLBmMEZip7FK9xIPno1ek3h+EQhg+aDtm//h/VR8Zaz5H2ls6UThDjbVVBw6ffW3Nl71KdgGDk+/D1pvVIc6yfpAgfqt2IYSIjiwJAlvqWZWxR/DkZQUfO0Tjx7fbWp7dssuOrIwo3KQALWFLOBCEljuas4Sw15z2kEQgwquReMhCByUT8vADZMeN1VzAt6X73/ZByCwoVx5rxFjuZkfpXOoxeSCBJtTBCbDlmKHAEb35Fo1yDcQDSk5TlcgrFG12VRpLkHOlZ+fCRn/T49V+TRF0MPlTh2yuJaAl0K93cs1uqqRATX0KsF7XdQOU9FMx8gr7YrImpvgUCheB5XJR1viAxxKCQpaAPpG8SyM1eAbTsNmWsDXz0o9b1h+iz0Pndozebu4NtJLqSXpXCVSsfLlbAaCdHvQ/hb7BEGKf63aL27oNfROm8x35ul6mLX3JWheWr1oPh/KwLgJhOlMPUEDTDMzSp9XpJksZuB4ricLei7rRIn5YE/NWaiswBb5oknS4hicl8YYYRzryUqOdC/7z3GTLXpmFP9eSolf8/Rzt5KNtJQWQK8SoiAbu4e4/ScgM1wzUaNnMNQ0RV4wFAwZ4vvkFNDzVAwpJqWIPaA/MF2cGJOfxA11Ssuxd/2gHXF65fJ1y1sOi10yNWjdnZjjnf8KEdd8ApKjNpMzD2WayEQXzmXXKQ5Ym9FlJb1oIsSJt9Fv2YauH0FlsSO0IWOu7iMPJ/Z0mo5ka31AtBJh9c1gtUxm2xo3t1qhMGnopFozQqeZgiSufSQ3pgrGrUqjwzCsmRZ4qtSOaCu1eDSgR2+DTJ3kSjU9IkiII0G0vFvR0bwL7nOFWBHzs8LT6eQic/CCMCJXuxvvwTknfgrDYIj29BMK5Q/PoMO7JMlG4mfMQ/65QkdmKvVVdmJYl8d6kHjawEtS0JsTwaPFhwNQcXXR4QBFtfZq7hZTyAl0VJ641n3FdiK8YjUJRhRVErBbY8vpSW8Cw5DXTo6rVtbmDM3GHhGWL/EQmL4yVLnmqJloHiCH9lgCZ2spd6WdTbg/G8lS81eFiE3AdnUvL8nOxCVE1cm886d2z5rJL7xXOBfhXiU535UD1FTXOt9IJAGFOrz3q7a7QBcN0mXqjabPSLUzao7SLxzzQ3N5BBtY9E5A6F/JOeJ8k1azGBsbBmHX3gX009gjdyh2FEi4isGWUYmq/ppVDOKRM9TrYBIusyuL1uJnvliLE41KvUnj9cVSGu6Y+LhOShU0oIZzNqlLz1drq9WtJ0pNOBHHcDBUZIHKWkvQu2Kj08LAVuKoqCUTB+bbFSubHE8+P+LqHhU1Efi+bofZdd8IImHxlzSay2TwOJmYr/vg1ttPsxY6QK2cUYrisuDe9flpa6aZ1TDUghwOD3SrGayV0EtJznsqVdhFFrMhyJVUZNqnu/Dacu5QExvHCzFWycNKt5DhsDafNS4OhLlgZofPhh0ORCnb31pkhnfZH2ViomqngfDk3HZYuwW4eKaQuzAskCW9lIk+PGnnNa4MgKye2sy+Bth5Eyn2Y0CHD3wtChNaro+GGoZpaiOyv5qbJLbMO1FfBeD7EGb4VXFQF4VBxnnGV1OFZwDKoa7w7L//On/9Nq4eFY8IJABXL/JWxphpALlAImWxSgoAg837PbDY9dbowRSrVQjhJZUM09BEL2FR+P3kwPwmzE3ReioFgvcAZtTcjzFZs2UHJSk6Mcphkd6ZCr5HIcqgC6GXPa4Aqesw89Uxz9DZfpR7PJkygyZQzn+nGFe9UDOfyqfNF4MxitwhtdniTtmpFTc2JmTNNGNe7IOzYE9kwB52RtLgi79orjTDW5DZ5TnJIqM3sbis0VBgUGXb5JY7oVpXPDmp5XByCkb2voab6P4uFhT8C7FmtsJVQyPRlddFGilUPX+V+n+ANkBMUhuMdowRyKwSxfaNsDVSgdTuGpOw0N2qr8kDOM3NDaCSUXNLoaxxW0NPdO7C7gFI4vcdYhiHy5lLmxuJD62giIjMqQOxH5cefdO8+eiMemWEBA8NQ83eQD+SCHuzLgo7LoIvZmzskylMbYFIwEIzAcy99HjGicmpxKzHFHyN+CRurnuNxaaMqx6/iNmvXjrftA21yI9Yq9T3Yip/33ksWdy3c7IGe+PI0WYExvJ9c/lBmMd6SGu8mKYF/pMxVOATbR5+xtU9EPvTKfOM7TmG9K0faNj7RxdZdua6eui6PekC3iqcWyGt3EGe5j/do2IYobTVDKKhnMZnSgEOmx1rTBo2KKbY4mYB+RtNvMhRJW4StmcRz8tPcGwZbrgTCjL+D6d5oxRiiZo29zSKfQ/yxmLwBPZi4v6LgZGpCMGcUqSSH96k7eBtSoifW31yPc40wPMNsgRBozhjEagoHnrFGA8uxx1turvhD+04CaMdCQGjZ6icqM9PZrL+N0vjxFN7feMPCHySBixzE/k0gwDf7hpMwZnkWoBwF16bK8pNYxmME9DrFDMG1ZVELOxH1PqMzOqDTB0uv/9si0Y/5PfxIk1H0BbpxVOacW9gDfuwaxVnRYlTl6JDYgDqDuXSAokO8ldVhABFE5RQdKb1J4nx2I7VDmS811kQTLZlZZ6jdvLDKKVq/yvnk4j2rXW6cC1j8cJ140GxQXkK1EYNUV80o8Zix7dY7gJMoKBsCA9hXFD9nexFfhUNHwcjYNhR20syWFFJehOjNJIcRPibYc15Zz5AqnBLYgnqo78xogpUJYMsClJ4ZMBWfGSuoWWio9OqVU3LHKfcvBEU6TD3xWTr225Cw6UVNB8c2OqwIA7Q6a+t/mvH1EKysRXxsk8iOTZ6b0PM66iEtEt9tDBAPzCWrAY4c0tCHRFXyq1UuK7lRWVaEnrNlpoFW08Q3zpt1nUR/chEBfQNOITrI8/imqT+CMvM+0hhtK6aokFYHxdOXeFRDOoGeH0/qfVCAnxv/XLz3ZS1+qeivmj6QmjR+3sKYPAMRv9H+YzvZ+ujz2VW59RyMTJaZswXzBmdwYfL8dSxo7tgxp1B0kJiKMfPaTWty3zszKcCc72NXo+hhErdqfA03QPD/w0kYChY+rX321xwuVFltMhDKwG/b4N9mDi5be+8lpEMlQsguMMFUPwJRtiHK+COc2fvo9hujDwtxhvv9KHE3rouXBsqhqVzezXbnSCJRRQg++FNw0pApZIaiBJsa/oIG5PtnyPFCNSfIo9ua1/gp2lt+Y5ipU8AXJTf2RbmbykJqlGUUo45aqA3kHtH++PNVDlbJAwX29qRziiS1OtvUQw4ld30U5+phiaaVP/Zq9GOs0KT0bernuZcmtau2dv27jESU3l4ipL6yaBpqzRfwWluAJhVizirM9O6Ao87LEahalzvTjnml95d+SCjmf0G7HMSGPY3KMiZUoyeOZ94XSMYssRKNnkx3mzxJjPuH7NCW/x0HsUxFLsnDYBl0xtYGKYpIAJoMIzCndZaD3FtRj9AwzhDNe0bsI/BwQ3GizTyr1TGCdXKCy+NaIB+5/E5vfp+1Atqey0P8Ak7ehDSNvs0NwAItMjNWrnKEIBVg7VYs73s8nuf2rXF4uZAbXAoSuljxhpe63JM7roasaBHvCA11M2/rw+vvLgBuLUjdGSbjz245MQBTwuruVCg27RyNT8kyCtDzqJeXC5z1WSLGUUxmd2YN9tJ6/Iasx44EILMV6qJbkfJq2VmcKO/w40/KM8VqOHuZLTQIf8jGWgn6bwgady20kUobrKVMR5/vX2CH8yBxBXtjCmfPede3G74VSjUB3afEelgGPcDQlLia1r0M1Fh9eMQUyQm1zUht6iHGBBfhA0wh3fF2wRVDrMDe0+0nNqknX3VT1GrKm3sZ83xTirO5NNmKXt1SCvF9hpueC718ZnJvfF8o0n29mep33pAy62WtTkR+aMcBEsaDNGqbXfXB6SSg6eDcpc0AaUkawDlnnbPOm3/HVPjpNVngtEy94+cVBDJ9c8ceeBVGj6gcKE2RZYKRLAzxGshUKstkT4aO8i28lAH2rPazurAlVOuVkcJOfXKMMREeoU468NNBQti1Iom7il+PAxKMgRmvgJ24aV+5kSOm6oFyATQE/RAhp1TXP2jWfDhgGlXptbU+Qf11TTOCKYfTmiSVBSwwLZuCxUhEH9NxVCWBHi+OTeuecoa+L6Ma+AZhfFwi9sKOOUsQG0BT9ZApCeg6o4m0XhqXu34iYHlNxowbrnkXKrN7mPzilOALDqGnJSX4hLsSHKT4INypfPH9qanWiFAqnmJ3/E968Jk5ZSa7hRbm4OUL1W0tpfYlsHDeVnANkwLsWBd3PLIe48S/qhzNzmDgFF1Py8fHc5Jp769j2WlTgoponm/1y0YsyBI/ywxaIy1y6fVjKqJC5HqQVjkLs+SrwIFDFUEQ1dzTAbhd5+rEtvz+jgpTGvFpE/7FHohc3iRLx8F6CcVXffFFDZmRcs0VPqmOyJwdVd0x0NECEoTHBvYqrpV3+j+RAkibPFt+7ultMeBxwZY0NQ47GJafHRAg6Y+RiOw2pPUqVRjeiP9lUuAJfH5ACz7iFZ1cIr4zMt9ZSdrdb7kjw/D3JBtVPk95Y4J/iMef6MFf/qMmbf3JhC16y6BnOr0T7rw66NlaD4zpR8jIOHFErzAhJltsxcHmcHA9GoAEAjq76dHMQ6XrJfC5zKlwLLlmndHniu1CKDCQ4PXqqhMn8Fi37/tMV9fhJ3OXliNa3ZV9gBDYZ9M9MYwGE/j5cIK/tpIK1PFdhX6rI9e+MS2rjVuWh5/2vFVrI3WvzFuOVNywdB4JC137UEqxYIaZW7Q1MI/ZrhkLuAN1UUBaEzFopW4Mc3MTK2uSmTa4a8rinCM2ZbWCQQjgGgyhkN0bnrXlVtHeznx/HTGFQQtArTVtVygtTg6+GpvDEQgl2PM4eU0GOe8NuyTPROjOGNh96apt3l+9Egxu6JEY8yl0Wq97Y2GDmk16/Ki0SH/OwA34vSHFxsdFHUkHWHuAqI9V0JL8yZoNW0YASL+w26rbf2Ldm5GHq8XKyIyPoDeLpdgGT32Mf1XqKOFlj/DBbCfQx5ZFC/ifuclNbJa4nGorT/zaiFNoj1AZWBAzik56ysnfp3dGj6XEfJfcftQ+jEeXXwyAPD7XvVI/uXQ7rdKW+ZC3lzKQMvVCQDCn3QRKfQADXkXNFK66y/RLZiPg9aFBKLA/9dDIBa1mLsRgk0pQyqCCfrrL5Tur0eKPM/JFAg5wqYtpHl0wc2zAul8hDfIQI8UEFaDaySgOcSmD9hVJ1d9Ju6Q6Jlu8xwvorK/UeYQDjZ/vkzzzxbvJxILXsLqcnInl7WTswak5kRwvmg8BKKkxo8YQvTp9c1bIwtH3aKLSKTAYDNqSQPv3YZVthoOxfNs3EQRJn9VKa0uZ19E2nHl5FnbrUzl3thPnl662rhNbKBRRWfrOuiLwKx0MzsCdqIoQNhJcFjUZh5KRjWzRVPeIdoiTc4un9yzjbcFu1/bdt7Dd7q4vp9CJlYb8kFHY0KZH2/AF7LLGUYLuL68uh4kKdbw3k83zMwQO3MFRiV4cm7uCNsz0JZmFmYh/+uk0ZFY7CMX+ZkAEpoiT3tLGOVr9ILS8n1dowYK0+PF6t+QWBICSrvkjYRTPEKrQIEsmUVX893EvbQfSMX1h2W7U1XXwcbP6rV1pWhPtmoX6HfKREigcgRvf3EeUOQ0pOMQhVo+lXmhRkcHqsDVF5J6bf0xZ0QTgDEEznQVb/7TUWuhUzTH+yPme9yKYzu7NWPwyoTXA8aNlcxuXLiGHytrfxS5tjcdj2YpmWed2a/uoHeTyBrIMwnwNE/39vsEeOK4CFmdRXoFimwIBhyRJ1QZtdxBimAwCq1xkfF+zZuEOgCsHZRBFP+0gvHBHJg29HoM0/A3p8RrucfFXzylTzr26zUFmUezCi1kIHF/3se+SjhV1D2lhHdVp4hAY9O6AeBFBmwfWByV2vr23g3UJBB22YqKoJG6tA+2QHax2IXY4c7CHdzxVdUZCXUlEGJsxOuhU8NgLEvk//U0+AkflbRxxTFHQnMRnXAJouv81utGIYGIkHdCIz7eSVJMV+YWLsFU76A23y6d7u2L+zvd8Tb3kxYaA35U9kNZbbd4NeGHR6rCnYnx9ufaxo8LDSAqWsH8GRkfxqtND7VNQMK4Fh/iTLXV6aMf/v0XH3EecB99f39Mf6uWhUyNPQlIMHhG30ZzHnXw32HGWgkhkyITbSg9V1FERN7ohQW8A9tFv8OuNRZps1es95IGw1pisq42NF9CCXKBY2t5i/VS06sB5h+tkYSf5VGkq3mb6rO/AZLxqDNNSJ7KCszpyYXzOu+4yhTwy4k9A2a47CwiTzLGgRyQb06tQNY2AEpoVVNuIVygbv3e9CcZjv6ErSAfGJNuBqhHG6Kphor4JZrJmTEq0lWunte3KAXpRHjr1QwP9vym8HiMN2HKuJjFJw5+ziwZtrBhl2hk6IYac3RFXsDvn/oyBipd2mBa3Rez4l1x+vc8w8jEIYT5gDHSOyO7ufnLrGfrM3iKDAujCdFzJUshJgoCY/ryuLLieqmdWqDz2xH1fg/2t2mWzg0BViENG0bf7NdzG7qzH6y6xrHFv4uwvKqloEdyetwT2WgvcY6/U8CQIbbrEW1bYojYszxUQAnb527OsTSZMqDLxCEXoQ4/GeGceaLqw0EAHYplDC9pF3xNjXbAiW1VY6WKNFtl3Ml6/2qAL6GzPLYoMFWgR1v+fhnX6vlJWxrGt7VWiqpvWUKfzyssfud13LNxcwx4sJVz8ejK7jgv77Qo8CHm2pJgf4UWOFL+GybX55euGZeqDc6vYeDV/dzBD9phAvSE9xQqYGNXv/dEFxddPxtdHiDeFULEekiLa2svfD9qjqWOO9SA9UgIxb7ZORqZK5JWaiDjUg5tvC8EbLyX558cyChLgvliXcO/X9MdECYBpMWjyHBGIleEtTyczt3UjcBXJJroTRAVhWDPDppn+RJHuv5Cd7dccCbbOJO7EzoI4A+XyA/sYLoOxyDDVvI7oglQ9wQbyhiDZIy5KLJc75IKKwRqsllIS60gv5a53PuQ3UBnZIYCEGhiCCTLNAzqL7aZlmigdoHFfCnKrg7QDF/OP2YUH2NOMJa2mh1uutZgsqjqXIKqlURm7E998QOG4iwHd+576/UTHoa4UyzwN3jWoG+8Rt1lpuyqiRckEfr/vB3W0hrKHL+T+rcWwVtbc3dU4Rx5hsHoSJxOzTfnAyBAJStVRtm8qivv4LWBjyPe14bZ4+BYfPGiBNdT7m2d5M6c4CtiqNovfmdLTuAEQmZmdcFEPnT8cFSeDp/cuZw4D6c+n9knCFj4T3ukaI5cuIm09GzHti1B5zCr5mGukDRsjxDcAcd4OYjpLFmtaHJf47VQ4YgJbhdDyl6BAKrCqk3nHbUTnMDS/1mChN/NSqmznLzYns7tlrm6Nwp+xSz+X+Hm3FnPd40zDpiCpIGoEq30DT7JITtr25lIy/po7lqbrEBZuhuNL8vz/k2hh8d/bYxjCbJaYBASN7maVeg/wjdrVPJm5oW3ODnsoOw9pT4XQoTVp7YdfFuKGIEnphrIjCMzO8vIvwAAnHZlQ6qU+FMTjuqBgaiD+U/4RJCtrvgcUsQtW1+xeilQk4nwOuJ9dd0mtSW+2YX27tF2RrTX7Wye8GZfUBfUzAOOj/NbZYdce/LWClXdTUFpyHMH673BhCZVfFpdwKifOnDk96rclbzRJfBT7lzIYqdSyZxk21hi3j/iu9uZimdops2rzxlvqYd2PYOfRMfAM2zzqICyGF6nsh9belAWjnHce4hkGcPY0p1xFoIN+RJOUflg6k86nPpLeCuSWDkBdq87uv+ANQHhOOVqpZZNLvfsSlvdU0dP79iVGgbqZ06SQnz7Hdd0elReNH8cMm17OUHhbLlNCWBsOi4EtSgBIaCXVHo+59K1zhsTN6xScR1A/9UDl6ToSOfutFHR3dGSriRUnpYloGzyB74ozqPKVMrA9YdVV1cCTzVvGLJWpfHGPkCy0DxTsBNK0MYxWXDFzTKO3ZwUZlHZj20UEqHe3O6tg2AgME72UFOT9aPZ/errTwDVKip8OLh+9O2ZHh56oN27fLEDBqBTGiLBdfmkxbeskBq5iY38ZoCoGp7Zlirkxk7IDcKxnh2bf4WG37FBgkYtCVN7AR8h8lOsvwLurXX9mvczxW3kO8usWT6SBOH3rwk1qZBD2oJHWJIHnDKVljh9lnmNdMW7DY9m/3rqbSU1X/qmgUDLcScbWQboRIJiSL9ruDLFOdi65Qc6pn54Utr2YOQpqm3Va6SNgQIytMC+DsB9MubUqJe2wMKruIVQ0/A6XkC6S6benIZmuoSyWm2fKolo7iWLcw0aQG9qAY8hTXWzd5DhR0IglH12+KwiQSzFBeKhmQ6OfdtZYBlU7TA2pcdGCdXqoadOOko8T8y5qwGwHZsxdgGhhEqgXx0tm52V1/T93rn97CbPpbIBLDkcmwHL9Sb3r9nd1dXJ8VTNKQMrFfGXrmWk/Q3yToZXDyb07bxCInVMF8PMP/4/o4sKPM5rp5uahwxfdOVDsI9Npyzv+fdtLf87DwSeszdGmVPElV8QFF8F8rGxC1BBUqYoIAON9Rkb0pvmNJU1QunkYJHwB1Qf2F0kIF4RTcZzUv8txKsMmNNsTOyk/YQCAm4OdHUjYOh2Iw/Cp39e8vOtB7rl8+/hyLhDaONbIf2hqHI31CHSewz0B5iZYEp8KXdnX6nH9JjrRfGTWKCC0gtYbquHDbNICzwf6QjHB45+k3x4RCUxORGbZ7dozhUrSWQ4/pyM4WSNLUaxi6Kr6ThwdfARDPrc7CZZJlcCf2dBsFGfMMq4kCtWwbMWQnAikrP9epFgicqaRSvyD6tRALfEsiMamc7qGL8IAA/RwBLrADGtXRjBCNhPo/XjNyi15UD/RxZqnY0WUzRccpkoI1Y9m7q4XDrU+kBhcRDwFd1dr5UimjTQ5YBNfOWZm7fQqvNSp3Ke68cKr9coPSRfFME8iJU7murKo5Y7Wc8Hqdm0qXb02FI64e5BudV1fCoRsBusMlhaFAsGkZr3hP+o+0c4/chRVTX/CYN0eQI2FrYCatrV9jLs5U+M2qw/L27IHdAMDUyeyZBqSM15S5LuPQoUouzvL1Q/wE+pDGFdjaqmnsaACkryWJFEvMrf40Ofu9ts8x9J/vBirnWDJJa6N3OualPCrhL8atPPtuq0rUgGAk0KzX7Lv7DLtbH3sQ89Xk6+rImJZO2s3J/RKFafY5fHN7tTsSOEGMtocrp2JzuqqxsoVmS4CY/nZYZUTsnNeLeBEuntE/xTcYyu3pC0UQDaP1o77Re1PHmjLB6wDGMPBnMC+V0+dEa7xq4LhjnR1t1pF/iKfLsQ2xxGeySQcJNb1veHgeRWiXRimiLuKl23l2oQzTqYfGAtw5u8+nyksWWY4fyQBFZ2DGKY7YVa/7/42B+PsYJkv7Cnqxfig6L/p0Gom2pRlQAllbkCSXbcWJxrw9yTYPW9DF6nlBd94K/xdyOknqY++bRKnENbYKf9uCr+v990BZuew1LqGyp1n3HMe/V1SXa0JP8QQPjx/w6Zt61hZFfu0PTMWiFxFXylu2Xa73Q6iN20DR+RYWCYQzpmUFOddl+fXxzgQA1ADpAjyqpg0vxQjWUU1izYkKZvxFlrhcqTBlbwgHaI2ciVZJxoJ3513RpGkyskPPebqzs2vlPL2d/nGOn03hq+iNxTDb+iLVTxO3fVxV1qV1SLC+aYIe918c7fF5EzaaOIKVqo70Pa3njEMFwI2IQWKydtrV3121YQC+h0n3C9TaJaxr2leQJfLE/WkH7k8qqUnsr1V8eiPNYewHFoZpvy3ok553HCWLSZUrFNPkrjU/3AS+W08BReYDGVQzDg4eZPYwCmNSb4j31wzegAzO9YouZuikHz1VGz+g0qPKBcPjTvYtM0BFj+Ox/rGdtLk0dNXkLfBGAhlSz1kLaEcox4zlKzcSUPpVQ2u8sPp44B+H5aRzH3om5OHoCUcDADbHD/Cs1dFXN/bydIklSH3BoZ41zuAiGrNvGdSGlcJKeoHPsxQIvSFqnaN6pO9VObYkzGVRoZyaPxu5f3RFIvnDIybqJbU+MmhYAywHLXNOfxjzbh7N8IC03TenmCicLAO85xOSBNhYpGT61FVhjFaCbh9TWs/AATaR+g3pbyaxxjzIG2SvvepbXKi44AR/Ym3FqGsvHG7KtrxpctfTgsv01z4d8FEpqT8AL1I/noqEANcb6nEJUYnKlKZdXYbU2Q4JcFN3jg24EnMsBBaOSxZANTClPYWO2YF8QjkSgtkEpiwRkYI3CF/S1PG9+a0nz1iNIRRb6AJ9zjNDBAloXYadDKIBhQJSzo8lz7ngG8xV7CMeeO3lKBKj0njPi+4wdHWTc0/hgHAm+yThEPMdlUeIZWDBeGvhVXF9b2bxbfF+2i3hOz81i5uf5/m3vCilVVXDDFnECOTAi4SN0lV8jXy0n06QCH187BObk4pOkkRffoWR41D1e4XDrPpokH5gHhLFtT4qjHitwWz/EfxrwNSHaYktnLKJXmmC/WfwvSXBpKMUt4lw3QnFT1YR/svW29p+M/MKHNQNVwUSIKnjphRoFRkTe005ye5RC4mopIet+6Jmini7o9fXPqLKI7LskaKPCnD/V5kap/OsSIeDF9cx0FZnuax8MfG2xTksJgrDw50pgoJAEpyNtYTTWbKW7u3xzYn1TltVqDVzaYlZEpv/3RGozuYJAlbk/S8los7dF1cMhfvBubGrXD45UxMvP90udKq03isSWr7PqYH6/I82GBi2PALgLuOU5GhsCmtvhlFTdTxt9f0C9mvGE0K7tVC46vRaTRrej90EDbnJnwzYsRlcmewd6/rIH+m1uklCPLo2sWrysJ/PYbwXBnJwucXCq8oRp6qoC/37GTXaqYAc5Sn6XNa3vnoAAIvY+L/xUqpHC0mPUgSXWDxWr3UzmzHIcmjzuDIX7OKOZbv1L9rEzt8YUip+1FbKCoDJCzxtAToEgrIbE9Zg1VZnFfdIfe1NdMnB9rSrUDUvsL/vcq+P46Wx+VUG+Jm8b3PeH9y3ssy8Dnw/VynsZlmqxKtnefBjC87epQGZ3twjgMeB9vPui1Chbg+nLTBzCaFxOSH/NX0Eh9iI472zPQxwk0u28ZDEFJ8TbVZBBHot7MhYnDXihieqn4lrnVXZPfxD6uN1s2oYbKxRPK+5pPuQzfrouO0HEZcYJZsdl3youilvDPO5n6zwJMA3t4FQ2S03/o1StOtnb4JxfIJu+e4kaflH3bTkXcGe59p4nzqic5TJemCJsp9kWKx3WM2NHpJQnLQjBrhe4nDsFAJt6zRkR+BYWFmfzkfBBBFjrLrZmZxjhAop0WQ3dqZ+WGE6xl/pelKEE3Pk4yti9n/uvHdsp6h6VhBUQ7Xz9X0BFYmUwLY6rOJymYOycHHyxX5iTiHKD+qQHf/gwv4EqIAzr3VKGC0wYCTQsQNuf3K8orcYnmT47vFlOJ95EzfIMvTaXQNhOC9VvB5JNGSbbA4/VsCrD8qoTK0iQeKuFl3J9Yhfr2btBX/f4A0UyfYHNSz3ta+6QAe6O97Ne6ORcuwFHnVYuiyidSHKSAJn0UrLwIEwOk70tYSafIEaX5KT/1aT3KXNFbl5UyzSEAFBMD/CCPzM9imej/VxXQdY9BHTLp0Z8zoTOI0wjPDbVVf9yiE0si5t5UUFOXgcqvvkxYpxD+TT6Pkn4HceY9WrwbbypLzoWm2QR3cl3If+XqFsaANChpAIxtWnchMa3wYICXNl6SIUPgdffF3+EoVfp/HfpfBHcPiHIPPNLmZ/i7B6HGpZUycV3gnorIVivYZsaDTcDX+BIuJk8vt3VUkIuoyi93JWpE1j03JoB10PTzh2F+YhTmvYVjZ1yK7URrTV34Keqgdbi1G9Lo5urqD6YnRByZwsVHMI68Q12/gF4oxChR0QBPcZRHVYQ3YRKD8ZwfbkEtDHWbKBLIWJ0pTuhfIoXamdfdjPRrUIY1+ZH26Bws9IZJlQXzhHLtLNIxB5J5eyvQRSgQOPiV6lDzHZbeDkciay1oJd7pn9vz4zwPnohHus193QNfeVpY6oUjHYzAIJUGqNLVOXbY8JppoREG2uo3vK+pDI55RAa/Uf7747fqpupRxhYw32G94S6CtG5+rVInikmv4ArQ63JXH/DOvsqcqJZU6JLUN/3GGj37YTb6bdbi0Fj+NswEf9uMlueqfasbe2G7oaKuVuHW7k/YgrxWXsTILL3N/sd64g7fuxFimqTj8/akjv7gbDQX2TjBMcTb27FFG5grYO1IVGqnRJbWl+NoF6Aek3UwMcVuFrlUN4DCjEgVPYKSbZNC4oVcVWxS0h7+QKLpNiqT9RsjnsgYsKP9+FgvE9QYM34AgnVQcUOfXa+3yIauN/1QL1v+bc3iNcGKs5QAlNWU22E0WI+t0BapQZ0D/1vxgihHfVE5Xbni1mVV6MvTwkGF0V9IEAJ6Ylwx9ibUEiw0FOK45Lov1jrEqEcCg4+zYKL/OaFxuEwpBfgTXY+jzfy9NV9ArmK82AxABvg1oCe3BEcpEzAl6M+TZVjECFLG2xLFur3XvdV56OJlBSIKs+IyYnTST3otnvKhDYsutjMFx+DT4LUciFPRdLqDmpn8BqSxynAsQ+PM+0rXXoY4GPWcTaeEC0PUBdztcHhC9GGY9hRaYuRrbRvBpWIxieHq0zFJ4GXHgCEAEVSYWJwBYtKDN0Nt10brwB0jQsYTpZ/FDgI2VxOegjA5XWBmYqJaNAXuukGdX31lruJT6x6xzAx13suYiyGwlQwGMJFD2n7virZ4GC08lc5T4Z3eesZ0gonXL+myfXt2FBO+i5GPtsdlJzK4uXAClU8zdEev16HGhiQnbGVyhQ9V5Jq5DCKp0AfaWci2sO/6JAuK/uxqL+7UdadrCogXVgY+ZB4AkPYybjT5srsQWaLrmcK99aq+Cx+Qgp7qOOON+I4ZdYC3s8hHUQqo15R8DoKKIl96ATC0y+UNGHb7QIvzRIEZeYj9RChDj8M7mEHS9MB9pRM49BkAi1njDTDY6cIEWMrGReeiq6P6kmSnfj0zJVSRQGzzL0Yimb8QPYIzCkNZLemCGKEZG8FWfSmgLxFIXwNSn+3Hq8go5Qk+INr6Fsdi9g9OObotKHA5ywQ3nYeEebFSQ9i5hO6fJMuLAyFtIc4EGBHIiE4NHn2TYpQA8I+H7RDwl9FxhpJAgmU8nXyM8pq/d+KWBkPJFA0ltn7BsYx2z/Abv7119YbmBNvCsQ+hoBsSPVIlF18Y4T+d33bt3cIQP0u0MI+2/vw8YWXKCNX58JxeVjM5HyfaaTOfjXOJKfoWzmknkfqPwoKXfHd8BeUZh8nauh4Phe69WYMTJHo57uoxT6ty0JcsUWEpzgUI5mgzO4voUUMdl50X+urGkO1eSqb5+Tj/gBsawEuGxqop8az+e+ZGSpNRSxXxBgjZKJ5o1c6KaCJmfNUmt2e/ilXFCsu636jfXU1uoAnuOnLNHzXWEXu3qbDo5JD+FZ3AreMF0+9ymVdOHOweRp3vwTNTxdItpISglbehh/HkcwZsoALGQKs1B1TJOuNC/6386m5L7tVjNYUN16OglnTkNfd7P/PWJvTND1OXgn19RuyIG67cr0/Z3a44VVVeAmgO2DywCBdFphadzFqManWDg3im1wbCtT9aabrv5tZjaNB8Axgu2yhuPJodEl6ouDf9r1FbIm4AxiIYHc2eKcdcXmaOKObu0uWx9oXfVKGB7wz4N4hwWPC1MoUD7xBtEsTrUjUVstDBcIgQdqJFmuismaXDyHbGrsDsPwq7fvW89rBAwAFFl+X4c43aFY8QdC9Uiwn/w8jTM/AEJOsbase3LTmKH12U1qMuzN0jd7URhhUhoz3wTDKstmiU7ybwvj06TX9C01pBZ7o2mjVEx70QdaRs3DFC/tVnBGuWLcr/UI/r/mR003koQGYlX67oKPcgLOdYmr02RMvhlsdqcNimkrRts9KDPcH5kCq3FaTTBHSwM7DKosPNfLpemIKG6oi7Mm1dNCj/bvIUe48mWVIsmFrVB/kTMW2SS6swO1WKjRSfYgPO1ZXmQeC0u+GkmbuCuCL78gK3Ac4Y59nnZonoKOMt5bp7i9atiiuUolSDA0q4+uA7d33HKRuokxTfUxkg8nDP6cpgqRi2P4RXCDEPxqCZ9M9W3M5ng+nnDMZOmWhySvtBDVMPSC7bcxIWU3qk2S8Cnm8nSL33RfMJ+RuiMRDtGJx6l3170dHfegAOke0cwT1z3i13wt7yo34PTCcRvcXsAXFjNb1fpeljcQbSjmWj9mlMSZLXe8BMTerF98kF9o6uc25/DqyqoMA8MDPkR7w/1mQOLcqX969DIn/hFWHlAQ5g13SSESFsPcvMfyPG8FFaX272I90QQUv8HyO0d206i2vl9tXFi/y1hMhlUZy/sMAWhPE9utNSk0RoqZqfkHFvwsPVW8eKY3CdrhPscjFQ1Rx6sPk+hJS5BQR5LB8hYRoErgTuZUy+0oAr/KDW7uYYN/NsRIiVjC2LJ81Au29N5WKjSMZxv0oSp7v05FLv9mIfeAocPkMRydWRVSdWo29hCLeE0Q/aBgMOFOs+N3Ywsg+TEetMGiLpNuVLNHPuyjUDxvB9f6SlVB7IGKmTtjvDqUXjMn7Uskkiquvr6LIaudK+zk7YPOCwxf1bx6S29ONO8p+WdtUFWMK8tXrcQ7lG6Nk3aECYR0XrMThokSxReBZyXoD9f/SJ31qna9Irp4AglFgT0hSivOTKUP86J4e3RATWUftJfsTlsObd7SHlqoGKf1Whb1wNa7ZJSTLAvw8LVQlsTIDRjfs+LvyJUp/l97iuHFBlBJ/sToeAPaWxfRHvwkkDP0YNAqfa+8rAVtX3LteR/437Be2Dh1sOAwH+y2p3H8lwH8MhikSwQrnuhrXLb+93YJIsI6aYZpkUW0cOmsijblV16mVEInsOomkiYI4ZExN+yK6oKgfHqnKmigS6Y7TQYY5DifbY9E7BJkp4Bm3rctqiYgibl7fOCpxT4INNJUBp+BYO0lGaGZC1H5ybdC8RxdSx14TrMJwV/k58E91IZ8MC/Ds8jSZHp0dgyMZetyvc+l13fw+Kj9sx0eFw/P7ROZR5t+b5KY6S9wFHHCReoHzDABePo8jLwzjeLiS3fdk5Eqtp1SUDSKZ1Ii81q8VjjKTBqHLJeDP9nFFkIhbY8C71wAU7MPb3sShnD9TX6QjLE+OLd85ntm1DGd7LNMN5YB4p8FgcsDOziz0KuuKBOg/nzOz1dw9Bz0ICD8TQDQYRLJgazOPLT95v+RZfPB7gK9KmJAa9wfhnUOCFCChnjSvkWQWKwBiHGuj0kc0X0UWkkeWgjJeL2fmvnBA52w+BER+Vj05FfNJnlG6zjqkoC4WlUzMiF9woWoymCsFBQPVDdZY4nqkWfElH4YLASYxuaDDn8gh5+Zpr/tUXCbhVrevjX/WYIuB2jLOV+A7PZv3iU/lvvXpNIAa9mk+C+C3XVXPXmo/Afi4gC5tVwGOXN8OVjzxpIZF8UiN4kiF/RVmLuxPwP4Vd/YGgAVbX3VMOCrqaAMZ8rnU7+F9BK6wsBSerWy9aa7kWQ9Ht2RFFrXN7mbEgogOtGwdlmbNK0cn+X8Ftv21olaUnDB7ZXBbuhStT756G7yoIdhQ4XMVgKcsFzcG40MXNlzx6htnCZpI/8WYVnSnkEwQt3/+03adsveSJH1DOZanvwCbLKureUXrkRuiSpIhY8uOhdInkcQk0QN6DJ7iqrDItMaNn24FYLQqdFNVXvu6XVYwwW+mGtxtr0I5BfGJTlpyk9EMMD8o6lbohN8Vtbdu8w4C2zkZsC3Jd3cONJ7AXjRj1vtsmYJ90iTMw9qhs7Yz50Qyt5gOQ91oeZsmmCVXF5YQlSlH8ZTxLSWmeZeOO0IzbNprezfOuvOFqSbDhWFtzhP/oQWTqdZ60THeY7tjFIY+qEJsFUEzpDenrVBRL6KMhjdANZLr/J60nF18P0VyFcHCvlUu8C8wfY6JCHYES5sxt8st//5DVdRIuJtwhkNoC0MxIGa9wet/5xKf1VslJvGNEe9FTRGfLGqHFCSnRlCM5/0Kow5FwSvvEfjleHWbaREAyuiXi5u2Zjovx3vGBQXGXxjZ/w0Kr0fc1io59DqEiIX/+hdcYiNKmlPaoCr+xGxVUPqtXI+hugA0nNLzAi2onq5r0D8gxQJ86w/6QXUgIZvFD+mBd2Yv1yict+ItE217W9laUYXQliSaln0CYTfjyAOpM5ICDFDl0kAQmZV0tDuFmqiXgxIPk8jk64VhjWbHd0iOc2FXFPySGFC9olVDuW6yYE4MD+OZdhb7ihPYQfXqZU/Ej85B+Q+ih0TUwWxVoZbl1F3wPKt3TPhCfRy32WQrql5gGU6rUz0TwdW4hySAlu+18/LLdHCJzlc8Zly7nbLCSUO8+tAY8PI8ajZkKHAyWCkvAoxsMZcs1P3HaCI/57iL03pm+KwX9E56FyUgI7c/7CmmR+vkH1n9UHQHJHq9Bjkdb72G2GU+gxA/O+G67rSGtIlAAb7c7g8aZUY/pgHuG07kMCvKPSyv8lCWiaGb1cj4+MnDRBKE9EAD3K293mQOmLyxVwXeBs0hbfh0HxtEqkb+1hC9p47/LpzVoHX4JR0ADMGKdLTCaRvWytHdt74a1Kxno+bKOJRdyVh9GfFsJIulpVxoo0lbnQiB0DHMZRhDfeYZu7xvb8nf4948h5aN/1x2dIuC83ks9soMka24Nd18YdM7+vS/LePgh6GzDIceCCXqqGvmBTChMg1MrT3sgyKlcq7tlvklu/5BuqqI0GS9adn3HHgJjwhdasTtZ7UcafbFFoaVaj9H1vEf67QknXGOC/SicnkO+dfJ7mOFNCrUiI0fZnr5H3gH5t3uHE3OJ0/qmWA6gFlgrGunjRasfUZYwC+y9zDbdjaSv6wkRlJyscKxuLOAGy34ogRKcF+6H0EXLQVoUR+lu6yh05TyuNEXtGDdKOLrr4xphyrTVfWaDZH3oJKBoK5aGHhU7DZsMmYYqYOB214hztfWCrJo0f8pnXMU6invY5o0ouRrrBkov8K+BlyEw8yVOHmFlxB3SRUIuvtf6dpb+A6+LiovLAoEaDHlRoEpIrUdqk0Q9uKTbfkSCsN26oAPHdrZHcXE77QqDRllpa0Sjw1qm6vQtq3e8hitNiepNF86lAChLBJyGcnz2ko0WuT7BzRXoq2uRg67wByg/hxXD9dT4M3SEmhmt19faJgtivZjiXGU3LQCDX3twbF/QuTPfAdTEwlwvUaqr8PJ1z/FGV4KQj6/FPJJBBATqM4i3qCBBGh7bXJ8TojGJOjK8xmJd6GUofqb+8HXrwE+9EV3ZOPbPQJ9swg8vZxoJHCOQ1fOLFi7Vs7ztfA2i+ykMcARDPJiLZDkIdwFyRurJRIRakNo4fHTc6NfgFAlwzFSOF3suNkCWs0awmjJkyNXdEIKq3sT5AsMGNaXRgZIJE3fZoHQ1pVdUyMtV7GJ91MEK4uqg+VRjopYTbPIbbeulq2njZ/TSzzZThUg0B8Q09hxlLBNOi6tctF5UNZSNfmoN0Yi7sbroFlgrdGnHdu4/JjbeMAdaCCY02IKyWRzFyqYMXbjBi9fWCyRt7qDQveoZ/WDL57Dh2z+PkQfxUQ/zWryQS5Gx0l8cZ0sdiUmndtsjDEw6XEkZt4i7pekGltwL6X9H0k3GGT4U+RLi1+6FjJNugZCJwCQXgwOurX7/B1D6JJQFg50Waj2ipwDJcaW+fzLuF+byzfVI2Q5GevA0qrEh1HspID8bPgt9EP+BS/iocPLkJX52wAl951SJd1Ne/oGAFUv5C3HOqtcWQLh/cmApRGtPcw6Wkapwpo8hGwsKDYHBr54tUBroqe6qCg7xenyoYIq0D/S8c8XmIFJ/I3AE5GcRZUsBLSTEIVarvXvyAyJQeBWPRsvE2tTZtMGuxS+20Rqxy232DG7lmgrjLeyY25t+evmDtlS6y2roI+aEoBuGeycqPaoIjDBdd3UnEFNU5U4nkoPbJjMBS9JgEPuLnX7UAKezEb7vUbl1Cj/5TwSXjgGYKpgODs2hA7SvJ1DSuftB29WG6pEqjt4mKHw/cOs1X8PnpEQ6XUIeHSZkM0w8UCWrHJxVFtck/Xcsg3dtk1crzAoVzwO1Grjg731jVNNJrQxk3rV4WdBBfpHCwG7Kk0d4sAyLrxDSOiio6aAnghCvsWRNV0Mz40Fzb/3OzExlNHEwA9YnCZi4nuwbDJiO714okB8QbiRMJRkPCfdU/r0NzytET8xtpI7s5E3Ol8yUrWJj1DNM7gGsxeUG7dD7wGOpA7IYwqWG31525E0y8ZIytZknSLcN35uDHJ8Eym6lqdxRdg/uHLpxUk7SL6Dn+TIe+eii3ubEj90lVL4c2joA5puYslDoTaWrsfEHJ7iyrKGa7g5DHWxkcB995Zk5coL9hSowZASKdWMpQ0HR2Dv/ZnDkO523WXlF0F35vTkIxtjjn48CUXMfzGjmEhKOWACYonLbikFqpvQ/VM0XTPSbmQg7LNw2FUN9itOTb4aOaCb74LC88F++KJ4azDVYVpxXC35bfsqdgK2lngxfFqhMOGEYe73c8l9Ti5gli2PejI6Hm0y90SygCRfiI6fOa2qBoMKOnoLyW4M051d/uz/Q3vRIgo1P0Q+LmgPlLrKjxxWE4Bz8pS3H0OwC4Z93RPMcTCrhAWmxmwSWNNndKUdI+0Cbkfl5NFeccJxVvBNCDiocwbXMMekEFPuotzsvo9lngvUru3K8eFcopeLEGL3jR+UWaJHrk2TrBBkQ0LYWzBJhp+607Jupq/ElEu26yMPKXR6iXUkbPYK8X4grUI47PUy+1LtCHadoazQVT3YrnDkjVausHVJuhSkB8HGf8uvEfustVvOxc7yxkqMj/ThLtVCXKUFbo514Q88t2deE0aslFeC2QXc8dd5MfIrdvDwRXeYAidIUcj4VX5gt2Qcf/54oL6jplPcFRBMhLBc5d0GzkyG+TLqswZywo6duCrgEMf0KJL0FqUoAAsAxpznuCSr2YTMBXza60MnzBFouGOqECR4D2/6+fbtJOUWEuuf3i8zUQqdJVuQHbbOmTX/TWVw14Nbp5gzk3pi6SdGS56VW+/tf30XRCWgIUvvxcIdWWU41PDSyKrTiGhnuMK3H/b4dEm7DaK2lAm82X+Kgodm1uebg4E0ZvcN/xFx28XHAv3hFd0JqpIyLXcLa+ZJMF3cOJqINMgJ/uf1ZZBCHNWbY7AHPm+caqMzXDesYXx1J6lzFEaVuOpTSO2alVO+QxSTNsspNCdV9P4VrdtmCt8uthsLAkDlJuOdxKHzMNcg0X/f+pHKZSCrWEfku9D65SwSVBkTi2pwsK938lkTrSxPJylUfTwMP2x0FSfI2/nVVBJiZlB5mW2JCdW0/gGxtTCfxdIIzg2FvW+mLs0WTZfazUrMbQFFuquta+Gb6Gb+2SPTAaoNXGJPh7K7ZL6VpUTrIhzizjFM0uQXa9r98cf5iVRYwd+rZOA6igLquS9HDW9PTCovyUpCMiaSBVGpaT42g+oRg189L/KBHkjs78sOXhPEq6GW4O9BRotmFpBJgW5MhszrALMyQ0UoXRu6PtzwxBM6fZfcUZiC1EToOB1DBnViKwFtCLUXiZWQqZubJvIniUFR0iltSENPRFEystHmLOyusYIsyFK37PGaY2bC6GuSkAKZ4uC6i+qmPeroh3Q1nygH8FXRZsrURAnxmupwMNuz0woWtbK+y5X5L3hypaAU3Hbhj0hJlJkkpZtplYAhNKuHByrdOn2A/+0Ls1kn++XZJoZfM//Ig0i3PR/d/08dGitolRuULJHrdZvVsGHSIj8XjQZqGKcMlI6C20OrU6wytTx5GuINb/6XglyLCLUAl9vPzIz6xay+tdR9FywQhTDedF/Y7JboQl7/RRSYk35ungaCIDTdh8OwqMJj/uFKrWYFRSJ9GZyU/trS3+R+1mV8M28KGNBv/xe/751MjEaC5bex/tcoO1IiM22vhOdFQe591EVGYw6NwJw2Sfk9nFnZFNGLEVncVbgH+7KE142Ekx/GcXUHq0AxwdfLx/cbRek2T/Vk4Q3vkYOSXmk6FqbuKddTv/z/Z5EF4LMV0OrJvIkepmPTpHX8PP1gEMn2nwsd6azE0ql2KO6nh1SN5UIFvdtJFuh6f2I2NsBkbG6lpQ+y+zUIGjn4KYqeSS5bMvk0rrADmR5HjxI9H6VH8GKWkThx38o3AzcMP08yelp4GZS1tJbiuXfLoOFjBoyFnf+0vOmXmzrbn+xBtIoWmBT1eP1E1tsJGOKLlLv42nMdd6glcxhx/NkK9tInZgYkrlz5q4ENQqbwgYAZe6a1fcKkPWXpqJLDMSlfFtc3f5E0kfYxbDYKY+rH0PZH2RPzrpOu6N7SaXrNoDPFw+iST6e6OeG10Hw4I6QzPPTY4yqFTP5/ec/wXu29bVhVcNgnYPddBo8dh0682XdpSMlLzJQez88fb56smkUlxIVpCBAojB/UlyTVtxEk6IDD91mVPrILdLHX5epz4QXUWx2VUOH2zpV2zZHIZZH+0RVupo13g9hirIzGobxfYTAm+no0p572sxAjUCgPiMC3Zz6Ks+qrWLilGMIhMYrdKk+r3H5PxyN81BPx7vErZwuSfCk3PptawcEvnDaP04XgbZ1udyCG45MUOzqdW0wBxj1MVyP06NU5n6ZBU626RFnO0qsCA3oCiTbTs+QAH3QOQ9sQDGqk8ylCzVpDSrhvctRwJBw2as924DZP8fhCTI1svc/c8+LJqsIfAR6ZdzIBGa/zhBTrDSZm+zlI4zHK0UZDLVW/DM0SXy05cfhtgdWIN2mXrSsDy45pDPwuOi4x5NJVAfLRkKAZCF08BS8uj4PfzX+slOb/sCmMgRt5VKIUdKxkkbTW6fzSwruemdIX+N/CPpkKr8TAg9/BpD4Up5thQWmO35GI3QFwZsz8yzHsqLc+ooQ1p6Uf31Cd03t6K1zk7yEet2EzcnZOOBliw5wZC7pBAVCZ31nKDWBRb3G58C35NZ87AAgQTLFF5XJ+VX4ADPVfrtIbB/YQf5ok76Te6Nybei+MPH3zo/3oG74+Y3J3ShYmigN4TvU9Jqurn9n9MslVyd/nil3pfRv3JElLKYTPe3n8sQl/W+pvwFayXEZSbiyEq0CKC7yQKER4dFkU9AciEMAAI1q6mbgQSc3uZEwaKTQvenTv7Cn1V0BFESuhCAImxmtCiSLtFHDwaoBXweoFp8h3lzMVYUatT34LuZ2Sfzjm62iC5loxdxydV2AdYLeX9tmmln0ineBqUXB5rXYchRxPWvZzGGQDhlX36k+qd9J32F1FAdWxrUUducpzEv8ePpEKXsLhGF++6g0Q2m2yADVX4IVxgol2XfiQiqqTqh8fmALto5VRrTfC9rXIAAJcOYV/xhLD6sBNevLASLGq1Ssq8FBHRdaR8PZ8jZkvleO8gXov9XEaG7Z0CXaiIuG/Y5PhvXFT0pDs+r4PaLi+c+xIhZX3e4sjDnmBzmy8t7eeGGPX6dQhzvTfV4qcQzXqytz10uc+WMX08Mnr2fIwaND97KbqXvX9DlH5DWptdFOMeXq5Fw4dhVd+VAWYi7N0g/4/0PI0KmYoupNbsL3jTUB7+hF3fkY5/8o09HBxJ+Y45hfElxpluO86Uwi4fQivFeKvSGIzLlALjjcuCkljFC+VbY/NRv00Z0Mv+GakDsOHedBez5WlNC2f3CpzHfU5avFpNBQsyPBnJPaUfLrMje9P3qhyNsoMNBptOPSauBK2zw5mvw97BV1+4UlgAaORB3lLW6O2VYkVTh1U3WvTmJcUwkOn5jJaKSrlDKd48XR+il5vmmYrn5pdrjMTNTYMrQKCBAGrOzlqTuuGDE71DFHOlBZegUiRDOejyv1rKwePFzqSXjsbmYz86HKu3IF1F45stD3yqRudxHwXUl5rIr67I6TRnrx0u+BlD2+wb3A/sIqgqGEVm2EM/MtGCQ+KlWxzhi/jTKnVXE+V3Yb3+ub3qEGnXmj0B/zvVmEYiw16mGYgq9gXw9bJirxOzmP2X5Dd1uDWd1oJcKjmzr4aEgTT6qQ5bd25Ry/TxxB3bU1moqHdM84naQ4M48q7z94kOh/5Zemxz3a5a3Sv8d3rBLnJY/QuWFzXnBBEOxYNlryJ03VKhvRYFqHKTiEZYUz74AHBisnwoJa3qZ917dis5C3ld9TUaEZjsVeIMZhOFBe++47d8P98O8fLhWZeMz2Ti9E2x/c7OfPPv3kTI7Aw6mPHAwmMGf1PgtQziz9Whw/9IPSHsdnvqO4SUI747u3jZpola/fhKMlDiIjNc2o0nYQNSNOvQZTqq9kjei3gLM/AwFD/jLaE96RZJxg0RhyAeNS5bd39DyYJyNAGwZe6HqnAZQMtXoditaYp03OOf/zwskxI2hWvkqGwQzKIhlkb2uZBJMYBfvo4juVEL1BoZWKXfngUCkCCLeXH7hIdnjC+yHBU2pGfkZS2Zka5VJNXwx+0wG4uZFOd1t1ftYfvHh1nR3ej7ZHjtAZb5ZWrqEuyYW5y/0GfALD8tJ5zTDzQNQiXQmFv4lNr3KAXJGkLmlvD3c1YjZ2ySaLmzGijr3lqpfK4nZxeV+K4KapskbI0qI5E+SusD4trwO0Q1gopVMQt0IuWs0F4mZf7xg5Ly24Nb4P1Kqy8mG8fwaYsB6CPvr8WYRWqjypmTTyKuou5wlSOUq2QRyVQoBiEGwzUSPHduCDhxVGsZZJUokE0fSfRKsHDMpDVfMcnbzyUVkeBRp9q770sP1UgWhP0Ym6abxDHA1q/MuUINeJbyINpZWkaK80kPVuDMSifMgWnp9Hu+7HsJEseNtNrPGWzSmclAL7bQhkdcjNKRustrL1/xSDNW1/QGG3J7OIX95UmwCNLweHK1PnJvry1bvrgHRqLRj4bs4wepeLZ5SsaoKpaX1O0M/47g9xvHMKvUSa81F2DbQKSMgQieFozYAKlmbKlQe95h19xTWVJl3mpT50rfTef1KyORxWxWgwtueCsEXGnfkyoHiLQA+toUmjuxbV1zjRDOc5Pgy4W9HfBKV3A3i65nVt2RIA00dtiVon1+JpYxTGxMb/PtzR1Q8yB9huLYDMToKCM8XC+lWd9JSG9AuA8vupJsgYat15K0/1/eeToSlLQZuE4qD7Poq5Pq810U9A8K3/8fuWpPVpSHo6+r6xahrjs9+exhl7Px87CHrs95cLS9RzCqLnRQ7KDqow+FrrHXkjpKDPrgoycNh2cCA2/HcV5MGBWnA4J6tNrjb74V3gJcvqd/QhdxM3xmS4AQ","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"a349b2a16820229804f5cce2c44134cc50d82ad7","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file +{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-97","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"223-264","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"487-622","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"1382e8398b0a592ec7f3d454b60c5c568f0e3a3b","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file diff --git a/02-SERVICES.md b/02-SERVICES.md index eab2645..aea9be9 100644 --- a/02-SERVICES.md +++ b/02-SERVICES.md @@ -26,6 +26,7 @@ Implements **real-time API approach** (no caching) proven by PteroSync. namespace Paymenter\Extensions\Others\DynamicPterodactyl\Services; +use App\Models\Extension; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\DB; @@ -37,8 +38,8 @@ class ResourceCalculationService public function __construct() { $config = $this->getExtensionConfig(); - $this->apiUrl = rtrim($config['pterodactyl_url'], '/'); - $this->apiKey = $config['pterodactyl_api_key']; + $this->apiUrl = rtrim($config['pterodactyl_url'] ?? '', '/'); + $this->apiKey = $config['pterodactyl_api_key'] ?? ''; } /** @@ -170,9 +171,7 @@ class ResourceCalculationService { $response = $this->pterodactylGet( "/api/application/locations/{$locationId}", - [ - 'include' => 'nodes,servers', - ] + ['include' => 'nodes,servers'] ); $nodesData = $this->requireRelationshipData($response, 'nodes'); @@ -184,16 +183,20 @@ class ResourceCalculationService if ($attributes['location_id'] !== $locationId) { throw new \RuntimeException('Pterodactyl API returned a node for an unexpected location.'); } + $this->rememberUniqueId($nodesById, $attributes['id'], 'included node'); $nodesById[$attributes['id']] = $attributes; } $serversByNode = []; + $serverIds = []; foreach ($serversData as $server) { $attributes = $this->requireServerAttributes($server); - if (! array_key_exists($attributes['node'], $nodesById)) { + $nodeId = $attributes['node']; + if (! array_key_exists($nodeId, $nodesById)) { throw new \RuntimeException('Pterodactyl API returned a server for an unknown included node.'); } - $serversByNode[$attributes['node']][] = $attributes; + $this->rememberUniqueId($serverIds, $attributes['id'], 'included server'); + $serversByNode[$nodeId][] = $attributes; } $nodes = []; @@ -206,13 +209,28 @@ class ResourceCalculationService return $nodes; } + + private function rememberUniqueId(array &$seen, int $id, string $resource): void + { + if (array_key_exists($id, $seen)) { + throw new \RuntimeException("Pterodactyl API returned a duplicate {$resource}."); + } + + $seen[$id] = true; + } - private function getPendingReservations(int $nodeId): array + private function getPendingReservations(int $nodeId, ?string $excludeReservationToken = null): array { - $result = DB::table('ptero_resource_reservations') + $query = DB::table('ptero_resource_reservations') ->where('node_id', $nodeId) ->where('status', 'pending') - ->where('expires_at', '>', now()) + ->where('expires_at', '>', now()); + + if ($excludeReservationToken !== null) { + $query->where('token', '!=', $excludeReservationToken); + } + + $result = $query ->selectRaw('COALESCE(SUM(memory), 0) as memory') ->selectRaw('COALESCE(SUM(cpu), 0) as cpu') ->selectRaw('COALESCE(SUM(disk), 0) as disk') @@ -227,17 +245,22 @@ class ResourceCalculationService private function getNodeLocation(int $nodeId): int { - $response = Http::withHeaders([ - 'Authorization' => 'Bearer ' . $this->apiKey, - 'Accept' => 'application/json', - ])->get("{$this->apiUrl}/api/application/nodes/{$nodeId}"); - - return $response->json('attributes.location_id'); + $data = $this->pterodactylGet("/api/application/nodes/{$nodeId}"); + $locationId = $data['attributes']['location_id'] ?? null; + if (! is_int($locationId)) { + throw new \RuntimeException("Pterodactyl node {$nodeId} response is missing location_id."); + } + + return $locationId; } private function getExtensionConfig(): array { - return \App\Helpers\ExtensionHelper::getConfig('Others', 'DynamicPterodactyl'); + return Extension::where('extension', 'DynamicPterodactyl') + ->first() + ?->settings + ->pluck('value', 'key') + ->toArray() ?? []; } } ``` diff --git a/PROGRESS.md b/PROGRESS.md index 88890cb..4c2e31d 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -77,7 +77,7 @@ All dp-NN backlog items are implemented. The active reconciliation is staged on ### This Session's Changes: 1. Preserved the dp-20 panel close-out without restoring obsolete deployment guidance. -2. Reconciled the location availability path to one `locations/{id}?include=nodes,servers` request and fail-closed capacity parsing, including duplicate node, server, and location identity rejection. +2. Reconciled the location availability path to one `locations/{id}?include=nodes,servers` request and fail-closed capacity parsing, including complete pagination accounting, integral resource values, and duplicate node, server, and location identity rejection. 3. Replaced caller-selected SQLite test paths with the internally generated `:temporary:` database workflow. 4. Migrated the retained Qoder page set to GitHub Wiki and synchronized API, deployment, and testing contracts. 5. Published draft PR #23 for exact-SHA review; Mutagen deployment remains paused. From 6b7f83bda6f7c3fe014d52428b31af1638daa6cc Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 22:35:26 +1000 Subject: [PATCH 24/30] fix: distinguish missing relationships --- Services/ResourceCalculationService.php | 25 +++++++++++++------ tests/Unit/ResourceCalculationServiceTest.php | 22 ++++++++++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/Services/ResourceCalculationService.php b/Services/ResourceCalculationService.php index 8ceb6c1..f344fe2 100644 --- a/Services/ResourceCalculationService.php +++ b/Services/ResourceCalculationService.php @@ -504,21 +504,30 @@ private function requireLocationAttributes(mixed $payload): array private function requireRelationshipData(array $payload, string $relationship): array { $attributes = is_array($payload['attributes'] ?? null) ? $payload['attributes'] : []; - $relationships = is_array($attributes['relationships'] ?? null) - ? $attributes['relationships'] - : []; - $entry = is_array($relationships[$relationship] ?? null) - ? $relationships[$relationship] - : null; + if (! array_key_exists('relationships', $attributes)) { + throw new \RuntimeException(sprintf( + 'Pterodactyl API returned a missing %s relationship payload.', + $relationship + )); + } + + $relationships = $attributes['relationships']; + if (! is_array($relationships)) { + throw new \RuntimeException(sprintf( + 'Pterodactyl API returned an invalid %s relationship payload.', + $relationship + )); + } - if ($entry === null) { + if (! array_key_exists($relationship, $relationships)) { throw new \RuntimeException(sprintf( 'Pterodactyl API returned a missing %s relationship payload.', $relationship )); } - if (! is_array($entry['data'] ?? null)) { + $entry = $relationships[$relationship]; + if (! is_array($entry) || ! is_array($entry['data'] ?? null)) { throw new \RuntimeException(sprintf( 'Pterodactyl API returned an invalid %s relationship payload.', $relationship diff --git a/tests/Unit/ResourceCalculationServiceTest.php b/tests/Unit/ResourceCalculationServiceTest.php index da11d1e..de51ed0 100644 --- a/tests/Unit/ResourceCalculationServiceTest.php +++ b/tests/Unit/ResourceCalculationServiceTest.php @@ -498,6 +498,28 @@ public function test_snapshot_rejects_malformed_included_servers_relationship_wi } } + public function test_snapshot_rejects_malformed_included_servers_container_without_fallback(): void + { + $calls = 0; + $node = $this->nodeWithServersPayload(1, 1, 'Node 1', []); + $node['attributes']['relationships']['servers'] = 'not-an-array'; + + Http::fake($this->clusterSnapshotHttpFake( + $calls, + locations: [['id' => 1, 'short' => 'dc1', 'long' => 'Data Center 1']], + nodePages: [[$node]], + )); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('invalid servers relationship payload'); + + try { + $this->service->buildClusterSnapshot(); + } finally { + $this->assertSame(2, $calls); + } + } + public function test_snapshot_with_single_location_single_node(): void { $calls = 0; From 64c04ea4c371c0eeae7aeb5debcd499cda18e379 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 22:36:10 +1000 Subject: [PATCH 25/30] docs: refresh strict boundary anchors --- .../Service Layer Design/Resource Calculation Service.md | 2 +- .../en/content/Core Services/ResourceCalculationService.md | 4 ++-- .qoder/repowiki/en/meta/repowiki-metadata.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md index dd5b206..8bbb41e 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Resource Calculation Service.md @@ -245,7 +245,7 @@ Operational tips: **Section sources** - [ResourceCalculationService.php:157-195](file://Services/ResourceCalculationService.php#L157-L195) -- [ResourceCalculationService.php:487-622](file://Services/ResourceCalculationService.php#L487-L622) +- [ResourceCalculationService.php:487-631](file://Services/ResourceCalculationService.php#L487-L631) - [ResourceCalculationService.php:426-470](file://Services/ResourceCalculationService.php#L426-L470) - [ResourceCalculationServiceTest.php:53-139](file://tests/Unit/ResourceCalculationServiceTest.php#L53-L139) diff --git a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md index 0e4bbce..06caf82 100644 --- a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md +++ b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md @@ -111,7 +111,7 @@ RCS-->>Caller : Cluster snapshot or degraded snapshot - [ResourceCalculationService.php:26-141](file://Services/ResourceCalculationService.php#L26-L141) - [ResourceCalculationService.php:313-406](file://Services/ResourceCalculationService.php#L313-L406) - [ResourceCalculationService.php:407-486](file://Services/ResourceCalculationService.php#L407-L486) -- [ResourceCalculationService.php:487-622](file://Services/ResourceCalculationService.php#L487-L622) +- [ResourceCalculationService.php:487-631](file://Services/ResourceCalculationService.php#L487-L631) ## Detailed Component Analysis @@ -235,7 +235,7 @@ Integration with reservation system: **Section sources** - [ResourceCalculationService.php:359-391](file://Services/ResourceCalculationService.php#L359-L391) - [ResourceCalculationService.php:426-450](file://Services/ResourceCalculationService.php#L426-L450) -- [ResourceCalculationService.php:487-622](file://Services/ResourceCalculationService.php#L487-L622) +- [ResourceCalculationService.php:487-631](file://Services/ResourceCalculationService.php#L487-L631) - [ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) ### Class diagram diff --git a/.qoder/repowiki/en/meta/repowiki-metadata.json b/.qoder/repowiki/en/meta/repowiki-metadata.json index 7023c1e..768dcd8 100644 --- a/.qoder/repowiki/en/meta/repowiki-metadata.json +++ b/.qoder/repowiki/en/meta/repowiki-metadata.json @@ -1 +1 @@ -{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-97","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"223-264","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"487-622","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted:6mjqr/IowaZHmZRFDheV40UGsQ0sVJEEfQuKG2umzvjguvQXGNDi1nl747nCkFgOsOds5jYVCKsejZB5Ycp55oXbpBTWUOFuTcbJi+3ZrQm9i4kbql3UWJNNseqDdzVBXYHp7WTzFhQ0U5rqZB4uDZ61rmVX/LpmmgFuevs1x8owCRFo3w/YQxC110zOuoxFXRy2D7RBc6ZTQZk/Reik/DkkqHuXW1aYatf+BkXbpHcpfYrOqk8p9/VEp0mMj0gECCQO0Pqw4Hd/Sv3nADV41c6kckej0v9kJtXhZqOzBdsFT7mLWuylMl+qvHsaHJ0MDt5MzrpvlfrgBeGBF5Midf8ReNZ6ORrydHNfFH09xJE6cpbKTERWFXgTyuay7GSWk5DakToppKb1wHNu0axV5Iq6vDU/uFLj1Nshh92Rdd/Nu1PY5z+2DpuP/55wMgC5+trljToArBiPQOHJAn4PtzRb7TLb+cSeKIxDddZ0ZmkGII9iJGE5gsK+DqnvDEAnbNBlGwbz5SIC+7PUjI6rja91bfQSJVQleSXZt86XHg5MtKJ9EwDGiHfHOD5jfZKwxPWwV/qECGdRIM78OQo5SUuP6twlgFU/UnnGz7dRSHYYeoR5mdmHDNZS+3bThmZbxUgjSht5CiCg+6eaiMcph3vjsDgefJtfFegbIm50KOBcyFp/oS2o3GYLVYHq4Hs2iT2VB/R0b6N36KLn2i6o3cfqgzKAI6QQ1C7jRX+8iREvlX3lBr//FC1VuUjr4iORHHlHGiAYFO50FtKAbrzk9gdnSj/zENTdsp6cR32Pbikqe7VjE7lio3O6NQcNHlypZIcUM+6Kyk+NUxn+LDngSqWYvrLat+AA5GqBFxhmhMrSFE0N3KLrPKC+NdWo99CaBzTZ2A+bbwas+ZajkwtAP4yAR+r8xFyf8kqQJ2tzMX3Hu3fs/ZY5IL1SLOpUeolvQV1APALj4BbcSDmNdJ9+mzDyRnbHeUgoxP7vYaqUQhqO7QQK3q26sySlLGLC/HkuR8NMYBsWaAxDopofmdR1ATxpAKWQyqQW0bGBQOPISzTIroTNSM4RPKIH/wyC2e/stnHcI2UnMoRO741LRUdkDYjkoZ4pX71D5l0fIekJjyJVA9Y7yTKy0s6zBxOnGFh/5As6sWSqEt/KBUXi+w2JtZAsIgHRsuH9UkmJD4i/83YgEIkuaxKNDyiSJc18vS9qZfLAR3k6dIDnCeqx2EUM57Hw2X3lHksgjYxhueVcr9sltsnMjqSvWjTJcGusE+pg+8z8MDo4GUxQt9ZGaUS4ZvT+aMTcjHJXKoT7xs0XgHJMGzLEiKvjeO3Xw0Iys459ym3Ju0jEogWDGsNP+5GSkpYhtX7kVR+zPlQuTlNYPIW9kewpAq+PoPYmy4i2WKlJ01CF7HVyHK73SJ3cASCVTlxVlPoO8faKhwLDgEEmWBNQKMfE4WudF8NSSYf3+qVwzpVlXjK5Ws64YYGZb87dbP7Vc4Mr9KSdsFKOouyOkHfWjwGNOSjiMC/pL5mjRILIh7Lo+fccxeFT4m1nTHIQ5YGG8M5Zs3NJr2dlmf8BEc0G4q9qr9M+lzefp+gykp4fS4zsnw/DGl38T/eqr9Tq+saf9MLlHZE/KI/+soLxPv1McH9P3SeGZCVlvxlGSFoO1Beqn1guVZWP0T5Vvs0GDZhcb7HqkmxidrJAMfVnTde6+UT5awe/iqtB8M95DigmGKah/I9I4gqTYGRnHLI4C9AQR3yxlke54c1/hifk7Xj5XKrUXEKBxfyF3P3TY7GUMmtndNA9a06sonBYWM2kytc0U4e0AvSuPhJeEWoR7QGZqo0c9bdkhlRsV65XFj640N9n12eEBa4G96+SXbKVqj+zKeECjLiyMCKx3wDLHa9Cs0VK3KIcl3heMF6lMIzAZOKESrs1ltPN6CT3AV6bSp3F2jT/46EQw9KJYDDUJKdunvmZdpah00g56m20GiY4Jg/7g6Ka46DENUcU62j4muR/DrcMxA1hEfrzTjcGp+f2pze2z9WX5Mv7gC5W90ozOfEvK1HTP6Tc0JqLRj2U2DN5Q+PRfNMoiI2JhfhQm9Chbqmoc86RL3z1A7N88M6VPqamzyPLwzMBXt40Dh9qsi1tNVwA/s9TP1Q7fT3IOCOoclDAbadPOKQMQLHAwas2/1sFNyfDGBSuahQ0LtNbs5oNRHBkhLr+2DFiaeU8SSo9hDAKRzxUiCOiHNFt2XRd4c7zs46e9mJCd+pGIIDEDKKTDfD+Mi5vpVMSivc0q3OW8GuKSYqbVKEG+Gz9HxnmcGOrDcJkRrCulqicsKScSX5/6bWoCabWYIGTsC3KZSueEu7f7xbsyeocxHcOCtU7L5evb6lwfNaaboCWcTVtQK//aet0C70B28WMA9Wly02VeyiGD/RGYWCM7Cqhw9cn63O9UPBKpaoCza2BErOXWtOd9BYJrCahN1jzCfWhDWWquHd+SixiIg/ApExEl7LhfWDhH/yc1kc8K7hq9OlD7gzfJICamZcYrkjZRBx7LebsiA/vdOcyNxDVW7TZ8H9IaAhsuynHN+8hOIBpem1R6ASKkuJLZVzPtPr6nWvHE3Xekh2VLXKhZNd2vN630Zn1KLTKx3mieZk+Ojpa0oXplkte1QA8UDEBLVAXkhbuF9011k2Bd49V0BvMoFT4TDLVJtZ5vQODFyo0C6P3yUpxBKiIYN+DjDuGENy3jZcIQYXIodgg5b0jgVGTMS5uWJSRewUjx/UgZNmbCq6LibeowRk2JiqL4DmiKay2mkQa6BlLFyhjYwWTHddGNj3NrON+35+AN4dpdCkkCr2/kMPv5mnzgi3QJIqWUJXUHdUg3ZbQmG/yf58hLn3J1bLayAu4pSI5cMd7iDOcPx5j5+QzQSAVo5X3Oa1xmq6jiDh6/AAASkH16Hv0sASVxuE8TRWQFm88YShX/aUQcTgte0tD1b0EpuAAceN496lJMmSVM5izotMtraTUMIND3ytV+Q+nXF7PiN7N5HUD6At5Xg32nwCbQ4vF3nhQjOt5820Pem4fG82RyiZw9U3SA+uxVhaXcdV+WCG6wUh/15yTOBbdvgKt9pSm5uYioEumFQOHq76xkVgDmqmFo+4u5k+LUq/PUjYSFBiJ53/t+xu7lz3ZC4pCsqVO0cFPHust3mBOod8pBAh01dCPkD3oYfwnWBPf+MbnhO79AzA6UsP9Bfi0KOv/yLrgVXRaVMZGw2C62K+4pLxQkV0oaX4D07sVGZWTtlGn/BOFvX/MyM+17PAYd4OaEvl5gk25vy5cdm0PbYUX3DZFob/92IDZe6wXDqzc0rAIXRjCOLcabHIKGvMG3BV188kWylEKAzIJpvHKecNawEBwR2xNjR+fMAZ40sNzLD0vMxQhWgC+pQT4EiC7GgCmQBssy18L3QxWYnhjfws4CmhpeLRMk3PwCLNGw+p4xpa3v+G+mLeNlv0FABA4mYmEeOYhqSCfB+jFw4Chi5+72zUGzapammzIh/0GwNYA+WaA+q4z6atxIjj1r17hOM+jO7RGdcJjHxLcFMujfG3Vw0qpmqLO7CCVTvKxkDgMo7lTLTDhRB2nn6bYw27Sg4/SMcy00PIQ9UyIGzhoJIFDTGp+GnFCVqjbknucTfn88utRVQrKT3iOdSHV6G2r0i4byvp1nOtfK06l2mzCE4kVP5Nm2KuYSotlAGrKZPezokOOmWQSJhguOKILjeAYu6lf4MttjIF5ySTVpJ5CsWXs+bZY3pKN2KS3xY2hZtXmxM41S0cfnQJXH0ydWGsbBNLIwVhaha/boR9zi1owv6qWynnFkuASutH+VJtgoqYtge42bGIm8IiVlmfB3Z2q7kNchPgFPm7kfIALte/FLswFb6GL8hLW9O4pEG10vRWPrMkxu/5Cm0dM92QSW1njxOEYj0jHEwr37ZBVJKE2P5om2/9rjYU6CZg4MTD1ybE/t7Gquwnb9x8wm3NdsR3fhVPKOlJBh/XA7PYCDy20HtVSmvStbm0pho/HUmEVfyGQIrgbMTb6IAhumAKWb7NVkMkMhQZjbmXa0Wf0cAyZCwBLBY7AnwFuQ9niRrsjpQAeqGZWtyK2OE31WezwkpoR/X7U7IvsmnR1FvIGZAkKLIph00z7YguWain7pmC675sboI6TmC6XiI8mizzm6xi4F9tXE24+8LAF5Ff7Om4mSZgtyFVbDyTUKKIqXB8UftRmbUbf7sUnl73HsMrl1R+AB9rqOKvgQax9ip3OXwVGFcoPRMwqRlFLoFJ5TkW3FqTCrdC5mVDMAAXNvxHJiBL04K+0pyV5wZ9twfdJhZVR+OfNsUckWFf8MVuWsG7gtuzYCPSbUJjWiK6e2NtzdQTrWyOgpTUkoTqmrNofApyekFDaxJn0tjYeU3sPXMbvb9w+PA7j/l8qkplDfNiEnWRjljtOktshJHGeRYRIKpKcxWV+1iguw+czhG49VFPQRgK9xrtRjCsr5n7tAGJlO1VlJCEa2gOE6IW/Bco3YysRsVBI3dedsoFSVfs9DwTcTNIW4VqaT4MN5EtmVeA65cvfoHpiNQ6ef+ax2AVulUiXFFDmP7yDVMursb0FcXm7KIeDlFC8FRpMa91fp6nc14RrzF441OIyya4T5vbotuokwULzEP695MxWEBHhR64MIZjRScsp8oQKonpHbIec9spVDYiN1HaQW23HAq9bumrRlFiHH6nEKV3H9pXLfVsCtknfLhm9c8JyP4Dx0dFCxJB7Y3v1J6I0QOtj7wb6hrYcGl1+3cBPJyon0gk51eAspwzeHLHiuiEpuQnoNL+1fL3Z40orysvlX1cvpMol9bdmlE4XgbIXVf7KSJL3zI/FkUdoQUqLmYsVs/g5ZpQwrMz3aewxCAl5uOw6sPHhs2NYlYwrdwyGE+zUkDCyf3BssHA4/crZP47IQOnRufr7ZFa90o4IyCJ5wthw+T+c+h0VGeaNnhdRNp/TyQ5HNR4/qN9EdxO7tr1aJfF56hummn7yaTxsI5mIbmJi8uOKGTJU7RHiGIsWukchtx3HEwYBDfNbetAxcQo+1CLHmqs9tp7PF24BP6Qd7BS0nrdRz3nZJlb8cdJygLpDPj/4rh7HmB0e0EOg/2RUUUnRE0ZIZHRuJD2gXv0ZFEF3qIfgXW8XFjplaEnkihIdcnbhR9dl+ZlSB+bABD8w6q20smj/bBz1r4PaMsgnA4UIzHMLWV54yX07E11atWtmN9tiTovj1xuuqAwT3tNr0ZCcJz/2mi7DLYwAem/DKExh3hab4BtDKEWfkghoJZCJPwHQkuc1m6tABgoIs3hqQNfBKJDMINEMnpnvlD/C2ol3Mawo7EbdicIiGsc+poqrky3tLrEtZoOZ/zft6lb8pQM/mNvX6ij6oYH7lYvdtSASOmlkqtuSKyWRxlAASZVociul3HU1q9Xt68iDOvls+aFS+Op14OcvKzqpOTbW/6gZizQkohhXlujGKecvQ+V+WAnLEDgk0W2cA0Mlqt9A1A0HPHt/CND4J2LJm4AulxA+sfXYEmSv861YyYq9VaD0tq6p1LVpwQ3cm5HjWcv1idt8807Z1L2Id7ER/N7uOUS7L0k2UniL7P6QC4IEJW4JVHvQJaO/7Xc7DeUIkv1SiBiGVzrardAiMAI6hSafaWZwAvwsn5GfU5Ng9Uz6JoGf+I1rHgZwb6PP9YAkFUXlFFBqX6CQQt+9axTPKKd/AZ9w6IHHIRIXwjRnLupSoiV7JvgrpQNcQoY0LHxAF3lTlBd91gKvbwWAYTiv0QdBTgJTV9Uuc4Zdp9R9vNTtfs6OpInFvQc0bmKZXoTF9P6+iUetATQfRshlgx4BjtfK9khPcDSsCG9336Lptz40AUh4nmPzxXNZKI+nTfkGoGCIfqVvoUxwlgzFVyngSIll0RlNPMaejUabKI2uvLdBDmnVZLtvK6fW1OxjXHhhSdWwFjxv+favZ2y+suXte26AmFOIuyv2Rm6L9ir76htUVDmawHsczq4PJUZG4OtD8D4JKgGzX7Vg9n8EZGBGykh29VRFkV1oHR3DYTHuldeBQ3z/lyBRB8t39OWaqRQ7IrLD/0ZyLn1bB2ZvtTo6MvW6yLb/ckvkMvQXe9noPrpbHHnEHWnrrCtbVeWWOsMVBYjUgFKLJzeRxYUk+vibIKEz3a4/fTxll10kOIsOjIp+x/dchyU+lezTz0W2esT9pfc5mnIachMdOYDqlP31+OUrIYYX89P2cd/u+mDIPf4F5hR61WWUI4dKHEp+fRgRCOrUk84LW7kezK3W0B7ri1r25kF/2k7gwkEVBL21zmLXYXNFCMCBJCMc3iVDvKYCktLPUOyCheO63oRVbGCgL4LgDKP3gObuwT9xTUDZ+L/cjdbykPSbOBQdrCTWM81gq1n13ehk/T1jPoepjUGMToGvfbBfhAtXvDpgs1ly36iHB7ZxZCG/6n5PgFzjk4szJqH7QfHijwW9sJ3t388W/npXzXYu56ESyau3yVwRhKJ7xqT/E7woImUiwkRE4kwg4tk3eQp415DIsAgkSCyNqTooX9T2udnd+708V8Nwl/B4zXLGzOJQG8QrVfiuYEqRLReD057NhtQ/D/T2U7KGLAM8cWMC0JeVQgn+/tS0CcEhxWwBmVwIp7zLbkWqezjc35Z7mcRepBKS1Db1iTdM7YQdlkj+XP8me5+SHNzzCdfhpNvKMSsvFAFiIJeUU087OD/wEnMh3V6Ki8NXl5sYeVWm4qi09QNYPFgl0z/3eU4K0k3i9lOsGUuBSm6wP+0YTT2ppve5AmA6ioi+d1dbPZLnVAISA+LT8ObdTeW6T0wYbwM4bg/qQ6dOzsKfDpLmyfcYWmNS2FArFhua1s66ZIXGObc1IcvwdHU6gPWdFnkWGSTk7DwNJUyQXooUrNkYL+x8tx14/kOznj4nFBfaT9KQiiMNZVNbSb7I7HjynQG5I1rnPr52Q+yhJOXPMoEaRwDpe4pi0zTMNNEZMmcFWLa8KQi1A4wkCerMyvQhgf1WyJqOX9O36SaJZZxEdG13f3+PvtJNFvMn6iJKnJ1JuyadrAnOVwx/KaNbyNy0DuVmzeh0maLdTIy1yY3d1a77XlcNIZDAC6dAS4V3pVYogzBBRD6FP9kyMpQK22LJcijv2JCyS92gCJbAiR2wRCOYf1jImPbeDOFLCGK2DDLihrdSWMPXzx46qJ38IF0UuGxosv0tL7iZt4TrOXZQXtckkMCNZpLYgH65d4PXF9s4NRA00KmfLdh0z9ihpggvqjkXWQCMsef5c8jBivY/+e+xx1XY+7pf5zBbqi6+MmGvkRnhbmLhOcyJ/bqnVfXcLcrmMUoZtMk6m6yD6kLYau8zhrwR3ZdIQwQ7N3WfMbIo8hd2FekMVIDz4cVfzGtEkQSPIIjmJeUMZ2TsfM9jyzXkUMPKetiALE7UtWxfQ6eEYPOWLNjzbh0sGp+EUoB+6OvP/1RZzDvAncgz/nWjIAS8H2S4LrQTO34s5LGGZmDLRl9f/fVVrwfiWBAeiD0kBXSYTNeJW4wULnzSWlvYr3ll9lCaWdQOnS14yJFEW05VafnYQ3UM+tlbJlFozQ1zehZxNc2Pv3KF4yFp0r8o0fYtMkMnvA8Xh9dmvJ8A/tt7GImE7fvCZKxANwej9Raaf0eCwLZfdW3lS7FB+CZ9y48kXntYMU9JxFUnqoVQrF+hVMBjMRR0abCVXfOVAwbxvdAxIrY8qV+jVGa90WvhAkKkgh+Hf8yCiri6+ifiMfDnv+k1W0UAwQj0dLPop8z3y09Pn8A9G80BEPFmI91s9HJBsAPXccTYveHQktvoUk7Qq+W8b0dAsjsQFs8BcTvGwvQFCYvLo22JMgHL54hZvcvvC1M6sc8uDfzPiQAj6orQhe60GhvE+35362Atxb/fCtBAaKGebYAAMRFg+wsfAH4aEzHvhSFVl42JGPakQS7s2bTx0cbVnMLsBSSji47jIXqAXtiduTFP36loKpYOl7n3KmR7bLcewC7AeNctVIIQ+0JeM+5FjJEQ1EgYA/Ax7GmC+hdXezes3eKI1c6dMOjX6/3lF00DjU4+AvhBkrR3M3ZJAWqr9pSB9fy8vmQRanQxj0Eln4SKNu8IaZ4WbqlEEmbOFJ6u4Io0RSvKzklYMzlm38bNqqEckKRNGspPs7uqYvFfqG2HmzKtzJVJuKvj5zInVSXD98FHeTFA4Eg2qwYhb2H76Pqdb9GFOMODMHna5A7uU7jrSMKTK0goNnv7UZAPSYdWdAEE0E4kHh/F1Jo3J3tOfqXI4ELr9skT6zKbOl6YDbPFDMgUF0IhgO9zQhKrNTf78qxC1KK+lA8KRdFFQb+PWgT72S+ME8dufBZYKNvbhX/QlkgrDm2qmwIU50VKz8MCXCQnYEmjp6jiyqd1FmZyyMg9N0AXgHaPAQwzWAmB/G/YJOGjmk7g1+eu/m1GCOljgkooweAOnryPDQEBmgcG9T1ps5P6ps+Ya6uiU7TdbZYgAZVI6oxeFIPYeGtMqCiMkwDcmWEfYlp16lFc4lVrhpE3wMtXl8/h3UsrNcY4jHEnsWf5L7wV3ukaj722ZjoQOkGAFIRiMyY8F0CshW44gtLgWetKFAlJ9ISdV6GOFb91ONxkUbRHNoWthbRayDDBOixZIi/5w9LMwGSfxfCyzYlnGgBvxxZS/POsYb9WjAVOgYqj1+gA65EpkINO5PzzG35AF+ti3s4QqSQWtuW6ZW3Ry6uThtt/Tw0EDlFDUIXd5K/o3/U6EYl94tslMYDc+AIoEWRTkqTsbsm6ZlJwQ7ARR6pJNWX9/7NbE9VjDXFhhVJwnKWCg9dTi5ifCRMW9eH0ek0hg8fwYi8daC3JoJHxhyo1nWT1HdxY7Q+UxdvBh84hlvXvwD/pA8mD9/NYSVJ2n1O0PVGMC6oQuA2SFQ19/+z04TkDQEi1x4uI3PvE7w3kRn3kfev7JrSJ7508vfEPT3MylzWYGnNNjlstjJpkubu5BRDzKC+nZwylJhJUhrhGCH+SfNH25r59CTULN9buN3C9ZB7Ea+gsFvnZ1TeRDY5tzP5u4RzCkrUlC9uhhd/y2BXjMzZD1xwL3FCXMECHccdnKFfpjbUrhqVFJ3RubK1osuMzNHQ6WR7Dy11GLbvEXA0F84yos72fYJQxYgjUb7w97j50wmnnL8DXDXrQzFxX8Ahwa6PtHwRH8FyCcnvqmH92eCU6JUf92bp3O8J8WKGBO+pfvcFSCpvtZhRpvbMlaus5d3Or7b5YmFqk8ROVqDqFPIEhb6dyDQsdzrs/N+X0hwLCg9cDxpb5r7JOg24OBgqtQOPsOCK6rMj/b7dmPIbmaI2su0QMeNCO0wUpim2/7GiVNgmq3I2Jlwg6ZlhZyz03TiGygZc3nLzdH75C0zPglSVXojAWCJps2cIHUozW/0ivvt22v9+WwcHMnMUfj1GGWs69rtru7urW3Xz0bcX5sAkftMgsB05YdWZJhZkMiCldJMkGfvhUo61x2DRig0p9+WhKv0TUTqABK+WAbT4yjgJUS3dTGFpOGqmWZZRVD6xXEFCsRg0mSDubYcSU2YoPE4k0676dXLj7L75BGaAskadGF7n2eAxJ286S28xa9vm4yVZDYlTZae8eI+3pFTCbFevS5J0kGdZ0TSzy1NclOpOPt7vnT3LzBEYjxjILS6xFmg5+WXnGyAW8YDip0bSslLGkRd7SaolhkcCDz6r0s7gZjFtQbqdScI4odDP1JEweS7TSw+40K71Au698JTMvI8WnIcowhu2blG2b/kOQfGGlaUUNZoVnWNw1IofA8mCYAPSNwPhMsKyBPaKPvY5KAgCAIfHBnyJyXwOXRQs9Sdld6+LtQcuIBv/zeHlF6w3xZxlGbiC6G7Hb2Wo2TJfUJ4tACJnONM8BpETTzFtptGgNipolfvjb1+vNsWAByCkv60yOBlFQcAUzVu0ZZzSGNTSYEqgd5gYtqRNOjXpAIZTxw77wIkfH319Ud1LdZmh29ynRBprzEWjUOi66Q1dRoLIDK7pVsItHaDTmvv4ZnSQNhYqyifgnpqZLRzG84/vlPwipBkOlO4L+r1zpZvvqY92xyhoPnL+ODrrFvaKqI4aHdJBIQdMGJecD9t28ZLhkGuUG2QNpIp74uD8eJUu4qAB8FapCHd+kbaQnXlH6MzzinR7wrcgWB2ONA3E8vPjzmZhiaqi7ZFfm8M8AdVWOdxZYhzBWtK+/CiL/7AO9cOQx7tzl8BNb0hK51P6PZrfnitbvLw6FIRv9x5Wdr3eITxCLOm4hjKr+yKGSG+wilmAejJw5I+eFZSNQ5vYrITiICkpFodOC8V5F5EqeosnDvQIcSs5OeR2AC8bPxWjB6xi39ET96Txz7UUC/NxihI0SZBMmVd4S0ks/kb0RDR85/T2bnlGsRfaxa1LYBKkjGMgw0SwWAuqRoJltDK5RIFKEFdlh5tSmsA1Or8T+PDd59CfOee3S7N2twMQLZnTyZMafxdcmP67y4oPZezP7Bnt+wNqF134fyckNDfmXkBRucAW/OuhZS0NkA+3nOdCBq11LlDoTWgy1OW2ljr9/HbAv4VqJJ0YmqdOjBc3mEP7kOcB56VkzZG4TbgUBxSFn4YzDMDI26MAik4zLCiJHTUKonEQ9tvp62qqO1nXIt7zV3l/4cyzyhTQlcFkXV8PjKBYH4qTUz6Nbxao3h6J+WmfKTZ+IvYGl4VxKteJJTpPSv+QWNgqqgVavZW8XsHZzukUB5IRZ7/H4Df7ABQxoj0LzBzE/75ePugTJuzKFQaVHn43L+NVo0ccFQkC9kTiNg/vzAhRVtslEXSKwneKpm1pIeZWNdZhccTrQ9gLciXENj/W2H3GfvMv1vHIoeBKqaOSOgrx9ThjiQuKex3s1U/lBBC2ke1euyeRJ8M8K30fbY9I71fAAIYV6CDK+FZIWroAss2pHFYpkIfIyZCdc0LV5X9xUrLVHCLx842ip9FbyCj+jw8zr8AqG2Ad/1H1veTeRDo81gktDHY/1cLWgncmuueupisWDTjod7wbnFF73prWdsWJbBh2FyKAsupPUIi04tiV5Xi9LZynAf6Aejt6IP1vKpqkqg0mgIXPWx11JD3Ck39iPElppAzPlUklgCH5CtoacG7KTzrVJD60VLALKPCaJGXoX0vBl4z0sNzbx3JWrW2bZPLRez4J4EK15PpJ/5TmsuTQy28NivG9ljUB2KMQXO9WcDdvZ1/VqFaBb/OwhtDdHPkQAFOYe7uW/fgTeTFgHx/NCnzEMzx7B79UHiabsHDdBAxTNLophWX+5tUfY7qxLweL9hxSq4+hVt5/QUzKmhVvz4UD2Lx1FRAJS1EOdUrSmmso6Q7jklo0e7sGZEwKSxUEF2KCXXb0r8qTjUExpQqdONtE/aU28jpqehsHk7XRhPE2dYPS03q/Gm+T85nLBc2cyQ0TYYx2Ejj4GqXeNjXkWc3mZ192ZsOxyh3ucq/9d3JvR+SzMdS4HKPyju0YbeK+mX+NFm6bnrRakiOM9nZsEUs8c2SPX+70lMzaPBEWNpfFrBVPtWxqRSSpT6Jce4C7L5jJeGfT1+lCSooYRKNgsNeifaQDgPs1vb/Mu3xRMP1ZvqSKtFRYm50eguxyYzvg/VeWunsvTn7csVEAUQEfRj1dcLokLmWk0gYX4fN6ftixM255HXKIHjfx23S+lW1gGSz7SAVuR86ew7fmwDY6u1R2vqRBEM9g2Ualy96gx6GZbgQ2v5/y6/aGLCTAWSNwZaUHNihS0KggKyqQP6fK2PZbaCiiKmzWbhsGjOVoRM9j/VFlyHdgFYoGIoRjfU19PCjZhnCmm7Lk8XhReADCMZXrUvlvNbe0JCzGPGoYTn0HFVVCoXM/7LxASiRghqIjmF4OWqLVFTQ3sc1pBbRo5BsDcJFIKf7G4laq5a8EpMO6jKX0/rXx2RJKUIaRlHGUkSPX48tuOsFNrpgwozw/TE+xSl03ZU+vLHctHLwXEcojbuB9PAt4K+CSZu/zzbYsA86LUH9p+tc4Xzgn6bX8Ztl+iT1zmrGKh/RWDjZ2tJiLPEThKC+ihW+D2AXn/I0SLTFmddJhnc+TLBlPUJl1G4q+F62bhYZH3aJJx5YiOllGpu+/C9GsjN/D+b0pT6V20p0F6sb2bwhhxl9aV+yoL+O4zJIO9FQv+HI6nz3qXdSZt/lZVltoYmw/mCKmyA0Ka140Y1WH4gTTG7nU+Q1FM/gIxRy3ncptjOYZvQfLhYoFv7Avt6o5zzxHoti9VqMt9j410SHYVKQefZMCnY57FmI0yE0bt56TwrXs2IUUFQ83P9kmjP4/AAgjeC8chzIR6x08UjsUvv1z+PMD490ZDWEI6ThAWTAlJB0xMWzL49F25B6HTtdwj3EsByLbjiZnXwhB0wnoiC408/ho1QEpk2QkrtOkiAf3kKJqgHjRtv4UQ6WwhoqkAq7xLRlTKtvtfm87JM0xQJ3XT/72BaS0fdusbwFPXolosfpeHFLqtDMsWPYb7QVDJI6+wtB7DG4FSlRfqQXCH5IkKnlZxTgap2Qd1EFG9cHkivPVMNgdhaKX5Ek30p+65qzPwrQsRtpMjk1bjqL5sH5yZMIF10GJIgajMshf5qx6SlMAdjB5o3t9HK0oZCfBk10eEXXlCXhOCyMYjtQFl/dk7OwJU1oR3olm168FhFz0DPGiyuoLYZ5ZZYVJTh8YShowibINrW+uyztaFNCnVC2orjpOMEnEUeQw0JD7LkQwG5XLYBRXZugCSZm4Qftmpq4FBPgXGjqEmriNDK3chpxHADXSdYnW5NmEp82CvWti+YU1wCyGWA2MEHu7wE7lIiF6wLKBvIs479hJrOISPOQpl0p1SoE7rIOmGmVFMhBljW/l+/d0oTWVcGYkltEPHoScYsdDBgN+sHWnjkat1Z1yNkqOA/U7J3dPfL9vM8NSbiz7vCOnRgcNtjJitxkbYZGXy4WbbCwFFP30v6+fc9tPM99l5Nz2z4EfHwcQnUv91eNXox3LsnzaW3fSED/PhetXI3hkU0kWkPezG4ZkuIdriEuhuHiKjgDTmBQWXno9TDxkQj/aUql09QJa5N1UPmce53Y5uXqanGG4SGyQ9s+epdT5Vigc6Q1lC+i6ZeBTlij3vT4575jFkIqv8d/1X/XWoBEgtqrZP6eLSaYLo+r3Wr87hzRP39q05HUQ3fkt+00HmT9QC7h2rEMxR5ZWt1pGJSgcPZqcVgvsxPUTxtxqom+uv5Z6gODyOjG5CSlQY0ALfBz6JsPhAE/q+YTsCtTSMmz6Uy0R/Coyoeht4nqagfm/FoqfC7dG9qtc+FY3LTC2r3mjNHS6ar4QIynNPF1j9S1HQAqhJDBqcXRk0iH9XTlXq/0p8AkdDhQ35Eb421xJpgcVkTgBAl8fn7ZwDhc7zy4QXVXitL2x2wDhbbEfLvUKO0DsfA3pq/uCQJc+FiUGKWuVyItZHmSFmrPXHsO2xc/X5l35qbJIM+4iyfCizhRmufFsQwoA/kIyp4+nVNmtQXZ3J1P+NAaEFf6u046uNTxVxwVFEkaAkYPhGGI0aWnxId62Z3nJFDgwg+E9AlW1iWAvJewOIPwqSrfl59ZWxProiUO0htNns68hZCiDI466Phqw3p6GsAZ+8vHk+4EIHpmXm6QiqY+OrGHFB9d0YWBEGOvWfoBi2Ly0Hy2ftH4NoxTYJJx3TgmtgvG22xBaLAzd206yBcV2rfs72Q60U4LKl2nRojE5LnUXJNNDBfGp1RjaTmtPyGwMJk4WhMZilTf8mrjktyde404TJGSP2mtMchTyMdJFfZvqpMrfnfMsuQw1sYVfJPa9aij/dGVaxMqrGJxdPVxIeuYVMofV3hweFVrAZWJVdu5SrrRRbAAgF1mnAcrZ8qjOcftMA5VuCupRV81hZLIryA9Wmw9RcXumv9NR1LqGCQjc9l/OP+a5n85XkUxGY4YqdVQE5Fn9y7KHU3o5REsgBxf9spOWTo0BiX8Z7QjDNcKlIbFbJCGVwtRLZyIUpuGknCjh/fzQqpaJQT37pCFmmAtmULb0Nnj6bnGxLjs68r1y5UWadqmIRbB5HZ7oljRYo1bXKOMKRtgwYXS9LFEppyQzwbiR974QZWRqdIEs9wfx6nQLashFS6tG14v5s3FV/fTFmnczwwOq6sJb+4ZGYDJtYVPwSWtYJvEWaG3fGUz4GdeZPajnoULvy8QQnlCCqT8Bkmxsp8zpGwzoNbBGsw7NfU+1HvOm/KVkn/rVbeejpKvx+QfqzvtUsoi3atH3eowS+DZ5GcPfQfSSgREqv4GntJt4Kp3jd3Wjn7mTBYXF2sAJKTROvumsBiEkZu2EIsA38Fc3Ui2GwELKHoSAyp+0JY7rWJB1TQ3yxcOqKlkpZNIWQBfg7mgLfrmHeJ09fQMRomFjfHTXDQ/X6C3oyUwWiPeFNh6ePrS81SP5FzlomMahrmEbirk6yIggnI8TZZsXOvMvs2IdwFV0wFr86Vw1Z7az+dg9X6SAm29aCCK/JsBTN6NF8g3FekeUGYZFIQ/0Q6BMGhCKSFFBxW3AkhZE0Rj4IarQG7Wpnss/As/IPYOq6LyZVpAAKg9R1ihA5xN9Rxv62yoh6StTU3YoG40rvyVUm1jvmR6d8maXUMN8H2RwbA2zrVVhy0ZDqxIIi7zloZVE7TmjiSht2Fz+zVb2+5uUvoB3EnmzCIAtmYPDYtWBuRL8ymFbPX0GmEjNGEnokfOdKcUiI51QTmrLUnp0rf4r91ispSQjeRi15vBCff5qf2zZNVHjfjZQBidMAauaXpijbhdnj59faJnyrfWITXhGFcQiwqYbgfc7NRAKbUYklqOtXMb2n3L/oiCgJuY94RwyWOlY4w5McWksQTppOPG2jME+/pyljRUNIWHMmOVJaf/ysT6suX1kYEZRgQp7KR0yAsE+iQFaEjYY7FlmSsYxSYlNzElzA7gs4eQ7x6tCBB2pbxss03SJl56Eq7rFOsBfGlWMsN/8afazppu5MS0oJTKvcGshtzJhfRqbfxoemD/a1KK4KE2jb0TUnA7yeVCLJcUB4DLAUC3nxhusw3K5TdBOV+Cm5s1+YTuGPncGlzjd0UREp6UNtzWBWN9DdFKHfwqUv8+TGysrlxBFYXCefqXqDfePM1/Bw4fPLeiKaHaJoQOt5LJMZxUGYuBlXAmOxGhDIBrOdN/GKOgo/kIM5Qo2HS25WmIZ3Wcn9EimR07RUXBxEs+I7J7Nw1uBvpzjGtItCNrZXCxf9Am4OEvzKYarWW4DUdLWqzUWEjfxaGdkFo0KRzYH7aHi5paFIjned2xSh7xs7AIknGVNj008ao/hdwrgEOWNXixJtjnYVYTWhxKxcdxyBzehvUtl5nohfhpBzPqRwg7DVRr+mGtj6zI8Db9F03oaGi+vBgg6UHs3SWEcCJ+impg/QGlKERraKegmgdc0oe/HEbOjvly6uMWRUoKjkbZGpnDmuuOFKwLBBSTV2GIvbgLpOP3kgbChkTRgBJXvbqo9e5rmlEfRCA/qJLjHN/qYkSdZfXPG6FL4WswFMQQJfvmrb4aweoVjdUjWDcY9oJeIJIPbRcxOMKwODZ/EmV1gCJxwvjNd9lH2ZRjNRuctdnOh1CFuj3xWAbz80cmF9VfgoDfM/3eLF881BqEu7CqCzsmEc0zvId/Hoaw7+d1WoIVnnZFMqLYiHxyRLrokfFDl4gVP0VA+f8ibJdOxkH7yfFL1pPEE4/g4zTrCLjVoipRKlRgNtrIHMPO9YVP8bKRqUXfZYvVnEvAeJwSewWNY06x2jVaiXp+R+q8wutKccXdsQR+TdzKKRBKKEtVIlRPI9/q7lUt85SNYj16kxxOWd0JusMpkGJOz7ji3SD2z2KwSRSIfOhc0tQFb0+6d39ymPg6ZXLOFRtt2FXxLoVCCpG6fD+mzD6ciln0PbMuG0T60Ak9Q5fFy5N5YquQoMf9r50XJ6EDhBMudNVHXSc3a0ihAvJni77q18MCtKKwSxk0V4SHyKR9WTQQ9IYleFG+MxZ/vUT1G+F008jQW2fo0y38YMDlN0EuXsXGalBDZf3Yrtb1ONBjLoGNiDj5rK6L/w/mN6XTwqyx+Ya5U2GmLMQtnsraE9OjDCPciksyyWr2jzYIcE01m4omTJVX7tdtpMbnus5ibBFDboryjPK8wejiv3RP7aUuHIFg19r7wHqkUIb9XPKBfAKnMyRD3965yewX4ZGgQJ0It8bjWaRVQmhNao4v6or2A1wLyIm5SGEzkXZUu/g7yCEhxPov5d4lBM/IGPHVI7c+tr5c8ABK1XqX+nFdSFyVSaLF6juDWqkyEPYmil/gsMFYUf0hTy4mRK2wK9I7Zj5rmpJN1a8PKrg9N2Q0jskrogtFO+3qafrCEy7LpPI6/I6kSwhGNVQh2tr0inHRw7PgbKY0Wq6ySPcTv/And0ArWq/fxJPngfosoRzdgbmkt3NHzw35SIXZjb6bYyGrXkNA9KS9axVNkiWOODA2yEEwKxrbd7UAVDAzGZOROnFc6zsLHV5HNo0Bx8h8w+Bw8uje8fAyF3JsWzuSXb1yZESI3W6eTLzpovZABB1LUQ5e/7oV+f78p6isaCUOHQRrdSFuvNGUrX6NaHfzfngyafHtokm+WmDoYXlqyeweYD8gQlvRd+q7JJZhFGwrrai0y93w0RLKMQXX40+Pe0WSKtIyoiP0TnDCvuf4WKzGIK+r4QE4BcmXLO30g/anlURkFY0BT6dpB6L4KHgngD32Z2N4UptS1G9g6fC5EShjGv7SiPgoE1v8rrnrLpphaAGvtO1VPowvBdPEUsAI6jzAv66Fm2F25ZATwUMm6N8zy/42lWISydAOxhmaUxCNaow2cSntwWRFeEy29cFbeG6y4hgMgGGWY7tAg3xZcYFgEV4k0XPx3QG6ogUdty5qLGD1wNbtkTHjN/bHZM4axMZCVH2pqruKLtZUE4OtKMho0f9K5fXMnvpnZAH0/Q9DEoflsAaqcGTxL0JcO2lvNEZWHb54m/JpwDrKxQHVLrJ+Arvw1S+TZp795Cqou8SvyKEJ1iY6qOwa26d8h5IMQmGejTRZnr4rp7zbbmyhC0swljYd5ACkuZdyjmtmC6QdrrmK4DH90kUEwov5jJgdYEroiCiQXEsGZ+giYEOeM3oAdmU7r0tx4ljcZ92PQwR97hV9ICAbCaVV7Jn09Qq8oa09FCdsLJ1v3mgyReYhzVNrqJK7vSSZzKS9dPuBqoVyqk7/cH+Qon17hgWuTSz/N6dX2bbOYxAWJ5EVci9y4s29cclYBQqeq69saS4SeSqEbCMfCedhyZkwaCCXczV7qJeiwMb0ow6CAU2Hx7AQaDbiwGzK8mnnGpWn7lJQ2VVGn1QQRz8+ffpHDj2v35ziPMbxlfJEcqnBjVlns6MnBEPC1ZqmAvvz9Ec+EzGOi55nMP4KR8CM/EBVEYVrDATJtqjtrkV3TuTZg9huTfrBoC1l7kdwIzJ80cAkhm+HnB/MwFwNguxAfSIkbv/vHRo8ReiMOUzGIe1+K8bRygvT9KhVwfWTLU/atlZgA2tANnw6kJHJxBAqJF87Slcn49t0ZZ7xXOT/LqbZ6kv0y+o/vnmDfjqKMrAiftl5EGNY18RY3P7forhR9ZIMMK8pjFyJyfOW8BbsTh8FtzJvP7/JFPb+dkD1/7lvL3OXVp+OLbDwAB6W6+5lFA4wy8PRYlZafepKf4YW/pXMflKjQAC7TOyVyYFmudGSmJRW2sSJR1CQxqbZxIHor0QJo3YeyqdscaBNGpi9M9lRSMw3Vx6Pbly9Dj+6tTqRsnmKZRZ8XE3HjaEiOmkU0bvKH2BE382uvQj7vWCcHzSOpsE4/R81It2KzizfmSGwTs4MikPF9AQHRkt8kcfeoCXhQKdd6iIWnOtXAngEYy9Q+Xzs+bZkr85Y7nYq6vfgSDKVYJzG/zmUJL8yZVl08p85ZWgvj8wyupegXez6PCmPdDHOVkOcywmNwFtxjxmVP4QU9IKX9/D9W6CpMRUeBSRKMjWuTmjcI3pLQgOIHDMQ4PDZ6wV9cDlxWLIFJXbFPDNtjqMADR9FV5XOCqrih4jZJ46p/qw+t3SoMsoNJ2LplJOfzReKR+IwKAylNMbp5t6evIOYpk9QBF9/2fdL2AQvJ6CPJEuWQcIEhObcyrzSWnklQtHzwwQ/+Og4B+LsEt0DD9Qut4DUFmRxV6lmMZqIGuuRgXJCltxfg7HAcivqjC0BVp8UM6X8beJULLBioKidpAKmDWiH5E5OwA24YMroHUOl2C/XmbysKlmvhgZiSsnGMaMe8HGXrwSZ9ojz/B+kkO05zvZl/Qp0YMwvExdOjaftz1r+fLvO+F/HXjpKnS7t3C62dWY1ALera7xF0+LIgssOiJhOJH1WRtXBZjXi66xQ25qk1GN6pn+Zr06gmCNzJ7MVeog8tvC3R4iTQUW5TiN0jJCIMMH2iSzsbM8KplqaB1LBO7K9rv043QQu2UItzQFo04PcJvaMQBkOmYeeK5GXgsIqtKiyOwEmejnz5TY1fRxXpV+/EEasiUWci0C2N/jxE0wqzM+/p7fbxThNBLIH2RyTIMExccDDxv2G2mHdzutK/QPQGkS2te27HST/WlaebpBMHLIXUK1BJAawBax23aYG0ZX0tVe8Pu0TIvCUUspeke5f63IDwIFI5fXgJgwFnfr/TGcFabADGuhG7G2r6ojqOExc0kBn4096alxGgB9uuxf4GWedpksXPoShp3gttdCK3OMPqHFdRIgEvWhhmmOvt/g1Tc4PYaUnQU7w3QRhtZuOFtrKoio3I1StNwC8WfQ6Q8lFpfIiJGONPN8SJqd8OMM8DWENBU+n8fpAvMri+PWdFplnsnDenWiywpW4Jr8wDOLNS3OeehccVjPmgp2CFNH3l+Y7KOGgOdawXtF8vuMax2KiDsMS4U1QOYTMv6r8iW3DFwfg3gZyNFqs0rP3hzngl5Lcy3vn4pZc1IaIRKw39IOzllfUywGA/5QFX2dcxPhCTwqxX+icQHm9cIdvqe6oNy2QDmAgX5W7gagulonRpaApQIeSTmvPl2i36dWqnQDeTceeeqmdPWqqUh5Py+HgJJzYWc98QNhF+Ll+g+rfs4aKVQLVxjheTDxrsH0JTv35SPv0+5nN+6LmmAkXr79g4QVWr3+zxV61LrObveSeVWD+7OVk1kkYZr8bI6yPcQt0haSxYYVRlqYMpzyw8n8L9RyawKTa+lkYjZZjCWtzRD4TanAY21hpVAOIwOhBXHlsig9HJ/KcT6s0ezAvgzEAqCHD4qQI4cK9BN8gwzWk5eFOmUx+3mTd3j8xYLX8xXe22pxQhxOBkrhtdpTgnaw7MR1t8spphsFvjqQr+K/AmKJy1EFPFXfJWtvNnJhNOB2K5KVLF6MFEwK6Xb2XpjQMAHdwjDhKFN5dZfOG6OCCv5X/NlGlEyRi0rH6lyqpqy11r4V2g4pdpFOcqKbReDgyJifCPmZziMK5AIXQMl2/P8EiCRb1QKLx83DuIx2tj+N58u/ZIzBiTkzCnHfANPwe1lOkQJRWq9gDUk34Ba7FA8buT8YZZ04ZNgq9lXlBYrL1zwTFm8gWC1SbpKS09SaBa96qQ6DID3XyWPdTBv84WbPKz4V/ky3hS5rhEa38s83EuEGZ8Bs9DLfJkQOV12XEyQYLOUbEyu5m4+H/8VO98piII1PSqmdGZvAx56x0DH8yTfTFuI421grtEqAmvR30WCsOfUw0HPUDFdmb18JoktQmeLBFEge1RIn1mRMQafaIksW2CM1CdiyY7Y/an/NX93EY9fZC4Zgc/CP2UVg+ypStInvgbdPd+h7EW8+JTCgRuNxf+o9ktJ19Z4mUmgJV3JFfhClo+2DoOoftifQFab9yFecSYocX+Lp2tNiCJlJmpmQE/p2dLTo3/ncwU5l3/cA/gzRVp4565tUiYo3owEK/U3a0Ht6/Bbju786eJ730KohblBaNaBfaaX1OTwEa0X5hvV/lDoGXi4IpLW+rsyA8/UaaOtAdnDFIqqYBxlQN3SRLXEUEzjzQtJYwDedEX8nSdnb6ddgFdXhMuJHutwl9fRTQEI623BbCC7PqT/Z9nqYZyFd2lO7Sw7kvMGT37DLwKGHQX9mh++Ye5qMhBCDGGPyti5KUNAXXsuxLRjT0B4V6gNYldeY8c2wypf3gaoOWwwNpEm2p8iua1/T4WZUVLlyPLJKzlFMBRp067ydeY4ltR3IqP0B8hJSBZP/0Bxoe680/XkoWpomt6KVxHB0gmTpuCRl9kBWLzle/UzA7CSMXByAnoslmaOQqZAy2Mpsqpmg9INGhqIUvLZUnfG/ENbuS7szyBw8kbi8J/6jKN4ZC+oHed27EhWRqMO4NxCKWeTjwTTjon9jVExXJbDkhVhi66Z6TcD97jTmiF66S0yF5VOZPX61Um0XZSagzg2ddcs+pfd/RqACb0DK17KJg+kf9AkCoZGLiXGxn0g+9qqxR4tNes5ZKPRA76l9btkXjveHKKAQPvmWaDY55R3kXgxHxeWJCUKwytVvLWTVEUAYtMRYtPZ9S7EKQmI/Yvx0pdWeohGLSX6ai+HR3XyMXGqaJK4YSq9hkSE9lGzTTWiQ0wKbAY1MRLQ6UpAb6wDFf5hEljxGMM2sXPjrHaXixkZLctKs8MSsDjcFH344F1gvp7i2ya+WOjdwGVDwHJNHiFobPzrmvi8ukAz4V4+u0XE7EVBWl8nq4ChG8O0NsauVPwzmICpK3nUvjtpfEgnJpROw1gVZqPGOKXgIW64BzfswsJc6f6EQcsqX6O5fP/u1nGM0OHD6Zg7Bz+RHjN7L2bG+DKzX4CqBnDKs7RODLmdldexCQGleoj9o/Kdcx9ghnyi7/t4KmrHFKIjWdSWdZKaSnhZbCDJeGlqhs++/RuxLHRLKx+NCBPW6jwprsc0f9HQsQJJOnhRbt+zDcC2SdE6C+HRUdW3GSikfuYyh44le7CbO47BG9PKBHYoL25e96Vpe3ljJPcc89vyUqAYsfDubW1BUUEE/algOv7+PQOG8QwH/ttHv2eaNkNZ1oTIUPznSteLrQd6fTJX3ULqC+fpTc2PyvcQq29Vu3hVVXfBneqFvxCmi3rwn8BGFZnFiAIAon3qm5/WNBsItzeYQ7dggCFBk5sI2D8youGWxEwrr4+UEP/P+ee/W/k/T07Oj0AHhlJY5uQaEKgNnOBmfXpNTtM4yhZ1yuVVh3bubf7o2PbqWFebuvtk7r12WuL83kqWN+VOmCyldgtgPUA8wt2KleGQcFjtaQNXjCSSjOoe5A4GqFCm43wCtP3a/9aX7bk1pyXoVIYEf7kJhmtCL8ZthV3MXw5zMSQCeRgLTwJh3/el/H8pW13v3gVX3kgILp92uJi92iMkb3LIvtsKM3WDMBhRZ3o8MW10g1DxIgDKxwl21Sw8lJZQ3T5AFzp8X0dfq2UqFbCL4Wdmskh1t8RTZ8HJcjHYI8oDlLcfl+u4SS9OVLG9+nJgHCT2+ei1VYsBqQOsOnFRLd0Agmf4X6eorn5x7X2DM3bT9/dI3YEp2u0Ys4r5XWrZDHZ4eRDdGXn60PdmEPeu68FRDkW7Qh+roObW1ONtakxyuW+O9+NGwb+Q1iYR+by44LzBtPL6kELiVSDhWTWLYn/DH5AuhS930E1y2sILHtYmikeomhZb0MGfC2MuwdtSE7DDPRPZtZ5YJVw0cqgPxT2O5agPBxpzkc7eamnIsSRjWCeE5Vq+h1LYgE9NtY6d5ZRjLr+mVxp1Ar3v8+aRqGzjYhfEKgJaWmGI/PDuWYr2wD8P5IeNUn/Bl2YZclMesZpS9YftEp729sSOBH34THyeXavr1zu4cXQlfAln1B5aLgU/I/I7ig0Bwo0h7XxnFa2SxQkjy3WzmBRwXXqyfZh9WKd4rLUc2sKvsaeY1Jg6stWX4mX5MgYaF3DjolxK9v7cAml/SDxxCZYyO6SHMxif/EnL5pJPWdrXeS/e5wXbYkDi7E068/dDxdNb2p7rpQRMRTNPSQDlNL5UzaKD9Z51f2l0ZFSCAayxUl/6Mvh407TSaw3RsdnxkCAykhFfn4pq/4azyut0zf03RlfuGJI+SYWg6jvNSdyyrUllFsPxqB1tRDBKDAmvaLWKKB/1b5AgAgLa0fZcPtPbl5G9T02pGozcU7I0nSTBvIYxDvy1x8Soit9dTgFoZZL62WWlNrg8Jg6RnnChRUk/E5PLq2bkTxupEtKuNnGAKfEim7bUAjkwJKe13c+vHnLfWUoalgCgogLABVH3KpxjyIFqIBp6jiT/8hMB9yfQTIZzrUnOxEqP7Wu1OT+i2/wTVDoIsuLH2I60FC1kC+tb13/I55EEWWdxzdY2qIgVwEOVkjIA0nJkIkLZp5Sue7d/aA/qC5ObbavhuGKGZYILBArsRzuk6z6hKl0+39H6YcdnnCcm/snPeUNtxStK37gIQH4tKx2kriKAwDgQnwq/IwHwUSc3hQ9dRccN+ilGtoaCY6ohIUykwOEG4XKDD6NzhtWl9i/6pA49Xrq4fC2Udn1ecxrVReq3PM7TK2RYCNDqLWCtUV4vJVCyY8Avf8sRCVKAn3uXdRzKJCZIdIQzBmBGMDdB9wRuaLbhpOCZgxtWqQ8z0mT+DP2B6a9aR+P/PTcDxHEXwlqqmZc6boVWLHTxWvyEomw35IfLnXou/ZdxEyV2Cqr8MEXfbjGTAA4KEeQtciELhprD8oOWYT3iFw+nJHQVNz31kStQvp2WO/gUko5QU+hwGXyRJ/UsYVE+SA1uayZ6QlxWWNXUw1SyWlvenrH2PLChNoHhOkBzX9mbVGUlpbfUS/rjHLpZ5OjD/VdsGMUGzSoitBLLJqpI4/dDQLvYUxMiMxNSSPnXmeP9QMPjv86ASmE0/cRMOSh5KoTFx8IhLZP/7mS56bsQ9F/5uveCjxcMpX+OpdY+MuQifnTXK7I4BryAm4Bjw0Kg2XHh2rghMRPOYsIECVbcj6pXcmwIQSYbF7QTzT3lFyoA2C8Nak/bc1QP1B/oZ+2/Iad/8Exw9B09ay/x0MSI1R4Y7Md9NWP9+MVz9Jkg8FUnTQ2rBKjOZQX70cOzXZ74ggrx+BzHra+9M5+VAWBoE7oDN1/c5cJKaYCfIPaolhyS3xIwuRfjGL6OaZHdLlRvcYBRlI1K/G2E2GpUTYY/wgVoehfCqY8pZ4UDTsFhU1GOC+N+uxiS9JoQI1+FyDMsgb7rJZO/CVMv6o69iKnPaxPaCt5+c2Dad33dQCAopMdsN2cItE2/tRAw1yNg7nVB6jMI/87cW/L6RF7aQdYj3aj0mNmOp11Hpg7uXyg7WogCJuY0CdhHOUZzsuBVZ2SuutvKRagv55Zm6sNWRhIDtOgnZy8XbEu5UtyvyNRc7qTQHBEdYiNwC54IX8Yj3WycAn5oNk1So6Uesfnti9OP/FrqhBLNm/9HVzYc11WhwG89avztTdyeGv5W0BZCYzSrQOHkca3EPdaTF7mnHr5m1KJiRytPACXdpcGrmuiGXIiJQMK7LWbQwkuJ4bVP1KsuoB6N25vHQhRANFTqYmtg7pCHnwx0S5qVVBjzynrSIV/IH33J7+z+VnW0cMnfHmah6chzLSuRk3gJNIyWdVWLHUbDn5ltgKX1eehfNRF8cEhhXOMj6K3lf4zzBEcFxb17JBi2r1Q7nhOPCGytjWedKFth/j3hm4t59ptjIV2A3Jq8VkaBqYGxnr4PTB+drLFYImAk7WbiqY3A0cMiNPAI9UKz+rmLtLea9oelJ0Aw49AlmN++MdC94NBmphrDdQKz4PF+ejnu+HqFqDrETUQiyB/Q4hJmu4BG8CYV1VKP5EXwLZGzQgMRee5PgGOAvnoIzP7dRGjBTkJmfMT/TghPylI7liIUnb3+9ZtOvBJK7Ji/DtCGR4LqIh8p9zE/5J6qDWiq/WZb766xKTtuh+hXjFoHYc4ksC9cNADD98lVrKM3GyrzTgaSRjLSD9MsXNv85LQNGM44eWU2zBh7w4QDOSVCr6vR7SfcyK3sAFZTjmUiBRvngQ7fessaBGmfhOt6X2qOSfHlDCVg/kBokjQoJGbwx8c36TRMd66/QEAze85yotlXIyy7I1PKUIzc69yO2mQ7Ug14zdug5E8sGAcuaNvPiIPBXHpO5MlSs61k3UmKJYxQI5qJb39fT/IBnyzKJTRkS4DnNfj7U95XtI6ePkO6+1TKPozrLNs8exJ44Lmu8buiUJJ6p1W9NqaHB9zmsY2bTUff3K4veCGXQMwMZhKIA9DVUHJq4k2IPjg13iOIlaCcFwAS3Zq/OZTa+wMPQsFiYw6iw+dfsiJXYguKWTzsip+PKfHpBJpJ2kVEW75O4NtARb32IpxRScSxTnfql9aa10F/TBWTmnVtOLvbXVXOnGel6My2Vw/yXv5eUNxxl+63hZY4mfZeqDFFwNn0e6awS3zuapdG3edbPJJD25ieZ2yDswG8aGudMYdt72I4Al1iSlT8LhfzvhERJXyTQA4Cj10U+JAzlw1fKAvOPGta5QBQiU6tBAnfKkFTsP5E3mG0jJ1BzJn1GtrKkwQ2SXn6IGAjKrsNH1DfIxXo8YtlT65gVC7QyeQjpb8uVCU2KUIrmW759BNhQpp/SOFhAzFz7eoL9Ns7URW1Y4ikDOOmniMDaIYptSR8GFmcUsLiaH8dEq0BozKKnD0loFm5YMvH8OkXmeabOvEQ2eN0KrIDBOq6W5xlsKzOVwwk/S3v0sNt/oiHzbGrD40FsDgTECpKuk0p2WPLjCCQvvtg9cMYoi1m9MnoHJdxP7dLmtZ9SFLntPnVeQ0cVvbzQ5h8zvH87rz2H/zkTrZ80zvrXJo+6Apa5cKirsAxzmpW0YSoPjCR7UKC/UtE3inhqr/SiiNqE+a5TpwDApYGMidUXwyMcqOTEvecZWR2J3lvHb4kNpI0qlJYDkraybyf04TP+kX6Vq593KIzJvVx0T6d8P/80p5iBja/1Yeb1Y6HGb2B2CcS3kaWNXEEQuyAa7GaQUhKSGDSIYl/P7T+sco6qOk612CIT/HJsNfB3tAyOdPkXy5ckI4Gr9b+D/DOZbRQKkw2HwVXSMZLi1VFvgmRjakmIvpCJzhWvF04HbI4jICFwRKSH2Yv6rMpQD057o4v5UzWnm8HLaFCN7fvm0m72BBoVbwfn/ZGtUvGg+1ZNkpfmk85nS22+2YkJNYyQFoSIDKpi50/4JyulgFWZ29MaXnzVvAD0eLGuYiM20e6ZQZUEZ95n3aadVoXgyd8dGu/b4zJCYSk0CcSOhJQJZyeOApSmoFeskD0deSqNBOuwiwDYNVr2TvgqqHNWG4FPeOOVpRw+cJCR/EgssP6C1uGu8Y590aPhjGND19aACfbr7dEvoM0bo/ImRTQZy3ayplHLz/sp/c3F3L6MFXg//TqIoQ7/jej+VUpOZgnwG/YoentTvca8xQt5QyRNgme4A7uYVRiEXElSHzFLNxvjxReuGm91HF9nd9P4d1K/dhG8l9Jj79rZJggjKlOaknftb39rCLQvfqWI/+YW7HNPKJ7VrplMmgtEAL5+rpZmnJmYgpBBSb9qJk9CuNvVKte9UVSbLKvtYThC0Vull3Cd9+zj2K0tuvS6YqseMtPRgxZsRKSVpDsxmF9sSuONVP2NXmFHQekNiS5b41Q3RLF+GlPLiDg3t2KD0Cu3u5E3PLypzFit7wnLTvMGcFOtK1LElXcns5lCkoKKRbqQKcDlUhA+FvasdU8mR5SgeVCAAwa8lcnFQU68v8Sblsd00I0j515N9DU5+zT3mTkUQCYtwfxkHeJ38pnlSM3r+kIiU0d9z9VWHWqrAAVyHNhVY5dAYR4qeo6Gdv7ksMyiNHuiHIHRdelqbQWoqsGKc0bzsbHaaQqTIJg1AOaMqtWsEfw2Fs+u6aRIVb6rd/KMhDzWSdfQL9GDfWSw+GYznUS+IycABZzA42uuD5eGAJeuVJaQcZxAj+4eZ7X1zYqvTJhFdFWHYzBfSXXXA2wMXplcUN2UTWgClAt9GupviZAd38LO1oc+NVVClgUY5V+ltvKV2wUVN4tj8gKnR3R1F4YHPVfil7sTzd6bbJlGt42vBZ658cY5sRwcUAJM8uneuFFVT7KSeCA247/Mtmi+O5lckVGJHy+rIM0IdStlGFOX1yk0wJ9zr2lZl3U5Lg17iAPFOkyzde/NWGMyfHcqPE+mJX4ABx/FjvdjtSpZFuIKxGeSU3aUtG2hIOCCvxbzr9s6jBGqaDVTaaobRRCe+p6celXP/Hb3QPlhILnPWtdD4+STJ9Q1ruu39SqFhvAWXBM52TU6bo8eM2cIessvUaOXagb97XV5OK+p6fsHJOOwcTagDhK/rWlYjoqeAUVLI2VHWkarJA9jvt6FYyqOwL9laF0/20YYqQDPn8Q+erYTdGxY6ZcH8QeGOdMhMHucKO53TDxdV5CdHd2rdtUQvczWdVr2/WpDhSWe8Lti93kVsXKtQTpgFwuYXIA+wdSFm3OHkkse7c8FrVp0UZK0CjLj9pEu34Du1+DZ1Wzd/SNWEWAOgSCDNs02k/Ha5mLQKwBWamnSlhBo3rMef2k4xbLUqVdoG/9Xi6i/D9NeCSOcWA9mn68HfH5N0Unwp1RdD61iP4HUD+6RSFM1HiDbmwlfwUN9nM16M7HgrcZN8vUIoLqI2o04mrvdu9nRsFIxadOBeJwb5VKjVgQiwDUBdkiTP+2nYKEcoE7bJwh8c5ILVJMTFgrzTepoyh69fwlHDE7IK9Qu16naeM1AIK0hmsfoPdJ3klfC3WQeYYhmxdNKmgjtOVCsAUA5GBk2F8cLxIW8xPFFqMh9FRJbqvpaH1l/2ek+gl+HV3gRhjYPfaFuUb6B3S9Y8rPpZzoOYmuID2NpOA+t99W46K+3BzExnnlnWar81WprpVvR3UY13Sft2CIsLblkxOtksn7ZsFO7NuJqdgqYCscsdtBCYRkqbHHDtWu1h7VUih1RS7uRpTkYndhU6EgonpsSlE20OBLMRhkdJbwsqd2xpb81/wxRx56UfkaDbGJbNgOQFm/pmLub0r/m0SA2R9nTET5GiBqvkbpj9D//ftiGiWHMfYtac6gTHIgJIY3GCIF+KTH+cdV1YRUoWz90Ifp1VTO/IdBFRV4vWZqvQQ1UfhREwvy+wL7wgRi+TvTFapG2OHngUqZrgJPQKurOzb2R7cdVOlGCtbROTA23lY5uAE7dW9xcm5tAj1lAXaJ8vxvVjlHK9+LmBBpZa4EJ9kn/WKp/SHfDzSAIBAy0n+Pu8BxERGbRT4EmAAhavxk+EprlAGTQQwg7uEw1icep/fO9pzmZfNIDHsUXZF3vgdnOdKmwuxM2gjSKYcODpzDIWzUbR43ltkNaYONjmvpnSd0oM9bOTHt5j1G5Z9ZV1cqDmOW0ShDlQLbxP6P45G+JbcH4GplYKvz4iowtwo2i8E0oAWKKJRdm3M0Yu2WAPSJq1mf6JrRv0cZpNimG2YBSFJFcRdxOhAAdvWuAG+C3ITuW3bd+toYBQXSqjhjpQYcXHJyqmKw869WBX4EbEji2utQaH0Vm9tWsuMS272HCIEkkMS4bXQYE7AKk39x35gz4snIWQNgWRfJDrx8hewYzvfm4Uq5zD4AorUZYqyfHphbxrWPGUvSwP+4BNe3ulXLi2r0DfioZkbhFV282cyHgJSR+6FbOdeQ4S4c19h+PKByq1uXDRSXC7FGpLj5eQFJg7/0hRJXAhxXZ9+CHnQjp7jqGbwDJm0P/BcF0U67e0DJrFxFciREgoPhbfWitArVGC7xf/P0nNHxnMQrn5ZtmVO/5wH79t6ZCTaiTvLdMMyHML8ymubVWkG9ncX+1ywARre/Tfo+5IUvA9xb6lwG3F3kKHv/BkBBQjhH9sgNLxNck/k8PiXy5CJ/66AMskUEaMRJMAFfz+qdwlaBeuutGRjBuXpdR4pFPrKHmmYfQhaOLpiqVw/zhAEMIyhlXKPj1vPqI46Vwipou8MBnb8gzVxSwc9YSHMPBj21VlMLZkwSbkAuwdIIkB+eNfvTsL6Kow3DRrl3VEdamoTFBD3CZigeaXlrYtCazdjXSQ+UxBECLqE85dUz3Qh7uhC0sbWhLk96sE4pnrFn3DPoYhC/2aqX90sFZH21drBs75VrZGrGRw96FimVnkw8O06hYfqOInQPbbKQdBXD/i0cF1SxXtjMzUJWtE1VBoAUiTtX8wCzEMzzoTf4vODBgWNX1bVrcoXi0d4zE3mTlO+4gRm9Bea1ACC/cyGIyKRivrTd/pZFET47iGVWMHgJnENDxCzoKuWFbXFCsrDFKKjr3PS4S3UgJ/3tO68mF51vnkeSxf1uABwwD+D2Nh5pf0YscnFkUklE7SpbyJzRSj6NOqHwb4vJkHsFtXjDBUukvpv43zwB9LLwBR1mnvikG3a+r5/lzMDOtJBI3eeD8OoSJw/QpfDVJdk3efVQpwmD6HHI2GUtkPj6Ib4unb88jnB9wZ+lN1YZjvcOPZWUehjSvyjoq/+nZTodlPnkwLpm7Rgl/08w56RcMdn7ch047DhpLx1QIVaVCMClz9k/mqfDibmhkfz9laaWCNbxApnRgKFtxI7Vp1XzyYnIXXDCdfidsWJRqQLw2hjcB566RHVpr8vx8AdlWCBTwdjzRKqTwC5RKJJLyEf+AHhLP0uyCPTwLrpqFsCZUyN16QF3Ue3UuRUcAlEBIWaBpDPlkHNOQyPh8LGedzA5XewYFiMy7FF7MBHlqk0Y7WW2jTzRh2OuASh3Jh4rrxgyYFIEkVnQJxZud11qjaN07+EjX2uMh1L6f/bPOSBvbuatkeWluk6N4JFytj9z2PCkU/OO8A4keCwssMj4Io5XaAJxgdWJoZbC7Tj/bziKp/blAjuS4vDndzW1PDdGZ2H4gQvhXChQAFnOctiQGCO5U7W1mlP1t+aP+LXHvykvETATDoOL0hnj4IWTBDJm7/XNX/KGxPmuf0pVnXZ08CoklGMSjaxk9elKRloLmjebt6NT7flbmMprU9kpzJIFofT2I8Jp61bEtXx8gSY7XRMkr0JCKraWGhE62bztRbcTXUk73UHEiOFuDEZe3NvA0KIeAe3mKsWfJOzdlfAkyH1w+btnHw/U8fRmyHJR5KcLFSxq0vSK8/dCj6+7YEU0GB8SW+afmXmS3AlT260CzxMlc1yxgCxqvDdUdk/zEoHSLhNxW0oqVULK93rRXzJHafBtRfKs2cB1dKkvrinHB+qH3m1182f6QX0KPanpQdPXBLBeLlrHwWuHuoja4zWvpPYrTy7s4r9FV9zZuyHKdqb0Wp3S26oqOXb3IlZoZG1DfLEXmOah6M6hAa/bWt6lF7kd2xMHwH+4qn17QB2YHHiDX4O1PGJU0bAl+DVyXr2+C2hp15lhsWSrQ+GSB2gyNSLqPie37lwbRpfFYZSvBFAkdtXolaeptvAiLM7/LuzKF8mA/KGP+GzlqZ1iDN28lNSmYYFHv/iQWItHwRzfBGJXtaS1im9E0y3n+SiW6OYg80xcs4h0Q8iGr4CbaBABNZly/ig8NrBC49tXFoWZVaEnP3MEu6zZ6QrmSZkBCDGb5fZDpBQlUI2ecBoPxoI4lIak3y0EjnEVACsjnfP1XU8BSpobOqZRZi/LEbIKNGnL2XL9uf7cP2U25oq3qne9ud6MCcqC7SHbsYYBq9CH+jvKmFkbwlEz0Pqbd0gKKiCuibvJnxoD0irPL1Myg8KnqexD+pfucUchtH9jzj/xzXvERbsCMq9yMw8ipKB3cfRxfa5HTmUNapyXuzIJekjOrK856oU/jEgD9Sy/P8SZ8X5Gy/bp/Wl6uI1LslePH3ziYYu4HkOeWPoG/5QsfvVn6xpxCn6A2TycL2owell/EUskdLlgAsNUsRwaqtj6C2x5mptow8hwWUadoK9wB6eykE1vYRd2aCt0hSIuhWdNAVRZwp8aucK7fLwZ+N1j2fucrfQ/6ilFfgckOKRX4vcyBWqsqceWCach4pfPk4GHY6Iav1zvaX5RVxKGfokc7a2tjqNdpQit4GtzgnNx+SOD80Hy+tDdv4kQHw8rlNI/8CooD4Nm+wiuntHg+CydNXDtbViCuAZl1Yc2SveZKTyTf4uSf6qRnDnEN7cjk6hUx2HdvdyMF7UMb+N34CiFiRbEsQJoeeqUDRWc1Hrrd4ktOEWEH6uuqgtXBg/NPldXarew72JMjS/LZX8EdhUECQZDko7hpOe0vtnNyyefV2R7QtfgJOn/5GlxGBMIWgII+JBxcNpkjngy++p7e4BUDMbKqjKg4vpzu2I4rl66vZFqsrkvyhlEC3iICBYoBcVJnM3EqEsglKIU5nTQVvEuUbITEsr34ALWaQG9rmVr7kDsxArFSOu4ZR8ml5HnhtV8SEZD8SCxwrmqGcvmK7DYZZG5+vVLuluRjommJQVaFAZrSFV22+xXconnJuPfPw6Tef8eXdjFlB4Gsm6iAT2fhHiWgh8I34FWs4d/ATeM5s5rlCKqTYwYNA8LWwgqQbrYMSkQrKQ5Sn47Z3/0WhrF3EQ9kN75x2ldQ787wIvokSg7gFPd/Le1lGqPwBWBxlfIf0Ijs9PqdCSnh6vS5G/vP1LSgq51HX3GW4e+GIQdkvHp1WZ6kxGGeqXQFbZE35vQrUVss7TGml/pMc3tcg5wGiOz0ujIGCfoUAmQ9fk+0hvRs/EO7xd3KVcmQa7VNaYFlaQBcBHXyruCyosp5pT8pg1pIhFuey7pS2nA5cR07iW6e3/bd7N8l2BnpMQ0Z7y5z/62LWI+MgQxVhYSGgquvD7yiso2YTy0K2Me5gy/4pIY/fOdI76eOf1fPWtKJGk93y0UDb9fYW1QVpx+CdtdaUQuI1h/EoDjQ3KOBOFaqG1ZLEmQZStMY40f+GCW5eU/PCLo7DFT60GrUiz2UklAYvAekyJ6RaaJC0q5KAXcq8G3UJnDLfCzdX8qpf+rh4rjWqaesmZ0pEskSrkz+t3/4C7+pLGyiaXSMRzfpTamKmlJ4rYvuU9aAIHzwODMZnd7BRMa0q9IVaa5w55twqqkgi6ZEp3HK0CEwgQpUK5ELDuwahzqaPIVw48Iq28fiIkUHjOfSjTu6NnbkJj2jd35O6nLFMAmM86lfjdDQuBqKVLvzoZ1vD5e45ZSfwAwStzKZyIIkmVPsH2hUAq638X9ceLEHSQBwjX8pW9H5k2NEWzZpC2xpqy4L0PmzY2DzacooJwa6nvUWCF7mMud4h668xPwjWoILL/hhoHZ7EPJyVKcN1VmNSp569ZRVuYlwfYDkRnimOgD/d41ewQb3ul8nGWcyiSvdXQPFl+elva4W/7Z3CRAhVGJtuXUr8xRbQOVf5h5R3KWyIbdQiJ0+7G78ciuAZbKzixA9fXIYLnhlweA1b2rTy43CXpnKINYl+PfRVd9zqJPdXNB58RJxJ7cBD5Z0upLkJJ0tQBp4ES4vcAiS0Ea6AwUqAxGnxV97VsFU3cZigs8dmTO6+j+fbLo0MF3tYyiAkk8D4wkkPyQ0vSYGgS2w8gpkCeOLTCSbbSiAI8FCL7SR6J7ZPqKRSoWIzzdk5zAJtw2VRydWHZ9gxpf1DQAQqBegLLTXA0JN62UpIlCF1LUZIvIsCwFDJYs+dYoTBskjnoB9JAPwJ8gecwXfWUUmxl3vodScQ96pT1OPXBLOyGzy+D93FlWHOSudxmLDO7qXmfep1YfsENVlxeVoUEOfYCCq6yYZ8zdTnBBEkk5jqC5wMb0LMM/JPPJZIoLF1Pzl0hy1Z3F57M98p/9F7q2ZGe8Fp9Hr3gmyIDCmUZswdOxqNV8Jsic5BV2Kx4fbFOg4Ajcx9UkFneCBNBrowCXSoBDeM7HK4vj1CicMQG6o/A/AmSJmAeJkDU9Sg5YeRaauplS2cG400N+ut2dLZIOqap6+9iuN9xTCMzeDjN+4QXqMplup6JPYuHP424RIbCNiTl3oyA4SYzC2MQdN2KuhzDjZS6h9R1wKTVIDOtgifAtyvj3iajFrNBWwi4bGZ2j0adndmTtLYEAyjKHit95+l+fmhHs4e9bzh79pJztLIvWAfZHmqHZ8e7TsNHcxgPPe8eeK4XSkg6XD7NBjfdz/+acz8OnGDgzQW+3SOXCVABOWzLEOW2oYDTZTkoh35X9lp0LUPOOnZu/FUIPPEpSnmIBiADjcCHS58v0I/vzir7hBjfi0fxLnhz69xBSo9C/1NQB89XNJCut0IGTnH5lJuloYkYsl8wqKU0iGtei7gkmAJonHOcrrNmfkMizLCmjYeclOF3WS/55vQBWf41yUt9Q0m7gYVRPfD5/zxdzO1/xQybMBFGvtWKeq8v3sAq0rhtomQWdhsBrPWdKQbVTytCskc+jpaIVrQHO0w2EfyICIgV67CpXLMM3zgJuU38/m8O5zj1tpAIUuE7Me9vBAC/KSZb34MdOtc6A9aJJbuD5NjNaT3apXla2bXs8baRznPfSsZ+aPw2aU9A9K6p8izvT8/gbdlnBGdedAR/T/FkJNI5wwF2xTIhr/u4V720NtYBqG/ruBjy3MgvXhgmtREB/Psx+GWzWI/ikPEAmquXUigKi63/lv5YRWr/upTkcsZ/mughZvQ0uY5FgEB5w0j1CUsv3f9pgBUrmMUOTSwAMV0scgBfYZ0i2XVK3cPe2WU+VaIRkG+zssadOp4u1/Kg3OBMPmKvLJFoLHWVqwWY+hdv8UIVJTkYuq6s/YFDgUW6zjiKmFryyw1YN1jp1iLrg61QgpKIIGln3MquiY9C5+/5cU+KCD5v9RgNw7xl46GKfZcsnfl60NM7jsZssgkik/9UxqyPxzRNBfnlYJWU4oZSusWPtUAjKi8N6LsgsNZ6SNowwaqh7ZWS2VlID9Q+Jfmk/0x8KX09JhTTh8EfW8A+uM8wI89YLSWlx4EfUzMP6XCVTUTQ000WOjBKUjN3zBXP28GjMSI1SYfXhSnFcvATQ7fjOoqnXVdAS9hwjU6kb2unLqJdafmSZXMDAdqCROEaONT2DinWA3v0jP6mXBHKMDQrU5wuw5GSlmwUfCIy3TzjKyiRoIASa8mjTewJ63pltDsQlY7uYkBzCJQZN9UqfYIl9pMDw25ySYvKQ53+Bu1PomAnF63VW6w68z3JDhvtWv6MLDj4SbQ1tmEPyqExT1HpF29egNKlsSu2A8d6B0eBbenB6REkbZ0ueYaUGLLCol4vfctWaAXwuKQr2GzuAr92c2PGyLZgy4RwW8rPCzQ7DVy+r4CKuKKUK/+ssRGhmJySylk1eFA5XWLD2zT/rZrS0I1KUe5g5pNIQTHLpk89bPvwoIC8/oeL1Lw+R2AMomZcQ9WiVqsAvm/9pNln7gzl+0h6x1vvoVJSe/7jrZRK7CB+qSAcqb55d6VIp+fLvO3zDzxuZAU8l6DiPCMj71PKVazilPCkcUagBC1JLoRpTO08WgocJQCdLvN+GJ1zWcx00dUzuUpTjrmxCipRLQHEGLZsOL9ZOKL0N488GX4BxrG4lbCMSSiwvtoQvrgBtSdQ0aRCux1y9KKvJXDHxsmJLJJP0KLsc45M/CMGCSlL3Y2wqvNYklIxuQNb5IqLEpifLAB4aimsNmVEnnLT0lVzME8MieB6WUAgzdjLZWZfTdOqyCxA/0Kvg4S1gM9X6wKHO0lQ9odXwcQRFH6K/u5gkifkCEl5FWRGmYMUMRH+FggqdLrFqof221dchOWGoHxQcaFkB9RF0wpRFYhBWujNuI5n8vSvZy/gqGmlwNFjibU1/3cJQRF8XSWIvuDJwnr3zv+zQOAD7PIm51N7P+7AOI4lqp0OsqcSaCw8Y90hi3H32DAXpqnPE87vg9VrtzK0o2IDBjYa4Ow+P4FtFvJxaSn8zq5U5Dd9VXSisZSByW4G03WNKGi0v2dZJSVnQuW/M06pbtVgjJsIPAm1p5REoqwVtZy4Ze6BPMQ3oON2qyyeXeTmJZiK3+8di7IemLmpxtesGAXBI4NUSt5k0/DdyCntZJ7CyKkgpXhtbJ4B9xNte8up+2VL4d9dLqJ7lVHntgpj/Xk6C3aAg543UvykV0oLH0SkAEzwQ9e4OGn4neZDuWy9q+PreaH7dTmo4Mlt+p7WtUXbvrrz6263ZfObCjj74q2hizx/fzlCDSlxVwdFRBuxNHm0rSVC2ycSjfpU5JnluTk/WMbXJbhyWHgxm/wz/BIQ08uyYuKAd+BSMj+G/JZZj8zGC8t4WoIywA3c4HfNemkUcGAwwcrkFY2R/AThH2zu9fphuNYadINnMWfTFKbHTkwJvGuQhbWlaxvRW6+4xtb2H8mQlpicMWTpW5oBVLlAlgTV/RmUYqIfxDICT7GEbERkM3yPTVQLyUI+Zyg5Xg5svUlygT8QzWArv/+s3q00GNUKNn7S15RrFfTj2doXrcJw3VOFGqLl3s9hiDZ0aSr1FBeOtVOi5qM/u91KP81BsaXgTsJJSCeLghqTn6ONYSou17pPMYG9kGlzoVygKsuOlaUGFdov9IJ/4wSljHVfkW5v6N1hhHigOInc75NqO67uPedNXjlXHNpP10wuoO3uAvyYWEp9pN4fUR54OG2oXQhoVnxf4etNtJNZMQPMAo8I/YLz+NOiELiKD9YUZosKY1Iw8AxtFCXU4OdjvZ8K0RtDLFAwCZeKh4R5vAX5IkL6i1L2nCMymOXbmZWLWmeZaZUfwUvh0eQl26cvjU0JwT3I8SCb3U6u009OBFIj5e+XEfRLP0nLLlQZIEHfSSlJPPalH/aV7nALDzd/BBRjBNGU9nmFTCdazljo7I1fL3to96dQNwPNfmNdbYZu0zr+RlgiZ7ldkfpWApt6uNRyMtqSvR08YwlGXtJnPF/VYZXzvu8nR+9D32a33Ef0FbQQg/ulgRv1OgP131CrrGyzyIaupz7DWNfnVZJAJlmI37BULHcIhsKMEhwhnvxKmN1PO9XVQaKR8MQ7yW5hefgi69g4pxgOHzEpt0NKgRIlsWsu5wMMkaUAzac9I6Viyk9KnUNe4FoDj4sRVcd+5P9WYFbmSmlgsq0gYTYxDPCxqfSKlwELOSmGzOg4jdji1CUM7JAfr6vD6nJZ0Vw6PXwUh0hkzl/C9gCI5bF5wP1Db3fUfk1oUafi+Jhl09g9jLaSkY1skJrVxBQ3D5DAZcIZAT88My8VK0EeYAEnKlmtUyl7J//WBRTE4kRw/Yuczm1EftJqm7Rt49TaIdGqAW0rPIv2/NR6KpYvqGlhDOaqHSyn22FVvOnzSj0seaFGUWkHAR1mgxZ0+X2icyYM6GbkpvhbxPLWR1xwfo1KO1cesL3v56Xph6u1/jCC5+XnnwjWPf8r59zeemR4LVTebjawlGyD/b4ju225jDN5oTBUW7B/SGY5UtJ4hALLti7Het0AaulScC/zxYJEcRL9Yp49EvlGAHm4Y/qFN9OUBvKOHYLg30ue3yJ3zmqz32720mayhudBTP6SKsakWOoK3iwtL5GbyFe64KHFftjlC3h2Q3WboQh9828asuyGJ5zdlSZmLQLq5ZpdHqMv/X581REFPA4V99q89ssZu/x+xxnW+CjNxm4RD5sDI/TdBqOQ4bI/xQEv8DG9wPVJW1048+ARYqn/13CpJ4joeoeHg88eqwwvZwOoylXZ/fKNb/OP6CRv6/ABBj/iA+sosFEcB4SKKHSrpjMkf428Uw4e416ZWA801ELIU7wbHSVXjS0iRj/BOnXE5iFmE3okr7pDA61oz/WmiqK5H6jifYHnicVGb9kD/fbPN5F76m8n7XDYiajXe3/6TzJYlWFOeWPkRauMb8XsEXB2URjGDLF+Qcj0oF1HjHJLb40Yk8pj+yNn4gyM+6yKr/m299lePdYh9wIu18cv4P3k55V1UzuPR4PuHUEUQgv+8+rseRwlxK68apqDKUYlYXvxlNdrfRRWGgyetWCYTAoxB06pEIhvmQ8C7nsIW/9OFS393m542slEK3WP4GS0NEUAb6PY8ws3aZGvthBx+nvKgKG2eL2D49pLB4DIkcO0nm8hMQ6gf2CWUmjBKWTbcsE9g15dkiY2aqdlnXJqBS8ANuX+g2PmF6ryCuBB/2auBZ4kJoR3C8HJ5D7/NpiRjBvdk7p48qvk3oDQfxVN2W5Iktad4zCylmURRDJ0M57HsYsqMpXCCXttPnUfOsJvb0Y1iXkDd2guWjZq5sdBxzixW0+UFwSKoLMqwKQagf/YGFNZKWaG8yCOF4Jk4htMyrvosLadZdmSUdXLLdM1ElKUCWBihPg8ccvuLMrJKqlusFkGPLLr6nUgn8tEvWaQKX8aRaoI35vNQW7mlcmWS6vmcCqg4eAQGplArE1Kr5D8kyH/ViuraonUf4gu1VjzekOCW4UkqKceuRZ8UrBMAlxwdaCu3gGjH/3F25aKqeA/1GzbOy5xPmLSv+rwsDYJY9YjTXEcwxmAWqXAOiY/XQNDNjX1zfC5JJLzVWMJUBu1nMAA6WjrIJk9jKaXX6KtRcVu0+KMJ4Pj9LVNBUrZM5Q9O03scruAJBuO/7xtd0EiUt2ngPzXO025bb13HZktWMtJt6mauNpZ/3ZnL+bLDk60vwqiGAuah3bL8PdFNrtsf4yH0r1ghfpdlvanp92+8b6o68THLnuIo54UvHuWYyn5oiYLCk7NmBnPVgEnEdftUmkkH1Ypn5g02mbC9+O15n+/taCqEkymxF2Jc1Iygm6rocckhv8F1OGlPoE3L+YTPx1YXZ73cyDotyFxBKVS4Uhf7b++9PhaDqr35qk8Y3/ScqAUfFpmylWDbFEXFRNRy6oeKDFMU+R4tt2Vi+jqnqMcHwTBpOupoFmXHV2PEodSXjSuagDkkiY4vRJ+KIYlwoDixE7CpLqA/QwwLP/JECFM99QJrSdTfn/7wBYdUKhq7k9AxkPiqnQw4UBbKFTFvPRfSz1zVtg9hCnknGJJpyz86voRZs7Z5Ncl2zH4GhTX3uxssnfGEuKycpUUm7+eWHVeFB6c+icJc73HiyocZVzHgXPg97iU3TbC9v3EwoQNwGUq4ZiwDQyCcZdqT9g+3oWliemF2HOcKNlXJjQ155fsg2Mm/UyqFuQTbNYM4KxyMosRPsSc5suwQpyaI6G59fruuds2mG7bJPOH8m5ClFXhdu/hiDL6mYEnY6583tqaq6dXzhp8XeP7v9d2oGgUb/obQHWEblqnZNu1/+5XtFKH5gg04h8YOSZUZ/YdontNVAyTzguQifAsQKhodvWwlgzAqlxJBGYT56c+k7UthMJE5uoV+T10H4Ke5vzUQX+CjtEMKH/M5RRIok0hf6/N89GOJ4FkiaUnXHJnMA68j+8XUvQpOa5o13pkHwQuufbQtsCzelamHG+krFbJ4D5Z5x2ME59dZQ4wR10ZfegmHtGLvuWigQlJ4zRsuOcyhlCpJv9tyB7dU/j1mtavgP2MR/5KVMjoQSatXWHe6r0WoSJ25wRtI2k8H3JZqIHTbO2Z8OTtmBTAEoGABPjhlWwuY6QTvr9bmlSQkFV16+kNrXpFj4a0FTumDrdrJ/3r0nFGwTHiYGKKzY/cNTFt+Gz95C/uXWrd9O1DNm6lvx8v76YDKWF7qrmOXRAJRp+EozIxBDdnCFKlssk0lipcNK0Xf9gvvnlAHqxDACxpvxsjq16fitLK7v5rxQRa5GZ1i+G0UXq+ATKazL/itnKMdpOHSHud5/HhmVnPiULEQxHGBEKEKHZLBHEO1+qvgBvTsf8OnMndZ+HrxNoMEPP1qRQbOOM2rx96VUt4hACR+llkE8ewXwWKPROru+EWhJTWpLEMdhhWU6h3mkzv4nMK5xBqt4C118MhjZpESiXsTjqqdsT5D6POuu43cfYdboNdCviP+scm3b1O4RDwrT0i6i4/yL13aUpDb/xjtFF5XIJ9puGQ5dalVXtN8vBGpRQ0uuvhVNfqKmJV1tzYiboC2gVz/X7Zy0mvLUlzaAkpnnAbbEscf6QHS4j5P5NwxwC3UVaNsNfekcrkbyVDPiB1oKtyG79zlx+02xNNVwZlSF8heQAuqESdTcqFVdydLtr4PJurfu1CfpK56+WBnAoRplmRoWhZ7w+Kua+V4wLqVoe7YFH6IUNt8lpJlHSjLG8S5tzOMejv5QwMWyZCfpsQM5+Lq8sLLCdh9DBfdmmvNMj0/2VEYrdtuGtkSCVcuVT7u4mbmKJ/a+eKdPy+z9OoqGFXpWwEUxkBPu437dHmiiYR+FNEdcxPuUY2our0VESoJwSGbiKNm5HAeWWOC3XTlEyoJlJtX8+2PO47v22KEzX+RPuwqALE/XJMxhERTAOIfMmsArKTHaDWFAPoJVD5kvGMNW0aOZ4nxaLSX+zgItvHT8nBSB0vbOPN78ZZob+zAAz5bOrch4B1tA25GgukSFNymHWhVNziOgBKptwHl0VK965LS83R4h8WYnTOlpF+sB34/D29nse3B6epj5W8VRf4KpiOmf3GQXEf6zwNkhO3WIFpemCk0lejNduC5HcBtREfaAjoDzNFl4sAJNyhzlbF9qmaS7kSSFfJFTgMX73UKzust+KYNuGAsNdlRk3DcFZoDR3WZTM5tA6xQ4t2tdaQ5dbxxxMn1LXcNsnVUh6sBKH98ej2IxIt3HU8rqTF8Bs11rkC+JSZJVdiolB7otD9NzkxcRy5BH5r+c/+DJzccYcZIQ/fql3zeNuECtCXX6zfg06cfuD00/CutzHpZEjUvf9SVEbUgJCUsSnDyotA9T5MIwtxXBAzP0XT/jtuqn78o/tlVfOh60HqEuf85udtbF5cz/Yyl2zErYUReFmkIR3zjhn4grec/ImoaW6xY54GcsQKWD5R4Ynj2rlWvwjq2e5hjYaQB1Zd7Hg5b2LE/pwYhAEl3jQMmg+XHBwUaLLI4GLBIKDzxUXTNTL8zySpv5BrdbF0HllohnvjCTRftsPuwI4EPy/dG8WUByACqf+MCyCme/qLu4WRhWKI52hcgUsxw3+WrSGVOU6SzC6ttmEgzxZNOBBR+ovIF80tIIxS1sM6qxYz55QsDEHM/pHC5Ts0Y9ne9g4sdYufiaShOI0OM1zsQCxrwIXoXCdvn8j2nlPt4SqR3sIzlDs8hIPY0dD2GimqXmULJXhwN8/KPeyOdXA8LKLMpNZhouO6DjO2tJWh+ygiNoIPRGSoK+w09iSYHywZyx8A9HeNI+2Xa8mJpSTvXonRFgtWmMJTZeKYaQZMqCdO05WvzUzEAHTnzMzerVNuoUsvW/pSdkNcEa8txGmp+hZwFNHbqoLxmeldAmNiNTWIHEiqgWRvrFhXQnk1139clEAZ1SMaoXFWavNlb9qNvx/57mBmiIstUlK5KQ8ArpNOZ4Jt2n0FF5xytCzI3JybRA/25SSTG2MHQx1qmZAa71G/A+NwstXAgYC2z6CzDinb/89i6gf9ywC8VxIT24x/l2i27X76Tzr8kyIh8BSilOJgY0tjaT1vAj9KJ9YKliQ9XTVnDyQXwctMjpvklmcPbSpFh3OjIqiZg3mRQhVzP+sjPJY1G6p4MyMsq/Wo83n27or9zQcqcDSzjjqIL0uwX3+v0xoCJakZgEObB/3iw+zUJ+YHr64/W/H5d5VJvAyYRD61D2yYqVptzu+w/KwrM5XZfjbXzbl/VpCPuxMnzP3F23vCpG3hj9RsIfMEfeAAFZRoUmFbEaKQPMpKK0bKaJLnRhJxV/qtTfZSGTTG3AnSAmIs0asPTGnLxCJqGDBYuWoT5FSt74DWgTWXKBfReyVWOF+L9lb6b8fXsoXZ/fLWZNF+jr8frIgwMLqQoJm2vfJ9CPF2cONTXin2xWIIy4aONwWNgqeX6K9QYx6KzoFG832H/USKTPtcuvKY8d9vFNcWiuAwXhgX9eL0KsB/le+fAJsqCcssGyqsX6O8w6m15aksgaEmc9mI7uI3rmxHmLbdhccrp7g78yk+eXD6zj2wOQecTxLP5oSe3S8k3AeSsuVhZu3jmgti+GW3YTyYNxFixmGLmChrT7nOfSxVCHJVudWlP2rJohf0fr99rUFQLksyqGtjcK8RuoP7AFYswP3gaWRyqSA/bXAuZNZD9GKrbQSl/+AfcGAopd5aYtmbzvloxoHB8IztC1e9eb0n4tokedub6sdsY+mJkRPOQh32rftToBw2SfHUL4gX26bnkd/Wx8DSGGDFyKgOVAtwT6OPxtMfYTxQq/sFlGREXrBppLOpvA6mGat1f3sBODcvBL9gXxSLT5vVTLdlPxfZPem+vutVdSfvsterFMUa6kapnqgbEBjF6MZzyhv9Ju2WVCGkFzWVgXiaU2unfIC/oiCnbGZ/b6KGLVMBCyFTdkNaxmGs9vUS8JqTtexjVGSPrd8pglGXiwNXccHBrUIgPzLZoam5tcsAC1KqJ08rsXbRGQ87uULaRT0hUVD5e+QQUm4gKqWHu9yK6A6Pf4D9sIIMDAXQm3VD6RT6cnmz0QiBBJezc67ccIcL8bW/tAHHxzD/c4Uohtb2c2od0hGyVGHP2zLvT7JrzMy5tD6jaUr8P2V1vIpGKcyhOhCrNqt9CuWYGttIJOphrqrruz1wunYL1vKV9LncxJ/fMTw8df4HBJWqQq0dgfPGoDJ82KEcuZgsyR4SmwoadBH1braitFg+fihUdoLnNLx83uQ/eszoMhU3q/85QyZpoKoaU8j7rORb54w0cVRh6syVLZLNriwzXtpBN4MCmnixRhAUQxV1iqoMJ83mi/OwMH+yMWaobjDFBQQo+v6bd6R8TEOhw8KA4yNyOuN0gxdIr+jKF6nDBrJszB9UK1iUcjY6LbXgNyvDXrZnb0g30vt2bXnRzTWNjBzqesRvt9ZYlM/MLEq6ncgXLVf5/jXD9KQDa+ahrSpOWQWSGATGyfusN+0t25D65pUj1/U+Q+P8Y3KRLKL9TW39t9mX+cKZVxjkzQOxJckZw+/BlL/SBrh6h0dz8wVzuFJIqwpkjaSpxvnIA6yKFoAthQFjs98wSXpTwFQP/ZtU3cmDOGHIEa9PhiHHl6euG7I3iZLBV4jiwiGTgYL4y0f0cpVcEXIGWf7BZLu+IK0m/aJ1HaNt2iRXcrYi9vwL9WwUc6p7zTpW9G9DlVQhkKqM0HC96Pw0thNOXZ/1/e60tu/9VwVY/6SlQpnB5gl1nHfB0eTkEbq6LRTRQbPx0rJA28GzxJJAzbfu81awtmqjQ3xxC/fv1UmgM/wu8+1avBMHpYuLWNECg/M8VitMf3o8ML7I4R+vS6GzXRkSEztfDUtJnvQs3AzxdUoQy0oiUDJTB5z4Y89GpXGoamuJo5T2+beREWjHCVvpmzTAd0JW9AlHIXSpopl+Qvgs8usu+OeCOA0jN8u6mvCG5c1NDB48JIzhhKbMpjCELhDaBbkmqSkzk1wRotmGyxunxI2EXKnFkcTWRPn7KsiYJo2bkTNvYMkP93hh42099VmSV+0I06UVH4pz8V5VgDr1bV96dFKBrk6uv7ImXoZGx9Ip6FLW2k45PYCYEGr7nltYVZeQY4xwWHIyup+y+uZQaFXj5DOVEB/xUG0+blDpuht0wkfsQJmp62tilI1DXjWv5kBBfNizCnWzekwrAYBS1uWxMTdhCXKlyK9NSNDUjvIONmTTZ1GIVWTz1EpFmFDurlYCQaBpKJ1Thx4irfFWl9zjmvag58mnvffDA0SDZTFEzQ0WF9YW9zfCqAAlTotiagCmnsqWwn5+mMT5osecrl4KnYZEX+bTzapwVYwJdYcp3JmysQzCOcHDAejb5ICLEOTP8xF5j2cDegC/SDXcwmCy/ZoAIF73U47/M3fG8x3iWyckyv6h2JYZbU1gkvHzvSZvIJeIfWusuM04ihzPwgyZ9i7JDeSrY8ivwo9Dl1+w283xaUZJU4RzGgbm7DDfLa5OhVPxp3G0NVk1uzFlDPOyibMawpIFgUCN085jDHuT79Ir1EcD2Ll3mgiQK4JML737kvr4FBFfMMtJyN+eWE56I4Y9m641Vqe2axt7rUXUukxQv5LTLf/bvmJq/U/68hLCSAbQw1+jgcdoteeFnkSfEFGC+d/1g8B+PYLPLYSDZsW9/PxWxsTiyZ4JrT5+oEsa0Sq423CT+HIFgKLh9MROIPAKS4zNC4mbmDhQbcE0xhw71vob2XXbgzDO1ybmIo0m/IOpb8rxZG8yamcDvFH4cR3RsbJSbs6vGf2+2ZnrqPjCj37ikj5y4PWZ3CPL8/Kf4Mdf5aA+EizxZM5pG+PNekATrPZW87tMYq1k/rIR2Tc/CbIcTiI4b1/Xnyk+0gptmgbxrvOjcRibps3jOmNvyl6FCmFfyHMeeHDaBYS4N3wa6bNnMxuoMnTz+Bzc5wo3341VIAMtGh1uTD7SvN7ZAqLa+CPB/utaUGeMscGqjfLsghi1TmMsi+qG2KEQPAHx8i89ZvsUHeKgWLgjq05dPwtgkF5hfd2sapGzuF7ZvpKvCiuq0k4vZSjOKVeL9AIP66SiEDHzYl153Vg/suveLGbS8XkeT+BYM8nM+4Kj9yqoWCbjGGAJbBxCCP40WVVzNyUyvtObF18GcKVcuRXxocLI5T/vfB9WI44BC3iFKptvt3BXJlOQYZidIyOT5KB3BmhY/tW24LEN+JkqVaDwtghql3HgnOEWD3yNX6U1ATYqWIEIbmMNH1xDKcRa15qMqyvRI04fWuLqIyFl30Yaqfp+hmng90baAJp8RvhE5H1mU3Sj7An2kl9/+Mb5fZzjEO3PDpSl4GsV5Rm9iZQe8gAvpdD+ko9TwOjjolpuolrjKU86qULZsmSq937NHrRxcM15A7ueq21bKPJtwMik1f6C6zxOBRcuHmE2J5MnnVDxi5RdXFRk2RLIxRO3/lP1nJsaAqzSNFVi2e9gh3MvgbOFUqWYNwQyqhseUr3sOpff5LiIKivP43KmmkVQxY1KtxBJa+12woB1dTzVT3zhcnRM+mm/Brre3a3lfxwWRso0A5purjPppX9MRYGe5OQgul/1EPkr7ma1cT+myPiWWfm9bkQspXZHjlmfh6f83vIRGavZda8CqW7PYK7o9+huWORmUEQTv3YbXdqAbUzpa5qGNqyXsSfoRN3xqBPvqClXxIamN1X8L4C/TXtOmB+k4UaHyyOmJ58Z73uwmVIyHlQznkYU+bst0Pt1ltPA0YEhPXXTBGYnRB46fZZqZRhm4V+pX0f7WEggcAYy3Gu/7CZKEtVIuXjZ367pQXU9oyLeUNcaIhcF+oRABFqqZuEAijMbaN8xVuJiUI3S2h/Z0BCZc8Zm8Yo3IB1liBj8w5QUVuwpBtack3jHdqiyu/J71Zo6nC1jzBEP34SoaKQbP4zpnZWeLKWEjzSkSLYubZnWAO5Om9XJSjXaBqgNIoygj++QFdGbl7QJ4j/Ba7FLcwzl0ikmAT9DknBxVoF5q/sicK5HszX/OXhZX8CCnLQVC/NBAty9zT5ARyccoEiRZCEOLpIcQrqdaQxL8DVccJY73VjC19gNG0QdcwvHjaNi6EpxmPEILyiKLgwU2Zfa263PDRDKaIBz9u0bXbOJWd8NGoHEGPgJV3mcKq3ik9hV71F/UL/qtFUZFQjSgx3MczX3OKoxfR7VcpUMyQ1LsnQGQ0WD6nD/RId3peka5iS+/GCZVljlnvXoNk482Lp176PjbJP5K/ySv43zqsdsGTmIq0z3PtMiU6DfRCLFrfR7SxpG+YDItmlRk6TuSv5Qj3cLFk/GHxA6XvzS36uEvxYVr1w8EKQXymCCfzovQH/e5+HG4zPLiEi5DaTN893LriM1xrAopo1AFmOyrovHQfqiYvT6er/LlbWRBZpM/DbKEGCE8PN2wPe4PLcfsRElHaoh+WthA9LrCoYVy4zlITQpsPDk/4KhWi4E7lJXI+3wZI6Bam9/G+ThppB/6SqJRwAB8C0KKa/x2JDC5unPTSPqKXrJy7BE2QGTExk0dqum8xoa6xmXuQc5yxaNlHmFAj1dSe8nH8x+Z5psWPtTctbvlc2C5M98O98vFRIPUiCWhaSStpVXvi5cbfeNkLRxQUczAg29QoXkMXR7bR7fTLZJwR6XKkUngEN3chuhrdKmOcjidsXduxW76ZiHlC5m4KCiCVuNMnK/TzgkKR/LIOHnOwuJCVQ/mXG8hwgYK43lpstyj5F0lpLPAvdmlhDHsjrJFblJ4Y0g0noKpF5wHMlJJCb9Bd1BBI0zKFmA6+iGYqG2sjL157HloUTU0VzLI4b3o6Sxo9XeePfB0n8jrESTNHNQ+GoJZI0khpxN+lMaZAuwGDHMmLmX75DeZ5YEaiEecFdtEd/fxX0aSdtw9s/57gaCg+hu4HSiJpuePXJD0te33Lzux9ZkxkHeYy+XkYOC23dyESLEdZk9xQamPyDXEyHA+WUH/ZMS/x8ZaCa7G9hIuRoubXrjbNtK0Sk9sR5wpJdCgMGwUXuK1fQQMKvkQQzce1VS3wtddV26VRaDK8R22x7LDVDJo0k/PQr378EHtGglP8tGpHqnqwXSupKJmFhz3M1fnkGxYQUhST6lKUytfWoZ4WqGffQpcpQl8svHVuSFLHu1LebQ2EgMrZ1DWWrYjZn7PoeGjpINeriHz+Au+W1Ty2uhxkFAI5NCsUfpPCfptSUNmdhh21p3PrKNBL23W0Zou6/47ZjHqv54R3clpaz4Gs9YnKwlLQ1k4O0b17KdrMUiGiRhoavuQM+lQZazdYSoLa2iUbhIYhjaqFSiFQEFVf1JwupzsoqTYWny4BxV/nUF+uW4OAr+C2Vv0tWr6GaDbhuPjioX/kJ8kHI75DuXJFNV6PXTw4apbs7V3wCdigmQ4NMLufgzyJ3Qvz/2eMkG2UI+sr8WwJNrinGV0jsp8H6kFLv0gxmwN3GdQLJUNhs+StTUgVx8T+MUNz2yvSKKgh4WEnLwQGrFNC2ybNNEDtqQ2aWarUDkPa0mkPhkY0diJ/hWhp+HdhWbWXH5ofLRJh4D5490/y0GIMKnZGWeEZSptWrrZsZRjfZQaSx7iM9XvDIvPHg0QpkFuDC3UIa56dKUWObxZR6E8cjhxDt0ZkdUadB9j/+HdqIPM7ry6T3IcHCBjIgl0GtLQ2CYP/bePTNwt7j2wZGDpojtcD4C+kNMUToeU86KVFKlBz1Kx4zgLFzhxG/DsKU3V2bp1M9LClXapnyq44XcZyClZtngbG5hyvbw4JUMOjQal3NkRz9UEqTi3xCHF7RkLPQr4NNfMdKYgFuuWToiNQKsnPIG51nLVt4wTSPtYj+RK6vgvTDiNi6wwlVhcqtbp47BPa55mJ5p6b2BALPM45YwHwZaz79yq1bouXg8ESuEa+SKXM5UAvGW+Jiiv6BCezltnQcgd03PPvZmps5Z7SHwLlUnmpZZmYxUGRmXVrhNiadALVxdpFyKGZtcHBI03Y/2lBwR5DODKmI4u9FzVjExxOagzQ3W4KhcIQuTF26W5lRjCj80aggi1hdUllNtA3HXd4SWyL8ydrb7dkBE6j3v0EFulaOrJ8FfSuRjVVGpx4d7mOI8TVBxWiVdZsnn8ifnElTvor4EAK3pSGFmlBAV6wxE4YDOSKXVLwis4omur2Z6Ac6bH3EuYVp4wrWoG8ORyp9ytAzWD53MbCIPE9qjoeSTGzxamxzNjkapbHsQwK9xRdIjT95oM1NGiTsCtsz8HlAisMKFkh+HOMfza6u2e8tmVaoOwNcD3rgtwP/t/YyTt1kzE38XD+T73jMXb1YnX3PW0eDC5XoS1bBZ0IqkrrBS74d6iURKRVuVN06LjyFWsL76lcSHTae7UJm5XlsEnhnkyBbodlXj3Mi4Q/ESrAtAb2QXphMzdyE1w4geSilGFccK4Z1tei6fV10egvFjCAFtmmrLqny/8frRWLzYJovumK4B/4D2YXE00ZQg8TxIhqIPGBzlZ7RApOTfgjozYBKpPSBaCQqp2r+cr0v3pjEW28pniBRidX2wg51vaRZGLs1fteApnMgkCI10WpCKXXi41mzEOVCG8TAcjMQ0J8Hzwj1oFesbFIZuRd/z2l7vvGNHJ8GeAkkkyR/hXSbMLULLFZuvBkeelGd33Ixr650p+0H2KF+XtvmMK/qnnsCDX8NDjxL8i7oGAeIrx9wKGkceheGCMEGO23tda8HPVrSjiXzliHXcrKHto6qeIPH066b4czepVNpHXMugwzLyhMh9snKIQQxy3FtfsWJgje/LZGRDlFJIOP0ou3BDESWx0mLQaQ65xf4O2D7YrywsHhIvN2HRvyZc9Kiu+Bn59GH4hg9WipC9rWcGOzkKX3mAv5Z0aFc7HCLYQYsTSj4vtIVW0zo5mJJVP7fCqSzw8sIqnN0IW7DrcpdL9XRbms8AIdf6qGnC5nDP7D9RFcxzo0Y3Aaiezd/rpFgn4Jn8QHtuRjFZjluMbBgh6d4Y3m0yTiaf3Ydim6rUi/Gqo+bLMPNW7qdda5lnmhfiUM/f2laEG1SkLAVK3tN7Wcp4L36txibh8V+5sxIA/QdtI4pZxZ5HBiQMmjddvEzSNRw1kKo/tHHrGhYYKbBar00C50upBBK7dRhpM5dHo4HgFUpNBG2PJAFVotHWjuMiC0gEh0sUYvbN5nkUQQ0kgVq6JwXVaH0WxSEPgXKJKXz+Q2uN1HcJnoUQnsPKMNSV5BPL2KuHKrVCw6h2YBJ6d9Zlt2sIWC+8ubliH7pddbaODsWFmO8nWAME0ws6qjXLd1sFXVipZHk+Nkhwu3FGUeAysfLHkyItfXByY4XTzPwB/x5QlrwsJuNDHtgvk0H62DBtupjczDoWgNW6diAnrn306cfibJAtH++dfGGKMyNDJzQXeAmKTHrkzKrKQIYsPjnlSw+LHvsfTGeWdPb8DnmT82EBx8f5zcmykelCqKK4doxsWSVO6q9xQImoBq+Fie1pTy82rYbR7wTmkSIPvJo6N5FlzT7MuGIYFJPOKaxEytEe3O+bABq/SV3TL+okt4njehdpdsBDyh1fRlcRzPlpXNNeT9KE+UsorMr9bb/rWXliyj4x6NjeYl9n2cYfP2ueisvIfBZdIJHjmsy2rfjzsc/1yMWGJFnI1W7wGBthKan9CbNyR5AJG4QVwuka+ltIgbTGXm80fir5sotsyRv1cDAWos4Wc0mtcZKUblUTsTR1PTREeL7G9EERqkoC4D9PGGwdqYl3nQoSgzNt203NPUEJsbuemg/jcfqGorE0RoXObxOnYI0nDpT3FfrW4fpEYpvEM+NJktvZS1IKIZKxeQH3dLFjejYq9L3eR2pNS5Ca2ZqvoQieWtU3kAN3gaVgveNDzqBqv0KvuWIyCCIaJiAT0AHqcxR9jSzEPJUNKGneJhIEscG7TPLBVEa4nZ/naIEhscsASOihWLo1imOTedQvshyhQQXRKwonBu4usj0UeKXJX5wZJD3Tak/IQgNCTk9NLSKRVfIbIPQTD4RH+G3r2Ig6JGkNdWL9cXkd1inEGn/BNTS3xWELuL6PR5e0TzQEiJOA6XxWoeDpQpTMZRJCjri43MDPPOAmx7FU+waLF/kBvbm4TgBKxO06+t8KwxERaNkkJ3Q+BEHh2l/n5nai7Rxx2s+mqvkLwTsiOIN+jmqfy2F9U/fRJmMu+OnVL7j6EL05GKotWV3Xelx2zec//W+A1tFxb4jX4JKjVAING9dLibT67KDxoDnC4bLvdjEzw3wUnOw89Wgzmn5Rxu7Zb49Xm0IeQPikjUO9yX+lRrvwj5X6FfSEZhIX5CxyrfWSn2SkxVfI/LAYRdxgQc5YQR0siwpEpOXgS3XO4hk9H9PG7YXRk9tOp/VPMf328LkPIftwrfsPTD8O7QZ++SGktS0L4LmWqE3MKlHm/2Q0hjyuLMEvcdKDDpv2xqfiZ7t8uyRCI0a4SK9map0/TDYfWJKSxAZsWgL8dUB9jwcXj7TKhsq1q4r/NSdfvWbugARSJbmNo2sY7Q/lsyZ715l9on9h8ip18VoOq2IEiaxwJAW1qUkKCLOcmWA/NTJJl2v5IuCl4HP0I77Wya3Q3Xv3ihmud4rgkMo+KDBiBG5VuBVYPw77auxd5XZRXAonXchirdVwMRQrKwJXKjiGwlMd9eZyrehJgRKYLS78lZ3ZDUzYGm8hRyFpYRHDffKUF5rm+5Z2Eq/dP2+f+thcVNaQG5I68sWBCnxHaY50uaXTM8FZbau5/vjCTI+F8p5b/d33JusoUKLqZrzNZsahI/gTje+dmP+vCDLQ9QklaC3dGwhMnk8s618Wgr8H6Rv8A3+PoY5VmreHhwvc5qh0lxZitFLab56y44GlcKCOTmoHPjVbuFo1//FeQNJmoDGRMcXeux13hiL7iVOkXcK4Nb76E7dbMBlK4L3FJ3rIUoWbLxNbg6q+t1P4ymsEF430q9QEh9w9Nw+CGshx3A2AySTI7Drcqrxb19QXlBCgnbDCI4iWAOLdRkXEifAYiaLyL5qfQS0jP5lcVeOqsNpnNQy6a6EYk5yToUBJnOuMlCN/6DYO2SiRNTwZ3bcYUgQbQEJzZXM002BtlMjPV0XxDhGQrmviP2fkdcrJQWeffX2nr/4IcZGYz+EtRFphQ3609WihoM+8QsCL9NYD5zkUBcmnV71l6qyuptvTFP7HdjP+yMtrtYZxZ93rxv1fnkSGoTlE0tRux0xdf+THUYrCLMZtgsmhAkJ9Ry37yunIQb9fQ0cLecnTeWvfhJwDf6g/65Be4rbHUGvjEbQiqMyMSFPut//LLxJOM7gp0P6BGotfKojt98GzAY5rxwWwrdoOM7facJG12dw38uVhsgHSlufx+9Xy+00Oz0/tFJmHSoBP+QI784GUrX2tB3fCvxWlY/qhHjB/TvNtbZ9kyN+1LsU/EMlO3/1ab35W5YCKVT/7qSctq0Q5rKfEH48bvvP0Bbbs+XsxlfEEFDflDLCDKpZe4t9zNJAkFcYqjxUvtr2TT5gcFPtnQ/SIYAO4ufXViYqN2vO3V5z5hYmwSBl1MRqDA3YpiBt7iAZbGRMMX7OZXasTYo2cLX/VQMWWEmUgonDPdv7WHued0Xj88cI4heLPy8pkPkfkepjtc/YtR3ejUb9ekmXjPWjxqbV3YNaOnIo6qh5eVmYnPvwBHPKunM+uCINKcBavbIYL3sQHoEtmxG9hIIJ1Qa/5nIF2z80JcomhQnmQfSsRk4MkwY6AIRXw/Q1sws7jagGKHR11iRJzHLzPkLWnEVhLtVD+a/dc79CsBS22xSl90USRQoES3fVgShXeU8mJmXTXXuKcyhCorGRvwYL/2Htgk6juxICdQg1k7eFdQc/SSVdInfDmeNbA8zNw1MqyQ5TGSHZ5k08MjC0jmXOKgddYlCFjjorbGmZ2hBBjTavvZpN5ElROxXYkt1B4tW2UPfYgQwiMWMh0jxAqQF8VF3KjN8u560gnklF8ufEQfi+YeZZWiM5GEqjQMXfpv2q1M3m/2PgsmZX0+e7goYfeMa4YXPT3rL5jv2keKZQZSh9rU4V6zOfQCaJH23lqb+De8vM9F8vNN3xWYZSlgpnQWv3e/mhug24dfP9ON/ZZ+lAcmsZqF0dzLBoqioDHMso4t5MXRHHs80l4NoDAVP+Pti3YABZYs7fIBQf0WrREIKkM9jZYjDjygZ/hWC9UE2Q4gM9cucfDf4T4SKO8lwRcxY74v+iq/ht6/v3jFIpPbjWEsMnG2qOdLLeHlLcVeFnkcLOxnD0dUzwvWd7PLx8ICsyuJ+hytRF9wrjk1u+mK0M7afj++C7RVbevEcjBX1r/zvdTIv5xh79uwFdPBYokTfLtpk1ppNX4AqwPt+G7TcabqYbdUwONMYwqTTx4APNNH5zW1SrR5xrCvLs49st2/JUodAPdl1FHH8YAcLYIb63HJBDrYu8mWHV8YsAyDbmoDyxi4MlhGAXBR87wyOg5DVBbQmdd9zRT/1MV06C6lVZiRdz8pk3jItDFp3A19urlm5s0pKufWl3/qtVWVyM7v4wA5vsL4ZANnKhgk/K2GUE+6AyLBnmKK22nDin5rlhQ7eoLgT2kipUM7lzWCkg1MrY8GUJMVzet8NFBr6NzUyKXf/m2/WgeKf7HSWRHm2lqdvxfiXk7ItVxQu1EnDpYqb79f5cL2VCtk0wSZAtQgSemwEZ9QjIZgjucEd5/CNlATPL27TrUjWn6TLZksbkJtVZOYmAWdD0XOl+qZtLJKsPXxiiGtarJmnGf9CK8OPt502+dbsE0OyzZz68nlg+FYhcMcl8nfeMiuTlF4/XYj8VY3WkDW0FoXHa1uWDsG/hejJ15fl9K8kOuSB66k6ji7oM2ahd2sn3GNKgB61eI4iLM9ORVYwzGLTig9Ryb2TmNoxQR47AdeJXAHXhw0mT3rX2yaRFn73bzQcRYKBTl1yEBe4F+cc1ZZN2C0axEO1wkfNPfD+FyrxptvgeZd4s6waLonu21wUCWMumuFP9EsixevVLwZWx23Nstw7usC0kDuMNVSrCqHniFQx2ualjrB4Raq+5VHLzPn2/BCmzjrGXxWJGkqJ68gLFcHp1v/Yr9RkOdF9CuLWX9Um72uJQ9WCcr433DThlcm5YygXxSmrwCxRfXp44AMxeo1DlCSJlg9eZeBE+qJQdH0c8pMhPTebkW8ji0Ni2N4eLu77m/P6+A+yD7ysN+l+B8DdzZrqo2WW/0Lk2B4x908TEpezbwBFghxcMMwTaXutMCYDOL3/5OsCaW1Wk0xF+k6oj1M/bqrvM5Kb846tC7qY2R9qp4mFmD0GSWXw9RJbrYBN8vW/bvwiIxCnKW0TKZorvfoJIQ7H0O2uQQmvy0eIq6Yf9DmR87DdTZKJRscjsxCm90d3s3SUrrRaAzzvWX6FH+Z2A7Wd+YKeW/fVHd/J6SwOQIDoUPG7YyYovST0O5NF/tF0O004+i+e//hV+q4u3xdnTHH4IikxJAbMtjAoFMnJ1t/8/KS+8tfpWz74R0hW23sb3Gp3FnkSk6JGxbuCZCVaSqyDrzEq33EENG4Mrs/UFWVdm5/ajxeRhjnLYNTO+7OYuSF6m3Rbp47GojqCdBVTxNk+bRVf4mCfbnn6Icq7pzV8UN1MFhf8qdSRUxZk7bFsCwnFrdXC+Ssk+jfCg1VhzMC7xMf0G8tdLf/r/N73iV0tWvm1E8U13RQZaRkx1kgmJKNSHQIJfb7ZfqYOBBvTk1FOBVI3BKiciLN1Ex2EcuoNYuikTqoEMLwKR0jMk/e5L3N2d0zUvlmkhOqR2MwvbWxOdHTOWJh/SmrUZyp2kEF4DoTTV52FkPPslogqR2g7LOkwHzjOteT86OND3J23bQF3EnsK6WyrXwmwBBBGy8e8+YHBeNJFvmnetkWDLOGbApcvlsPL4X3uU7TFuRNeh0PBlrCdpCZojCkYLEGPnls8nSkrJwBc36gydx7rs9bwCNO9wQWBUsILKUSFeyOGWlx0A6JBM0Gaca6YBp1WtC4raVNRXhYAlFRFiDAH0S0ZmiWRkcVcaCiapZAm7KwDMevmqKgMAGolQnApirm1sPtAqUIWuYNppK8I6ByIcpjgUVnmc1uVXsDi10Lo+VlPyFGUtNdIvrpyzW1VK5iy/xUX3kHzjurzK0if3O7AoW73i/gvQZLEC7vWa6tDuwN3kaXINNJhsVoQmzbtESOHXGR+pOQ6kYEixXMbLDX/9HK2riSMzgrcYB+0zSIKbPdO+wDEficWNMlrsfYKTkLrSrgQPG7/qdTZUU3SHy4/ZFRx/4HOcKQX2H/Oq2e5P8x/MYcssTe5S1f/mzvBcov9TNAfYs2/273FgXh6d4M0eCcZI8DaIUTrloJp7EQBXzeTv2ef7/Vf9C9N8ja1uHAHOicp+3QpwBVGt10RHcAHu1sQCCAXDDjjBfjVorLrtUE2O/tKDtGVrkYArAE7NguQS3qsH+Us0tDAufafOcK3BgUaFZisAsPvXxcEAMAeml+eRMOvWNb3mPPPwq2stKNydmOmnrhgHVHLUvFa7rfl2yO0RYqUQv1vajmv1fTE9ySiMrxRka//cpcQZQCxO6mtHuvvqVnYGQyFoeOPT9v1RMXA7ANMcL7UPqvDVOPyTvSXlPNXPZgoOEEDtbswDY7DTiFjHHi/C77X8Iuc2ptjT9DpWu+jqfG9KaCmc9b531OBFEHsBtSqMDo5t6Gz52RLAmOHE2v/ovVbD1YRVSx153qd4a3skhvfhhXP4Ra3AroITugsXPJ43QxcnGX6rCjjUUBGFoqjN1benomVvz/2eYbAqbQTD8BkgfK1EoGsHbHCI0Bm2zGHp2JOmz9Y3Vncw2W46HgcuKj5ED/3yd7uGcP4ab/FVC8vtwkz/QsWADCMCQNb4X7mIGP1FfDadAGyL9inz1p2IsTyVncF+/O7h8v7AsKj+8jslBpGk+kVWzHoV/Gl6j6Mt3lGGjw39NQbxxlpW3gALic/KemEH8M/wvadGFxd13VlkXz291s8Z37FMCJS/3czVapoge1XW3soYmPt1PLt/lh1KyQp7Vl3MAwdSSI4ED3ZEBIwa70BeUsx64jumD9i04g2o/Ez+0/a1gQgRR4DfxLY7/ncQqyLYvwK1lFa6SbLiN8ldugPvEgqhB93Baap3pWXcDNQtUQNalico8iEWCE3q/uHFUMrYOTKS1xQIIcEuVxwB92KfS6q7ewAkv2WAD48ZEIiAt9FUlex2sqqDuQUk9JefyxXkWAWdPSLNr0vI5RMZrJOWR4nvEPchr8k/O/iblSzxb2KO5JubkBs9ubAx+1MBkDwQ43w7bj9NBN+N0MO6s059l1ZvwqkO8yFC/b6VSU0se64qAs0FLLMo0Y8k5ocbIs28LP/rkhaQyIzgJx7CLABBlgkeOEEDEOCbw9R3HYo22DXvc4U67Vl0dXpzmLe0r0JEi1rqA4567JEtSEsozxaIvieGp889jV+Uo/PQdOxQ+ENIYGA6RibT/UmxdAG2rp3Xk82ensLdWoSp9DXT18XU84wThKnyr3Y2ROoh3zUBmRUo24cyKixh6Kne1a3oq0XRU+iVaaN8muazAxcPpUM26OX7N+8vZoj1gEnx6IqOhZDQFLvvTsHe4OkqdZCJAdUBkc+mRQHUVcTVKPrlbDSg4dNixkOQEU/jF8c3EO3yoKeNQW8uAMRCV0LXh2BVoV8tIyIb27mCi73hXell+gwRkuMa3RUvbaF7ucO0J77CP0eSv7tCPQ7CnGHDwBMkGICfc3CPHE9u0QIuf2v+ueSOTdJlLsPEzlk8mmsSLrf2iJREDkedQ+Tl/MyOFjrmawFyNQGolFpGylwvgwV1kxeBrAfS609OIwKrbswOsfC5kKsp1ILsglfyqRhdEiGegEHR54DMzk1V93+/rLRgz/MD9dD0oV9WwgCfaB7hasFOEi545IEdw1lnT1bXS7b+hW/1MUiK2LISTk7dgGoIc2JK80xfj2O58haZIKhG903FrTzckb0EhBlwo8odK1KEO5lhNZqimsDxs/ChmXN+H8AIwLarOLkYE/f1T7vin/QxBwOemFQvaaDGhRJG+aZ6u2E5rTF2GFTOMm17TFs4hMBAApr2dFHL8vAH+DYXCPQd6oVdGTSa2OUYMa390Gz5jlajDPaXKV4xijHIhSBRAiEIuB0LcWk3NYUG3gyeZkgDNmuShNIIDfqjZlwHvaB3HqJLTFDmHNg8DOzaf5i2bUZVfVTIrGuX6r9f4tzXxOUFw8a4sM5NKYbZi9JHMLDdGz47UbIfB4Ce4Ks8xeyibfB+nKAdT1pWWgTrpC1Etjiufs8DNw8U65/VpXHeNdOprVA+6UTVgzwj6ZBeHhr8/F5mk2GMiIBd0F0gGoWFBOuIvjeCMPnPLMBVA1FQANYQlJZDO8iyIyhHWBLgxPNsO2Wm6dRbpcGUySYpBDSOVaPx9YP5egYKU6EO8ZIrUkamibcOkMv1NmQ7r5HI2qfN8TNhZnLdCFUxMEicVi2CgcDnKW67b5fkTxn0wpQgcP+uWMY6B7uSnI5XUmOjiyOd53DBHIeEmllM2apcp5JDOTfMjzH5y3o2cDqSetPVud98GeSY7mcVJvgt0be4Hi+FJ0VFDRuR0ylrBS0o+3IynxiQNLLV6ggEwyke95WQe0pQrxM7Y0Zky5j/v6csrP3/2I8szYPxLNKtKSboAcTMGcC88hNM7ZZkSIAjR2/af1vjGpWPW7XUaX8RJivpXxsVPqSYwIfGnGw5CbTpsCVBIivLJr4TzkAanYowV1vgHyEmJHmfnRy67muH4JYEcGgn3uN4CBRy/EweOFU+NtO9BFbyw6uZdzQAbMT3kzfvUXYAdGZSrHuA4tN1u5Jxp23zXwTZ1WvJa3ZYRwqrVpkH2NvCckDlO5pWe96WP9cYoBkAt+CrF73rGE3uk08I8cafSN8ELHMfehfR0v0ZMvaskNIomIJeFxez9J5f1gv0j9p9NU6g0UT6qP/bfR6z+kW9exRrymqGoDd0lsoH38phKPF44NW497DIxbfbTEJYEVwlRdUN07PZIvQRELZVopfBiUYNvb99CrNJVVPERNYfpqsU7NrmHbI8HbawL9DI1o0c69KZQlDPOcYbhp9WuKZTWVLMmxJq4q5nW+pHLdFqIkOWtqU37WUUAdlf0EIylLfWd2XZTWUlUitORnmGigh/CILV9g9nKMZwTwyz0HB++t5/x4Dqf8RL1Hr8KNOGtMSDd+Z/N8SwgV/6Ucp47Pd1i+W6D0WtLWoFHbSS7KqI9xiGJ/C1+ia52hZ+63v+vqWFdCyIe6jmbZgBaoz5roHNjxb6sDvMu1rc+6tCm+dx84krPGlP71KkO/xFnCkkeLwPMYLRXmTJmriXe15AxhlGKsZRTx2fp8w5wyhqjypnouYwgIDEeBPmGbrp+augb4k4kcKKCVD0zw9/AEZVhHf1TD+xyDgXsv+yWxUgujrdi0kkzFf0F1xOjCCM/ZX+JQX6XHeY98DybfZQWLTdp5SNHTYS66f87n4c66dDT48NgZ2OTBp/8NMXhSCV2vhbr2w5ALyVJbCw7eCWd1Krd5t3pLJ6gqn+hGUWRGulYYYHAHWMOF0Vq5Ez3KiiDj3hoh/2GhcMzsXu2KVwZP6dmuHrJoYBJLbVgWZH5ZPf/zjYPLqPf5HYio97CgxxEqC9r58aLJUnqFsLrXzdtFcUqZXNrQr4CAx0jtR5ZSW3n9lu+lEjtV4A/qCxFarhkY5Jd1DLxjOMnxdZ7/D1c8mv+jbwtYvfAX5GE1nU72Vf0G/JMolEz/PNI0UqqKx88HK9eebNDzSQ0l6VcZgbKTCeFaBH3jQ/XG3I3fLJyKWERCbt/saZp9KLz+R5L7mJVuxBEB+3I08DsOIqGezH6eUsSy+0to98wjtLw9wXAd3nut9/CBdHoCawxD2miC3nbK5dlb8TV9RzCWyihKkLoqcFKshRkX0Ch3Q6S8P/jmbM12MGX2+Ul3Wbgk8Hj79BBawbHlpAGjxngyb6RYfZKn373LB3OF9BNOD4HCTxQr+338m+IyO87YJB51Gucg8fJflRbcUVrOT4ryxK2uXdJTp6LtEbhCk+UyoBs4xmRZbzK0qS6A9NEXrChRgO+fG2xf4vobZj7WXH232hBvtoo+TUnwazj28A1CFsUvbcmv5dt+zURpYBfuwtSfEaR9gqt0gnfqA3k06teaLlIM82sf11Qy6aKQrziG4sWgWPTACHSBVoPMT1jDirINTn1MfpJ4/NyxHCJvSFkuNUkr5A5l0mPonGyYR6qnOB+G+y64AxmcT26uvN7Jipa3KpO3rJuER8c4tjDa734Mm+qFhPhlqmMmPon7l5guamsFkq+esMFAR+3IzeF/XZCC9gHhSc0g0pqF8zPV5tK9xqh6C2pcSO8Gxxj+v37KnXTv+dkzKjg0SybsVS7aBAv/ZMJjgUSNtoqxk4ZInMpZp7DLPToWkvS8IZxgMI71AUITVDHfY6IslcN6Chv1YHdnO0e630qT5Z2EtuGFf21WysDWXBtZSpVW0l9X6IRKQ6no+LLMtphJzvvhuQGozp5a5YEDTaP2w6EqAaou478TxCgJL48uCzKLIyyE/vbr75oDu6LFw/3AIvLEjk9c5Ykas8a81v0K4kRSiDUlX5szSp9BbmbwRvYBJZOjG/P68JGhum0F3pH5dkWYnNK0M8ulAM/1cAcykLbvllLITsbjIjf0JqBREzJVb2DTWu/w0jAETYOXveouaeN6T3ujrj9yWiqEdabIRbOSqtxVf7EAMBXtf35y1bnFWgsbY76Dz3E5llxeBLHMpbTZeeBaLNLGCd1IkT+cq1efVZeNFIJ3jtCsFebA24LZcky3HGLrP6j/YHAw/VxDnRlIrUzAD9vUOO3eRvdeYPGkik1Jc2obZ7/wHi8fATgqvsvQZltUHiMgbN993OO71/UhYk/6IDmkd1RbbVC4xstlHwPRD9ayy2X6ozmJ0/8xjg0uTqXCDUWkTQP+X3vt59EvOpI55BDp2q74HJyuo9dpE84coDPh9UjHiAcz981eE3WkqCX8EKQr2m9YcHb69VChf0T+Q9B4ppvNhpV10nrdga3VGZa11h7AXHv7cpT4mQkMjPgZE7OQQuc3X5uaShhyYBNznrkILh2ZChCUKMmho7IbWmVaiS4sO+Mxxlh19x8iJ1T+X88GZVWLbng0O4wKyVDoDF7dSncAK4mR73Ly/9FLWem0KqyARm+NbPLQnTepsslze2vixWmbLB+v+FfH7ZQkqT7tnMVV0olt/wQ58OjlAKJSjW8RV/KCW68UyJdTAxbChmCc0U9xq0Hx7NXLtk6re544Qbsz45ck3nybOF4FMAlA66L7Oog11ykxeGTqgKWsIaoGkHuh+Ze+KzU9ILS8SLzzr5LgQSPWtEwBqqvElWJY7ADWLaV2JRaJODSndixyGBzv9QiWgOZZaSb7V1vKkJd/h0vEUllNai5cIDkG+fLmqk5+GmZD4nlCKoUI+ynrCBljRK7kCaclUA4mUuAcaaN3JXjPM5Vsat7pcwnwGbPO7yay1WZm/qWMNcWtERNC4g8bC3dEpTCNavmOvqNL2symcwWBEecNiZejaYBF9yNSxFht6MzC5/LOhmf1Kv0M562O+xC5WEdL2yE5bjoEdRNYuIDdDlz2GzB5ZGELf5nFpkAurhh273arATn6Y2f2Jal9Kkn/XjWOittkmD2UZg7mAb6QYEiatZFieWaDW/ldVtUqud/R8V/BBAH2Ai9BT0tXiosuDQ2u/kCPqwInfZg+ugz6qocX037ucV5cZHixJdtWO0xBHcj2rxPqum7U1b/kFnds8vjlZTdjwKyEuPv94pHhjGVR46hhflS96SYKGdgYoIszjIkP2bCgysg3etqFXmUDzr4kd5ONo8gQg79P9vzFpXFQqN4t5IOZsg5bZ7bcbUV1/dsSGxYmsuaFl0I15Us3TNUM9sInaiLlylicsSGfc8qJD15RCOuNtqMHitZaCQRcgYmA+GFXAK8KXFRGt9g4emsGVKtSC3N2nODJb97OluSmnkLl6sGRn8Qmk73WFBPZyPKGXewA3ov+1pS9YqEZQp9E0MqQLtdb87WJTGAJmm5plVxK5nf/eKURnd5589aKVkyfeCFGvajDee7rQQGnuVWhoe7ga+A7hh0/TQumj1sP1Zjjevbkc3PbrFB4L5ghCbJzRO+1hnathlV/gcOPshztnxHaYGGlKYF2P1Xt4VBtVNfcnVN4dIM926154teI/8LEnUBqqf3IEJZHbEnH82WGipsDXVBP8oKQkbDirfqW0KDuvzSrkdkuaSO1LtTNAoxzAQJeQQXKns9CAfuDLlSVbRJH3mPDBTTjPBHJrH6wdwYp3y5ZDmPlvnnI651CA1lg+v+d7AmulkV8QYSZkOsdtuZu/grVUL6zJ7dJpOSn5I7Gn2CqPaHisEZmyi8d0Lgh6DeDbqjrdNg/REhlNrKzEH+iRwcUVN/JwnNbM8fFTuk5yWrKMGh+MeJBOFyWtp7x6XiP/SbHb/HuUkU3UH5DrosQrSYtS0ywSXlGPjQ3on6bTG40VSGPg7cRu2xbrxYMf+IuZ2wW6I0vvswzPKsoxg49J7vXq49Uo+JVpu2HQy/G3nMr8H/q93Hz51ThjvmveKAi/235XuLMeBLhHgL7Kn/WVUrASq9xSIP54u47OyRXMB1eFisqFvwP9ILGFCgJB407DpCJ8Fx8sdNA/HLJ865mlW1Z6oUdGbSPy4LGEgWdBBua4gBZlauMLkdNdaDYl8PiygIVJVa1op28Y3onZR4C2OV0Ag2qX/IrgCmv3NZ2PpbdqLQLwTKnsQp13uyR+QikNjY9qI7FPJ2mvxozHiYgxCc7wOZFEk1UrjwIwZqZYYdAjI6UrBpu7clI0076Cg2qe2YE46gadSWS/2pvIvqH3aBe8fscWwVgUzI10WAVhT98/GvE9BxUFS/JIfhuolNRHtz1AM/7nSRYnJVtYP2iqxkxvu+GPFlTAaUASa9E7HWlW1ERcVtIEdkkeDO61pfyzu3bMfe8Gmsd6uwt2ubc97/3kzDtQPmGjAXCpL2tcvFyrTdLEjqlstj+8Bn5B/9aLgGi9QDtnmpKBqgN/defLY7Rgj0ZfVJmF8l2GX6LMLu0zyHPo1BHL0+OFJnHqkKtZct4jI/1QDh9GENr9J+5aSuZNCQ0ex0OV2Taw3yjlabF5zl54TcrGAYMsft09Rmrqk2d9DAJHXITKv1IBcM0mv0Fmd3Kft12RavqFQOvA2BquqQ/KTIAHFfqmEjWamM0sCUqkExBcgto8Wdzf91h1etHQEBPE5DD5pryvcb0HNSsY8qEKGen/PqyI9HvEBOhqSnIl24Q3QuwQsfkQ+QGWus4WAe94E+TfCJenRqrlkxhQh17dNomjT908X2WueAvLW3VirForgXab0ZsW0FZX7c4g/4NLOfcw4TPn52PWGh+jH7N0zU8qygMgiqjZGxMD+XwvcUMc7BDtPtxmCrRFXLErss+V1wkCj26llRiw+DhQGxfIETXEdInF998yuZNl8bC7lwDuSnW4BAyW6cO5RdF1zW1DLNsQl+uGTro6oGQTxr6ua9OVjpLdOC+JwupBpa+pG3UYmxan5Y60F6yxqGk3iZm84agoOYaD4dutUG3Q9OIcRTTk87hzx9LdgFdr9R9Rjfj50t7QvUSWm4ZD42fPh/J60gerd5vDWTHq8+QMvIVwZ/lyPb7JdlqEaLClmIpnK+tVQ2DLv9NOov+VwOADI3gT8QaN+BZWiFiLd9HscDMUcE3CUD5ohAl86UG42lEeKA/9t4cQqs0RoWbqTJLxJ70C2TK3Pj8deQgR9oda3NEaIuI899vrSMlxDspedabhOm+KqgOOzlov9A0A37OCklp+38+VIIb3MwUtA3ZDaUbf7L2e8WcciAm2iGV71tUIOlbHfKkzgLk/GCpruoMYBwhPn3f+6KCLWk3D/jjEsO6B3WZdLBlLyphUJklLT5o+3+YBxsF3E7aG8PruldgFaEmGTqdL5vL8A56/QzmXx47i58C8kXURWBikRsutxIj5hCK2XWgT+N+xLn0HpJo3CMRNZx7MuWFgEe6yKvmZ/qxjfrnGKm280Bdf8HXXjNIMS6ajDcf1ubH0V33Ah2mXYG/FDY4zGlavVBH75YcQJ37/c5i+63sKZCLzjRSZyRmS4dufuEs4bWdVsIPkILFkDg8mz2bGCMOnuPSHBZVTxIt2YZ2oJjQryMPqSuIVfv/nHF7VrHi5LGWXtFPe+Es6pCDuD2DUeOJ2brg+jsiM30r1I2sIamSHcOaUoglJd37DPi93QSfGtreA+YOsDiJp1rVw3dAa0CW0WOXxSASkcU41uhZEfpYOdUbSJej/2InYfv0dW74zXWcvWsMiSbDEfzHjPtbaXgG322orR0OUMHMIwrkMDgkwp2SWk1RVS3OJc79ezBnEqWcA8fYBNOSq9e1HIC4KFlu6iv+7zMApyIXxpCiJrjhignzWU/2z1PV21CTqL6gp9Nxkl5WZHITyh/sAMbogVcYOm19IW12FtJ51xhHFiwOmqebMlMwojz8I51EnN5JJ6gvYxRKbNpPVfxWMLVY8J0OPdsQBhq3BdJugP6Rlau2Kh6StR3gJh/5TZ23Rb4VfnPEfveQIRavXOYF9699yPJehQrfQh1A9slEdKXij+DI4+5g6GwadicPL2Ti8C0iaPc452je8IUsxzQFvljrshI8Jk/6/PPM/7G6go7LwlBMAWYHWMdzmMcw5RO43jWPHkrqj8HwN4ENIn2yg42GI/ay17+Q+Pm7cMc2GfeLHTvCsmV2f1ptLQziuHLE+mm1idpNAqOyPDWtMMMbqBY+daDE+VvnVyqLhpLA6WS80z5FsJEhk2AaXYxa2gzi3V3EMpOCFSOzCvPJPbltbtjt1NoglQ70EleeA5HtrJV5slY0/PaFJBho3kUTnFe3fbspwPfFXgXV51r9JE8y021cKV8Tl0vejdlPlaAagmaPwNz1wT5jRVXci77FjsxjSoW8JuS+horXNdl/2X7Gd7Srk4ubp8YKCZe0Z0Y/ChBWrIs9JBbCkh7K2KV4+YKn/+kNYA4jBaogstE0YmX2QUUJ9FM0t9si+1SEBefNzNiaI3HQkhavlcv7sZQCgs5pue5wmZLj4r2W+1r2CvY6dkAKiVMqS5MGeawoK7BpPf7C+K0wE+yyceQffPCggPbVM91ZW6s5J+aw02AFAGM8d3SoYMPWnwz7/eTYS+gaHPQC9cfLpJD5h4+VMr5k1UIKrsUCvIS1SM1Vs9D0UX5g22gRKx0NzTlv7xgb1tcksg5I/1uguDtfovUrg1jLEY3s66GcbGUyBfCROzBxHU05cFOPBB7Huqmy9yuxLvYq5SYZGKByj5l05kr9BHXMNOZuHHWFZvLNNQGsbYNsZOluOJOoSeLqOqJ9Rl1yWlSz21kHSYJjXXK3rU0qSIHs/MipB/F8x3mm7V7sOE9Q/jXMJadrCxokdKDP4IvHJhULSuPaFaPnqc+5/oexinWDQrbgP2GA3HqPeBrm0LSohbIY20A0g7byX8oSXO3jl+H3/8hp8SFCU6Dk0r3qm03znJEazEHZj6hO/YNZz3faFBP24eutz+26oiLFlZ7AuGX/kydi17GG5+GIVPtLTYEogyQ+/EnZmhg+xkToZG9YWitjoc8IOj0mSel7rGToiwtbjbJf/L0p+vB36XX3CkpNyPHrRrvIU5ka/stTXiVVVW5X2TluzeLa+Krfn/BfSAXoO24WMr4p/teTIypQEWn/EA2Mb/mWujVhH7IiIwGEQ0PAnGOtNPBZzvmNFctzZZxg3MNgXuZsgV9giX4jSs+xVH2S8zEDrgoqf7Md7Tyw7fp5hIgODIvxA8w5ABXXHj6cxzbHfTVla/cnnWI5kZtrGgXcCIP72M8+TUV3cNO16tT/Td+yavNEUA+WxGeEQEXC/1t0351yfWcW6YBMHnMz8uzN5y5aHUsPBngboruLNozLWwRwUMzh+cJ/ceSPByDWXf/jrpNPJ4kYl3+ePy0y3u1GY+55xCD28xrneXq31Rzyh277UkAd6SxDjysxS8O/0T1hJQ5qBK+Qndry/QFz2Fruhggr/81/SgmdKcjUDcYw45WTCiByb9NtfftPCj02rK8AQffGW0qThNeIuFg25s233MU1npNtKJHRdolkpQBgfXu7R+oTbpDRwLZGiNX7LEX7KEJw+FClYzYlQrTffs+a0ggf+CpgCl0igPeGnb2yNgphYQ9lJfd85u4SQSx0ldY2jvb4vkDrg2QF2hXnZKKTgdY1KE60IEjptpgzGe1g3SRRrs/vgDSS3sSaO9xfySqrL3ZyH/Ch16XYkcGU5LaqPJ0M9RpljiMqcENHx4S7dmhtxi3vynGweNEV7RYMGL/0538lRf6+mL1tR70oBRXTANKQSJGMtz7YmK2Zf3ej8PHP0uSOdr30EtbWb1dp0GP5MpcpFs8FIqTzLlOw+G0LC0UOyLVgFVll12HJ/ncchnSMjk2LM+h34P882qwI5G0DiycAGy7sRL6Rw4mR1aKweCUgl6ls+iehg0tgehkktr1TeuEiFyRW/5yRqaZwisQOQur+4TptQNFXb1nXWxfL/2DZJ542HDjF4TnAGSXX59G4iN90HBL9UrX/o3l0vvfuqeG8oETyjGptJkV9RgNdcXfgIEqu/xuUkZBymbqflWopaCh3brS6JB4q4Ewd+6enDKwg9HelprdgIeD41oJewxTnNbQId5pNlhFpBznuuC+VTO5Y/n+qkV/s6ZLsj9/ZbRojOBjwkjlCisYM7TAWuTtaWohluyMzo08sb+iFp20MEVQp//C6FfV96Sd/MigbA5CxHzswlZusjOwfYur7uMuHLiICprsRuuDfjEqPytixP+qtKk6+MhvMeO8L/uylLQav3GMwlJswkOuF8Tj0cOgQigfIt1LPle18mlaDc3nyYw5mLdN+Bbd9lTeBJTAhy9VD/clu42A4YX/2IU3OoRfUenGFS7BuiWIvKcptqmCg2BR0m9Wn+U20OXvf0rMvOObVXXOkIdQBiIyn7TzXORkGzIrusORlgmmnjp7ouMQTqPXwesTgFIkQlaP+yWHcI9Pu9XEgjZAComRrWkNOhlkvuEFHhbL7iA5C3kzOz0Q8rw0izSEsvN9bROwOolwiO9gKT5eu7TpVzejqHK30v2Mh6RvpdTrqjo5v2vvfR8gKQf40Mq6Es3QraC1FMi6qsIB7oW11oR6N3MmTwF1us4cGzsOxboB5NzW3vLlmAPLnKuvbigh5XI71x0S2RwPuK4eSoqVHSadJqcFB+0kMzEN+ldFHoMN9bxFqAZ7tgp1MCrM335TKJhHyt29qY5SZZJ8wq9/okopiEB6hQT4wzcUEtyU4TEVy6oUuhT8nnNupWgbhiyW6/PrMd5XcTMDSeeA+QjC/0wiCEHRvBtci7kLrMJElXzK4W/vfh0aks/vyZZfWl6SrYeMgyIR9CqTVHFDquyqWuuIYbKqAkiqvQcJgyWacdyJSnYNnLHIMi6LYln9Bzpkg5v3kIlNmEk7ChVvkSABE+V2vNUXplbI2nA9Uqe6wd/o/Xac7VNWADOEJS1kHYkVC/KtrHSyfzYVnU4Iybt6v+TBzT0PgGlIwWHWeXb5+ffjjzn05YeeHNDlLvCIFxvz2c70+YgY3Q+/425isSV9ZwxulLxPXrGulBuHhLBv1DnkKTolhrBnc57C9CaGTXfuQcPoJcbTDxGkT/SHZ6sHf7AI4mvvEcHrNyesBkStFfr3M4pi/uTeTO8bYb2O/106Bgzo52kwcRxNBVt7ZDmOfYvtr3v0ADFqQfUvwdn8W7jSLJsCEdhAs7P3a+U7leHCvb38eYG+CxqoMZjuk3tQ7S/BmJ2m0CzyrM9lFADmJhMVy2Pm1TDtUzN3Gz2ouu+TJ8TuO16MhIvT2NE3fCC5c7Xh9NnSTNmcjl2pUY/9p1mraz5CXfbb5P4W8ZRymcRoueTtFzhJMjqNISeamLfqDi3o92xL3pIv2LayjixkIdcsXzsXzWJJitku/m3KrnKiCLTd3LMzE64os3ch/d0+KnH4DRlJVQDFkx82AtOR19FuhixGnS/PoSq4j5UT/LSJhzvv5okjWK3v03qm6mppwjEcwcGmMFmUoyhjBmpjDqg7gE5Tk5lTRw2SIVsWUqHXNQCsmS5fPJ6LcMUD7imLzYo/+yHofNtIYAY+6tB+x60wF0oTj8f38GzCGUKcIq1kRQE+m/jkK6egWPOxZLhPKCj9cQ4vZ6uBjlP1zBXeA56oNYdZX5ZLOwbFskjUnAhkZUmGpJuf+dpu5GEVGv/YMVlU+p2C2XjxvpmFjm4kkJk90PO1jE0N7KnVWVmVNPXxW7DQ+LXlS1N79REuCB2mL/sYskMRMwLjgQfCGHjvpe3EoUU+tvNFZw7H0QGyd/KMvxd6cc9OgIUMCUoDOEYVLnUK5KOR7sU28urcPWgAfMZ51dIsswwZyDz+Hvrf4GPaUT3bqPmhhCRc1cGANU0N6Zm3ab//nv8RexxRv9nm7jLZgLseksVRUxr8kwNblYfIpFyIFTY22JjdYv5fT2m+5GS84w3fQL+lj1z71I+DjkI4twUmK9c23ckmJqSpTBlJMkJJ+Vje664Wy+snKYo3oZCvEJsgf5YriW2WSj4sTKddh4hHtFB2sou48cMgMnkevqSRRtoXHVCdwMsMeP+lBrjH7WGIaa3A7DVEvpkLBK8rWidbOK0+rDmys0eFnl1eAYt42+/7lQ0UJXozRzcSfhhQ2XN5Rw6fILm33MjqjemTUKPMR3MwX7vH1q8kz1yeUvS8f/XMTictkrxHDRfkxys7C0dDK6JnhuVALAO2nQGyIGoB/joy2t915AeRU8RwPz0IqT0fTc51uXvQbLmlUyHJJwnI3AV5hKDkrEdam7J+5wfJQV+EbFF0hy+Q6Es7GkJkFoIKaC/3Xm6HQhZhXZUyjLKKWho42TA7w7lkRFn6LQCzNtmgoh5TsPyjzr5PnIFyYM6GPzxGare6jk+8U4PTqlypzjStiEI8TwxG9ggXH1vVPobXpjVR92figxhIC7YdR9lL6e2Erw9tekvyQuRVUSaTEOxOFjyVMMbYINHNuWTz5sEZ3t1Lyy5JpaOl1dNhpqFhtpRQSzDoNuVbgfqDRrQ5n6TPkP+Vj2Iu3BWSYbntjfyEnB3KM1TNFqjAZI1syD4WCkzu5dvCPjBNRJ48wGQklmeas64mToopg3ehHeCVXKwL3nqtoE3dk+OXoCNurumEQyJtgGq5Et8N+kaWUjatI6uJ6x3DnxOLtrynhP+7wRBYmYEWT86eHEN6Yc6f8prj1eRUe6dyQZh9spZdGcU/TmzlrEE5XcEX3EJVb2ik9J3U2DtbN9mgrJYel6N1C8TBJCzDvYNDOI0OaBrBmB2EJ7B1Y1iJhwEHRs6nVDWMytQa9QxIjCaMYQqZYcHK44iNVUhCDZK6pgckCnXqJf7z+KRewqG44Jv2AUoca9XyKpKbLHfpS2viaPjo2TDBkbL/GLkeeCH75moAovHO7MMOBSfFpfaglCqrMvCbyUSs5o6/gXZgs6InAjPxhoDbW6NUbLxTGtiiRA1/UFMIFh84bBNlPYwi4IwdtXHXdMpMiKx0uDx7Fjef4O6H4JJ54JV6NaqDFSm5I7Ez9qSVKthx0VOO3y3+sFHBZlkWozqFDWGSC8AO30xJMURMTEUv76+lJ7I0yjnp+S0pDiKU2Kt5gJCWjEe6dBcBS/RUORVV/rcWC1V2TvudFJo3C7n4OaxHS7Vlovi1fVtXDhZXeFXtgRRY1rCQJSWZEvZNn1Ik0VqaIig7fRdKoUCUjbc+cJ9e2bVIzrmph5LuyDfYT63YrwyjK2vfxBOlPczJ9Hts8FyYqHRsPgZKTiEyaxHQaDkngxHKgDUfCIiqu8tveROpjXFrKg+mlkisCZ2XmBCAAGcfJ+A5UON1b+/GELQQJKor2hThdxkKsbjnxENLrG+8K9X+iGe+3trrdmE9RspxPFcDRlTKD9sbrwCOJzF8qJ42oGctZe9vEYR1SOxBie2kCc9iNT36dpcW+cwl08eTun40qIwJSeaSqO4c53L2P6A6DTqD3RH4RSTsjhgK67GUYlSbo9qICB8zOalq9fQV/GBVXOqfxeH5FdTqskgvHPvgFYNG1Di1Nd/azRIUuJ7DcfzbtsezHmYeoXYiRwCJsAHafFwvf+DSrITr0p+8HZbHYSrNwmQxFIgorD5tQujNOhlL0AVo0OEiS7d5tN0QXjKsw9wqDwKouuOFT8jNHRiefFgWR+nuX5rH3x9HQabagLg+HnNCOvl1rvpP7Oe7oLtSObopfVsyQasHg+bg+UmJoJob2sLSzBQd7u7eC0lYbXEhyWzreSTqSttcUrtP8fB5Yu8jx4QdI8p2jMy6VTYLhYK3/2PP84JjdAkxzP0sgDaw79WQTtksIQZvtKBV3xtbFQiHL4lz9UO3jcJ42wAqVKTh1OHMb1YMz6WHkMrsW0wfCNEPxNpNcl3FvjVKpDtwkc6dfhZhzAfbLBqbgK5ypJJUi49YovzLCjjTv2dy9SRztlZd+JqHuOpyjgaXJZbUz0+oJkUe1G9Ne+S4lZUR/gGsWsXK7NhpVoN9C7pxuU7l0W55wwvVo1IsKjsmfpcV+Xp1lc8NGb0DRpUVOhQ2ss16DjyDazdZORbAd+zKFRcyFjXPIeiBScB3Y1oaVfYMhbEgJkqDtcIeMWxzEZp9Uz1a3zYRSXZaNyPHj0VYjEASR0UJ621pAGV5VtTXZS2+MtwbLMcHMgdSvtQtWc4idVB3XPQhZNBpJwyVEj9TFnKL28bsiKOo9Gka3up95sZbOZlXnDGN0zuMiMDXv4Dvp8or5wGxhpyOt58SFt/iFWF/KmJCS4tKMbUq+S7nIMjUKEpGxhO/0iWiq8mw9gRP96k6/e+vAV/ZfDGhSiMYojMjmaHoCa/Wt9AnigN/R6/4tjN3OTHGcUWmauMUQkRj1NccJsJ6DElE8+rbnZQ97DWXlnzRxVxWkmx0WGVIOoRkc3ZSu6gkK5V4lWARlBnnADdd9Axu09PZGw7OsPeDI1TWhc3Da51LsRatNbRda61c/ncOAUFpAio3mHX5IPWCIJGwy0E6fb0nHNQ07gpP6C/NUfS4efxt1z2Wr5JG0QFszbKpmFZRyvNhush65Adnf501A41B2NVxKoVpCq7KsgmujDk90zIsNDXel0z8vipZPk+g28O2JNSZpzjlg4DlXf6U6DpdvAmFhEllKIYa6KyYjUinuEdW/O48dzSuhtn4BFFAtK+8JSJmPfwC8IC0lXUBCu5K4phttBGs/cQV69Kn1Gxy6idyUDTApGFgibo0iWC6OITMSFW5b+Vc+VxGbGtCuHaj1kK4iXi9gTOV8UHssT5ZzPeBqubCiFwstIBEr5ZLlPmxxyMKBevPJNwqHmaR/FAQ2/fDBerXjpAC7WifgBn3e10YS+DJD8zd1GRx/8cz0NV9vi3ru7Jri6Q7zk4yJscjNQtEytzXX9S8rSJAJj+xke348sMXAmzuFdpO7v3+OP+Zp/HTY1sy9BOKjKnIys4lmLlMomaWqKZ1m8rrpfo6gFEx/v/ofQHSvyLI1E2lyYi8GdNXajI7HuxQSmnPYFtN7LPw8H/e6wbduMwzdbKxJ/Er5h3XNWikCIY7b3zo3OTSrBDynSvKs/RXccZouWy39G2TcKpMb8AQyt/5jC5HLzLTy24yGtXSr6RF+Kr3W+gWOvN4Xhfo6rMeHEAv+bJUzju1Fgdv2t7k1NWasn+yohJxKUIlDgvnfMgsP6mgaeT5cfxXMRVGNV92u3cfAfvXOZHt+E3MPtCuEuPxwUZUkQmTu2V1p9RVk7gk35l+WM+Nj5WreYmEHPqIgtyB10i0S9r7ttcpenvZJ84Z/mPr+7qUKPXg8sLeK5H4WpMbmbFXNeayrOVERqX2mpU8IhIMSsmrcp52+3Vs2VHx1qLD6Z7JZ9bYkGJ2ZpSZyXZ18HgzJBIAh2fmHvLb6TDzcckKKymqGyM5bIuf+D1ieNcrW0qQJ/fEYP0owLfQBy4Ngt8R0pHoT2YhQ+aOIdXbbTwp4Yw72X4inYvAKokevAVyFK3bK8gTvI6CAfxRDIhpZNdIAix+YrS7CJCfL6Bj8H11zkiupLHGXjfg9Wfra2uDh5n8UTFUZ+Ms+VPoUXi+35EsLhjmC6NNn8qZKIhJiU2OIOzUNXC6BK0D4yKMt8rqD8Dm/J5+YR2XFlZXnIhdOnzk8Sm4mxY2IFDuxZIBajg1v2yhrvBYwiMO+EjiIxsu2lDr8N/qCGHa2hplMFXtH409IEaoIWeo+IvtkBP/iWLCinIaRSEZ9sYT5kEjvbjiUb6i2bjO3sDN4x9l3Zr7s+UhAHjGgI+GAOJlKQFm2P6MtD8d12PbGRxYpjxg6vu7fMhRJ1NsCc7T9Erl5ZMnE/ECCA4hBmZE0O98iJJuQtV6v3+Hf80v79e7CgB/l8BqzKXbMuFVg4fl9QpeKcYKCAHNlFYkQ0z/Ec9hUak0TAIE08SJW7AmECvDvG5p3nJ9+F0UcWcYTaNGNZFdhPYvn1ye5BRUvt5309zPfGWYIv+ysZrkRN/BNEaKHjwAaoIi0kJpXgLvwEnyy0vGVRRxFoRwfC7WyS5wnAQK/caBUu1ZH4v8fjB2dC4WWBCddlaXOpVLChadDGkr29bMUYbVQRGNiugVXpQp7MZK4BGDKZPBD8rTfTh+AdUarSd8Jt3s4j9HkH2tZ/BbAcu8l/M8V3l5h3xRYuCW8aW6shAig4Hk4hpF/Eht1x8kfaqIWVkk6ib9IWgxRmMg6OMM2NwxmURfuC8L+fye6jdeAxe3IC/cLKA/dp2QQQ4cCtV3o78ymk8koFyw79EuuOZP0/tDh0gXts8zWdzAL2qahAQ2eE2lNpI7uWZZ5w2YGk154IU5XbEmL7k2muE0I5Ad1wsqLKJLVjg/EPbf6rPkrgJYS3ieVojTF3ZmLvNleiKoleWVdPb9rfx7HhByl88pSZaGHogbRXzjKYjVb+Ayw35UVmnpq6V317xpnG05PfY6T4jU2nvG+K0nElMxVg+7yUzQCsDZxU6YtE1yz7Et8Zg3Zbj0jXzQDhOmLQNyLF4hc45cKS51yASWDPnNZ2KlIrTacqxjqWmk7Rs3fHnTqqombjK8obcm+K8ZIdJGpHltZQz0fMawAawT283Ifsqzz2ou5u75N5MHd1TFURv/6cv7qDbypnawjIPX9B2nPNu4nztiHowXKFJUY2IkqjEbtVl0zcEX0hsm8HkLoLYY5nUt+Z91cNOuyEQ+D1vQabSLu/aJfDRK+2GuU23/8oJgRknaUpS3H2LCQCKZqfdeZjlKJ7NPu6sJoSihWtf9heWk2C5nC8ZrL74/OmrJDUQ/6DYrbSUmmMV/h25chAffgqBDx/v9I8m19y0XOm5Kx27tBHUqqav7Md/fZDqWOwGBMYDdPPA23aIjmF9MfEJQIcRnSxBHPlGMZ6s5AbNBcKuqjBXNTvj/fwy83yRkU1/7hkY/BJHMPkKjJwxrpUkQQ6+RCr695FFATiPWoemxjhC2XpYWf9zZdTZlTedurASrghIQhUe5bkx7uYuiYMNO/BwF86LEVOC+ZsKqjV3ClPMgDLGxpUHI+h42hQH+ydMB8xHQyo0lmBaOWhYcQ77k3+BgOTX/68nWclQRrtWYCa71Wa6G5iZLrov/+OMXDQn9Y1DUAl5fn76aC+1BxyEiAWmazmi2CIGiY8Db4o94BgK6BqvcnYAPD32VXeVP1pANQO4Swr9/YBcIjXpltTLfUopVW8JvAW1IuHCtF8DKIZgc+vfqzibNz0T8qavB4jIoLwHDqoz12k2zMFuh4VhMg/ojToImJA83LvwGBn/rnThibymrARBeEpVrivMObINFkK/pAn4jzV0+KMDEUwJ5ljL0vuLqSfEtUBJPkZhUIFkfPM/rIGa/hrn7QZlN4nms2f3/iWom/hPzPC/g4z+RH7on8Tb7PLnXMEGyayrG5TKPKz26mEcTvRADmXeB4yASDrENnbBZo0s2pWkCT5QA6leIFS/Niz1O6R5QuTpUPQuvoiW4PDUTG1f4tzTCljUM6sacjuNkoqUWWZxy7U4GFvVthWBGcPbMGbM1tyrlnhUi+8suato+VvXxoQJN+3wb18cZn+hm+vVdocJ0zae0ZEiXGjcnd/sW3XwR7IV8rX79AsFxAYkKqBDcTW2GG9b9jpKcgpAJmgfb36CrKyf18QaO8TVGSNT/YKX0XMZgLFc85yR1Tnvolcg0Z5xFmdridrB6gU5nIBxQ+EPnWJJkFDftJpBx4YbmsVHjAZxecLa9YrffOjDbNZganTW/wylmR8Q8wp/OoCo7nA5ItHsZjkzfLjlxOjPhwvvQxwRK2xaCYw67DXoU1WL5JritPM8quCeRz8/3N7/m6r7Z8YasV4Nl76ku+8cAJv37FoN1FfkDELKTylDjsfUqgjCYcZq3KoE15l/CDzinmMxShDfMzdkqPCeeMG6AQfCq/wTz0fkVnvkNc1x7QYTjMvxShYq1zKNzNOfsbVqOmMLcmVgplo1gbA0qbmXbjZD+FbfpbjE+FwPbsxKb39qT2RD59y07Uo6uBtttuRAENlfMYCibK/TFewNj5CgJWgAq4pk3kDRHWtGYiwKrzxY7yf5CiUI0wqelSFjGnSfiQ2lyqvmO1LMWg1WKXfnubJqNzVLTN8EpcdiSdcM4of9ZHTcrl8yTlChYUCgr3o6L21QQovftVpAtx/MCx79RwdPePtUyXoYQJ4BAjf00vjCaCIZIYBKom+0sLIm/NTK81m9TF0MndEQquJnRPWRFj6w4DwJJCpuGn+IE24gcnt0Rcx1bHoZ1vEGQCwru9JKaqBMaQLkU9QlApS7kuiXaFEldy289QOcrZ1FQYy/bA2CP20POxi9EeqV4vsMIwIEkctPwgTOg57qUCObs7aEq0Suk/4RB8JAPCftq2kJ6EJlb/bOORTteRqubFhY6OUgY8fV+69CYm9UN2SkQt+nReah9/nr7MEwnBnoZlXd5mlPO8lMZJv0VzuV0gahazEUmbbuYNp8cste4CkFIn3zPowSCJ6KfbTdCGOF8TglQ5cEbBD0pZSvoAbTk9XqLOuhGg+39uwbqLT9KamwMD1Siiy/oQMrvdi3xwq0Sm7XVYEttfMNkB3KzSSj7Jq7k1lLBTRnPArYeks3cQjm2ysa1IUuDF8AUQ9fcVxYUKn0ZZJI6jAcUw13IDs55D6ecXiupczd4gAVhpTUTY/bZMzqdiHeo0D5Gq2hSNAh8ofYmMHdpC82orVP8vLEO7G3gCnG7stylzmMCjzs5VTvm6u5/h3lOYR85xr3aXZv2rR1xhHSgr255ZODRJiMRrJSchgPPg2NF0MFe6xySQjhSFNSbvb4q3zAuuUAWR/zSQEGpzjLuPpFg8uCTKGE7UuGM2mZxn8AqjvTed1gx4WEBBGAh4u+IsLMEPkWu6TIwTFHqtVDZn2ntm5tIekR21mBjr6qXMGy6s7TqERabf1XncOG34Sr0GvPUHFOk0k/ZaOE/aV/wTW6JI4A3HawGJmpaZH+fapwQePakJh0F7qP/MmpPphuA/FmBWU8PjZJfR7nJb7K6aFaDBXkX0EpC5vWk=","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"1382e8398b0a592ec7f3d454b60c5c568f0e3a3b","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file +{"code_snippets":[{"id":"48b7ce6dca7d39b1c8c59d2019fecebd","path":"routes/api.php","line_range":"17-22","gmt_create":"2026-08-14T19:47:29.0866231+10:00","gmt_modified":"2026-08-14T19:47:29.0866231+10:00"},{"id":"63143fecd4df4183b3756587b465bb0b","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"22-52","gmt_create":"2026-08-14T19:47:29.0871327+10:00","gmt_modified":"2026-08-14T19:47:29.0871327+10:00"},{"id":"221ebd0fd2828b2854f959575b99e1c3","path":"Services/NodeSelectionService.php","line_range":"78-97","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"d64732920886e90de00ee4624b3a7b09","path":"Services/ResourceCalculationService.php","line_range":"23-67","gmt_create":"2026-08-14T19:47:29.0876441+10:00","gmt_modified":"2026-08-14T19:47:29.0876441+10:00"},{"id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","path":"DECISIONS.md","line_range":"237-239","gmt_create":"2026-08-14T19:47:29.0913239+10:00","gmt_modified":"2026-08-14T19:47:29.0913239+10:00"},{"id":"84fd25e923e2751ef2c02b83ce548d94","path":"Services/ResourceCalculationService.php","line_range":"223-264","gmt_create":"2026-08-14T19:47:29.091849+10:00","gmt_modified":"2026-08-14T19:47:29.091849+10:00"},{"id":"223b6de577f16ce5ba3530942d7e659e","path":"routes/api.php","line_range":"32-40","gmt_create":"2026-08-14T19:47:29.0928897+10:00","gmt_modified":"2026-08-14T19:47:29.0928897+10:00"},{"id":"0d059535de46ca676e7d42e859e4d1d7","path":"Http/Middleware/EnsureUserIsAdmin.php","line_range":"9-21","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"d73b585efdfd9612d3fdacb25c16a83c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"48-49","gmt_create":"2026-08-14T19:47:29.093398+10:00","gmt_modified":"2026-08-14T19:47:29.093398+10:00"},{"id":"ce8c6f628b7674134170b278e6498b95","path":"tests/Feature/AvailabilityApiTest.php","line_range":"77-78","gmt_create":"2026-08-14T19:47:29.0939215+10:00","gmt_modified":"2026-08-14T19:47:29.0939215+10:00"},{"id":"18599a3a741811129d02db625ec1a190","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"9-20","gmt_create":"2026-08-14T19:47:29.0944322+10:00","gmt_modified":"2026-08-14T19:47:29.0944322+10:00"},{"id":"6628dbaea27cd7799e76d0ff29784c51","path":"Services/NodeSelectionService.php","line_range":"5-12","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0fcceacd3f4f7bd784c2498597b94cdd","path":"Services/ResourceCalculationService.php","line_range":"10-21","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"120a44fe5780fed8b9e50178f2653f0c","path":"tests/Feature/AvailabilityApiTest.php","line_range":"12-100","gmt_create":"2026-08-14T19:47:29.094954+10:00","gmt_modified":"2026-08-14T19:47:29.094954+10:00"},{"id":"0c2729e6e2cbf5369a9d05fbf67a876d","path":"Http/Controllers/Api/AvailabilityController.php","line_range":"45-51","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"},{"id":"8986b3d4eb9c79faeba772245af7f5ad","path":"Services/ResourceCalculationService.php","line_range":"487-631","gmt_create":"2026-08-14T19:47:29.096503+10:00","gmt_modified":"2026-08-14T19:47:29.096503+10:00"}],"knowledge_relations":[{"id":82,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"c673875c-4422-476d-ab2d-b9a260baa620","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:48:47.8160652+10:00","gmt_modified":"2026-08-14T18:48:47.8160652+10:00"},{"id":83,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"2970fe7b-6d2f-497f-9362-3e73a595927f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:48:47.8170983+10:00","gmt_modified":"2026-08-14T18:48:47.8170983+10:00"},{"id":84,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:48:47.8176101+10:00","gmt_modified":"2026-08-14T18:48:47.8176101+10:00"},{"id":85,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":86,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"52e74833-e71c-416c-abef-6a52d5e7d237","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:48:47.8181258+10:00","gmt_modified":"2026-08-14T18:48:47.8181258+10:00"},{"id":87,"source_id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","target_id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 24a7e201-6cbf-483a-aa9d-07769f8ab369 -\u003e 05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":88,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:48:47.8186468+10:00","gmt_modified":"2026-08-14T18:48:47.8186468+10:00"},{"id":89,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:48:47.8191626+10:00","gmt_modified":"2026-08-14T18:48:47.8191626+10:00"},{"id":90,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":91,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:48:47.8196891+10:00","gmt_modified":"2026-08-14T18:48:47.8196891+10:00"},{"id":92,"source_id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","target_id":"397c6189-f7af-4992-b081-938fbeb2a16a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 752bcc4b-21c9-48f2-9375-e4a7d290edbf -\u003e 397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":93,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e 9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:48:47.8202032+10:00","gmt_modified":"2026-08-14T18:48:47.8202032+10:00"},{"id":94,"source_id":"188acf53-87c9-4598-b284-fc851204c59f","target_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 188acf53-87c9-4598-b284-fc851204c59f -\u003e f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":95,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":96,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"8ad6f733-a3db-49b6-a00c-339663ececfb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:48:47.8207324+10:00","gmt_modified":"2026-08-14T18:48:47.8207324+10:00"},{"id":97,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":98,"source_id":"18e54911-5366-49c0-8103-29d10e4e011f","target_id":"6b790301-e99f-4c01-abc6-c1d2251b04da","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 18e54911-5366-49c0-8103-29d10e4e011f -\u003e 6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:48:47.8213183+10:00","gmt_modified":"2026-08-14T18:48:47.8213183+10:00"},{"id":100,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":101,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:48:47.8223634+10:00","gmt_modified":"2026-08-14T18:48:47.8223634+10:00"},{"id":102,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:48:47.822921+10:00","gmt_modified":"2026-08-14T18:48:47.822921+10:00"},{"id":103,"source_id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","target_id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f70303b7-4f5e-4d4c-a3cd-920ef1064fd7 -\u003e 5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":104,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":105,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:48:47.8234353+10:00","gmt_modified":"2026-08-14T18:48:47.8234353+10:00"},{"id":106,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"e02882bb-0384-4cdb-84f8-774469b89c09","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":107,"source_id":"6037ff6d-e047-45ad-a568-3493aa4a5351","target_id":"0db89115-1be8-40f6-a930-ca751cc20e05","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 6037ff6d-e047-45ad-a568-3493aa4a5351 -\u003e 0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:47.823947+10:00","gmt_modified":"2026-08-14T18:48:47.823947+10:00"},{"id":108,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"f39634e8-6feb-40fc-9768-344eb9186ee9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:48:47.8244627+10:00","gmt_modified":"2026-08-14T18:48:47.8244627+10:00"},{"id":109,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"a5435748-2119-4c51-be75-2fd8ff52c01a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":110,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":111,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"ccb27e95-0867-425f-b0d9-148c2a46646e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:47.8250114+10:00","gmt_modified":"2026-08-14T18:48:47.8250114+10:00"},{"id":112,"source_id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","target_id":"84c24e35-8404-439b-ae58-deb60a3a485b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3c632a4e-8679-49dc-82c7-17ae7c52c2d8 -\u003e 84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.8255381+10:00","gmt_modified":"2026-08-14T18:48:47.8255381+10:00"},{"id":119,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"92fd52c4935466c2b4907fed01ad2589","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: routes/api.php","gmt_create":"2026-08-14T19:47:29.0970744+10:00","gmt_modified":"2026-08-14T19:47:29.0970744+10:00"},{"id":120,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6227d1ffcd3afe1f45278e49f79ec4ba","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":121,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"246f3c22dae73dc96be95625fd366ebf","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":122,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d4ac1e9bd132b778065ce759f5c1fe18","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Services/ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0975865+10:00","gmt_modified":"2026-08-14T19:47:29.0975865+10:00"},{"id":123,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"2881ef2b7fc68234fed9616f7677d1f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: Http/Middleware/EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":124,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"00371db7438a3659399cd6adba728d8c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/Feature/AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0981107+10:00","gmt_modified":"2026-08-14T19:47:29.0981107+10:00"},{"id":125,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"70994fc8e7bbb62d03a93e49ef3b0f98","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":126,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#17-22","gmt_create":"2026-08-14T19:47:29.0986221+10:00","gmt_modified":"2026-08-14T19:47:29.0986221+10:00"},{"id":127,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"48b7ce6dca7d39b1c8c59d2019fecebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-22","gmt_create":"2026-08-14T19:47:29.0991483+10:00","gmt_modified":"2026-08-14T19:47:29.0991483+10:00"},{"id":128,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":129,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"63143fecd4df4183b3756587b465bb0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 22-52","gmt_create":"2026-08-14T19:47:29.0996604+10:00","gmt_modified":"2026-08-14T19:47:29.0996604+10:00"},{"id":130,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":131,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"221ebd0fd2828b2854f959575b99e1c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 78-86","gmt_create":"2026-08-14T19:47:29.1001759+10:00","gmt_modified":"2026-08-14T19:47:29.1001759+10:00"},{"id":132,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#23-67","gmt_create":"2026-08-14T19:47:29.1006846+10:00","gmt_modified":"2026-08-14T19:47:29.1006846+10:00"},{"id":133,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"d64732920886e90de00ee4624b3a7b09","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-67","gmt_create":"2026-08-14T19:47:29.1012052+10:00","gmt_modified":"2026-08-14T19:47:29.1012052+10:00"},{"id":134,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: DECISIONS.md#237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":135,"source_id":"70994fc8e7bbb62d03a93e49ef3b0f98","target_id":"7f4ef7b0b87e643be1b3bb62f36d0e3e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 237-239","gmt_create":"2026-08-14T19:47:29.1043215+10:00","gmt_modified":"2026-08-14T19:47:29.1043215+10:00"},{"id":136,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#247-289","gmt_create":"2026-08-14T19:47:29.1048318+10:00","gmt_modified":"2026-08-14T19:47:29.1048318+10:00"},{"id":137,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"84fd25e923e2751ef2c02b83ce548d94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 247-289","gmt_create":"2026-08-14T19:47:29.1053538+10:00","gmt_modified":"2026-08-14T19:47:29.1053538+10:00"},{"id":138,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: routes/api.php#32-40","gmt_create":"2026-08-14T19:47:29.1063864+10:00","gmt_modified":"2026-08-14T19:47:29.1063864+10:00"},{"id":139,"source_id":"92fd52c4935466c2b4907fed01ad2589","target_id":"223b6de577f16ce5ba3530942d7e659e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":140,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Middleware/EnsureUserIsAdmin.php#9-21","gmt_create":"2026-08-14T19:47:29.1069583+10:00","gmt_modified":"2026-08-14T19:47:29.1069583+10:00"},{"id":141,"source_id":"2881ef2b7fc68234fed9616f7677d1f5","target_id":"0d059535de46ca676e7d42e859e4d1d7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-21","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":142,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#48-49","gmt_create":"2026-08-14T19:47:29.1074729+10:00","gmt_modified":"2026-08-14T19:47:29.1074729+10:00"},{"id":143,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"d73b585efdfd9612d3fdacb25c16a83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 48-49","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":144,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":145,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"ce8c6f628b7674134170b278e6498b95","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 77-78","gmt_create":"2026-08-14T19:47:29.1079857+10:00","gmt_modified":"2026-08-14T19:47:29.1079857+10:00"},{"id":146,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"18599a3a741811129d02db625ec1a190","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#9-20","gmt_create":"2026-08-14T19:47:29.1090515+10:00","gmt_modified":"2026-08-14T19:47:29.1090515+10:00"},{"id":147,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"18599a3a741811129d02db625ec1a190","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-20","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":148,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/NodeSelectionService.php#5-12","gmt_create":"2026-08-14T19:47:29.1095851+10:00","gmt_modified":"2026-08-14T19:47:29.1095851+10:00"},{"id":149,"source_id":"246f3c22dae73dc96be95625fd366ebf","target_id":"6628dbaea27cd7799e76d0ff29784c51","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-12","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":150,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#10-21","gmt_create":"2026-08-14T19:47:29.1101013+10:00","gmt_modified":"2026-08-14T19:47:29.1101013+10:00"},{"id":151,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"0fcceacd3f4f7bd784c2498597b94cdd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-21","gmt_create":"2026-08-14T19:47:29.1106279+10:00","gmt_modified":"2026-08-14T19:47:29.1106279+10:00"},{"id":152,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/Feature/AvailabilityApiTest.php#12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":153,"source_id":"00371db7438a3659399cd6adba728d8c","target_id":"120a44fe5780fed8b9e50178f2653f0c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-100","gmt_create":"2026-08-14T19:47:29.1111413+10:00","gmt_modified":"2026-08-14T19:47:29.1111413+10:00"},{"id":154,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Http/Controllers/Api/AvailabilityController.php#45-51","gmt_create":"2026-08-14T19:47:29.112188+10:00","gmt_modified":"2026-08-14T19:47:29.112188+10:00"},{"id":155,"source_id":"6227d1ffcd3afe1f45278e49f79ec4ba","target_id":"0c2729e6e2cbf5369a9d05fbf67a876d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-51","gmt_create":"2026-08-14T19:47:29.1127093+10:00","gmt_modified":"2026-08-14T19:47:29.1127093+10:00"},{"id":156,"source_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: Services/ResourceCalculationService.php#452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":157,"source_id":"d4ac1e9bd132b778065ce759f5c1fe18","target_id":"8986b3d4eb9c79faeba772245af7f5ad","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 452-498","gmt_create":"2026-08-14T19:47:29.1132187+10:00","gmt_modified":"2026-08-14T19:47:29.1132187+10:00"},{"id":158,"source_id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","target_id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9573fec1-f465-4fe6-8c91-0bb4bba9d247 -\u003e 4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T19:47:29.6736745+10:00","gmt_modified":"2026-08-14T19:47:29.6736745+10:00"}],"source_files":[{"id":"92fd52c4935466c2b4907fed01ad2589","path":"routes/api.php","filename":"api.php","gmt_create":"2026-08-14T19:47:29.0800247+10:00","gmt_modified":"2026-08-14T19:47:29.0800247+10:00"},{"id":"6227d1ffcd3afe1f45278e49f79ec4ba","path":"Http/Controllers/Api/AvailabilityController.php","filename":"AvailabilityController.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"246f3c22dae73dc96be95625fd366ebf","path":"Services/NodeSelectionService.php","filename":"NodeSelectionService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"d4ac1e9bd132b778065ce759f5c1fe18","path":"Services/ResourceCalculationService.php","filename":"ResourceCalculationService.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"2881ef2b7fc68234fed9616f7677d1f5","path":"Http/Middleware/EnsureUserIsAdmin.php","filename":"EnsureUserIsAdmin.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"00371db7438a3659399cd6adba728d8c","path":"tests/Feature/AvailabilityApiTest.php","filename":"AvailabilityApiTest.php","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"},{"id":"70994fc8e7bbb62d03a93e49ef3b0f98","path":"DECISIONS.md","filename":"DECISIONS.md","gmt_create":"2026-08-14T19:47:29.0860903+10:00","gmt_modified":"2026-08-14T19:47:29.0860903+10:00"}],"wiki_catalogs":[{"id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Getting Started","description":"getting-started","prompt":"Create comprehensive getting started content for the Dynamic Pterodactyl extension. Explain what this companion extension does - adding dynamic resource sliders (RAM/CPU/Disk) to Pterodactyl products with real-time availability checking and 15-minute reservations. Document installation steps within Paymenter, basic configuration of Pterodactyl API credentials, and initial setup process. Include quick start examples showing how to configure dynamic slider options in products and verify the extension is working. Provide troubleshooting tips for common setup issues and explain the relationship between this extension and Paymenter's built-in Pterodactyl server extension.","progress_status":"completed","dependent_files":"README.md,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:29:54.6189588+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjspqw7wFsgcSykO0UmGZY8QTKN7XNoRj5gLcQItLpCOKXutiG+6VCjcMYiCHQKLTKFKR0Qro1TzWeUG0MgAHCXo/VO92qWUk+WvITJEKK9q1DB85tBLvLFKQ1XDWbKutFvv8WSiZ7tnW/i6ZfMblJ4o5FA056HZiRAzyS/GmVJRNKSiJw7FKn3J0ypU+hyhD2JArjvJ1bDmDDKTdL+4G/oidN4gZMbRsGB8tqNkthZavuwzo4pEIzA8golXB4LnDRXnuig5o0aYse/6dhFu3oCOPlnGqWh+zfVHfVqrnzxXgjCdtVMGTobC94rMeKY/NClSuUQ/Po6njlkdgyhIibM0quRS3rxLorr39hHBon2WY2z4aZ2rXwC0UJpQDAgoYgQO9Cy1vzRMdQyeN7w6eQ53WuNWtEQPgSGzdxw3ejDCr11BAY/Duo9/WgRW7qAJniVNf73Cn7lrOJY2QmoGeBQhojD1YTYOSu9P4qDpbJ/TUfdhMXj/wETq61329gGQBgVBqiKlUyzZWOc5GXcyZCPkDrRvKKg7SJHxoL9MzN/7vk2OK/1Bp4OSWzbAAlQeD2Wbf9JSxHiqG82dUGhbP3s57o5T3vUDy9bVxIwo1EAVJ+jkAQ+R2R0OwN0XcwnrMBmFzlE8+j1yM/oMF01PZMk/W+CclXdr20OOL72KxV3ySMGk0kPu3gZbP5fP5Pmz4MSvg3s4zhooMHZRvPQB5q83NtSat9TvhIJcTNjrUn7JDtOYeiCQxXvn8D+DtuZjsW0udKFkwTQjzIjlLeb0F1P4Hu34fznKYvg7RBw22vrkrwQ8RJ7jpm1OZC4DoGGV+gKjf/goH4hpp1y8romzxgpd5BAplcA3Kz5zsX+vAv7g3xIuNFFLKM+tDS98jxvEVqhC67THO9QbmdpNMFgBSDaBeZgra84ACzmpB6y+ANSMU4HC0v82daUwc4SnwY2MxfUfyQP41+WoEtNoSuu584vKWVIoIsYYI4BQKv1+518jlPpXW9wN7gVhsbgnvhTSmhGpfbRN6PlY8vMGz/rBwyRr/sUMatYdwMt4mdU2iy9UcjfxPL+sqEhGscQeqkSoHKcNHvYYUQZSNxoBrGz0DMjecwsWeDc2CEHMc0exxGeOLKr8LaPYsGm3vloR6oCK7FQSZXkDQuJRe3Clg7yBDwFOQQ8vWxQDOflaFqGODyH/p3BpS7ncjX5CU3Iy/r/WlRx0OkOLgjzLQgq0EDepi7L7yEf2Gc1tG3hIeh5ijcZtClg3foiYgv5oMl/G8nKRj/a6mbbQd3ywZF4ujZg6AzJXIoaKF/qnZOo0mrwCrJdctIBHfCquUNEYQmosqbpjKCuhheKvfl5hQrLTczSAuxmuzO/Yc/Dz38Jb5h3Lyr1AQQ=="},{"id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Public API Endpoints","description":"public-api","prompt":"Create comprehensive API documentation for all public endpoints exposed by the Dynamic Pterodactyl extension. Document availability checking endpoints that return aggregate location-based capacity data, pricing calculation endpoints that delegate to Paymenter core, and reservation management endpoints for checkout flow integration. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using web session with auth middleware, and rate limiting (30 req/min for availability/pricing, 10 req/min for reservations). Provide concrete request/response examples showing how customers can check resource availability, calculate dynamic pricing, create temporary reservations during checkout, and manage their reservation lifecycle. Document security considerations including why node-level details are never exposed to customers and only aggregate per-location maxima are returned.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00","raw_data":"WikiEncrypted:ooagOerKncaxKL5b9oe652R7gDvFSR3kpl9W+Fadq9Uz5Mnp8ZiIexHuG1yXixmdt+TYeArNR3pATyYGiWkJSW3cnnHVVaBLqw1/DAZctfZz5SrrnKfXDB1g6du4oEQQSdyIl+5RBfkgGcKji411VbhY7wR8A2PCz2QWblB9g8cAYgJ691zqJMcNa2KHRFa+UABcu6mQ0WKKMfaN69GL7SVyGIaoEuDjBrq4wA10K4zPCifa8wAbcWwLgBuPasgR4jeOjpFKEaUttlLykKxg+Vo9irZPjKJUsDHNPR7MIWBhvlCYDfNUpX4Jj8e34fAkP4Nu8tIMZq4d9NF9cbMjkNl8uxR/GR2CBwIRZ/zRJfxGTrbqyvZZQpKvoADSbqDuzZBwSg7DOV42pdPYIx5Xo2fHNfcsCwxYCOXqfp7DqEJHMD8iJL4+DIq/pDcJxm27SlgU1F0KGaPFEyrf5OfaLqgrSW2TraYyqVcsiuDTL9SXctNAgumXDmg78YiSTpsV72uUlBt0FPxW4JBCIkk+BjBmcW8RtdXUCMAJ7pg2gp2CruLMKNGo86KA1mIWa68zx9fEmqGEaD7ipdTR3PrT5qKNUpEkx7AWGgF/glJ8EQYOgGbYBIAB3XuDUipElaIO92USro64v655HheuQko3XLspemMc2MxCKZTSxrXKafkGEWizRQAGsupq4iaLPKkkIliGMnBsYaIAywiuzoylFtqf5RrtuHm8wvb6j7oO44noUGuaCAz1rT7n72Enz3/eihpUzHGKZrbrZffdrkMfVCQlot3ZapDPKtE3dyMTnYX12GQGLwwEa9nVR9/wjomV4iVqAk4A8BihZ/4mp+1g2YnTdThd/mgkxrLOAOzopJjKgTE897rapVr30BXC1oLnSpcLtxVqZgEAKupPZdmeHy8tNB9+wF5fP39I2tB12xakNHFeTn8ICPRcOFT6iuOVl8+LwuWLPPJhBZz2G80SOniV2uWG/g4eUW67jy7rkwaT+qKeU1ZBs+fz4tmAiXCktSPT0V3H7BkqiXEktuFr8ozEe2rObfKNDw0ZhFfWWNoISHL40ELKgMsT53eB8tmQ2nS3hDu4Xt0rrOGqOxjSUiBAa6N2Lyijnz2Tob8PV2jHoNXHFSXHQhBOPIrFVPvTDH7VpXWLOaA+Mdg+s5wId1PsEqXY0kmV8yBG3yZP6sFo/4ZPdT+4pbSLV1XtpDb8ksCaQkOYik9MmG5zmrdYzPUDEaYoZxQTmpqDVYdMmaFivrolNg44OMJlodThspJu3kbgMrU+eSBEXkBzw+CsjkAUtAB9SCxTLseN/w2MmB86C/7Nar3QvdwbbeJQiHEZsxVoOwUFtXZufIzfpHGSktnGWNkh6zQsfSOAQj3a1tQlDJXYZMoelLWf1uEVSXggucBJqCG0g2XG1BnV5qxe21pAgPFEOCqZHJHSioUiuOOYgVmY7jtRyiVoJN4xovRNMPiU9Qcjk32CQHAWia1ExEpkehtyJ9hpwbk2ewiBvb5kdjCGrLGF/6OdkH4wM9GzY65u2BqKSFjuXkisQXl5fnMSL3cOKra+GlSAcyysPiQqsPase36Xqioe3m9OztWKKRQ/yvkAjmyU8b6ZXZ05FC2sAytRcimz7MG1dcaDcPUlIj8fQHVYSM8eLojVmQ9zb0eNvHpBUJEN7xk5KH1pR48JYe6pwHq0ygj5jJVsJ2uyq88bZNmUQfvskLnq0Zm8rR6J9JL1uEr/wa83N9vtuPVufq+ZRVjjC+uAkdoua6k3pwjkSPhox5Xz+hXuLD/J52SXj2Swd/AH6S+5r/Q4NyZPu1m8PcQ6lu6tmWbyBif0l7p8cua37wbIYu/WQdsQvpIOkfXUjoeEJ8e0tGjKQEOd+/ae68BMPiiq799roEfay6CGkNFEU4O45+A9suj3","layer_level":1},{"id":"e3386639-745b-4c62-9148-1ee933d1e0b6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Companion Extension Pattern","description":"companion-extension-pattern","prompt":"Create comprehensive content for the companion extension pattern used by Dynamic Pterodactyl. Explain how this extension integrates with Paymenter's existing Pterodactyl server extension rather than replacing it, maintaining separation of concerns while enhancing functionality. Document the extension lifecycle including installation, boot process, and configuration management. Detail how the extension hooks into Paymenter's core system through the Extension base class, manages its own database migrations, and registers custom routes and event listeners. Include examples of how the extension coexists with Paymenter's native pricing engine and service management without interfering with core functionality.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","progress_status":"completed","dependent_files":"DynamicPterodactyl.php,README.md","gmt_create":"2026-08-14T18:30:08.2198258+10:00","gmt_modified":"2026-08-14T18:37:13.2582594+10:00","raw_data":"WikiEncrypted:GiFMFkkXJ+CpqHtjlJI0P5zDw+fIYD9Q8TIJn5YTDPt1Cnff/j7r2yNL1IhqyfgJO6gHU3XwP2ukGvalSTvMuAD6r2jpOWfTyDg+RdVhX4r9J5/SleRUgd5FFLRPL/R8nNA1iOAqXibPENbSeJYVjvax/OqdOQmCVbRD9HswUeHN+0tgtLKDn306sLGfxgFDn3o0hDvmONYAFGIpXgOqTnPnFGzxnRnDOyAb1QA9ViOy+RUbyXiMbWZv1Sr9a0Xl5uV9sP0D4N0Iz7XiqIJmZlRpqgiOAVd/C54T2H0fUIop7jMpELsuatfjtD4o/n8qGTv6qO2Yhmtwq51WFOT43FQ2UshCVSIVeD4G4sg66VOSdSobnyXLXy4FdeJJeJFddOF4VnoAEHsKXkb44/+IBAvvg7MD8+1C3VQhFAZKo1f6UTEAUOuPZMkTxgjWEM9o9M26pGKcyr1UHk9EA71vmNBNjwuBtzmx73v2up/PjobfM8QQxk0ELjQPgUh1arrsuasAKPM2c9ck2kEh6mnpqBzexh7SFnANzb0R9tVthfU6wOTcI0BJKIoY+z+LtQBzuaA7VaLFRuSz1EsCwmY7Yqy3pJfipmVIAronNve4GaEnWwIAohLtWP9lnlv/dIdTJPDW5w02Vzmb6a2fDEGORlNxFDaoZLOs3bswbcgoCHnh8bOn21QfWbU2m7zcKHw6nrL+hYxEeC/OFJF9PjYw3Acj1Ounr8kzPW65oTtjhV2rFPh4f7080crNXvxY1ze0verbRcEJqgxoxRQibM3QsbhwFHN1xXL/gUJ9rTBVUWfCuzMY31+BR/BwxQVMJAEp7x0Okdt2BiuPKrM75Vn+wEms5Hf9U0ecHMvgN5T/tFfgynBxh3Hw+6DczHqIzNu5H4oMfMzrQUkJc4/u5Q17cIf7FOJyxbVanfYjnd4+RT3NMA0/5bLYPYEWpO1Su0COEAB858GOH0ihwIv/tmRT5KY7A/DE2CjqlRDJ5YyCg3urOcMPy2hL7bNrqYB2OGG/BRdQCqQVDlxxsna6bOs/OtLk780DGB4JBofks4wvZ1RxF8XDSOqbzl6GpbmJSXlhTmU4PDqqXwGCYOcThVh7lK6NhvQUae+ePDnXqktcQhplfW0U/jG8aWdw8mJ0+psdwkpoz7KXI0Mdnx7sWPlSutdjNV944A+weaO7WvkG8J2lCmuoUcdK8yklrFuSadv9D+UgzNV1pJxjwHYjamOfe8hbeoOCHVd+T6BdT/4jCxHwDuozTvS6lS3VnyVOF76BsgRZjQ0K6CnOGIk4xRZf0UWqtQ0zWOQTgpLxib1xQojDxGpLadIvmGu8KqsIZbdGuqgpp9YyYLxLDskTPUQJ6k2D/EDoa0YMGeVjGwL1ELj8DnfxBkIsa0mt0dE4pLxT8dpT+0AH80tTu1d9KmASWzJsT9AV6bTHHMYHE+9Z3RLXE6NoBa+aRA0X76uS5I9G","layer_level":1},{"id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ResourceCalculationService","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService, which handles real-time Pterodactyl API integration and availability calculations. Detail its core responsibilities including fetching location data, calculating node availability, building cluster snapshots, and managing pending reservations. Document key methods like getLocationAvailability(), buildClusterSnapshot(), verifyAvailability(), and testConnection() with their parameters, return values, and error handling patterns. Explain the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how it integrates with the reservation system to prevent overselling. Include examples of usage patterns, connection timeout handling, rate limit management, and degraded mode fallbacks when Pterodactyl is unavailable.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyH/jzXrNtu0OPy32NWRIx2SErsPsfwEjTq86GobRN8vNhs/nAvQEonb/+6iOxr91WVqfd0+8rlhIonNa1lSF8fObQ4f0/Sw4uGMBSx4WpewL6XpgpsGm8C6vV+Q4rxzL4+b+7xTDxZbb6TZXaLUyGcBwNm9BTkJZWzbJYNiHpdXPAX0h5gzXRSU4/zkNX/X/EezBMQrWT15z0ElAAkuyXuuZOA2M89a7w1uUXrNirY/4sh7VQw1DKz6O9o9l6/3t7LSMgLHyhSoPp4Mzmao3K+8r9qJbd1K4Kss4lowX8fe/OglUNRnKBZnrqGDfOzC94KCfdRlM3MRSoyF0AEw5xzCr6fkBpMCMCX4VFPhlgnpPSwz/eEgXvdUYm4O21HFRfPt1gbuR4nBIJvYFxy7ggS+xvIAoI72T/nEEzfKOBzrWIfv8WQMuY+Ud5Y2UnvWpygJ8IgVZx20RKPqw8aXIoP5wvrVPi/CTM/KbaInuTOKMgKMcvyrbtp65vkUv41TYVVdF7+2QeD068hp4ZEWZAqkK81DjQKv17mzl6nPy1PoPTPOBai5zamLM0i/NfswpW3lSjDr0jisQtqbb5jwzGN9UZmOtOBzu0PiN1f1SwLC3Jgwpf8LOTCN37s0FGD0rYCEUc6NS9I9naZt93/ehw4wB2JBhtZQcSCGwxvR3fFMWQTH5tYxcQ10ZTRT/9U4P6HLVJL9AempgocMQt2RswkzgUlgVTR4FNVCefZV/YkKhXgNz0xH4dG/vERqhqeeSQ80wcn2gKjl+lSjH7cfBmC8vUiEHaQz/to+xEzsY9apY/xuJL9/tI7+TX4CS7EF/Aqu1DIGCak0A5FZWLumaRKSzXKnxeDkkvZKazlSoKKmPmLQ0Nuj/oSx0GAG4Ke2GqA2t4HCAEyKX0WyS6lr08ooG1skak32NGuI/4v0dSbs5RrME4i5cy1p2Fzt9Rv7cTDDxhiYNwsZD+cKLgRIj9W/0uyh3lFloEVMRKT0YKbHBcJnGciJCEFoXLYcyT05htg9bZM1y0fHnASZ394Hkt+SwLD0cafIpqPHEgj1wCH2VQ+M4VB3YquUdyMcrGfBKPEOrQ59BzjtP52ZpW+nZt78Y0cTnKorJXwxSZ0DAJDC7dyk9VSMKu6Ms84iv6oK7Q3s87cbWpjJi5ne/P8Lr/uf0GKOLCpGhkroIhXfevzW7pzNLa1j7v1ZzxMzmHPj3u9FrVp+9lNqayYJJTQtSeYHeNMJ+Co6vhs+0ULxHJOVz+jUCWgRiMhNc5dr9OalYATUk/C+94dELvIa0LmhzJ2a2p6ycIVs1YIwXfZqzm+YDa60pt66v4N6UeR8Gk/FGl6wkENL70J6PiP0Iin5LMk+AFfUtheVbmVn9CU16tmPCdacuAxYGbdnyCrneAlSTZmV/aQc/GDtmZsPsCI8sb/k6BtQdRX+YdbKg0bnsiB75pTPx+GhdqLrmJoeT0fl/lCCKWdp+5OIF9E0ho3jg5TiPhwVKkQ7Ge7I6Q+o+TJb8ZlW4gCyLAQpgYRv7PQNKGo5FqbKyl8otr9XC/5AJ5Uz/qsV0yYE1fOqqh2aT7lS82YP6MBsLmH2SJSKWAGA/scRwEp/mjaEoFdXFaKuI2DdCJjRJJghcTlCxWdxoeBzJEMHKy4ydjUmU2shw0WyjK","layer_level":1},{"id":"52295bf9-bad3-435f-beac-e59e3eb28421","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Availability Endpoints","description":"availability-endpoints","prompt":"Create detailed API documentation for availability endpoints that return aggregate location-based capacity data. Document the GET /api/dynamic-pterodactyl/availability/{locationId} endpoint including required path parameters, authentication requirements (web session with auth middleware), and rate limiting (30 req/min). Provide comprehensive request/response examples showing how customers can check resource availability for a specific location. Document the response schema including total RAM, CPU, Disk availability, and per-node breakdowns. Explain why node-level details are never exposed to customers and only aggregate per-location maxima are returned. Include error handling for invalid locations, Pterodactyl API failures, and network timeouts. Address performance considerations including batched API calls to Pterodactyl and real-time data fetching without caching.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","progress_status":"completed","dependent_files":"tests/Feature/AvailabilityApiTest.php,Http/Controllers/Api/AvailabilityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00","raw_data":"WikiEncrypted:4zIDF+aXRMvw491krmgVvPuFfz47JZsP41ti+yqcjKh+lPAlT3jL1VT05V3PYVqNwDOoqBuKVup4l0s+swMAYUwXuUuQp1rfsZpJgObUAgVYM3caE5pf/YX4+bgtclgoD+8rpepWqf8tX+cgt3Pqpd8mUkimPHLITXzaus/y95xnPLeK6SEeZRD/6GgmBMvAVTWQA4ks8iB30aHxxf0bzsl6Kht6s6RVRO72uUYmzW+cpcSlzRP7rPkqc9Po2vxScn2B747Ew1EwxKYId25/JVF/brq+V52eKzrCTDySLCiP9MaVN5r8SjJb1gv0DWwyIwbNVSMf/hjnnNX17NYNYEVSSRpxYdSkDgHbE9E7ObaaUJ9I8bUPkqnl/ZamKtPuqLkdkj1rTCca1GOSZ5ynrak6G9Y8BZofL+C+qfmwB0qCgxZPXc0AR4nbIQrIdyVojBGeuY6zNAO1bggOURjOBDy5wZG2ITu91zMViOAOHE5bSNFk025EF1VurdGMhFQjcqK2aO+su1Ii9UKPQxOgMKdv8S2nvmFnWb4KNkCzjFtLmzxgb4gsFJqzf0bEyN1mZ/y/tuVqOspJ1Hd5DH3zkzRFxHSObF5EDg89gYnl6M9kqQnR42KEPO8PHaHC8Hi5n4CumW5pUr1G0aYSMPoEIjK2r8RlRGyVI/l+Zug4ivyvXxqpyPGHyflRkH5BqqTj3YND1uTFASi7DiDf5H2KF5kkG9SIOXyv33n+ahHPa8rIdy+VUFmxSgl3uyZtJpHbkaxeILiKbtoib0LvV/Ur+R/2QptMibKEAcGWCdF4u1y44yCztm0l3vnMR+7pCHUVrhC57JR6AIQOjtAPs+nOyUwiO9ebyTBvg5Ye2jyinKt7DMNJYynHxxE+Bpn0Pqoy8QIEJNr7LuovuEU7iMJiEBBa2Ej9YZoOFRc6VOrMX1aZ8qp8tb7yZhvE9uLGkwWBYKGbv/1t8obi5Jpwt6cgwBrW65h/DITO6+o6EtRAYla0KGERRGfMb6RJhOJGM9UPiN9YurhooSg5Cm5mldflVhcCnapalZ4YVfqbJnUaXOy1h/BjdSBX92oq2JobXQdcCGaUrak7OyezgWg1PdIdT7TychGIVn0HD/28xS/OBYXPIgUiWWQ2oOI4c26gzORBDqd8B2aSzPPpRMehbpbX15Cgvd5nXenjTUApPij3fTue1CwoF/POH4fkypVWoo096F34y/HPa6Ou73gNSuM8UJovXiKTBJJewKmTqF/as+6fYozzABaduvvf9/OV4jE7Xrpop0DaNrqMDtHdWVQx/o2d5OzMUFiiJfgYxzg9P/PGHl3nE6Rv6WgErRk0lOV4XZ9y//no/kYar4EdiPC6e6/gLgwqFgHsWNJYnxM6JyCvWI5K4GQfA1ZjFeg5s88Etr8GTe3LXgQ+NKJZSJFjCfYWJiQSu2a43zcNozbE6hkbZJHwNVBYo+q0wbBgmWBPUTDEJrajEdDbGvyn0JzA+yUby5NRUFslkv20yWJh1gGF31t1NLNmt4UTptxXo1mSgfJ0E5uqlFu1D1qsAkJ3p2lmhWhX4M/wn+UOfyuIHGEipYmm08PE3iNQEy3++IyebcuEl5iQtDuifu6QrDdawg+7bcxD088NEv5TQDWmHpQ5FmZl9AprXWjUP/o8QmL4ieok218GpGA8ynpbUZJw8wBDadkgFKtH96E78WkNrb/ZzWwVQ//OcWWdHrryjVWNcv840QqBuEHFsgqxHpuxj5yr8LIgbtaVUeBhPDSbjH0MX3QM/Mqi0ZO51e1KMtnx","layer_level":2},{"id":"366e7e10-0359-4523-8ce2-a28bf6870f63","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Reservations Table","description":"resource-reservations","prompt":"Create comprehensive data model documentation for the resource reservations table. Detail the complete schema including token-based tracking, cart item and service relationships, user associations, and Pterodactyl node/location references. Document all field definitions with their data types, constraints, and business purposes - particularly memory (MB), disk (MB), CPU (percentage), pricing snapshots, and status transitions. Explain the reservation lifecycle from pending to confirmed/expired/cancelled states, TTL expiration handling, and admin notes functionality. Include index strategies for efficient queries on node_id/status/expires_at combinations, foreign key relationships to cart_items, services, and users tables. Provide examples of common query patterns, status transition logic, and performance considerations for large reservation datasets.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,Models/ResourceReservation.php","gmt_create":"2026-08-14T18:30:21.2677394+10:00","gmt_modified":"2026-08-14T18:37:33.4304848+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz7yWP3UWe5rcj4mC/6a3Uf/FVHHmJPRh5nLy2qjVectWVxWLOLG0M7SDidCUWeuAs1OeYSDHfZV3e2GZ78DLy5mCUFtTHVFsxRpKNT0Qk4aw+8WBOpvoBxYxgnfg/4hbck7zuqmZi1lM2VizvRd4OeijyrVfNqEBDMT1ENE8Yxapht2awzLwKeAusNG2BCQ5zVycKhjbscq8HjlFZ925ppAjlrisBIkfy17wVOJhmezTa2M+sqQiBcGkTzKLgjJvXDFlqdBmye7zd3xI7HmSG2qtxZt2IpXR9vY6+jbOIRvhfdP5BrKdxIoaMxYp2OLYeO4nGPtrFnPkSfETOdW6E5Q4uT2NgnfPW1u/V6UgcZqdm6gsC5c4WSboHFCqUy2XgTsPA2y/g025eW8yiZJmxoBzG2sZuz6Hh4QplleQL+wO99dCknCnAWYv/tXMp4FV+svq0l0MPcMJUcZCKi+DPQL8J0sgCj2WbQKColNCevg2aSbAVdEHa93MRSNgoHRjIswXTZ0wlLSkzq0yzlek8AJcbiiX1p7m3NloJo+hRa4WNHOM4mTu83urDuMyg+J+xuU77MOm3LT/RYvLcm4/AQv13s36wwZ+FRVHcf4HOREC5430qZIqppzsuoR9XjLwn4RNsCjAe7KW7XLB21ijBfM6GJPbm2yxdO0V2e0kmn38y2Pnm6TnIg9WJeQUbVqRuOIYWXlbZ9VfMpO0XuvqF/sD02OSPY07Y4g1cJpMuU7mAYf5jqF63Hz4jU9Xsu8uis9QB7Ppij4I1sYHhqacyGXbl/Q9h9RDlyKdxpAqn3b/7ZR1DCYcuXpVO+A+J3wJ7c1yJ2f9nZSNSXTL7vL2RmIvDxdQd4nYzek/fqfS63sUbByZKMag8NPHmm203xoF7CzdVrBzBl8O0uVg8b+2ue2AhfPqtF6NYMa9csAXJDOdggsxeiIoPGgKCpyb1kUAxyR2lVAeoDvug3qG9YzxvF6oU1zQgbCRN7cb2Cjc0gEi/G9uScAToQzT5QncuPSqYIAvsuwSyawamOXd9rzl8Jof6RgoWPmDSU3yNZaCL8PUfL3KM0l8wkYss+B1VI/xDoVxLwdE7em+PzcQu1W94xY/VUAyoAcTpRwXyN9b9r97qYgCm50G3u2L4gJmbZTI7FHJ9Wpx5EA7vRPwFc/kZnz+N74IDnPpHwyRgZzVbfB35/8qKV1DCZeMlrDYbVuDkWWJ3HuDPjtgW/xCpg6+ak/SUDyXNGmcXFvmCnG7F8/xMMQwdPQQ1pxCMOlpzjdBYYmaeQhHDhFLcTxPYJNZCU3tFf292iRkL3BGJdm5oEqO2fpquVwTsRfqAS9+SgC4W4s2UZpChYy31Qu3KVMv7Q5kCLSLFG/qXHcTa3ZJGo/TZCsuJrrtEX0Q5Ra2VeyNg300FKiCj/aQaP6ReOqYmxZ1TCVLiXzJtKou1GufPgJYgEdFWKlXk4bHAkuiX6zGdSnfUZFiCPB3fVERMx13oUYeKKeouJ+s3/ZP7S7HHX7FN33EeGxyNN0OJ2My1CIwCn8+pXZ/DyWZ5JVi2K/k9xoeBFqHjP3N6YugEI//azp8DlGOCi7rSJGRCwIuC9hbEGjujAQ2KqzFDsYmT3j50n9dDpgOgxHNxE37KXehcAmTFDl+LtmK4Ck9sHwl+vz/72HK/XEFKyMhA9VFVVHihm4v12V3RhnE4rYzc5EBqlDEuS13MA4lIGxnNmLGe6b/6g0sTulbHnNsTDnhhiUARwHLBRlXT0aUtOMUkeCDfRZUV3EpI1n5EsCFTo1u968mEHsrhnK0kvlh0Fz7yqBMiEJREdTyJc0721tDmKSJqSXaL","layer_level":1},{"id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Capacity Monitoring Endpoints","description":"capacity-monitoring","prompt":"Create detailed API documentation for capacity monitoring endpoints that provide administrators with real-time system health and resource utilization data. Document the GET /api/dynamic-pterodactyl/admin/capacity endpoint that returns aggregate capacity metrics across all locations, including total available resources, utilization percentages, and capacity warnings. Include the GET /api/dynamic-pterodactyl/admin/availability/{locationId}/nodes endpoint that exposes node-level details only accessible to administrators, showing per-node RAM, CPU, and disk utilization with FQDNs and server counts. Provide comprehensive request/response examples demonstrating how administrators can monitor system health, identify capacity bottlenecks, and investigate resource exhaustion issues. Document authentication requirements using EnsureUserIsAdmin middleware, rate limiting at 30 requests per minute, and security considerations that distinguish between customer-facing aggregate data and admin-only node-level details.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminCapacityController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00","raw_data":"WikiEncrypted:gKP9HYHAokeBckJVfvEiH325zO2FUZgafxMdqDTenfiADMILiieIEmH0kNA7ZfTMYbKx7O0jd8q/kKTy3/q4QynOxUF5cPpGnvlIOd+vgslIh+nZVSKwsZW6YWyFMXoyPPpMbH9zDoSRZYNjakTZtm8uh9nVIPcd3g6Q5u5ccXyMMXiJfl8QrNPO73V3CVaap3T49B7eoRUYgxufbHfJoQxygQGhFaYnhwxUNO0sOzrsRo9AoOsG7R3QHGzE6qzJYr4a7L83DterwEBNFpr05GW712iIGdqeEvnZ9a2VNycfp0RdTpZ7gmxcjrXG1z6Njw+vqLvFIwzMU357qi+H+jcW3WVKpuT0GUzNNMcnoVqYNhumbAoJ3oU5n6mIpzShs6i1oroaD0u9aqhjMj0ndPtwNoWqwYD5clOoVB02vez1/hOTgAAHydkSSCQA++pYdbpp57z9xI687NsCv18uq1XJKdshhO9dSbghdbNmTB+5c9/ayWqHSx3NTVc0vIN+rdIKTavlLNHaidRF+46LRD9K4aUs4u0QJjcF3TJY1U0OmEYVKMRYz4C71c4awOQSnPkS7Wwio25SszrRUhfERKWnYb70RgR8e4DrZCLugl0wGwlq1j78QcbPYzlXraknUJxzY3Moph+rxR4MMj8zCYioc7DH7DYKuwxiJeMZEu3Qmg9Jojuoesndck1qdYApQTTNOUQjWPueXSZhG8XfI2frcZ46Td1B3/DT/p0q74G14mh0bRc5R+yYMK3djnAIc81p76HE3Ed1iuu+3U9yWoodllWY4YQiuqkGQrD6AiHjrNnLScrC7Lk6r40bhjNqaJSkK2i1M+LYKM5ugDshi28s7NnjO6B5jBRRQRFE8Ua1moVoNAOPajM/bpDstrj3+LtBuKEkBPF/n0mtNkyVJxOMw4x5nSQCS0iHW70OCiZpQCvc+jfyVNYq3AHmezm9VX8KS9+Fjs4SLz311sFvTBpZQ0QRBdCHssI5X7+VqboCBxC0cV2i4EOiu869rjbzEGvooJceXBwFrex74YRtOepI3i3g41ap0/Yg6nL4LBRq2MSvAn51mnInkOCELHhTI/ISJjI01fEA8E6XEJaFTHn31SMA0we8stu4cEBJHHBHUvZfw6O9uvzTIoMzvnFjymL6x0lV7VH6243v5t7krTTPPhiT5qcVoww8YWLD0TeYAFux1gZIJrWeVKrdCehew9HHPmRgyj631blk/5HQKPboCQvTEJAGo22e/Ri7D7r4Th/L7qsW3wgcOjqEP/6VQqgO+MTyRm3dBJodwTs7xhLjnP+j5hwMLCGmrJbSDclLE705n0+It5LqEeNGeGveq0BFvTGq2hVes4hWoc+gxXtTF08BdNQ7DR2kr9+ZU9pwV3vry7GcmHuxEJ+Bmu0/w/QdTJrFzbig1NSFdBM/zZ9aze2D1o4lF4mbGGop9auUC+TkH6obV57NV37MZDgeC+/5UtsTB55BJIz4nZfkSGyW8g/+d6OVA6awgYRV5S8ko7WQkiIPK+IVWvcvT0H90AqgUJjUTh770ft9psWKXm29SLaB69ozQiTExp4JxL4KYCwd37IbxqwOZwn1VhRLgdAjFq7xsWY5eeFNLLJBZZ9fWOLphVMnPa6W3IAds9vYc+ZKgVMYbDApfWupxhzXxvE2hJgmKIW7IrkMSIpmCeowrm0oGFj00dDXSdzTj4r0dD3n2tKk8qNqDCciHxuxoPTALva+MacMDPh6CWq7JfP8q/9IjYwC0mvBvO5+8oERgl6G87CHYx0RuB8gyGsperfRgfxhvj1avYavCvUadOF4avbtseJ/OIAAJnOZSLSVf3xweuRtNASXilvkx3ZgafMDwahbhKR42WKyhx/ARYKmqf06sVVJq+HLbTiHoNaU1G/Jb3fwHuGrTqO7gLoMpa3JS4tkibW5+9YzAUsB2ez8pQg+vpMbPIsYMN+qouY=","layer_level":2},{"id":"c34de209-e200-4523-a028-b7ee197969b3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Resource Calculation Service","description":"resource-calculation-service","prompt":"Create comprehensive documentation for the ResourceCalculationService that handles real-time Pterodactyl API integration and availability calculations. Explain how this service provides accurate resource availability by querying Pterodactyl directly without caching, ensuring customers always see current utilization. Document the key methods including getLocationAvailability(), buildClusterSnapshot(), and verifyAvailability(). Detail the architectural decision to avoid caching for accuracy, the batched API call optimization in buildClusterSnapshot(), and how pending reservations are factored into availability calculations. Include examples of error handling strategies, connection timeout management, and degraded mode operation when Pterodactyl is unavailable. Explain the difference between node-level and location-level availability calculations, and how the service aggregates data across multiple nodes.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:44:10.5583264+10:00","raw_data":"WikiEncrypted:WRaIw5LcDrebk4yzceYz76KRQhmpXIdv+Er/u7CVkqImUNQAm2bnSne33LdsLebyG8y9+8M14ycVfRc+fZpF1TU3tPFrEAZ6OGLYQeY5+fsWegqEUP+znWnqpIpHeLW6K8c8BqPUEZEw1ksVoP1OKeOw9EpQv3zdpsi3xdS4BRrwVLkTbs8vkAnz3SsruVDT03ebl59Dl/Zajgdn2g2iQM1hNEY4ms33t2RjZ9uhMoRkPIdno4D+yHanNJcFo1463y3GS6yYc2Ph2GHh11xbhkflkRfcNCBFYg9GgycZQmVcS2QQYoaf9ZkH9Wg6ALr6VCaGPJImIF4efd58SV2dMwCCoabQqIurGp1BRuIIo95eLt/PN8f8LZIT2Ti4vuGGcFaYAaFkRCFY0w+6eBBpUCtdoGRUcsXOtArNvqezwCA+J7YmfGJlp/HRT2Y1SuTa5bETZR0u5oAcVY8iuad+DrVJQI1WA622E3x77dP97Qa0qk8LqG2hhJQbw40pTavODtlL/FVplbLrWcxknwLoqWuyFFiJQNhpMf6W92D7GqxC8BPBO8EK2Ytfm2gcpVM3EFqdtn+6yUdVLAQJ6kh0y9cRQMk+rQzCwSendQ+4r5restMHeAK0VkpgR7tj6YwPL8F86t3yYv/cWMiZOQjoWnpb9rwJiZsiJ2JV8A2SjJa7E2m240beP2igMzSfXwr0dGJpIQ9lGXXP9Tw9ekd17QcVbhXi7/JxyZ0I8Gqe9PEchSyQySPL1UZ0OZSqduPbenQ2wMV9G5Yz5fgeJ+MmbA0x8jXnURpP8ls/kpIIKbqj8PIjgXEBcDCE36JaQ9R+MY9vz/vVYBXqjPb03zGG1z0M2d4DdJLznzp70LZBBtENSjLpgQTIZ3Ka7wprqa17t23VG4zGjOP3+CZBoGGiMFDgHLDiEHlXOjDRqbG/JiOwQ4Ba7zIKWuKDLkgsH+IK+okDV4kSBWpM0uTGNvmClGgT3URCW6bvmsLEle55cDeqbRDbs0QjjLjhcpnaQyGIUsLWV1FuGzNjpWSBDtRTKULAhYQpl2/S34ROQbvre0oq70HqguvB+eOrLUjRfQRKtLHFSofSOEMZ3lzD1GRzUpxXwWOTzv0ENpavdkyzVooE8SGy2Yn/jEbsoazNDE1tlX5kBLemjChkSSUAphEpW8YFqeu8HJUjXVPFFmppd8oTdxKGqMxmdgZHQAB1pMInMQX9cQ4ENludBWzcHcUGBTvN7Dstc6mDdsrKC+khnchzn2hAJJXMSA58Q83AwBkzsTE6XhDPwMjVyC9esEHxZGMdz/CRXOjzrg6jUy8NZT9cp+Bi9Tf4UXnMhMnXytvyaFxulrSn7X7YptfuONiDcmpJSe/GHQEFtNgypXobEEasEQu8BKd5yXtLfUFb87ZZqQqKrYnynUfFCCyezhVtaNdE5zE0icOgZqYFt7e0UZ8Y6DTCTfo0VnjomSuBqFj1IncpuKEf5O34AC4ENZPFbpHP2krc+mrRprNzriAVdSXEc4VFkCMZRdf3Xa9PqNIG553IQUPIHkIkuXL+HQecFxwLQ5oTtR2KjKeRWXCjexjR0ebfKcrQv3Csa75+PriCaI71oVY8kRJjcXXJ0lqDbBmoWDdGLBXLsLvcdOPXcKPybrmnnyhFMBsHtEYgWL/hQamMqER3Nc4b9U90kOuo9RJHY/hTrmhvG+Kqb/KvIztTsRp8bT6xkAm8qZ46wOtdMy1qN1AW4Z7Z/CbucF9uPoJQ1AEcL75cZa+vRiBYNVWnPubuxmN9Dmhxp9p85aklNYzOmQsLD/8R+tPihiBPRn6vBI0K5jFrdGoA1ojohzE=","layer_level":2},{"id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Cart Events and Listeners","description":"cart-events","prompt":"Create comprehensive documentation for cart-related event handling in the Dynamic Pterodactyl extension. Detail how CartItemCreated events trigger resource reservation creation with 15-minute TTL holds, including the complete flow from cart item addition to database locking and node selection. Document CartItemDeleted events that cancel pending reservations when items are removed from cart. Explain the asynchronous nature of these operations and how they maintain data consistency. Include code examples showing event registration, listener implementation patterns, and error handling strategies. Address race conditions prevention through pessimistic locking and transaction management.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00","raw_data":"WikiEncrypted:PAEsB8Ju3fT5vQaseGI42DlQoL6o6U5PuaNjZtoRczbR+sX088bPDHqLSdj+4gtb4vPAdwJCZ5oyAY2yU5QlRjmAgqBgJ3XHm8frE+zN90aSDTh/0Fl2hwi4R6o489zl2jI5QoDK/NxjAeoVK+47QF1TRPd4WWeauw9y3LBoKBo5+hcP+ADMmUp7ht3Tb8e+MH9DZl4aEnJBoO7nSu2JpbAat9xZfmTrErZQml2nrgtOMC5TSIeWG7aIEg0cBmDgW3UJ05KxMCa6iLr/QpVckAZKid9o9RVtD2RfJtYZ+30sqF86ZTriYQM3cON0viWaQlRM4JVGdIbe8DLJGjHM/TI+Pj7pxkUlSwvX97YcCtF8XqXgQ8Yfyt8gom2Xw5VAzA4LGnxH6oCDVDl5AwwZ1NKvgxQAPHXGiszWUYTWo1mx2YtbGpl40d6omVQWuQBtCf+LF16VKldA0sxEHcirpIIyhQnE/Qnl3BUHp080TN3YsrTiwxjz2bPjB9ibw2RPWY/Acyk2yDZCUqmgnM44ANUKrxzXnK6cGdLeDAFoUxWpYuc3WhnO29y5fMhc9O36qVc0AtLg8emw29/CAX9dV+au8IlEuuC0nGgOb3dYN+paZueNzUWpqfw+BEkBjlUmCb2C/snq3JhAxHip87Nhdmggni5+jx7Ea0cc+r6WoPRRLE5c5i+fb3gJ0CSrP69zVgOZWthDZgG6lGE9tRHXWuKXU35ZcbRcse3G1pq9+0xtHAUfehxaQRqlDIJkpqjkqSHRKVyJV3BS07ZZmJMXcMB2KzuXLmcEbaEAHSeklphKb7WJiiZ5IgSEAQKxG36XDSdue0Bz+V7i8IutGmuC6ON2IT5F2HKXQGi4N9oi36D3yAKjAkuvMLTjM286zg2iW94gjmhgsmV/93JKGQv2W6SxU11sbyPmJBszzRDKJyGXB7eRt2qJ51p+WPQtznsf0Jiq+bE75+Poogb/V17zLxtCPFOEG/HzMJoLEXEfsqWP8sjKihYKdAeWhvmeZqjn32EyeW0ZSul9weiOUDXutPrN1IwCUqlLOPhR13sAnfDkk/yGiWdGtsAwqJredHvUpgtNqzxTbrUzvyhKGEWAF/aeypitgPomGB1Cv8513se6ZFTCot+VA0yK+4yJKgHrlDsjXE2/uE8ickP6OocVxDKkpWaUGR2MgY3TIh+eFqmLv7X1xTdV3MPXezmTzsdPbF1vJSaj+FGf9RLeOwKJtA==","layer_level":2},{"id":"cae4c946-defa-419b-88db-55655e77ad15","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Architecture Overview","description":"architecture-overview","prompt":"Create architectural documentation for the Dynamic Pterodactyl extension. Describe the companion extension pattern used to integrate with Paymenter's existing Pterodactyl integration rather than replacing it. Explain the event-driven architecture that hooks into Paymenter's cart, invoice, and service lifecycle events. Document the service-oriented design with clear separation between API layer, business logic services, and data models. Include system context diagrams showing interactions between Paymenter core, Pterodactyl panel API, and the extension components. Address key architectural decisions like real-time API calls without caching, pessimistic database locking for reservations, and the strict reservation lifecycle states.","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,02-SERVICES.md,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.6236221+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00","raw_data":"WikiEncrypted:EPw1VhZSv2AMLpYzHbCG5biFcgGMvwOBOVUOBtRMzXq9nIrsyT+EBefN3hNUPITPVarYYS5Pu/iqKKh086FV2DmKzq7AELY1ngI7PIP4ODjdYOb+wSA8A8KPn6IFiIZ39WNHfVEScci3wq7im0bAgqadyrnE1Nyhq2+tV2hNX9g2li+IK5SHw6058IxhfX6MtSCh5TlDVxDQ+nqNNOUIpa1GLT+yizbwvr1zaVdQeih2RpmxnWVPj2iVzGEnuaqrKEioVn4cD8esSDoZnakSs40hiFHsvJ4yW0ovotM/Z/RLb3icD56Xtn/egnrxVwMe+a7GE762O15x+xqhIlYNCBNrbeZ4DkZYWTAnbICguaughPo6mNNv4r2pFYwADO/lsRh9l1Nlp05xjxo6Ku5iPV2zpIh8xSm0AH1+lh8JQJNw56h0oJr/DuQdSToOKmpVWdDyzp5zqHbzoCP+6zL17zGKr2jThSmvqBhXfG7o63ZWzqqOS+vedoEcMC91o4yL99cIZD61AuGNir88TxVORv/U+QqUq8ElyHlWoGGBGBJhbLWx9ToF8sWt6RgeoAIeCYS2gg4egDm061kiGZjGzENP7WTizOXYwN0QPAJY+l8RB1L+HF/NeSfH1AdpEUvxAxdHgayPwJ4pEeBmodJO7/Z63HhKl7gEzTEH+fFaqgqSx6lGeGYeJucdakx4T2sgxYaow/13TQvB0meSB+7I4mihc2384X0EF5QJaEWYHeS/dSNwKqt6B+CR7TfxbrkueJ/HJf7cncqpEqVhb2dpURrwuLZv079D9pxTWYr/cSwEW+GocZdpc9pa/CfQopAcWh7R3L2DR0iJVF9lMbNmnqPf5mUVx5QYj+Uf/01WFw2OzyE/96cA/9tBijKm2oJO2iYPWL8C6mP7wKPkiKAV3pdY5WqdJwE2b8DjhsyaDvulZPbIIMhBrKc1WYK6IkLkIBeKp2jAI9WZ/9aRkWdt6jjczaWZYeIsqGWbhyjiPNVwNW5WgM0G5/BQcxyknMJECBkl/GziEj8xbWGl25VFGSuhapq5gzFf4nKPbuZc6GcorZijrbvKHMv9LR9Zw/rXuspZfFVPpeyWm0A5N8Y971yfkntUwxKVYQWA1+XY2ghh2DAN8Ym3n1xBRdZOHeXsaIx2o6hwnT8KGwgiduxFlWfs6gIJErso0+9/5f+lK7cjxZOnJaOuiXSVZj1pJGcZcdEm0BcRPk1tQQ241JFcgiBZpy+BmkZVgOxYiEtsfRa7ixA9ceGFBgxyx6CcwPPy5c9l2nMctoNAnhw6f6hOXOzWPMoM7UjLJNIn42Ur65a5W7k4bxQvz1DW151DlDu6G9zM3Z0xC7xWzk97dQdeUJZb8kipSMKrvEvMhgvV+4dFcMkf15dRtLBacnjlR5Xb18crMz2AC4H2oAvNSVCFg2iTxpBj2fuJ3NQKNZGpyDpZzTIeOnfVyblHvMAxoanTOJhEXSU0ied7c54xEVmM5IOvqYZUuF0d5zTcrDXSHbS6jEoEFIdhXhi33FUjQw0oA/NzeyvyMW0acf01JqPHFg=="},{"id":"f36492de-4fea-4b83-8237-0f42aaca10bd","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin API Endpoints","description":"admin-api","prompt":"Create comprehensive API documentation for administrative endpoints that provide system monitoring and management capabilities. Document capacity monitoring endpoints that expose node-level utilization metrics, reservation management endpoints for administrative intervention, and availability inspection endpoints for troubleshooting. Include detailed HTTP methods, URL patterns, request/response schemas, authentication requirements using EnsureUserIsAdmin middleware with role-based access control, and rate limiting (30 req/min). Provide concrete request/response examples showing how administrators can monitor system health, view real-time node utilization, manage stuck or expired reservations, and investigate capacity issues. Document security considerations including strict admin-only access controls and the distinction between customer-facing aggregate data and admin-only node-level details.","parent_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","order":1,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php","gmt_create":"2026-08-14T18:30:02.4382459+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFPnQCmwwfFO5MgWRJLXlupOxtwLWoXcGT96eqgtu2S2Hsb8vb/Th0I0EChsokzmOVp6oL2EoSZFUWUQLVOhWbam5VmrSvVg23XiZ2IgwHbOG309k585Vx06gWCzlYYlrTpQPfNgmBenzMYqDubVMhd1FSPC45+QL8MHJvpJhhZKpMFAOlAJYzJOdtBii6eIO/ODrbYQCRdrQvOLszkfFN4+E08r0VNTj3bv3BG/rax3NBSnDjtm6CvmfViWcS3TV1cUE3KiMmTDnTm3cssmoqVEc6nlT1n2Q2hYsXgV8PR+pErV1xoaYQEcwjvmsqPRSBUgiGIfSHYJC0SGnzxnsqximBX3ozqwGK4kRppWk3ICwRor65CrKUI5usjDypVusScbBudNraLxazi/+dGJslDB582OBuni6acESJQJjEtpEMJmwuHdyfCBCLtkRXFXPGCUFxU8AwMsp5Qq2Ra6is3yVetQ3WCyv/8pyQW1knoHDuxfJAUk5HP8hdOm4cmhmATQSNlY7kZLGc+saFOhek/eFuU4/Nih/n3GCe7fmZNOpbslfGCp3QZ2ezaSfdMYbfIx8PT/M0FsrHK4rG6xLwvhO6YhhynbuNERSw2o7qILsItW8Cy1TTQFNUiM20J7aBJgB7xwpevibqxvN1cEfj4GmNTd3/bn41ds3Ue6vpqtGun8yD8yAZC24WSSb8VHdqAY79A7DmyRpD3fbrT582o0WomqEbLJBKcNJ/yKZDMl0WvT3o74MTkdki5oM4cAtcBVg2uSIPD2BGxdBTE0MDWnKU7rfLUCj+MgHGvLl0LIrAhXZbGanxnGIGbATKr3AtSawYMDe9M5gZUzNZmXVSu/8x2fOrCkz/Dvjc8MxK/QkY6RNg/vPcu3wGlv1eFfsDL9sJuIN2MAGIYJZPKQfZ+ZYZo8YRHMjmTj/gK9NdNHfNRhdo6PWWPc8KQtHGehBx6kATmNDL0dw7XHa0Fan2wcegR48GBYtXPE9HhIXeKMwESrb7u70SVOhzq0wQBJoQcG48jn8Y11oMWlatgKXyr6+FoQO0oK7Njv113ZczREC/VCPfE2E3svx5aiRlYStedcgornPBUvyuywqAVVdfe3nd6UJnzv9NUMsNuMYWI2l/lFWqymguJR9mfoiIoQbv8PsEvq3S37STEp8osd9eisOtHMjUbN66RLJYoMYGOz6nFqJD49gez0Q8uZGAOhFJzwjtt1gQ+8J44cZ909hvpbX2H7FVolED8mvBRQiN3wHcQwp0HiyDAxHz5LWKIMGWfS4uSYucy6HigjyJAIupo/IZG/KkTjirZWdM3KUWcrNOUluzz1tmXkG4eWC8ht5JUlk8cf60Ax7ee1f5tcjJkwHtC/HtVE2c5OVec/yW16HH43uz2fWqRC4euJ/6cD2tT+LhfUQoTRLXU/K8wWmnuocc6ZNTYmPEW+BwXZdqoYrJgAZufHfDPTApxinaNrocAegG0rNr7B7ACUJxTTWI9nmucQ+7eqK+d3ipfW/DYDCrhdwYiZ5EPpEWAR/8NEv58U7Zk4b0bW+Af1FfBWTPzqQu6BtRfPvY4NrQxz7DTRhVhJsX+m+0HZQjkYJbWMovkQdP1e2J4hi3wfrrgmlo/eqRXnbJzBj5ardyAmlWBuHJGlCpMyHU/p2CpW+qgXkVKDmIk0bFA1AXM3rhO+N8QtxM++9leGBJsk5KBFnOQg/n+6HXjuCozOcHsH+bsfcJk2fQxxSRnJKzieIU2NfCJ1fVAS98/62ZGYtXMbYuKSO","layer_level":1},{"id":"2babb181-df9a-4da5-b222-f75f0ec91241","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event-Driven Architecture","description":"event-driven-architecture","prompt":"Develop detailed content for the event-driven architecture that powers the checkout flow integration. Document how the extension listens to Paymenter's core events (CartItemCreated, CartItemDeleted, InvoicePaid, ServiceCreated) and responds appropriately to manage resource reservations. Explain the event listener pattern implementation, including how CartItemCreated triggers reservation creation, InvoicePaid confirms reservations, and ServiceCreated creates audit trail entries. Detail the asynchronous nature of these operations and how they maintain consistency across the payment and provisioning workflow. Include sequence diagrams showing the complete checkout flow from cart addition to service creation.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":1,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:08.2203921+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+n30XbiFQ0QQI5a6lxogiBPjTg0DvvbBFVxLISoEha9gTHejRqEmQELBgKy8TpInzeOxqTibbENEoZBYJB80m7a8AkCUYjT+8XutVQnlBsxW6B7AxVZJPt8dBsk4/NRs+3Fs9Hy3f5vUM+rkVyeRDU/t4cBM22W6LsubJK+SlH/camNzUFL9YraDqm+kvr1KK+tqrH7Zsqbfc0YpCXQQZMhmQbRku0lZPANjG7wx6ICPWbd7qTQHkXeTJpfEkyJTvKmSoIMHghCq4Po+S7kjqYkDr4Jri4C8tCkMXodvNquesgq41stmNXIugjD2mJeumh8gEhunKj6Xp65wbiwD+6pHdHDR+fEbB1N8i10vzzuXGy+TNfPkfhoAxh1COQu8H7YQuZz27PksUOTyeonQyHZDZ+HrTFEn/PAKCy7fXZxcUqsLRmyBcw4Ycm8zwWZV73BXNrGQyFBoAZ2N+IKPqr1H+kFXJqY6V56FmZ/4C3dIxEPyJTHCZQ1PDJ57wcILfSyX4yQ3BW4H6BXV0eoIzraLG49iAlOlc89oDBSZf26jGZ0zakzam3DbnFtw1a/s0+NhFLYTZnubCgrhbaPhkcs9pwbmw+oN2PfWkm9O6M4gqDJgnV5Y/61/m/KjhnMer4eoJYRI+TJBdJgrLHvdgkOjLHteMznWwt5uLVap3WmjOtb3AWqLMq9QJMqcP3trj7ZZSTvwgDHOOBMP5Li+xtuRTJgM6gF6TkkkZ+jjDkTOZ2OtctGO6qPcDC3fopQ3pj3yYsn/DSljnX5rAlNiyfZ7Bg8jwJKwG7lTvDi+FEBCb8UNh2P8Q65ImiFamKq+FgM4PDt1N+kFfDFDkRQPpcfU1BIktJ9wsqfOeqly27FE3+Y4XqHWSPh4EIENu4n4aR+76vbpoxebk7bEpUQiOWr9EZhsQFbAgqJegBVnNZod933FxlH6HpoNLIm+1XfidbgKgAZGzh9H3sOP2Uo8IMy5DVKXDNKNDqTBnIkIizNAw7EkwChP/HB8eGykKTGHH/Bwdi+5GJyA5zfiGcXkJH9s+2ATPGi+BOZSatoXUBiXLzQvNX7NOvE05LY/oVFuPkLmi28EvIVwom8FAuuYabIjxmGWMu2blrYgMCX30+IJqtz1HjBjjDbQGGzmJ0KKPrro4pgQZRm/R/DG3ZFpzklu3upBd0Dy/qBtB1XILg4yDRc71Caj0bVTHS/vck0zGmkVNKSk4Q/ValrtDITP8I/klcSRfnGsi0nN/0vYpeRtsis5Gw5BwnyEgpZ7hoXGLx3T0ipD/kP7/ATMvzN0/C7nvqoTM+PNOUWqTDpu7HbsBlLHuEFWdVRvLaKAybKx8cOIgVwCi3tqSvM29mePu0IZCHp0a9237e43RrTwJfDo8T8UyHtBZCTtqRha6Ro+hn9k5kXTH+FEHfq15W5KLy3SvXvWAG/G8yq38/d79UbJBjcM7Vwvu7ejTnbU2xCm/JZHZCO1Lh/y2++5bXwFM4SLmSvCEFA5iF62jZUASkE9B8/1m91bptGEnP2GKSg8IQ==","layer_level":1},{"id":"f090ff65-6cf6-4648-8dce-03419ae86c77","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"NodeSelectionService","description":"node-selection-service","prompt":"Develop detailed documentation for the NodeSelectionService that implements intelligent best-fit algorithms for optimal resource allocation across nodes. Document the weighted scoring system with memory headroom prioritization (50%), disk headroom consideration (35%), and CPU headroom factor (15%). Explain the selection criteria, scoring calculations, and how it evaluates multiple nodes to find the best fit for resource requirements. Include method signatures, parameters, return values, and examples of node selection scenarios. Detail the integration with ResourceCalculationService for availability data and how it handles edge cases like insufficient resources or maintenance mode nodes.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":1,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:10.9300315+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPU1NZT5lCZZWgY4kA1m6Nsey88uVCxSZnlNfYBLgPfLOOSgKtnCVZ2xSdM/4qrNwQM97zggPAHw3L3MzBmJJMKdbAvGXj7asimVq8lQYsM42bpHg45aSiwKMuI9sVSelRUDuXUx9OAOhUy+6RA0PI4cgc9FGqgGzHEHdVEN+tebL7R/yQpFiNOf9pJayxwo+WbpBlI3xtc4WxL6MyKdH6ySHouuAFJ+3KaVvCXKlQcPRz8Yc+aQyTAUTd7KWf/UNW10tRC1DfWJAc5hJvapgyRQ8pKYZNeIejsAi22f1c7FyBKlQxMKF/9KHRB9TYIJOhB1ILCzLGKBbzvhryyLIXWUnVU6naODxNsVBnPLWjNhP2jrGWAS5WelkLkWgUqvRokcFn82edTzpJPU6miV66Y7tWSqFfJg81BRmZnFoBCB/E/jpF0u1vhCRDP8XyphtRmPZTXZQGoFCtDPAtUzwPBEY2M2xTvFwp5iOSCOGTCaDiXXg5zvbeay2mG1+i4UhilKZ6aVN8lxt/pcmFI6sd+IWzOAUGsQGuFoC9wonxOvsKH9d1eFQiBeZPbSBuRSeoEaepVtVdFGKmx/xJUWf9m84Mm6aMiFds+ZSXYVwMqfA8I4Wv5xbpFZXLV1o+9q+gevqkcgv/RluK+OvAliL5G0S5cvRGql3QhlK8f/0clLf754EHfWbikMlXuTvKxoS33jH31TllYa5TL9BhMpV2JOTBO2pKIRob/YFNAXUrX5DT6RZ8cYc6gDipHTFBXxmQXk59sNsPNz/V8GPbNGsIHRMtzIe5FyPTWzI9GC6vus3SynAKBLldk6P7Km2BAsZHOsDt2qyXTqPhnio5lfomXzDaZAr+9y7/2nvhbfXx3sQOyrfRgzJVDqalma+y2zW9rgSMMUNW5aP5aApdDyeB7TomIGCHU9x4HI1YqBkfAcW+UEdKltgI1SyvdFy4iCaVleAu8jfUeYABJTypFi1MA3+IbGpSTCOSUYfewl2dBstg+ZolNhScj6DN8T/R0HYYRvvHRq49qbs0u6ZNLsLFo+vAjTtJ7FggngE6G8cMRh/2vPTXtth5vhciF/BUowwhvi5Kzt3fJvWZzBFbyjNqTtsOMYxqpoBDuml+z+pZq/LiM3nPGjYLr1TifGQGZcLVQHihAbn+EukkfDuMp66dzQW656HSGc3DttSPr34K3YkzlQ8GdkCGnmDASe9TfsmdXfQ2Uvf/YQTsIyt/hTWG6Q0CtluLS6fxfITfckBaPQPgBM+8JX2PbCp6c2XZsno3nxhY4j2ok0IIscAps9Q3gLqVfC3EdVg1GAvVApUNH3uxDBYugoBAlzJKic7I46pof4d7RLPNR/q3eWbv18ZA5YDXHtwnkzwL6VsrQ87S+6jA==","layer_level":1},{"id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Pricing Endpoints","description":"pricing-endpoints","prompt":"Create comprehensive API documentation for pricing calculation endpoints that delegate to Paymenter core's dynamic pricing engine. Document POST /api/dynamic-pterodactyl/pricing/calculate endpoint for calculating prices based on slider selections, including request body schema with product_id, location_id, and slider values. Document GET /api/dynamic-pterodactyl/pricing/config/{productId} endpoint for retrieving slider configuration metadata. Include detailed authentication requirements (web session with auth middleware) and rate limiting (30 req/min). Provide concrete request/response examples showing how the frontend integrates with these endpoints during checkout flow. Explain that this extension NEVER calculates prices directly but reads slider config metadata and delegates actual price calculation to Paymenter core via Plan::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Document error handling for invalid products, missing configurations, and pricing engine failures.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/PricingController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6978147+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00","raw_data":"WikiEncrypted:KrL2QibOSZbLMlUoFPtX5FYrcUjZasYTwn/UujzkoeKbF3ty12OCKFPTLg71evrJP4g+Cl5S4PwtQFYPhAAcH3yvug3JFZmsM9Mqvw55rdI9Btx3wiNcthVQW9UHmAI0p/KYd6i7hKUbkv6Y8jZWtQ3xy2St2l8EKjlkukXBvdV417Y4HjylORnnS5eb3w8SSvJEIc/AVfpe7pCDzbk/VQimd1ouaid0LwSz1V6lJZEqs/yNa00ENj2MxRQ4C7/r6fLW+GDIM1dI8TiT19d7Oeh6T96KEKPRpsYgU4YV2asQ3FvmcPYvVWujTwP1uVKnhJ80RuA8/j1jFhQonAN4Ob/Rz6P7opeXZ3ixK8XTcm1x0EeG71eN4gzglOmRR7N3O0nxsY3irjWdKTSp7cw7y+tmKuQNYqVqLN7pPWd7z1xLdfNyHQGiV7ksvVKsEJiAb8xozRSzv6beOHslwCUIRH5ypVcvYoNnsHPCq8bufG4GRtvidqSD2Wsd3fZ08EaE2ljCCmIxHHcfIa3y6J7paIqWzCF8Q/2KMryo/MfuVOcMht2Tt+chKyeVANBpM0LkSilFqMjarMTF8Ya8VwTiNsQSFMHg2pA5G0HiEnBrvnbbImaTVws6Mkj1aCMbhmU2mrPwUPhl2tL0V8jxUrXI/n/FgHJpik6bRbYwDcgT9QgfB0qPensetG52vEe3oTVgOS0uegterkU0qTiYLy5YZAc7IoMGNaRVgkrPrWgyTZCjpYbp8n7WQckDZwxBs74dSs1sYnuHlCi6/cRdIYQjF3dYktz5orFA1RMq5cgNIHAOQpPyeVPdxeIN6TSd3z9oQY+TqUy2ezpaBNL+GKrB+TXpnYEXUA0M7hKVq1OGvdzFDL8y4BYz3zRf90bR3StF1yBkLqI5aiSCK5WYg8nyZJ/Yz6okaisHVS6TcoSNFuYGp6yaVvBwQL31VXf6Hh8klL4g3FyUv0Zx999CJed/S6eY1huTX7aI+sE80v6uC4M5xi80LkeIWpQtvcrm1YAM9LQF72IgNrACdU1xBvNqiYvvj/X/c2F9zNl/CxYnIdc6lJyhb9GRy4tKMa/IBiCxGcAt8D0lJChiYTG+SRQbiYbnvmsdUZPzwIy0r9smQgqpZiLwwCErhZiqNcfH4IrWlwR/oWKYQ35OI7Qu1YNEvmJxxBsZiIeYwaw6j3AmQHRvFu6IS7FwbNDmD8+cBNIeidhNdvzpCgegzixLIS71wEX2lnzoUT2xsIcudWJeglgYnEjTeXiVT2z0FjcyVKL5pCBmOQPulkuXpLmrkO0bgZES0wRqnjvPz1EFogPMoMB18PzvGeRWVLssAmhMrPWt/LTs7QXgKqcCbjbsGRuOl0w1SlEQ6M7fQ71p9Ln7ujjQmW1rFVO8g9HBJCEY6tZirXMbrtidcAZ5/WbUU1sNzGhNvFcjcnuWAKQ1zaYeua6PosDjK98Yo2QxXfsxf6IlRyvw1hShQhvJP62PWDdaMiDnGOwbC4p/8aSj4O9f/5nJosdJI7ny9+zLZCDwCozhOCdg58d9lv/uYQfj9ZtEV+9La3XCFeuISi+AMQr5lT5etTR3lHCHS6jSVIdnVuPEx/MgqVbwf9l9skEOODASkTCR4g+b49Qrvpujd2LgAGe30wTtef2rrAVddZvtb4b8RuA9tV0rJJKOWpNuEhSvMR6diY+EvFCUKzuUkDKGZqkyEHURjRwBw8ydDExn8YZUc5K75xfuF3CLwijCQzmrZpjaAxTnpmk44tvWMRolbSRs5WwcrmroPu4rFClwZnfXRwylEMvH7F8yknGf0fDjr0a+hvrb6zb4Wc9nCZ/60vYWjCZwxsSDPV4adGexm6W4IoseqMDqwOk4UNdpik4hU1LSyN7daCj6jcgRooG1Lp96ZaX/8lu1njskuOxvewY/","layer_level":2},{"id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Audit Logs Table","description":"audit-logs","prompt":"Create detailed data model documentation for the audit logs table. Document the schema structure for capturing administrative actions and system events, including fields for action types, actor identification, target resources, and event metadata. Explain the logging patterns used throughout the system, data retention policies, and query optimization strategies for audit trail analysis. Include examples of typical audit entries, filtering capabilities, and integration points with administrative operations. Document the relationship between audit logs and other system components, particularly how they track changes to reservations, configurations, and administrative actions.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":1,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00","raw_data":"WikiEncrypted:eBSK77QvZcmbCugIIal0dJV7nRn7NU6S/LHQTT07FMuoD4PD4Cz3saFVCxkw5e63ZVedJ83Ytx7iC/kNlGLurtBZcmxZrva0nqO55D3/Uup8nqSxblkJtZS8HqujneppGi34JxedVjnB3MCDR3iwlLVLMw1ICjMMlwm7Rr5SHxPc2DEyDqVYpEMZNx+HITvlM7NkckwmA4UoTVUDIqckToGtVXeqjuf8KmjZ6cqxRm2wLlf3hm5nWDtj1h0Ivq2kV2KSoMznvH7XfYHZPQuN5M4n0RXXaLauxxKpbOB7DmVJ+7pHj/VEC3IPRrnJggqp35jZ0ixUdWx8+Wn8J0IKOeUNv2xemgg2JEv/vt0U50I+8ejFVaxxYP8y4k+duaeLWtmBgyR2eWVmkzbMKapQ+L9JC9H49jSAehj+lYrG48KsNVde9gtf4qutxb1DvhXB95OnAMLwmocXXWDYEoOgVL/r9cSZfit0XdItYNdsVwskAs/GhV8IFvP9a+oBzJjdwqYD3vqQK5KAct1Tvynw+SOpyNEiYeJvJDdaPL/zpunnrK1qUv60B5dUDuKP1RQFGZlZ83HooLhIXnIRBJd5N4Gcmj6LEa5u7XlECV1qAl6UDn7d/BxXVur1rGHZrSqiZTOPhljgd2pyYeH6AgKQD80tzbtPHXb5rWWIHT/uV50WOhEPJ0KQ0jIpfW6RRS4UBRcIJArcZkV6du2YvyY+Vfb6eBtg9IRZemAw17JdoS99W3Zhry0HEywTShANtrgwibGC67i9TbAaRPgzFAV5T0NC3EL8woLw0jxMnNDwEw1IzjhNLAcwoyvs8KM1ZW/sMA53AtUTORNaNNvrsUY6px3L4IPjzzyCNvNRcCoMZ3Wfv0tVuRgvyhbXPExlHe5p31hNKLc7sHYNFUR/lGbXm8As45LkXeDPe63k3pZKU56FpEEPsRd7b+HnXwisH7M5cWBfaO0LjH2hsqP/aSL8+mgF2ocl5t2qXYyrLq8u5+DseSzBWceuVOBb0JY1JYkddvdro/KtAEwnb7JXK4+G5yyudSnPlHEEAywbPrg68lcplXmKOZBOq+j8TU9cRXFV/eS87pW7venRaJleiRK5O667VzUmRKLoxzYRh1x+Zm7TAAIrokDU+RjGuQ+5rIWOx8QRvCHZr/TSaRf85Mu9fEAf7zALHYJc0rPgbJHR4TQiwADZ4yA1OjMhYc3Aw7mQYzBBC3T8GKRLjkWRiywbLSHh+wNWjA7vjVoe2jk/DSP3azbV7g7jPfMmqGhvO4eWZpRdAmGo2fZs0/KE8Uj4z117ivunh/nKdThyc/0wAEseRCMpW+sOTbGWiV0bdU7GIp7w4ONVCOU+L0PstPAd5Or6NOYJmU9pj/pkvgjxmuTtnBOq2wMkkOh/jV7vHfqO3xffiutVwi4cDtfYVRmsVciT1dhaRCoi+9xLxpBVCca80mmYZUoLH6bXfw2eAkFe1OqOtIoZZVAeIFdk5i+axw==","layer_level":1},{"id":"7e59ce25-92a2-4b6e-b318-305975e4774c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Management Endpoints","description":"reservation-management","prompt":"Create comprehensive API documentation for administrative reservation management endpoints that allow administrators to monitor and intervene in the reservation lifecycle. Document the GET /api/dynamic-pterodactyl/admin/reservations endpoint that returns all active reservations with filtering capabilities by status (pending, confirmed, expired, cancelled), location, and time range. Include the POST /api/dynamic-pterodactyl/admin/reservations/{token}/cancel endpoint that enables administrators to manually cancel stuck or problematic reservations. Provide detailed request/response schemas showing reservation data structures including token identifiers, resource allocations, timestamps, and status transitions. Include concrete examples of common administrative workflows such as investigating failed checkouts, cleaning up orphaned reservations, and handling edge cases during system maintenance. Document authentication requirements, error handling patterns, and the distinction between customer-facing reservation operations and administrative intervention capabilities.","parent_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","order":1,"progress_status":"completed","dependent_files":"Http/Controllers/Api/Admin/AdminReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:22.1845953+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Service","description":"reservation-service","prompt":"Develop detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with 15-minute TTL-based holds. Explain the strict reservation state machine (pending → confirmed | expired | cancelled) and why the 'released' state was deliberately removed. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent checkout flows. Detail the idempotency support through unique tokens, automatic cleanup of expired reservations, and transaction boundaries that ensure data consistency. Include examples of reservation creation flow from cart item events, confirmation during payment processing, and cancellation scenarios. Explain how the service coordinates with NodeSelectionService for optimal node assignment and integrates with Paymenter's event system for checkout lifecycle hooks.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":1,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSla8lhwQGTs0yV0pj8IDu1UiZ6AH8yKUGDtfPXlQTy/fXRUtoszgFPGwJWtq0fOq/KnDMFtJp+AocieHLMogtlZpa0GEaCuQLGo7GsNQ+eKDmHbXeqw0p91WC6Tcq8rH8Obrn0P1/uMc1BYLvn3XY8PPyzsOaoDvgJdTRJNMyFNXecJQjKfv6rLXyEIFXLy8c7Zd2MMsPTJ4JEeW0QzWQCujA32fon5xBLoe8uRvybKxhF6tn3jZANqVIkOV2MUlHRk76anYF7Xc3KNXrr/UB5YzklVhQTlJkeuyV95Xey80p6VwTaL9VrC3GxZ7QQ6QCoZsV+IL5s3MqkPndGTkL3VITeS8K3QBIBjC+rdEyk+b3Mov9A+5Syo9AxXcUnwHTAmaq6At3SZGCB6ZBDRDCzRc/s3eQrE3Bb9UEAwqYt1J8YTQAg2mjRxhdGmV01L3k206nFfOZbZMdP7wbXJOzh4i7S0IyqZ/FSAENxNU3VbOtyQMwr2LWE1hQoVoLYqLzDK2aqRp171PDv+f2DF5xVRALSJA7OX6z1kc+TIqxLlTYKvSjZkbwVQzB5f+CmmPzvPNnJNi3XbOp/zBExCgq2zHuX7AcnrUb6NHHHL2vdJBnhhIaz2CaZkQGGgDotqaLJPSpz9JS4gKRqeO3xLMdXjWt2PdMx9fcyLjjqSP/1wTYBxzCWIlyp21I/7X9bGO9VLPkYDvzgfuf6f08/8iU+et9xFQuthx2bTaY4qztvreCPib68MfU5DnATaRS8++Bh4iFJrLKy6jpOEdn+HJsoPXOtcgYLPm3Ib+8uzhvBqTEFcncDiLagHCgC8pzlpeZJO6be9V/m6VZRih4OCYzdVmHtAJV0uTNMt+oKavYBm9KlK6uVjq2DpUDS/ZIG5+o4pftmhDa0RDcPvQlSXgjjlN5T/pmFw5laLtTZZbRYhhZki0tX+vHISWSZuNeodTjpI6qQ97WY9KZcGgKHsWf0uZ/Y2x73OOJbMuLn5MJxyMUWIOLMDn08EsSkJsLVi3BdK909/R+ehWJKdt3pU2rTvDnqQeeTExZ7XM37xNj1Wovu4VQeaJ3y4FUJibR9pVNKjnsEFlpL87FrvDYsHk+RzBN8uWm23NNbC5HiolS2owxyCWiQPmshIkJVAmmwF9WXX5UR2MmC8asB7KNuNLiYoZqC3HMGMHBZTtyVCbzQ7diHAuCGhrFKnTxNl7XCtgkl/NDWC0M5WVuiP0g4tmNkTTYVNV+HVlfDQjBOeqvVZQC+dXY4fnWwYq25cXEBHJTt/zcTRfJnhnQPdUKIyHOiaEhQ2VzZSs09nw+kEDbOFNxOEzpPftTwAn/DqnWJgjZ0ptB4dZvtkzXKnJN5E1lXX+RP7glCW27A4oqAeoCcF58I5gV1UY5E3nbu+N0NsHKETeYZ3uhvCj5AU5tACKN09T6W7P+oczLZe9rWCPl+NgEPag2tFCKYKXjBpDUjSidiqrDfyr/DABMavaAvmrMtH3rd7ChtzjoXgu5Rn4BfA+xEhJj6XGMk+uTpSvsR7oW+BI/kfM08lODDJp5+nYRb5IOB93kpaIcKKl3eoYuENELAoFCgxoavbuymntlwUWQWRyDgYgJavWjD73k1tyZ6RZMt2Z5R+uUjh24BvllnwDwAbrMqzXyaoKz9TfVQ54BUTJ7EJTmoB8wk6/Huo7m0PvabHkeA/1kXIsrNqe8lCdxFZ6CdHnpUd2McWF0PHkQD","layer_level":2},{"id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Payment and Service Events","description":"payment-events","prompt":"Develop detailed documentation for payment and service lifecycle event handling. Document how InvoicePaid events confirm resource reservations, transitioning them from pending to confirmed status with final availability verification. Explain ServiceCreated events that create audit trail entries linking reservations to provisioned services. Detail the confirmation process including real-time capacity checks, reservation state transitions, and failure handling. Include sequence diagrams showing the complete payment-to-provisioning workflow. Address idempotency considerations and retry mechanisms for failed operations.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":1,"progress_status":"completed","dependent_files":"Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,DynamicPterodactyl.php","gmt_create":"2026-08-14T18:30:40.3525775+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00","raw_data":"WikiEncrypted:lcOTJMVsDrhWtJI8Bt/2JsRjYxaJz5fmP97lIndtkE6QfsGRkOWzsvIHzfPSyV/30w5sPj/CB9wLl7SC/3nNXyqvZfigEZumNX1acZ0ucs0se5G/gVrLUvLPhJiIx0LL15hl55uDHC1qiw13bFSvEfsP0yk52WRlikTLac+g+ZElFtpHqUp8KoS4BW+PRI3OnRhBh4S4FI1aIijXWBljYkPsN5fU415AOP8PPG30/dM5ZFnUJ7nnWspuvpEulXhkgkpykkIIimoPP2NbL7q2v7vwxE3omklumTZ0Qt5ztn7zXjuy9txTZDtYBmLrmigqJkbnQXQRK6b/LemCdscnRqaHiB/6t60hsTcxbN39FNtqQULmzPBeAlMQOUp6LJJ/iNTuehZKoysjcXL5eqgLfTBnQwF+06cum7CvC9JKVgQBSpgqeocWNmLhWU8+3TQKhmUwXZBW4/aEIlQBnY+03C59H9APO4XRGyZSKETmkDunkIF1+PbRlAzfv/Od+S0TYDuB7qHLBNXaWApnbm4Ue33YNi25Q/5S7P8yBXv8ftd7oAMN4fCn8gs4AciKo/Tc89WQ8D2aSap1umOrXqIjr3rINVUL6WGnOqK7vI5yJU+AkEWT+f1Dd9gzvnm5Wvwk/AkVgIud9ccEAAPhRWrtqIRzn1M5ly/0ooU2+taRhXyH5ZOXxFsjUxFjOA4EjFxiQtkqklzzaQCbZBfQtYH26bsLmKw2hYsVkx6msz9RG4We6m5i/lfLqz/S7xJhpDCAcrMqtLAvgYhc8OC+CpPEn5n//g3WKfatQ2OCS0L4+LZTO/VMu2u++WBaCLE+FgWFViB01pZkjKIHJyO88Cwpo4AkdyDIbiFqNdGHu661wf/1uKdPEp+i8dy4IzOrERR1WaaL3NFUpsyHlQZKCiQY2syrpNp0W9dhv85hUpq4MArNG5HIar+qTEMGX+hfPrjH5SFXKptO2mL13AX22mCkHNu1vHmLHIf5j7qpILJMDjEvRfWjpWW4fz+UaL1dCU468b0obZldh629xOdzcJOlGkrJL+c30qLK+v18oh+tvKTYrUcLA5LjH2vkG3O76VLd9JJz6A58LQ19N0oHIUm9y4xwL7VF7YHvmO/jI3WEy4DRZq6m1wxfNG7IGIUdTyGm","layer_level":2},{"id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Core Services","description":"core-services","prompt":"Create comprehensive documentation for the core services that power the Dynamic Pterodactyl extension. Detail each service's responsibilities, methods, and interdependencies. Document ResourceCalculationService for real-time Pterodactyl API integration and availability calculations, NodeSelectionService for intelligent best-fit algorithms, ReservationService for transactional reservation management with TTL handling, AlertService for capacity monitoring and notifications, ConfigOptionSetupService for slider configuration management, and SliderConfigReaderService for reading dynamic slider metadata. Include method signatures, parameters, return values, and error handling patterns. Provide code examples demonstrating common usage patterns and integration points with other services.","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/NodeSelectionService.php,Services/ReservationService.php,Services/AlertService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00","raw_data":"WikiEncrypted:E6mVXkQswlRvkiQNYg+8QdJV5H7+P766fkAKo9Uu1PIGDAtCUIuHkv5CKML8sQD+mosOR7cidXxIHXBCLPKdxSuGqJUd/fhRezo9qVbsjKgtDp1U72lHHcqopLEHdp5woxfIy1+viva2zvZZcW18EIff/qUMiQE2Z3uaA8y9760OQHh8ry+DQa26peVFQyuhZem0E2KnMVNdYTIkylW5GiHAP6XTXzU96lhoRV3ilGeYO5Fnapx4uo2BLRe+aW7Yx767ojfarfuTFFIINodL5/0rL1toA1pCVQyjF3L0aHNcgK9m7ltmy2qYd/JZE0lr3GG/vjiVuptvL554DOaDpZ7+u7EdanW2s/+8Azhk+Tmw7wHsosS6oeWGXOv/kAgTQXuTqU34KK0lW3UjRxXIaZU1nVDxwnTw2aB97evyhbIZ7iwGWsWwmwEsQxhJgT4TTsPWdXLeJzlPQjEYtSHOeWYWPlH993A0PoqaJeEPX88Kv0Ii3zncFE3qgu0G3BB0r4EA5g9z/l7xv5fO5ZoH7H/LGZWgoeXwqQZ1JCrhMmyzVjiQlLSo5p+lXG+nsNCpsy619Y5XEpLgMyeN2VZm7sq4aONODYuqrZC5VGNs5LuLfGBNtCu5j/NiYMtF1O2tWrGg7AglOPisS3Ay91CncdO2RfcCmtycXR3fi9fZgc6Cg3umfyPQ9tjzXCjh99L5/zP5GE5iQ0eBBcP4SgmvBfrl8aXMlRh+tZDRiqlKT01pTYWrfab/qkXwqYW9mv3n2J+ChqlGP27sIrghSzRaf7HO2Pt+Y7W+awmfKwL7358JH/6roJ1Q/zrDTEJvMussWu9bMsySBaP+iTBngzHxaZeuu16c517NOgaettP1HHXw8nsEbqOJRI6IllE1tOmKXNOfPoeKzMiB+G/IVjpB1T8v67fdm0rx0zuqVp1rrtYf0Z0RFkqcyWzU0la0qW/1pmxyNXVFQquJ55gHnBUcRaCgqBCN5Cj2MHkiTFZWtEYISLvL/s8R6uFaELg2Z5dkEVleXq6fCxwhJQj+jT+ocG37haKtZNMixWUMjvt6KJ4QyOL6F/QtxvNWYHFK7oPE/Ef6mM9XWWHPolhEne8l3RPH4kb1hR6JuMGL6HK9jr9WwoOKGKdz5oqp3ycBse+2V96LJ6Ng+pxSwIq0rIiQPuBi9jNOxr4ESt+dLKdtJVbXJ7eL6YrJJ+bHHf9yMykDiQso1uKoPVTH5guDmzmxVlvildUSYguOK28iDNdJT+5j/5UIo9voGFHkoZE12QRikPiKRYhqABpauZaBHIuzRU+O9LcEIZUJkOprqpbkJ2p/yR1dAzgjYC0LPJkJtWEXes31T9/PkRr1Dbv/tu3HUJwj5V6sBPyXq+Me9TmJwvHLryKlOASJGHQVjszyI7Ee8WROLpKbG2UKnYVmSTtgxuXxwwRrQ2KXLbovkv2HfcOAgA3krYqptAjYCu111MGD504JaVmVy3VRIdH9BJ5aCaGlvMkDEW+afBaXchyfH4CEaNkFSEkUf4g+35lSOehX4YnjXBAqgdrX9GyN1dEVe6lreI9XZOAPXA9qkj5aXLyoXJ6hYAsN/HlZyr/w9bjJlupGb+hrl3AOzQKXnxxnjwtcvojma0Ncaq/4aTN3M7LvEw3o6vbHho52PTVyCbCAOhC7H660JB77mNqTTfi/32fq64P8m8OOTB+NdK7Ousw2271oYMmZhhXL05ZIMSTPwlSyTrMasUzYBtM96QaOdX8OwYLPekaMOATMSk8YhF8RUqLSGB+RyM70gpPa0lA4canCIkHGWhM2jhmschJpy3Be99E07I4d0Bbn4G/6Ah5h7fuX0mZ2jlpeyQ9YjQZA"},{"id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Service Layer Design","description":"service-layer-design","prompt":"Create architectural documentation for the service-oriented design that encapsulates business logic. Describe how services like ResourceCalculationService, ReservationService, and NodeSelectionService provide clear separation between API controllers and data access layers. Document the service composition patterns, dependency injection usage, and how services coordinate with each other to implement complex workflows. Explain the design principles behind service boundaries, such as keeping Pterodactyl API calls isolated in ResourceCalculationService and reservation logic contained in ReservationService. Include examples of how services handle errors, transactions, and external API failures gracefully.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":2,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/NodeSelectionService.php,02-SERVICES.md","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00","raw_data":"WikiEncrypted:vMsgMax61wW2sTWhXd8DH6aw07pkg2+eyIqOXpXxP0eTEeN6IKKJT4E8yhRJYWTqjspbiPhxSN6D9Pz+vR47nQ0fddxBM+CMIbN3b0al1/8BkDrHfpKECzGon6hVLko3FY3K8WcPZiJxwmWAHyfzgwYhirIwB3W9pd6SVMhT4qEGidO9s1tDtLvNKYK7rouBlY7gg90yIHZef5GrCuZDz4q2aaJWomaFeCXun9RMMG4BmHnAJ9lckOkl/5akjoCJMlxXNFMRzSEnTKIqwXAR+wuaaXUWwgfaNy6xQMvhpHBEaruQH8FZ5F6QIdiI3qB3vZ7wZOJy2eZOjVEvCfd0b36ade2L3O/udL/qNjlwc5qj3amRZHjvPFvu+aWvxfHRSFJDkQBnpDwBW6xPTipFd9l9q2EEK/hY9iLCid8l3Fy9tp3u0vl8NDGssSpn+UKyA8aY7ydb4yzUBjpll2cJ6VuqPiqmInHpjOkp144yZUGKK/BDf/JIHUosDs51slr9kJJlL0uulhT8qpU4W7p+R9OXlEH6WFg8w4oVGXcnSpDchXqjeWlVBL6ahNocGdHEMzXSWw7bJS2+kuBlV/GXg0uE5S6xtV+u57sBn9S9ITtrx7gMhL0gXBefdsxGxErkWgqvQqMAmxssQ3Fv5txeqUT8MjN9iEraOTzgnDsU/4j2/1jDr//piWW1ZAvMlSEqFuGod0Jk9Z/q9s6Lz3zRU3c0fs5F6DtvNZUSGLxkv/dVNNsED7yukiYdhDrZPY0nMYr4zvY/Nks1uAPwEkkhZzJTe04WPsKz0uzHmy+5+EIT3yXx/HIy7F3HMFNtsV4vgZfHaysaTLuKvVeyL/sP6UBJ1G3tO6U+FYqBc9ieW9hU8WkG0pxkt3McrjgDfYR5iEwrrEi6vE6P/7rxuAs4/MQkgBU8zvmbCDa2M4FHvNmkptIdoCMh0h8ugbCnJmV5jDTT0/uFubU9eMO5M8UoSTQ/m97N3vS9En0wTW03AUY8rwrYArMq3zjkQJQkbd5tHzJo0ctalfzKQ9ekPk/mBE/7x36stupE3x8Mhp5MGmF33extBCIqh2HoYDdL7eGVgeOQT5DxKfy8TCb7styhM8AQ9Vnyp6nNQC561Y/aj/046QzqUYAZn2TAKzmf9Mn2AuQkRUFbOi/Q1ugzwM68mDb+DI4vDhH5N/f52EAIyaLtA84UMBuXAztx6UV2X4Ygp9dgiXwcsjVmZUrNvgDZs17jBw9TpD+G3TG2UgFwhTzBkJPITprZ18oi8+XOtbNAwGmK/pCsqgpldVjahS+Dw6LWsLtgOS80ShvbeZjls0X3Gv1Fb9B5WwibhKvCAXk+SdZsZfvO/xE/k0Ho8LsdzeMKpn/QMEZuW3IjG/1kXQTElHewlhtgRGDBHphxTQ7V1reUQDwNNM5MJFN6wIxLxyOUOHEqu7NE9X37Gc49zYzMuRx1D4ve4NGxfgyvT7ToKI8WbMX8x2vtqTkVKyzmHlEwmHZPFGec1gNQGnXIP37QaFZrjeTt3uI3qHAbywZs3PnV292hNv9/8UQ34nyftxdrgFP6Ru04x9S/k9HYa0vMooQ+tLYaTTZ9CoOuUdHt","layer_level":1},{"id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ReservationService","description":"reservation-service","prompt":"Create detailed documentation for the ReservationService that manages the complete lifecycle of resource reservations with strict state transitions and database-level locking. Document the reservation states (pending → confirmed | expired | cancelled), TTL-based expiration handling, and pessimistic database locking with deadlock retry mechanisms. Detail key methods for creating, confirming, cancelling, and extending reservations, including idempotency support through unique tokens. Explain the integration with Paymenter's cart and invoice lifecycle events, transaction handling, and cleanup processes for expired reservations. Include error handling patterns, race condition prevention, and monitoring capabilities for reservation metrics.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":2,"progress_status":"completed","dependent_files":"Services/ReservationService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:39:48.123513+10:00","raw_data":"WikiEncrypted:dAk3XF2xPfdJl9nxiXvxBaJwZsjnZjUgsFHpJYdh2WTsiEd38zI3LZJwvsic+vSlLV79i452hhvBOW4QeoMZpYlQt0pL4IVPlPtQ973Vur0IOPAbnLs+TdT6ZVCHCmsxTO0CHHOn9Mjcw/KGruUDydW0Os943pMNqoP3vcJV1Tec6CzBKOjPoto0RqPpJxQpuFCYzAwxTqVcXjR71+oYYlkYxoKFVvInRrdeiN/u9hNl/v+DRg/LWXDYovUEbEHYqVnKGPjprAuulGCgUVrY/FrjbQuUC20eu/n2u7cPQbtj6P5Fi6/Cux4hTNb+v79W3mUcbDIvx2lAjyU3Cq+QmRWS9dMhQOu35KCF1HZtxGEJba6hMHIAcPRtz0igcnVyyfezjqpTHopCtVK/eGfzRH1getInGPa0tLls0vdw5oUtjNnPNx5EY6RV7tFsu3yTYOFOlyM/D9IQjfmhy+D339J4qSCTHmT7FsjB8kg0BMRuDYhTQfo+mv8dGJj5kOcnzZvdb5bi5sP3H6+Vn61O1NEtj4OYGF3q1lFCLa2k4ZzVfn0p6bLKG9mErTQy+fuJFzW0lLsdfrPPaOKlcd5pFdwb5kTM2uyf+G8+R7kypuf5tvd5WtG14Nj/bUSR3wOyqYU/eTaOwsc5iSFMMwcy7ylnlkHfccHW9O7uc1kG7UFFL1TnJ+DT63tkFQyI3xZHX/wkNVliLl3f/GlXPQUq+EHw4TGuVMhSHDCmuNDPRyYqr95qRcQ64DI/v2ka8JNriLzvKoLlGZF0M9Ra01O2f8ULpkYA2sdTlokxYr8SlLnfx+/yECDDzGu6/8XlaiYnSDpDSE0G5RINWjuMCOHXm0kQUiIainrT2/YYI7cxboxh57TpKWNUVXmqFDefY5Da4kRFi25tfWdI6t5eWWtPmAfOS7bI0S1sr7K5kYnoVUCvMje5QHtuEuhOa+zPSKGO3nK4Tsw+F63K14bYBJFcHfB7zheGWQ7G2HJxZHpZgOjG3f9k2GU41F8nUBfj03NURBbi/D7yDmznMDkKAeRxZccME/XXMSmVyHaddhWHyVR4p/ESqszVe0606gwwWKdTz6BTyB1phAG/zuZv7Pd+l/QXLCVfWDFIyREMpfWWyXjIey0/GxNL5Z+KhRczVPp/5Ni/Uo0C6iPtqlvMguOjywM4C0gs+eJi+Gsen0cBP3JVbufEZEFnQcrVjoDgbSyJJQbfvgqTQaLuwUuBXSoXH6h7w7jjqjUsOASycJ0HK1S7ZMbG20z8p1VJbhIcCmPI06uF6y0jYPUlA9xbIoPx9tQyRUvDRXWpAdt3Uf3b7jnOBFKCgHt9yDE96RnwNLCGLbnsmoovRGkcq+AYWcE7VyRVP/8BIp1G2Y/i9yCYIH00SGm/TbGcVbkgvNcJnXxOG8378mXnquU54RjjjjxV/1Wut2dLY1HjU+qt/Np6f/zqI/a7VOI7ZRJDuSE0rGaRYb6D3XN8Wqm3SKAEH88aspe0Cic8AEW+gcwBiKdjnOI=","layer_level":1},{"id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Reservation Endpoints","description":"reservation-endpoints","prompt":"Create detailed API documentation for reservation management endpoints that handle the checkout reservation lifecycle. Document all four endpoints: POST /api/dynamic-pterodactyl/reservation for creating reservations, GET /api/dynamic-pterodactyl/reservation/{token} for checking status, DELETE /api/dynamic-pterodactyl/reservation/{token} for cancellation, and POST /api/dynamic-pterodactyl/reservation/{token}/extend for extending TTL. Include comprehensive request/response schemas, authentication requirements (web session with checkout middleware), and rate limiting (10 req/min). Provide concrete examples showing the complete reservation lifecycle from creation through confirmation or cancellation. Document the strict reservation state machine (pending → confirmed | expired | cancelled) and explain why the 'released' state was removed. Include error handling for expired reservations, database locking conflicts, and Pterodactyl API failures. Address security considerations including token-based access control and idempotency support.","parent_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","order":2,"progress_status":"completed","dependent_files":"Http/Controllers/Api/ReservationController.php,routes/api.php","gmt_create":"2026-08-14T18:30:20.6998408+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Configurations Table","description":"alert-configurations","prompt":"Create comprehensive data model documentation for the alert configurations table. Detail the schema for capacity monitoring thresholds, notification preferences, and alert channel settings. Document field definitions for threshold values, notification methods, cooldown periods, and configuration scopes. Explain how alert configurations integrate with the alerting system, including trigger conditions, notification delivery, and configuration validation. Include examples of typical alert setups, threshold configurations, and integration with external notification channels. Document the observer pattern implementation and automatic validation of alert configurations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":2,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/AlertConfig.php","gmt_create":"2026-08-14T18:30:21.2682504+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJmLE3o73kryJ+YgkeKKScyLdQq3hxQJnBYvKCfoqSit/bePecpmgpDI9GqpvLlVQ9LIs7lmEV+CCTkpghG+gyLK/O4ewPhJmt5BINAFHKXFHIFOYj55taqoO5+1x/ppZu2HHku9ZZoXXq0CsZ41WwKL0UfXfM//JrSnfCxv9+vBrs2+0eFbNyzEP76TdV4VqF7+tC2O03zgvn3Agc0zhjAnVOWGM+FQhBq+pbx898bWdFoDfYbPdBkGrOHeqEVl51VdAaVMpJbx58m9db60fqr7DxQRnpuL73ShnCuzb6vD6sAXkF5f7OtvM+JJxyTLEQyRxkYm7WAzZ76VfCW8MswNJzmH0rxe7jfGiHDpRJgkk3ay8vTlYKYy3MvASpAk4ffsZpSTjzIcF5aOiD8MjID54dNWqTpL6g/PciOfIsSBvrD8UlcJutHP6ZSfCFDxBOyH1Mqd2jNNuiccleEBeQ0AswhBvjZqE2JCaqH6p+nibP8nKQkfxaYik0YORmlkufYNGYhqxF/hA9hdIKPow5qsHpeztoEplhVuogzfhplQSXwXy1yCPJjW1CkuRDL2ErtDyOAvDqcYC7+r5sGpAOYItYn7zEq2XvxaUhvVuHbR50pKluLdd8ggFrf9+ryZu2Hxv5GoL/zbib1oke2h+RJ0A+cGmH4M1ZLDY3KoSFcd+6u/ASHlTbT19imwE7F19Yuwzo+o6y77j+HH9dnAa1MI8tGRQYCWQ2UI/DkEawmN+2devybDFtfA/ZVrLoTBjW2f4709bxfulvNObwv3NYP5OUVKl6tx0gECW//bbfgvWpHrZp7djAA8AarRPUUVd6iYxo06uFF5C0vaI61IAgmLpgK+PRYSFm47ehoDqMvbXQ1tnO4EKi7gjqlhETVBmCHLLyUUA8R5doF5uG/WvTIjeB3qLQtZcBONbH9OilkoI2ZEfPi4b9EJ06dEVLZjL9aw5AEQCtuKJmKV8160iBi0fJ9udbqRPj2b5Q3+EFDQTOyqdmGPhah0OwpgjFP3ovJZCcDDEQrIUmkX6Y8Js5mCIZ1S6YB6cl6TslKeEwJw5+QyKrdDrCoPYXSvOpY/YxrTlHXqFEs0Lp4Y4I6UoYaeo5nan0IpBG+tP8aqxFh9+hS+7uVQrfD52v4uuUcbrRazh+1NEiyiaU+SA3uttPm57EQ189abNw5DnqCmOE6a4DKQFD1BiZtNNCYQSZLds6xuveWcO/5xHbhthKGgqZuEC36R2yuAP/U6tb/4RaU1R2zqljSICpOYeYbJurXPFeOawdeLmdpgTonQwCxJS6UzUfoxMaTdyJG92xMkaz00RrjPgem5GdYkY6YyVCYbyM0+V6PWfey4PdIm9vaEZuxwX/Ea99BCcg0wlLazXJXj1MTq+Kh6mURrTI6xECRrOwy6n40RfXhK89GOLua4jKBaqOpjcxMu4u6OinE+T8QmOqLpKKtIubkNcD2YXh2KBgiB619vhmVion6NhX+tRjOI=","layer_level":1},{"id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Node Selection Service","description":"node-selection-service","prompt":"Create detailed documentation for the NodeSelectionService that implements the weighted best-fit algorithm for optimal resource allocation across Pterodactyl nodes. Explain the scoring system where memory headroom contributes 50% weight, disk headroom 35%, and CPU headroom 15% to determine the best node for each reservation. Document how the service evaluates available resources against reservation requirements while considering maintenance modes and node constraints. Detail the algorithm's approach to balancing load distribution and avoiding hotspots. Include examples of how the service handles edge cases like insufficient capacity, multiple qualifying nodes, and dynamic resource changes. Explain the integration with ResourceCalculationService for real-time availability data and how selection decisions are made based on current cluster state rather than historical patterns.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":2,"progress_status":"completed","dependent_files":"Services/NodeSelectionService.php","gmt_create":"2026-08-14T18:30:37.1505482+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00","raw_data":"WikiEncrypted:N4PYxZ6FptJ+DLbD6d4AOREdNi1pjOdSwyX0v9JiiPXdgki5dhSZTMx3j6qMo9QxqT5NiHF27e6lgcDdk++lISTpbPUEQ3mLpq8U8ytrYb4/PPV8XbY9b9K5aJ1Odxpapk+xuDFRZitY334Oa3oc6vidZq3psTtfb+RIUSo+WJMKHSui9quFIP16P5TFBT9gIJTDNBqhF35KnSs7KUxBC0Bmr3pXuk98YvfOoi7BGIUslehSowW3Xsf2L+G3h3Wv08vYM0by7w+V4EPcdfE2dwlthpWqs2M1S8WQq0YgMHVsVcooXJETScu5gQ7Mbmp/ST46BFo372dnMqEZguyyNOX1Gur6xFSEfP/ZYsgDP/ZnP491mMzuL9sL17k0OIMDSjPuqqhBtXWNeeRIHWoa+F+/MopE8GZAwBUuaqpka7XtLWwo29CyJWLOqJlhuDCPeQng3iSWayQNszXQMCTXkWpGlU2hsSr8aM6zMBAXaKSg1k5QSsVWSFw7L3srkpWdzJOiuWXgE1wmp3dicOcAYc8rBqfNBssUewt97RMy4beeMSjhd04YNwCqNoDfOh64IjfmsROuJn5GRf8A9Gde0JXd3V2Mjvwk7xqJCpHhx9FdqnMo79mFMnIDMxmEemdZEbsEZd8HBnDgyw+d88P/7uMv4rLufFKPp5VMspJenZkdM0YtFy2tJhkqinOCB2cCn6sWg9+q3KoXvwKiO6G7Ntrv3WFn7aDjJ+25+wckpiMFOemUP14dR2fsXmGQBQiEJBnDXEu16aVxVmVvF/pU7K/AdBbzWnGMn6S7p5/a2r/CQTf93aLxiAIeIrDz8i/7cL2BPOvoJS9j6WMmkuwLAPIHkk/GSKBf7jkQblnlbZlkxxMN0aaJDqEMbMpQZnb4xG7yDrxtbzA0oS5x4U8sFEfO55WGKBPhkAYQ3Dt180ITkAKP/71hW2rseX24wRAhoS7rlAGGdopVbb3KNEZW77tGutaQy8TzQ6aw5CEavGc8hFdifkDCBvGqgCR0lS3DzW4gtfFDE+VTdSEM7L0ODanaqKC+QkBLU1e5HaRZYQ6Ky5gOKzuVPrIJFaZ2YfziMfZc60Sn8/ExjKsRwcifNirXUmBIQgLXt04BDTPl1Bb0voxmOOLfJh/7mU22y+BkxPWN1fzZXQqkBpYBRSohvE+Cj1cEi6tRFBpzkZyC9I1ro/wTi2ymb2sU7r1ml3DYsh0MwqQAjg25wxes8WxRu3v4qd9G5+3JNbTGHKH3R1qmtCKG1TRwibSGrm/OhQY0sLXL/R4P4EoX0P6WgTwORNJPmi+Q2O3LqYBhUOjsLdF4P5UMy6BOrZbA5MJGCxEtXbj2SmA+qAVrrn8nzmiWn/Z3WXTJG5+7B6WtngDgcmKccIi3O6jBP/hdYqKqdhtFsoS603mZ5YeAtli/qbqg+zOfCK3PDX/B7Ku41IVOfOWFdNrXwlYVHgfTo7b1om7UDL8fNHEHtHrSowe6sbDSl2PVCmLNR1M6C4DcIA4ymvXFXjf8GBW7f0tiz5oOMMvpqjX4nNELtaZPDHiiYf8l/TY7ot6PMdBJ+B43eCQLePMGCeQWokhCUuUHY/Ve/NVbemj6E/c3Ytr+g370CSgQOr5N+kNI+RGv2CyMd9zBP3vJGIDg/u8Q/GZwRT6HluZEiORghQ1JyG2wZXcWsmpn2KecPRD39Pesq3reHXo8ceC1vkLArqi+PXQMAZfakJ4p","layer_level":2},{"id":"bb865521-1431-40fe-8fdd-d248c151919e","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event Registration and Configuration","description":"event-registration","prompt":"Create documentation for event system configuration and registration within the Dynamic Pterodactyl extension. Detail how events are registered in the boot() method using Laravel's Event facade, including the mapping between Paymenter core events and custom listeners. Document the extension's integration with Paymenter's event system and how it extends existing functionality without conflicts. Explain custom event creation patterns for alert delivery failures and other domain-specific scenarios. Include configuration examples and best practices for event-driven architecture in extensions.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":2,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Events/AlertDeliveryFailed.php","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+imxxp9gLOp7oepygJU4+6Llw6GR/aCSW49kVRbjAbbfLqA70dIewPOXhc8h++Q7Cyrs/QsWF6aUW47+Yx5gGCPo17twDAhM/MD3vl2uTVHPZfS45uCqIv7PlxrlhGKjsUAFE33mf5jLeq8XedXLmfZgV668S1Fk2DHiluv7Y17jr2UqgQLCPneRzOxQB7TKJuOcjPWUUIQMpdQMs2Hn8gludyP0FyNnFDF3acXSSwBye1KxfU7sqz+mxHk9Yv0Ns7aSurVCaRNr1/sAP+9sVeGezazrjN/7sgN7t162IqKBw/lUxDvr+VZvYa88/cRlvJhF6KgM1ljlXhvAleZtYxqqNZCjAKtGEz+Be4cPXxIX72TQLalHxLeLvl2kGGmHriiFYrWdiISTkdlva/iol4F6Ef6fBjyI8Xplyv2tKmLU6IvoVRQKqpAMCg9XoiNVPTg9vGh98+26P0JR9sE+xQwlIZSa/ibhHoymr4/gf+fWIyyEvLzDNa6TeJJWNAseS+ngzCvYP2QcC+BkDcliqNSI2gBoOSU6tiopaFe5qpzYSe1zLwfRfMLx6mkdH9uySaVPNEuW+Uyh4bRSv6SUBSRvtGMg2bRM5CNhAr58LNTIHdGbfP+kRnU7CZYpYxGlyhqWiOcAANj9ecQElQ/080qk+7QXRjxx609KevAVtmyGX1OWqMP48+9TZQ8KsxiqnjiiSWTWwXeNTLZPQ5EUaMf2O6NTLHm0d/sKQHGlw76+uCj0bYwKBxQE8Acfx9k5BhuWsz6i8gpPWZ4IXqfrjk0RIaW0j0wT1VwIua07Krn4EGSaXUTX6sKfLlmQHijjqBQrMwlSBOPjS9Pa8YmPzS5FVe0dW6fyaHXyRncbI/F5jGVSEE1noqxX/FtCzO96Roht2NvCI33xsZNwXLDCJXApWvuXfEmQIxlAaLLj4OG8TOx8W6DKn3N3UdQ6Z7WaYgF8akU0AZuPOhtKHXxRdDWcRhIfXAfmiimetXCEuVmwWN8hOYva0UudiL3SvN74SMV3/CnAoYphdM9uJjvmX/c=","layer_level":2},{"id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"API Reference","description":"api-reference","prompt":"Create comprehensive API documentation for all RESTful endpoints exposed by the Dynamic Pterodactyl extension. Document public API endpoints for availability checking, pricing calculation, and reservation management including HTTP methods, URL patterns, request/response schemas, and authentication requirements. Cover admin API endpoints for administrative operations like capacity monitoring and reservation management. Include detailed parameter specifications, response formats, error codes, and rate limiting information. Provide concrete request/response examples for common use cases, client implementation guidelines, and security considerations. Document the distinction between customer-facing endpoints that only expose aggregate data versus admin-only node-level details.","order":3,"progress_status":"completed","dependent_files":"routes/api.php,Http/Controllers/Api/AvailabilityController.php,Http/Controllers/Api/PricingController.php,Http/Controllers/Api/ReservationController.php,Http/Controllers/Api/Admin/AdminCapacityController.php,Http/Controllers/Api/Admin/AdminReservationController.php,03-API.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:07.2555848+10:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPlAbu3AvGLNlwH2YbJEsK2ZFah4wHB5r1ikrL2gZxnF1Nn57fAnwhvy+SLzHtydtchPCXOmIuzxruToPm6Xd9PRtGMqZYPr99N8Dff7Wet0bzOBKeAAcYwLuRIMu8wV3+tBGjN8rZVNLnUAXs2X8elnklt+pWvXhH7Lot1U/VTnmmPuuzt/9RgwloJHCX1PFFC5DMjIXsAqr+IHB79ukVc8/OocFqYwz3197g2fugTc2EACI5kR+lgALYTBVypdBN7dzBA7BWDGv+ka7bcfaNeCJAMR+nYwvR/05wepx8Sfgd/yzrdBih68cMl6bLtoyw6EyycFnk1d6PLIGmg0hm/eJQMBfC1hP/EeUOGp9vpN/0Ufm9/DvIMhp5evoBjvAzzrxyVYHK3e97kBKj0SM5FwAaQJ69x1sjLObgiIIlFRUB4sjQ8O9el8uaG9ChyFVFnNv4i6yCyr+Vk7DmJ2cb1epnNj3HMj0xCN4M12D/dQHFNDYFbERU+bdaYrpukKPiwbt71LjAaQmJh8s3zY2eWljsGmpKMhh6HrVwctHTI3ptnKN75C92Ik80Qn1vjAFPsZx2D+bAOIl4KJOTe1+G1SkPkR2dmJz4Iue24kqEbye6NaTQFEG9N/XFzRs+f3ALfzyBhE+uPApEe8iY6BmB+mL/GKUbXiNJY8wUFbr3FxZa51up6jh368OCGAIGpHKs1fTxexEd+BYOPZCKhmz6ujxk2rjsLweJOlwrdWMaJnvVIxJYetiWIINq0JGRAgcNbT/EljDQB6ifHUVLdRaxv9qRuEThRHMkWekS8YwU2c3s4naKkYgFOx/HM+6VIOjWJkvzBPUgvT81WI+H7rDUMyZQHg1uPBgGRTmjZr/o1vQrkPAylajo+XKJd3RBetjU0gWt/Ts49S5Ppb73RZHAoj5XJZzKA6nHpeoxEbHU7eRWqdQFPNnlKqSCIz6zsHNvVddT8QpcQFqNkh3hA7sBUN7iRHwqqYBWh49BY3yeo9u+I359bZmI06Hm1a3vmmM7ULtIpk4F1+v+kGrril3JqKevzsvl5KZdEBrV7jSHtDY9jP7qQuSD9mZUXe9TCdd9UHnVJQry4UfDekADvlsXASgwPLRSVNDuzrglHRhW4J5pMX3BMlEMjs3KtDseFrHvQxXsI4lDAC8D7H9sl6VhsSy2QndNpguicOhLPHcSFVS36yYUp8uTKt62g5DQIiJw4CNSTFio9elMOaqT/y5hGpLHAow80pUl1E/8JZIt2fdv9yQFwEOK+SS7jAWuTh0bLlznwd8YYQHcz86HVrdsyyj/tYH4jP0PoS6aBYe+xa/YgHdTRCRFXM0GvL1L1N89uJSEk75sn5QYCDs21Pms+Yykvb606j/zyZq4DYzqYQyvXY3LUDt79VX0ZEEnez3PvlHlmD1O4vqWMaI1AEVbgTHOx9VM+ElqyU1cjj6yvrDqHTCfVOZRVvhrt3WmaP1Sf5rhpqFBIrAifNXtbI80cmPmtBjuy0HgwsuHKzwQgr+XQJEO/6MloqpGxTl/FeE2SLDj4nTgTAgggJDsbd+TpS7FDg59pmXtmga1jSw+/Zb0XZb0tNTmn2iiMqgJd3H1y+Y8x1PbHPsX22SDeVK/lJRtrf8Rx/nnKTF9hp9S6MQg+MXOzKBuvaBa375GA5VzbBylobAi5jKHA4znfy6vnX5kMTRwmaMjInarW4PKLunNOSUM3CSGz9ke8jna7FT4hSQb7X90Y5nmX0EoAwDyds/0m2z0YTiILgqy4mNz/m3pih33FMY6H4uReybGmcMsHwieJkfRNO8XPM3/bYDC5KMQ8VNPlzjepYXroN8qN3SA=="},{"id":"8e2180ce-6afc-4199-856d-14944750075c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Real-Time Integration Strategy","description":"real-time-integration","prompt":"Develop detailed content for the real-time integration strategy with Pterodactyl panel API. Explain the architectural decision to never cache Pterodactyl API responses and always fetch current utilization data directly. Document how ResourceCalculationService::buildClusterSnapshot() batches API calls efficiently while maintaining accuracy. Detail the error handling strategies for API timeouts, authentication failures, and rate limiting. Include performance considerations such as connection pooling, request batching, and timeout configurations. Address monitoring and logging approaches for tracking API call success rates and response times.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":3,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Http/Controllers/Api/AvailabilityController.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:40:38.6189761+10:00","raw_data":"WikiEncrypted:a46miLh4B5C16RNAKII6IEKLw0MqC6h0PiMwF3Ka7Ij2OPHaScMUS59vSqkWUUgrkKLVBTUU8zoSA2vaNuZ2rf2OJdfGeO3VgrgnuSh7Y9mbKNPBn+TGvWcO5AnaXJB2EdUDr8X7KvdhK80ezYaASqUGUIhpeqR149c9mnFscepyWgx2Ek8KTSwFVC9MKhJosEyGJrn7YyVGvQGDCKSsh9Cfc2/hlpa90xca4Gu3QNSCVQnZff4bdk5zz0to7cQ+zfpx67WTW/CodBDhmMS03I0uTZPJE7AJP1ERvmnNcXmsXkbkTIn6Jaz4zHR0znIguYIevPlUoS7IXDtfxhXftbs+dzDSv6d5v6serP9dhVRERBMS08vKVQQW4aSOXk5hWd1dxoNsWCjPokAE1DfcYWqwH6aJyFWiGAMnpgRi9K/ONKBTwp7DYJ1dc9L1gguGYAzl/fKKPJA4PM9rpfaw6qMRrxdSi+f+cOC+WNiXDQJH2XFy1L6VZ+FAp8p0yd7blXU+U4BcEWn70ZZKe8EhyDkkmDfOBYjEJM3cKt+oEvHp/WAwoaASh+fKHOiIgu0d0Ftj6vC9ACsxKybfZ7JnYgbbtO97+eV0hg79n9Dpc42WRdPi+7fZjP0ZycDvxlfhRXage94By1V+FNrcn1xs5USrhdX2GCWwTbKuo34IOCI+k+fJl4+OMGjYuv/To3BJW14XCaXe0Vc8+GB7p5QyIm6B6fsg6itIUhRuxWEcLtizsBLDkPPBfCfackzY8FefHCuq+16ZiXSfAmDwALKTtOBO9+lO2ASRDOZP6W3Bfx/dmEngHDG930BrKfyjOiU1d+Dj9C/KTGmVedsjEPE+mFsNeqGzUx1wcHlUXuIR2MoS/IkE6pAfKQFpuad+LK1zYsBeiXaCDtpDiG1T3FbbX/wlv0E1MM06Z2uVIco/K4JhN2h53sPXy5CasAiPwd+gP/tBZ4P8/RZjCnjvRJFRGAS/an5RflBLv0Um/6ZYLty6ydTuBe2zA9vspNAJbs35huP2iTnJyos7IYxMOCVI0rsp6911a8m3QVgqExQt10m1F5K7xRttnWPk0iBVFitXP8UzsDl4gmWXBvtl5+kdNtO/FTX/LMk0VXgqkSc2hfnQgLSNO8Q+M+Q2P+UsZSLgQOUZdMC+fY5jleVxoP01Zq3Ny/88qUYkKwFqKY0URwyZXfLUrUReHlG6MnFCB9VepBgaTEijhxARQFpyXl7ZKAnxY+GwFSISTsHHvJzWY4JhYfcdWqbhFUVyycwgVkNHh95kj5HTjK/CFqgeY8hT0uovksN7qSUIC4uod8qI5X03bIV5vfdg/6Usx2DbFNZzZWfdwj/3RrX/XTI7/1qEMly4jFw76Uu2HwZE0F0cK24=","layer_level":1},{"id":"46b9fc6e-218d-4212-a930-0fc7713261c8","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"AlertService","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that provides capacity monitoring and notification dispatch functionality. Document alert configuration management, threshold monitoring, cooldown period implementation, and notification channel integration (email and webhooks). Detail methods for checking capacity thresholds, sending alerts, tracking delivery status, and handling delivery failures. Explain the alert scheduling mechanism, rate limiting to prevent notification spam, and the integration with the audit logging system. Include configuration options for different alert types, custom notification channels, and monitoring dashboard integration.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:41:26.6868225+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumFsNsqmOR9Y1fz915yV8RIIIcnGt9luzUNB5Rts+iylnavxhY1AgxdZiyE17XzAFkcDSvNL4Xq0i+P8W084sXyyLi/9f2viIbprKi0+6/9b+L/MgNMk2z4KexjoSI5nKpqx6N95tWQc7xornaWWhIj4VvUm5KzjRo+naM8WzmBZV7jryANDyUDHgelPd9XGEYhm0CeTnnt+sSu3WyMcH81ukC1DWlY3kLa1hWp41z7SfPudp1BwQWg9FGrkFy5SbxGhjbkPE308IBvsxDnrxDkT/AASdvk51kd1eXaMFprTEvNbMKTvejQGqIQfi7oAFDoTIsPSpYJFMjjLRzaDP3xabUfj9Q4419Ale3z8SWX3cnDKoApAQq09BI8wHLL+sxUtAyuAk0Z9G2AWoW4aYzxOx2JH5MMxpJSS+Tz8IyOr4aq10oIirutHVrVgtxiJuc6KaPOpXEwqC/RnLlOza8+x+Jvt2J+Y39P8QPvLdxQIze6N7dPNLowvWczs5dsRlVR5y1x0tBjNU4NGfZ8WiIDo0qPjvvkCzhgTwm1F0/yoE+iZ6X2stVI1VK2i9L3Fpl/2iNQi54nkLGmWY/4XY89BEFmQJx0RqmFlTfrrEXP2SlvGx5SX9SMzVzI5qBkyzxonyCB8DHl59dIL8Yy/WDP4N/VF5aL2TFDrM2Ab2TGLSG5MDIzMZo0lAYmeSHj5VJmvRJ1RGeDByCXhp+Z+ME9s/XW2Yikd68rCgIMG86Pp+gCM8JGVvs7plR7lBZLwkFKsIe7Fz+jFNEr1bF+bIPnUr4FKPeAKIN3OxoxINWXzoDPlCLBHeAZanWfWwqyzR+J7IUE3hyahLtZ808XPSJTtHsRkPZlhpRS8yqbnTMk2nmwsW0AHAt9qrI/a3s1b6fhu7NUwxf8JhYYr0O2TkYJcGO8wp78xDX4Gd3kak9LbdJh9S/Q1HjFm6Jp7FzWRusfm3WH9WkcoADoG5PiLtL3uDwWiXBnsadTtadBT1wKkQr3OjNwJjW4qoM3knH7sm0dsOfNBp1Lz9170Ks+GN1qh3VCXhS0JReKUxLFwVDGfMqkoXYk9pJKUNUG32B9grvwSdBbGvp6Re4o2edK5XZSUzrSCa4woyxpE3oJljPdr0LNy5957Np3DlNHrHBLSF8Ttr+Gg21v+MlO+IrKEyw3CCT+BBlhTk4u8C+7l2142593dhE0YP3BKKFPDLmihsazXHFP/RsQRNWE2zODEak/Ix6Jhjv8cQz2Gi2P4m1CsDVSB8gYLBEIvppaRagXhVGrdgqc9uwEY+vyX6VJX6M11","layer_level":1},{"id":"db81e08e-4803-4640-b5e0-202e80fb914b","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Model Relationships and Eloquent Models","description":"model-relationships","prompt":"Create detailed documentation for Eloquent models and their relationships within the database schema. Document the ResourceReservation model with its relationships to cart items, services, and users, including scope methods and query builders. Explain the AlertConfig model with its observer pattern implementation for automatic validation and configuration management. Detail the AuditLog model and its usage patterns throughout the system. Include examples of common model interactions, relationship queries, and best practices for working with these models. Document any custom scopes, accessors, mutators, and model-level business logic that extends beyond basic CRUD operations.","parent_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","order":3,"progress_status":"completed","dependent_files":"Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,Models/Observers/AlertConfigObserver.php","gmt_create":"2026-08-14T18:30:21.2687638+10:00","gmt_modified":"2026-08-14T18:41:52.684526+10:00","raw_data":"WikiEncrypted:o5cr6Bo4m333A3G+lRdTT1zTwtVRlFzZl51UqVOFJohX4sTIIxVqYCHtRd0t23P389kscTHQTThJhL7w4nQfnwR3RCAxF1nBUIgc+YDRw7/ohisZ7xjn56OLyPO/2hMEOWkhPTvbzOwXZt0LS7HksKWM60RYUDKclPaHZKiDDOP/aNhYGrqETnv1qqqLtRzmMtosNd27nUSf8XuVdYNhxLlNs0GBV3hJccblk2M+M9qR2+bW/8JARAzfCQKg/MuXg+B6muiJYBWVwBQ4GMALlspnfoLawbHDKpJ75lBeGCjT44XltN9ftRwKHBc1QK0wyCHnNVUbdPXOwZm9s+SR7EHEQZujo7KhrLzs1hO9dCeVOtlclovBuiAh3M6/RJvxjmL2+3JeCy9q3oll0xpbyq6pD0hUqUblYDqqfpLa/hCG5qs76yiUAkg+zknJnil4qOZ2nFGmtmcgrxFZCbGU2Fxe5eGyB3VgEVtIYDo95OcGlTMkYNQeNhlH6g+gccab0RmD156Tm3aUg2qsU99rUOiUATmefkuiRZQxT615q4O6MNvvGIkwmd1cH/5wHRQMvf/Fzcm1JtRJPg4rSCA6Gm0kCrEK4kcN2PRANK782ulYb7UwTisvgSaK1l5pRfnxGv2ZMHZv+E93WqF/r0nL/ddriCXKvwowrvTG+KuzT/UYqzsrv8eo4V98dZzYAsh8SMj9bu1byFt1Yh5ZH7ZoGklQRFx8OAeQqYKfMBzsNjW0YzC/JZ9SL7AR+3Sk7YuEQxL4H7OGX+MQHHfkdlkwsS5jCLiR8iBMCZPtbcdH8+9cW+D+j2jTjYgnb/a5Foj8C2Zu6AbAtDIH4QvMVAeof67Ii3efQ6YsY5HYie1kSIuZBQNUbny0q/PxC0m/0YzgV+ynShn1jn8RYuNcZXqLyMX18azcac9KVP0L1LWtPsb8GCURf+RZasftCXxU7H/n1ztgrKn7htSV2h9cPXTrcWJla/l/crT8js9/DN+7MQSVPbGtMS4sH7EJTcqberUn67IjhAf9dElvh3NgA063fr5qAAzWCquB5on5uV99/r+GnfsX+vLqGtUsQhq0erEQ2WySTm9iyRsRjsO5k8XpQ6/MbJ6A4fzmpCgM6A9C22hPVjcV3fWOmgGqcxDl//H/fesJ7vC9eTD3R0IPkZx8sauyONVKPyL5jKjTV2PQ6ZIF9QvM39tywIJxlKkX6oaifeWsUn2kcNq/9S65EWxmeGPLi8e7egxAY2NJmK3h6FEiOC1H8GmVDWQE23MJ7WL3RgRuQgSkaj5FMitdnbGB3oNxh8FnShDACIW1BkJvoXQTY6Aa1z87M0NsvrmEfIMh6kXjGJvUDwpy980oN4rJiYgzHh8NsOsRQ2hManyQaLUnTBOfjpKBZaoC8npXNdf1hWkYe4lQbIALOGxngIiz+ZZPzE7f7LYSIiFSiw+c136k2ahb5GuLg0gIrQv2GqfLnZvNdgj7PY4e6AVZ1C02uToU2IVLPOIw8h/keXkCSWrBbXaRiZe2ea4IJfuAVacOn9KVr31XKso+d3EU/iYJNVdfQ4v6mHSdRi/jFaH/+YPvwNocx2ABs0faFGlDM4waSGRTm6/ZNLsngiMonux6rA==","layer_level":1},{"id":"2c2143bb-a6f1-4903-bbec-853144163068","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Alert Service","description":"alert-service","prompt":"Develop comprehensive documentation for the AlertService that monitors system capacity and dispatches notifications when thresholds are breached. Explain how the service tracks resource utilization across locations and nodes, comparing against configurable alert thresholds defined in AlertConfig models. Document the notification delivery system supporting email and webhook channels, cooldown period management to prevent alert storms, and delivery failure tracking through AlertDeliveryLog. Detail the integration with Paymenter's notification infrastructure and how alerts are triggered during scheduled capacity checks. Include examples of alert configuration scenarios, threshold tuning recommendations, and troubleshooting failed deliveries. Explain the relationship between alert configurations and actual system monitoring, including how the service distinguishes between different types of capacity issues and routes appropriate notifications to relevant stakeholders.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":3,"progress_status":"completed","dependent_files":"Services/AlertService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00","raw_data":"WikiEncrypted:mGloAU9ocPWd9c/n20tiJqx5DSN6YSWNF5+w7wSOumGkxfRPgWKvo9spYjKOgszuk0MLNmFKFcVto5i3bn1a1JriKtvACh1XiJaF3txBGeDnTpOnGI8GVp8dZmpnIguyLKrCGW/X9jZkgbwQbVwEfHRmENV5PlaZSvRfpq1Y36TBE0noLaE5sh0q176aWnStZnBj4K2a4xSmOYGAsv8HbqTmTWvunklLeJaWjs6NfBaUopbzjuehHIDTnfnuutYeOYeXJUjpS5R+1X/olKDhoEP9KIeZQreSHIEpR8VFh5xjHzzgNwO5Omd3makVXkMmwS5bH1hAN9+/UfDHYbVxHO/Wrxv4T9bYCWEdI80EXlm5WvcMwsdXaFNdD/O0MedvlDcDywhModRKFVrD/v1JxoWN+pIMR//8Ryk24kEY8vD7Q+Ko0lPvDRRgM3jtjpUtedhCOT4HyA5UUR42KQ+kYZ/hbOq3SU+iPGhZXRGSX0/mfH9EXycATjrar7+ptDChAOoLsBbNzwtCqTviL+XwwE0fG/mTTM+oKS+tzc8SPMzQnnNnQe5SiZ7vapYaGJ/Y1F3/1RljayqHMiGXsJpEogvAu0YtB+ozWriKQL73gts0QErqjeVZDpKaZlAJypHMUo5tLo8QKpfRPkuFNWsN+dD398a/KxDRB3y4xuO22KOSbA0wLUHX+LUfOLbsmc7V9YZue0GRUpU1QYr2gg2n6ENgO7KkNSIpFP7tlVLaXZJstuHVTJ6bVRhF1vJt/a8GEBvJA5XNUV1X8YBCrFeVSDiYvLN3/g8sdb4lvFkVU9z+OAxnTMiQTOUhzAhadn3pUZatOBH4z5pMrVFlUddc9dWuSB5yzL8Krnl0BOoqhcr9wz1zxZtUzHuYS7gRstc5PvRuH2t8fjaT/5F/b7QpjH33K/TWFvQ6NzfcOA0alBXDFOzxHtKjs5iITPrLZTa5qe44OWeDgiOb1m56En+2v3pR+26yZqNZXuHXw7W4g4a/c9UW7X02Xr3681xPJZe0VHWkfH8XcEqatS+zpOPcEHdLS2AZS7qdEnk0qlZA9IV8bh/sXaTXy2IA94rG0nN8Bg1BuIWUKDX7nOagOtmaaiWe5ddMrsk7lwtqCGTnoP1Uap/OUOcBFW30SqbqlY7SO2/WjIix6MbE4s9A3FOQEubeQXgRMG9MkTmrQWMJ+kATfAoHrufX6bnbiU/u2L2/TCnV4tq7C+82Ew/cW5nP5jjkUcVctQVTsPKutoFLXa2m0au1WpBGTumnt4G+Q5Q4ZMiyeMhpjTFyOvhvRUrlbI9BULjKWNerIvYFEBzoW8BI37AcWDCy6Eza9ZvDBryD+9Mg/AUWgVFiWqrk/kFt7Y3fnxA+LKb7w5eHMEB/dukv1UGuuCSG6YafBZqG4+teiF2AGfG+h9o2xna8JV5FhaQbWAxvd1BOQZX4ThU2/sbwY6Rjt6yOxgVx2AIMAKzGlUFTbKmGdwbgSzoh8cjbyBFNMLkZLDPOKQov1suOnDtKzCaYEc6Z4IgqQC7/2eekocjLQ7Dz8I4Hj1KjpqQrdP3hAUeMbpxD4GoW41VGDlDUQpW+4rheUQoIuDtNTW6IloKthdVEG5SBw8CbDC4cvboP6wbeuz5X6RVmRIcM1wBm86ZJOPSo0F8MprHkzOM+WjypzUBOO3U9VJ2hW3ahYOVZVj4NicoxisCYBWOCfWUYxB0oRiIIyqDs0hZcg/6nqacuMYo6Gl6hCkCTpTsNqW4l4NVPGvHbjrCbWJu9w9HnGq0my8u73AAHUAuX12otrlJ8U1s3swyC0aICg1W5CfWglqfY0bBslnvLyd+rLJAiD7VrIM0RFRXNQ4AAbVm2","layer_level":2},{"id":"632eace8-7d7d-41e6-9c29-2c85e645491d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Complete Checkout Flow Integration","description":"checkout-flow","prompt":"Document the complete checkout flow integration powered by the event-driven architecture. Provide a comprehensive sequence diagram showing the entire customer journey from adding items to cart through service provisioning. Detail each event trigger point, listener execution, and state transitions throughout the process. Explain how the system handles edge cases like cart abandonment, payment failures, and service provisioning errors. Include troubleshooting guides for common checkout flow issues and debugging techniques for event-driven workflows.","parent_id":"2babb181-df9a-4da5-b222-f75f0ec91241","order":3,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/InvoicePaidListener.php,Services/ReservationService.php,04-EVENTS.md","gmt_create":"2026-08-14T18:30:40.3530994+10:00","gmt_modified":"2026-08-14T18:48:16.8368671+10:00","raw_data":"WikiEncrypted:/3r/IgJF/D+DnPujiCpodvoNOiYM3KFsRAB8YlBdu+xb7BS8Uuh3IVK1mpHtXs7mPCNE4VKKRn54TjEfbcpV5ZIJz8TmbubVOJ/dUgIK4mYkS0hMUVvwv5QPe1Q3QC1Q8fbJeJlCF+5/VuoYzz534aZeclwwi5Oue6KbEf/myM+uSYTvEJYOEbyq5PteeU7K/JEP3av8RyGe8WqNIMavK6yZ8dltFKP/GUgUyJOvvC41EQb0wYtEbvqK5cwo8LabsKYcAfpsg93fdSycxCIcCnQ8WFgzRq01kuHfgUsM/IwbM122IbQLHnjcxfxlr9vaxbEH1DdEk2TLPswyJ3UQ5bQzUAJNYKPVBluRcDyzLlT56IxsYWFHN+EdIuJ5LZKC1iR3xddStraJshePes1Z1GO/NKztwAO6hSHIStexDvyorJqyUvbYgSsv8NQ49rhtWfKzdMTU5MxP9r4P4nUh5jjiTOyyEJv1V73K1qDF12wYxV9/ehxaFQWoXpzMmLa+FySGKcm4vBIWSyuhDcKT8a1k1psgylOOJlE0/biddh62HcRl7hL3DuNvICGgfDtQNppNojlNC1LPyRa0o7Mz27sVtzYCKKm1VDlD9VlMACQ04/AkiPRb9mjOqBjNCV42FMS9d/1ctC4H2aY0JprVtKK0dCkYWsfaacA0+ldS94CKeCO1e0jRMT6fLFoIkRSos5qkoRmOU5eury+LOX8kSLKMEgTqHawq6hutANYhMSsJuCiTQXDPnIn8cTEDRaIEUdXXFc2j7zMP3+jrw0fcjE49b3jEsJOE+4NTdbzkc+8sq6sFoBJdvH2Hm4kmvxtiRtNAmy6Wl1V90rQC1js3SvE6J1VK6941VIt9bTWks60R5R9uHMC3jMwbiRe8lb+LqUa2NBIcSrZfHYuTj2iG8jtSGmOLpcwCZStgwNF+WrTi9Bu9OjiZN3qxFH8vgSdyueciKLHypbu/qYCWV3z3HTmt6iRwAFYQpg0L5BCZiqMZM1y8YTTxhLuL4Zh9IXgUrE8tQvJcdKZHVW2oM+Nb0t5Bl/YBldM2Fyfr6Aew9whpbN356+Cr1kRKs1pBky94A550JCDX1oX8/mv6fXBydw==","layer_level":2},{"id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Database Schema","description":"database-schema","prompt":"Create comprehensive data model documentation for all database tables and Eloquent models. Detail the resource reservations table structure with fields for tracking temporary resource holds, TTL expiration, and status transitions. Document the audit logs table for capturing administrative actions and system events. Explain the alert configurations schema for capacity monitoring thresholds and notification preferences. Include entity relationship diagrams, field definitions, data types, constraints, and indexes. Document data validation rules, business logic constraints, and data lifecycle management. Provide examples of common queries, relationships between models, and performance considerations for large datasets.","order":4,"progress_status":"completed","dependent_files":"database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php,database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php,database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php,Models/ResourceReservation.php,Models/AlertConfig.php,Models/AuditLog.php,01-DATABASE.md","gmt_create":"2026-08-14T18:29:54.6243105+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkKY19u2QVJ1rg3+MIy4jIV2G7991jW6cwRmNYXwYpuW5ArhlxyDWCj1MQluATkttNYsoMBDdgKUezQdGDD8+omhNzdnb1qef/N40I3Anr2QwMP3nIUzAIetBWt3asETmzgpUhWqNi0c9/gWDGL6A/YQUM6F58t+gH796VZqdRPXxWuT2pr5G0iutoRLIdprxtMSC+QZHRImcmyRxuoomSfhWYNg9uGlj0l/lCb05MCiDJMEDcZDxLd4fUn8mnozZiZNTTSubVHAZOpJiSi5LB5HxFsVQbCNsNUADnWSR03e9Ks7klVEkvvs6l6dJks23NZJAg9pbH7BTV1igcLixjWxWz0slRxP78BJBbYH8GOkAdRT1dtzdIeCC8aecaU6NvDqi3gVqMard/lFyXVLICVrfiEstzYj8ZsICdnNwIfFlPqqOSsrhU1+YE/NVqp749vMdUf4XZAsaUU4OGYnXalSFAU2pHn2P2bhE6MLibxENIk5MWOVyeBrusuddKOXN4wWJ8au8Yq4jkZdCpuY4kuDz19y7Sf3fXriTh9gdnIrTRlUsD5JxY94KfGJWambQDZNcNtP3t6Ggp/nsKhnRqZBrzMtfYQ4ntzyBW8gjWAuSwblrGF1bdDjQvjKHQkJPIY37D7NoN+ba2PGfg9gXRDoG482XzqjC6l8ClCgavMnoxn3LMTPRg4VYSigxaKHXfUJHbj/1qo1rXakQpSBEjaHWf1L2ufg7ref8zTsvfdEWfpfVX06/4qzl5rC9n3eFeTM/rZJfL17yHRBltESgzj0omjp4Cenb7va/SpJMunvExXDBQDvNRT10jF/oMVSlF+TbecDZ+9hZMnnVhytpEkniOumZWXgwDHJxU3KFYhnvKMFzfp+qPKo8b17TtidoQzQ5GDhkFkNpvB3/XabohBK2ceJfRisPlb40nL9w47tCdDa0jsucJqVLZ6olCXjrmEjL1fjHE/5LSKjI5pLUMJITZV1qG1rtNBdhKRGcd6aJTQqCuoFgJk6CsDWZ4k/8G+uwwIjdOxvdsEdK8AwkOnH/Cj3azhQh0XYo8eo3h8r7qvAXelQR8kK/oiDpjAP82Y5821q0E1Q/g9UJ/xxLu9ScqfBiK8bQxJ0j/+cWNMlyfqScdsefdowAWa9nQJcqH6PR7bT632GGsV5LktkiB+jFYsRsu4NnmKaaiavsSXte83lTWsx3rCiRbDXDp/ukZArS1mqMm3oVzS46EaWRXSZG4zJiaoFh9sHUSPmoPnPB5Ph5QDKWPLG/xPJl+XWY4xhP0pSpiT7uMilGWDNGXHOfQlFUbzxOu1ohusVTWjYAnW3bVkXZ2m6ONRqOs+U7s26t/Ae339JGrEiaO6mcmnLd+OTYvVBup6de+JWs0fGO/i1CQD/8NyoY1C4vUetq3QMiG8R4VceBYJzddNuCu0aSM5yAGF7DF1T8R6yN41LM5P+6B7DGyAiMUD7hJjPJJGFNMwfiLoT1BvG+FR1Ews7eS/hESzkyY1BMfG9Fgcbm2RNFH9i7S+FduOmTn9GF7N4zojNaAL893TmD4k4ICDgVoGISrmzjYLPGjRgnxGFDskHlHjMQegYV136LsflYifyTUxFI1GVuTKmRYo4eeBa9731huIhfsQNa9xFSEE1EP/980lu6g/G8Y+cxM7nRs2wjapYIufIKAsHCwW1Sx9+aqrqxJ40F/YBw2Rt32hVdqvOJRQyyhoqOGsk4Of7bih0kSX3UrgZDL/fngP0/C/GC3vChV9fRmbXpRiW6wKiBGLW9c2m7/GRnwgnCKQlmEbfILmmk4YQMgB9CeNX+zVEIP3ljNws7qOcfrdP5JZuhE5EMDSqOt+x16Cd1GtG27CrIamyc0slol9sB/4GhOao="},{"id":"f3550273-5462-4317-b2c2-6354a1b8c98d","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Data Consistency Model","description":"data-consistency-model","prompt":"Create comprehensive content for the data consistency model ensuring accurate resource allocation. Document the pessimistic database locking strategy using lockForUpdate() with deadlock retry mechanisms to prevent race conditions during concurrent reservation attempts. Explain the strict reservation lifecycle states (pending → confirmed | expired | cancelled) and why the 'released' state was removed. Detail how the 15-minute TTL-based reservations work with automatic cleanup processes. Include transaction boundaries, rollback scenarios, and recovery procedures for failed operations. Address distributed locking considerations and how the system handles database connectivity issues.","parent_id":"cae4c946-defa-419b-88db-55655e77ad15","order":4,"progress_status":"completed","dependent_files":"Services/ReservationService.php,Models/ResourceReservation.php,database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php","gmt_create":"2026-08-14T18:30:08.2209811+10:00","gmt_modified":"2026-08-14T18:42:18.2922061+10:00","raw_data":"WikiEncrypted:/j3nBh2eZGsOhaH4GyKbogm8KrJAx6ZWDJ7Pdb6drKrb9nwpgTDWREvPEyjtIn9xQdXQTv71QtHEseoTwvhrBtrhqhjm8gleqfb/RCV6wO/wy4YN/0z7r5XKxzvwf0wk/t5OFLEJeZyVh7BnjahURQFv+tZkkDez13TXWgbWgHcyz3Ji8O+XcdLZy9NZFGSoz2+hIwikd+sfw6fXMFI3IqOjtTRf20eeIUDhUg7se7i+PL9tdVGZ0tisG71P7VNhxjq5A7DJ0w4dpi0+pTY8zu2lhbJCWQjBxalRlkKEfPTM39FVFw0Qg4by815J9vXUcdNK/DEmR1aPIb3Xe/ztqbjcqdTpDF5tSoW5ysJ/7wf8Dg1hzt52rPANtAJJj4XWbXux3A93cJeb8ERXPcC/p6jmNOyCz5vcYUAJOAdZXaUZCOzpaCvW15PeTWfSbU6wH9WxNQ2WmSn2z75xOfRW5ecz3++LQ/W/JcRNnO9Cju76SL2WYfzsko44RlHFjKNBePMJkzqN/rFV50dFyokUZzLkSjZ7gBdg+NB/QJ/itiiirSZj9iVgOmxND8nwixMUbuDQuRCeRFjIR4M5scGvwzDOFtEgorvcIG7Nmq/PYWNT+cp1293xHTjPwt7cXQMmL9QW7l197Y3YNhFA5L57BHXWcT4fCK7pxyzhH0ug1AfB6ud7H1RaEAOssVmHEHzl41ztgtDkdmy9hqUMVGmKvJ2p26O7TkBcFY7nHXhQFuysZbrmh4aGxQcML5ZpPntb9uM7xsoXwdX28ZBprBC4IFkVjYYKdQOeiD2kwwtAh4BIS79hZ9zeW1VvdgxpPqXGJxT0Rgg0bD7qq59wBwXxMtxr0NUZBPPPFJyIsSVX7nK8l7nbKKishPC80cYLQIs9mtRYo963Jwv80ta8Do6vl0dF7CA3448eLtGxYJKlYKiPseB22x9cAjMU8jrBjT/3mz215pDZyIuEOE7woc5vpYP5araJJc2xTA9dFI+qjmVz01fDetf3mTPFOZzkUSI2mlsKDdP/NuGNkiIJ8fAJqPuhPNi+o9/75GXDkooitWlxmlAEva0HfOeLE1Sfp4ikuIcRknCnJLsQtFCSBYr9vAflXAGSLiP9e1wUvM2R7WlqcUmWgFcACBUp13vcjt33xW4vnzOKOCEuVJ888pEuyi13i+9q5/cmbhPClC2ITdy2pXnY+7VRUmZTCs4o9/X6CGhI8UK6jY9JfInb7UGO2RK3u1BJwkDJZbukWpv3tY8qUBvAFK+KREbwuomERciLvureZnu1WndQ4IlUyBKihm00Isd/zXnlUoSosfz1glNqF9UmNkEsQqQNKJMux6NzkzX5U1kzmXUqIFJFnax9r+Uknh9lpB3rgxTAOn62pGlQiMf/nALo7cw3K+nWlGhbF7bC3ULSYy85iVyg7iD+iQpJRWW3CxQ9zxZ+2h1odHFg/nn9W2PMro0EpXr8OUUifrkg/KaABkw0THHKzlIloFaV4ttReCgtAPR+BsMYjz7P/JaSNkWugYUybtZVXiTw4mkB5xW3JI7nurwKaB+TNDca4p3x0rSUkgcliB58Qsw=","layer_level":1},{"id":"41003932-cd5b-45a8-b46b-cceb2353eb97","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"ConfigOptionSetupService","description":"config-option-setup-service","prompt":"Create detailed documentation for the ConfigOptionSetupService that manages slider configuration setup and validation for dynamic pricing products. Document the process of creating and configuring dynamic slider options, validating configuration constraints, and integrating with Paymenter's pricing engine. Detail methods for setting up slider ranges, minimum/maximum values, step increments, and pricing rules. Explain the relationship between slider configurations and product definitions, validation rules for preventing invalid configurations, and migration procedures for updating existing slider setups. Include examples of common configuration patterns and troubleshooting invalid setups.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":4,"progress_status":"completed","dependent_files":"Services/ConfigOptionSetupService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllCgohKR6YmuldRj/z6qcqjDR2pitBli9Ia+zcNB/epHTLmBoygqBYyX/jJOBhT0WY7vCbpe22qceZkFAqb8DZzKeAHS/7S8eBLoXzPcjtKKyg+k9/VdmoVNuJG75h4ZnEDfMUlm8qe2CMI7OjaRA+kHbQkuLz0EJ94HS40VKrikJzNjEwdwaRPdZNR+WAjkP6PYFnd6nsIshMedwJ1MvKc/XYaUdoplA5bn0MAOXN5ZQVC/AZIC+XLtGejPcX0T4WnLK0kGqgleEdbJJLXL2xANnyrCRoXuDv/n7GAO09reNra1mt5X+R1g8y855x1EHahCGn87FGlb5J42VQBcnhyrThOpSkyf8NI4ZJkFisxq/64QBzfyPSwloJsvfM7rkUy3tZPcid6SxGXEod8Rhj0gSV8H0AioN27rEwI92JBss7JPUriyBtMwxR2z4+jhziQ3mg9OAPvRUDV76xF7JfQa3XqHmg40MSgFs1/ANbT4fOCIs52axVRxjV9x4V44uqDO/vg6RNqty3Zybefw0AQU6cE8lkH2CWrZ7aHEmN19aUBrwXAX7ip9q881tISrLVemtjoY4KjhqVZJJdHGpEaQfitPjN9l9bxg0Q4AMGN9RW4zAeTzWVdFdMoEkaigaVkFzAL3ExafZveH1aNPy9kDsV8M46Ac1oeXPi3TyaujUN/fxRvGR0vKiWRQ4asgZpxQewQrWtFrSWVkMXKQ4pQLO2Foys4HUAmdZ/j7ejA9A7kSx925Kj0uZTyoyLfMAjtW4p9Q3mEauRMS2RRjd6+Zu28xmt52w1xMcivg9JAu8wCqo8LYeNMPzHC9ri+K+xyAiMVLJ4vS190atcXPUV5A5/alS55RBPyY5LZfOL+fSTOEhAT5N3aWKPPKnm1+yc46zNe0iXBIQOKSF/e40mK9BLs2gyZ6aZ7GnA301acBQdL82uGmQOCvB48ViwdnW5bytzHe8ULvKl/jtgrPw/YsuYnMd7UWhUE3vdwyHbhTJ8ZgJpnOW/qwj7eG4nb06aNguWBAuHILENLgU9KjJbAuwWLNGUeU52tZstHayCQxjerq0ltMmz8lnaDW4cceWI491B/mhpe/DlGbBU7H9Mhpk9LBtIcMINMjUROhL9G2GanSCgDD5SgeTheUWtHPFZBAK6t5ju0KZt3taZdLHoo3SvR2X92rvlHAsEgXLQ72/znycR8LguH7BhjnvxNxgoZ+xQcDd2mLT94WFwWLwJ1iCKSmsragp8GgKXRRVhwJUKB5M7NW2jo0ZypJUAvSgVxflLg3Ih336vqO16pl79bnerBvlQpPVPwsE4T3Bkf4LIv7+8UsKeB3hVkd8L05QxdWAStHzegxaA/wInflA8WgMF1E3IC0JRx6BLkbiryDu","layer_level":1},{"id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Supporting Services","description":"supporting-services","prompt":"Create documentation for the supporting services that provide auxiliary functionality to the core reservation system. Document the AuditLogService for comprehensive logging of administrative actions and system events, explaining how it maintains an audit trail for compliance and debugging purposes. Detail the ConfigOptionSetupService responsible for setting up dynamic slider configurations and pricing options within Paymenter's extension framework. Explain the SliderConfigReaderService that reads and interprets slider configuration metadata from Paymenter core, emphasizing that this extension never calculates prices but only reads slider settings. Include examples of how these services integrate with Paymenter's configuration system and contribute to the overall extension functionality. Document their role in the broader architecture and how they support the main business services.","parent_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","order":4,"progress_status":"completed","dependent_files":"Services/AuditLogService.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:37.1512484+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00","raw_data":"WikiEncrypted:3yERI6FkM0skPdXLWnl27OucrSiFcSfyE2MQ2pfXvVCxyIu6PkNXW4P6qJ9roLiRnUTdUXWLkoQ/rO51IySmNsC4rGmKOQee7MrsLshw8n2ff7g2j/CmpGGZ+Tpx/RuH1wCAp3E0vtugl3GnKomWc90GbYO44Mihl/LBnmkOt+vO21VPyrhsnSUq4u3uNHft5d8N2k7wz4ct76or/lPT2AOZrkWx+ZXvD+RA7o8U4Vs+ptP7hDCuW3xsUpvEef2KCC6+qKXQF7y8DBHclTY5O22u2Lz6dBc8bAkWjlMtQvTiX9ZPxStKjajKUByqhDLk87hbAnc7tsujwJronYsBC0fwjLrrTKpRjKCcwOj5LgnCyfivTPuflWLiFcuDGSKRj0HTdIDTW/74uOzEpACAx3Q418aqKNY2TXbS1ieHTMneePN3Hlvpvbvjjzl1puGExk3Xq6BhylLl9KF/ooJcWCyfU4mhjX1SEo/++rX5ZpuaBT/hGGVNdOm/lJtxHOYJ2YGEUMjgFk+A6fXek5fBlxdDjelgW0rCmIRnYPPXdtdDitvuQ9JCbRHF+1QBBmt2ZLkFPm7GLyWeuGNQsLEYTc41lWkS4DXUNzcPPkek5Yn7WBllYpqMNTdkyUQkVMdhDABq9bqrT7BAS7/cEX/drUszYiuUzm9VGhVDufF/tcJ4EzeohDzg54lcTu59D0Ram9+ok3QpLrEWsWHN3rfjJbpyBBt8vT3NXhMyGbV8B7L5oUqI/Cpm9l6gVEbVvPZVL+ksLSFedI4zDf1qHNAbF0ggCGv9mEp2jm6v+7RaC7TAAdZe2Q+qFBlzIuppUCNN2TKn8GEHmZjARhmI6J6BkGoZ6GYloCQ92jADnRM6OAo8OsXdYrmXjmvHB8uu1ufG5hcoppqwVKyhOh1+/diyLjSuavW8xYkGC9Ej6dIFVzBa7aD2j2WVGq3OvJNp5/Iv7MnvYbFYTcekjw7ph65Fssyfmcpzk7PnJoUZEVS3x64Slx8y3sCcny/Uw+odGASPnVFI1gWbvqzkgxvoxvcdtBu1Eps2RbM69Phw4lCYw4/ugykhjAx1Rz5ILLQOYmk9shv03/mttizX9TI6gtt5BzKZn5Rzqfijhih2AFvIYNaluBU1JhhciO80P7q47+Ykm7L1ttiMSv4FxDxTpH1ISqCI8pLH0fXaA/PumQor97+WD+4S6ZvY0tN5wYO2EXrQtcyB8Y/cYuK40/57PJK5aqmEAjo2f+oyGLJ91smBgSiTVygV6wKS5/ZwbQmE28aijwpAGtZj2Avm+vv4kQ5n4OZuUM3f68M8gboQvmvi6p8vDarBwhAZ7/CIb8mfXRGzrlxqwpMEeilCdJmBxzlA8mA4tpt4WzEPQEnqaJC7W5ON4WLNYzU4DPX5i5btB5DEi6gc76zNqQvAJEAl9wa65wVpqZ3+cC6SFDlpGfldLAG67K26Kdp1I7eXzO7WBvPRYa7xUgQd8ZQ2qRLA4jYSaq8jcAZk2kf7D6cIigKMbTS+8aghE337uoetBGICu7fHuKVczszaw/mCEZiI1nwMGcVDWpMgth0E8/Dfufo2Vd5V2h5CJKv6fkK736GlRoFs0komdPB+sCL8kx9PD38QZSVmhWEaDVSK5WM65EezsK5oDflvHpHEDeb1AigP8TNWgYoAUkg9ubkUqLZzlo9d3cYi4uLW84bTIZnPMmVZb50mJhzvjpSYG17PSRg4nppvOwobtMj8bA3FOnKpWzCPjJB4Dhsd4F1HqQ8M21vwlWLnc7mfNpsX62xl2Cija6KLiMefXl1GjCJf3ux+UkobEDj63cy+mxQ4eNaO153Xuv8=","layer_level":2},{"id":"81339392-0da9-49e2-9a37-807e51b40b06","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Event System","description":"event-system","prompt":"Create detailed documentation for the event-driven architecture that integrates with Paymenter's lifecycle events. Document how the extension hooks into cart item creation/deletion events to manage reservation lifecycles, invoice payment events to confirm reservations, and service creation events for audit logging. Explain the custom AlertDeliveryFailed event for handling notification delivery failures. Include event flow diagrams showing the complete checkout process from cart addition to service provisioning. Document event listener registration, error handling patterns, and debugging techniques. Provide examples of extending the event system with custom listeners and handling edge cases in the reservation workflow.","order":5,"progress_status":"completed","dependent_files":"Listeners/CartItemCreatedListener.php,Listeners/CartItemDeletedListener.php,Listeners/InvoicePaidListener.php,Listeners/ServiceCreatedListener.php,Events/AlertDeliveryFailed.php,04-EVENTS.md","gmt_create":"2026-08-14T18:29:54.7050692+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00","raw_data":"WikiEncrypted:W27BoG2tWSBKbrlfVNVQ+jhnraa0wnmgMERgctkchXEn90un+Ggos3Xa9FaBmmyp3rtD6860nxngk8pTcEcpoQDv/cjB8DsSnqtIywxsjYGrVZuTH0RmYLQKl+Zq1oOWL8SH7NxIzcBsSj4exr/sYxdY8zm2zQwTU7TTjdYye46YV/d9Vh0j6rx36/YhGOLH41h3yVCpSOn7I4TCmzZ4b4R62y4H/zLKX3KfRxSYjhg4VrqewdYo3LvA20rf4z37bcCG+5U5FOAQrKXF9b2sMSy/qvncfdCwWMycfim654w5uF/P0UyBcgugKzqoQeSyvr4FmsLG+28/OmueRdapstcWhXGGR9UUh89fWL/dnaxuJ+CUwQC2n99feNwhl3F7WB2bIKefGMeKCa/aPA47MVamjyDERrMhpZmZ8kKmiX5m4GzrkFQ2dOcBWTZUinfOwb/FxtYz35XZCR8RaQSf25wvKWegDqlfVyFN2QcH+LlZdSb/DbdxfQiM2bz/Xb8WTA8NnNtsKcaF+HtS0mWyXnNkbDkZ01gwG3WGHgcK2EZSGFvhvRX+/Taak/BCpLekq9SyKLYLuzKoNUfeCCe4tivPXj0JHVXdD8SgNBChzrmKoNL5/OfncxfG99nL3BPnKrlPPHB0O3Oow3C1ETpm2K6uP7JIbL2K9l9V9NeO87yZem4KnUExG08Tj44K3B0MkcoawOins+vzdItYMK+pqPa5pjSU/jms4OIDGEYhqcbMyCW4kOtnE8DAhs44TplGnuA6J2GPqVSUPLe1XIa6Y538VOVq/asQ0AbvKC6RmhMWlSYs6fH25AM00iDyRqyaP+1TJMid7sTET+GeESiNGv1rvvC+qxnBeHVUOlwIWuqIY5xXeGDjsvKWLV95+rEl1lw1YOpFUujv8aLfaMyw7F9V457URtnsupN6m9/J1J+TSIueVUQs10XbGyNq6FsWdKE9vCnXCLQdA4YsrzdP8oOhQnEb7fZb3fMgkO72v7C0bKqsfeMvmcHC9jNXOzIfwDVV0i1sJxwzVoyQuzyNNKMePlbeOH1DfTjRz2LuD7YhCQoO78Ae3xltlDwL1F/Iq/f+fcG9PF0LzCG62vWKOFBRTAOdk8hyKYAd6H8fOjcT4bwNRtwygTMgptHZ3OI8f4dhnL/hEE50GfcVyV/Y8uVsqH6gpT0E2R3CEGUHgySA5Fhdjlpe6naNOVj8RFy2kxuLWEfh+HI1ChMeEL2gtdck2VFpWhAOH3uUKz6h9nQp/guFRqipWTRf0hFNOVB3dHMDUd1PYb8N3E9OZj960MyoL7y1/x6hYVDjV0S7Kvr7i00v0c9nLb8Hoy6u/EfO8K+cxsttoRzvWObg8BvWBcgSQjoipQ3+cp4poT2Yku3vWSKfwZjjSsWy6vKA1cp9o9Ap+0WHi0pjXAmIbq6WJQ3NWYn3YDGoOm0PbvtcyS7N9f+vvZbQuiATPlfP0uxz7IvZzR7/sNBwBNl8wohDzxP30mwluUuhgDrK9kcsFaJ6hkpforzaRLFQnwVyVOfFoLlaExZ7XGpjRHayNgrnEeFUU+QC0RhBSaNsw0TgKguNXVmXYEmZ4yW55WsWtnRD5OFoJfV9yXUjFvd6iUq9VO85gFKmYL9qbvV9VwPg/zwavtp0dcwbGZD/AXJrlLk9QbWwQOuTUdCVMkrNRljF7Q=="},{"id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"SliderConfigReaderService","description":"slider-config-reader-service","prompt":"Develop comprehensive documentation for the SliderConfigReaderService that reads and interprets dynamic slider metadata from Paymenter core. Document how it extracts slider configuration details including available ranges, pricing rules, and validation constraints from Product::dynamicSliderBasePrice() and ConfigOption::calculateDynamicPriceDelta(). Detail methods for reading slider definitions, validating slider compatibility, and providing slider metadata to frontend components. Explain the separation of concerns where this service only reads configuration while never calculating prices itself. Include examples of slider configuration structures, error handling for missing or invalid configurations, and integration patterns with other services.","parent_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","order":5,"progress_status":"completed","dependent_files":"Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:30:10.9305503+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00","raw_data":"WikiEncrypted:xIW6FSR5xsHzmFFuzwoOfnjq7ggwBk47TYV8NODkwSD5VUde+q085xdz5IHplkJ1wGfTrHtsRRIcmLHiwbA2l0wQHAhqaYEO+Js8A8WTNXSSIfE15pbJHQG1uwZ09i2JqwvhKAFn1flHhyAQbqlucGEru4mt4bB7N/gbOcBq1cjZNtjFX8oRrfmxaWauHWFbjNQPQkHNTMcdGGxnmBVzdD1iQ8dX9aFe3fB+J0J8l9yaMTNCLGLr8Y1uq2Nt9xR0nSptub4R4Nygs7gps32pA5kkUAvpvm64y/KyIxAT2wbUJ/010exam6lhuU8pHvPWjpFHTzzIqsneaiMM6TEfaoV/5FnIPaRwjjbWT8XMGIQbhO9v6SvK1cfG89EoF+s1ham2GsEaQ7GG8uOUQxjtm7SRS6yG2wDxlqOV63ENChPB6Y1HcFgMwYR0vfIKJneIJZ7rGFGWCt2iv0mxg3+pp/ajPV3VNV2mohEVuLQSdhgwOLfnpDd916hD1gIz+5BZEubYPOIUXtwVBonVEpr2dvf7PTP66xVyopM/k1EGfsW+9x1G2jnLglNm1840ofTX7IpC+0VCo1/3SqI1fMHeRUrv5WRaJSh7M8YlF26V+81/Zc1jur8ewIunPbJ3J7p4a3bw4p85qcKRyRekmf03GFcLFscqMFsmPItwCdC2jdcyF1PGl4mJVEM9GCwI90FApFXll5BmATVk8RFZaTnvB9PIEiSud1Gfa8zZRNHwrwZLgHkTlB/JKfa6kw2MnsbK/7Ej+b8DZNeOHL+F8g/NmJ6U17VWOh4vfuxII07sdZeqiGgMrYVAccUvabGeQP3R48ny3Z471Xpg7FwUW4mL9zDpFO5iwZen9KEByxSBNMcucP4EZ9d2x8xOsw97ycq005anwzzkUe241dm7IyPZIx6Clo8B8YSFvZ5/7Cb7PW1juIvcBk0rGkF4qbZBEoMcEqolQJm5sTVcQfTSCJETyKtOmhx/rUke5QpftClEPkG5/VJz6jS5LSC/ZZZYeS0xbvp38A2X/lChuuC2eKKocsJWTdkBumxRpA2DKW7ck5I3T5Ib2v6petQC11VwkuTfsZbpl0RQWcUxwLlKHfPSzDV1IWbVhhNmrENi6M2NRkDaVHXRXgkquj107dvfnfrb1W6sLW1x9tBPMYrPdt4ui6LVJcKyKl33ObCPwOzIxKZBcKUVKQcI6hfJxTefia4es5ffiuXD2mPKYgLEbFGdVzC5dXzXtTKlY9W8NelWNc0QXTWpCCbZYJDf9MqfGFU/gsROpPacOi3e/VnUCiigA0RLjBotjWqX0dMKATZcA+TD2tdKRXV4L2/cKrICfYz6JccAS/A63FY6WeDrfKCj9eQ0K3FP7ooz9revgK7AJn1tgoKXwBx0+dJcsgle5Xr044UXLHNmtuAesm9Nr1wG+2009mgoMmhiJ4m1pCXH1S9hcLgKCBdSVFPGdCKRTZzjXR6gwJ7J9ZHUixDenn/Jhg==","layer_level":1},{"id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Admin Interface","description":"admin-interface","prompt":"Create comprehensive documentation for the Filament 4-based administrative interface. Document the dashboard page providing system health overview and capacity metrics, node monitoring interface for real-time utilization tracking, setup wizard for initial configuration, and audit log viewer for administrative action tracking. Detail the reservation management resource for manual intervention and alert configuration CRUD operations. Include screenshots, user workflows, and permission requirements. Document customization options, styling approaches, and integration with the underlying services. Provide guidance for administrators on monitoring system health, managing reservations, and configuring alerts effectively.","order":6,"progress_status":"completed","dependent_files":"Admin/Pages/Dashboard.php,Admin/Pages/NodeMonitoring.php,Admin/Pages/SetupWizard.php,Admin/Pages/AuditLogPage.php,Admin/Resources/ReservationResource.php,Admin/Resources/AlertConfigResource.php,resources/views/admin/dashboard.blade.php,resources/views/admin/node-monitoring.blade.php,resources/views/admin/setup-wizard.blade.php,resources/views/admin/audit-log.blade.php,05-ADMIN-UI.md","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00","raw_data":"WikiEncrypted:WWG9qBb74s3FuYyeVUFZFNVBgoDDfQnTVf6JIXSs+2ZVT/jBd0Tohjq15y1NP/7b7yfay4ZSf1dP5XPBIgZ2qIOZlf+nL+6M8tb6HXSMy25DW9Y0QpDfjGLj5svH2X2FhVYOyXBXnPysCjr21fJlupXgUhxRSUkrS+zYSjJRhIUzGudxMrNMSZ8NF0DbUpK0CahdE0zM0i8bwhkb9tNp6SXjrVAuZq5MsPnAjF+sSV6i2GhSWNvVO5PdzwyxrQxKm8JNXSB4i/FEmKbv0OXYYvggSumGhaH8cuBmRYLfthNh5Gi+pXuyEUcmKhPO88plbMlbqWYqwYt2ugQQGzWrXu2rmkXj4P0Fl+EHJrW1ltv3/ZQgkXj2WDD0ZQ+sXCp+3u+kKK+wLryZgRTURTY1IYz0IxZVZbZ9u5SP3DIkznH+KCpE1CDSFPK9UczM3mKLIAFRIDeF3Zx2BlIJH4wriMamYO1+X2XiII9WEOmGM6O8Yq+qU8b3BSU8S2Yty62QmZJup1yPi76+r1chYOQJY6KkCg2eYx0THGFdg/Mp3cZGk9GIvLYqdoKR4g6Id8vp1TG2SFyCDRBqT02T6o9akze6PQkxGnSx/GpPAgNV0SY/GCE3o48E9Zrpb5eGparA8D7mLpFoFNsOIxvRICKg/I31crOo/t79SM9Kq1ZGXc5CYlE/XkLIc5UyRld9uDD743phDhrmdozPoS07ykjParVA5qn+ZOoV+jLDAM5H+ZNdhClTSqsAbdVZdGhLBD6+k6j8O4EHg4D7TNmpSyNTc+oaugSuR6BNWR6hic53wSggxsegofanP9LksIpjyJU+e5I2iDUYp+ki0kgiuTf+T1Pnku1+g0OgeKhyr55iulqHVPKbUuUMZ+rxeR+Z9+GkaqgrahoDQ/BPNS+i/QMvqA38np1uMgCBuxFf4YbDIQlIVFhq6rEYIqYSbeSWsArxowMXCpYsHsm5zRmEumjbYf+ggggtn67AoKX6h6goXCUzdANRWXD4cISkSCM96wodNJRY6v/+Gpl7rMIZTM1YMnzj69inbN+ip0VrcA7vX6c2OnkqgU/CVIqJX2rZKfpxznsfVhnOKstzhmB9BDqw0l5E4lM/rLwivfGJCdAX0OqMIZV9sfX0X+eQw0jizyByPKGcpSX1cfFIXlkC6yAOGvRMN0HY4Yp9d4eNBKG8TVXBYVjm8Lt9qUGe9zT8AyD4en+J2B+7NtrJC0T9nHqJSwTsWa2PxjjjhBDk0m1a9bBuqpRWaoMuwQW6XySKdlwPsu/pNJoIToaBAqjQUw6WPMwUN+OcLS09QPOmVuzobrYDCupbXc6KdBNKpTCvfEzURi45lydJ4NtzDYWruk2RVyzLqy39ikPt6zyADdD5sPK1iwwHX8blhV/YTogPk9AucnCuCnYdtam/n6wDGS9uI4JzI6gaEmZkud/5z1B5+uKULCJVcgTvEVEv/h9rENvVfV21KwYUlia+bBB001uI2eTCJT6j5D8Mjy7PpDgiAWNpbxFI0xMTC4HYbcyR74T0gg6JUs4Bts2ePLHso7wPmu+gof31B00VK/rU9wF/A1Zfp1Rj7xXjnnIu9RBFSnNhETP9smIcQELmT41VJ/VFVI+yH00oam7mqqpxpHyftBUpRCXRI6NgUjhvUoC9sinE8/t5P2q8mwenT5elBMdoDfC0iuXontweV6MKxV6rTO9iRAsQYBNbcySA6Ha2dQcw78wiINdkbN/K3qRBJ+li6rDsB57bgxrAn2R/frqUKqP6V17ii0YJjt4lM8AZBCA0/dK1MiMqAb3+6Z80/+rDHlAmuYFVYrdRjc1Mor5K/nsJ/dxdcwlDyFjpEEzhHC0g6uZU2GF33sELr98rp2BMSD9ruh9wGk4wJCkdCrT++AxE+81fUhrr4Ok7XC1IGxshgsAjGikGa8PyPpciEkBRbr/Y+OOpbMzfdibXDpotTn4="},{"id":"268e6157-30a8-4047-8abc-f7116c8c4969","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Configuration","description":"configuration","prompt":"Create detailed configuration documentation for the Dynamic Pterodactyl extension. Document all configuration options including Pterodactyl panel URL and API key setup, reservation TTL settings, and alert threshold configurations. Explain how to configure dynamic slider options for products, set up pricing rules through Paymenter's native pricing engine, and configure location-based restrictions. Include environment variable configurations, file-based settings, and runtime configuration changes. Provide examples of common configuration scenarios, validation rules, and default values. Document configuration inheritance, override mechanisms, and troubleshooting configuration issues.","order":7,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,Services/ConfigOptionSetupService.php,Services/SliderConfigReaderService.php","gmt_create":"2026-08-14T18:29:54.7092437+10:00","gmt_modified":"2026-08-14T18:34:12.6344536+10:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllB9TGvdYeEh4zcG1OGQGWJSFpFw8F31SqwuVj2Tmc7rXwB8dEu96VYbSi1y6wDE7kKK2UgLR4P2K9gN0159Y9k3pDIXhYYPbGcpM4naLOh2ct9kF4sM+qqf9x6UeOT4BXyRnmTrJKxiq5Oc0E0QAeYHOoMvOrwO40HJJuBoE5oj4FKQmaKjVGTBJ02sjiyWWijjRp6Z4X68W7x2fZWXKRMqamrO0Jb4JSNSwadPRgpuG4M69s0C8uO/wcWkW3mc8XYJ3GGJm2tsy3nufzuKj/JpeKjcOFBNXy+5oAzRsfGbE/7ThpW/YS/wGQt999n552y7MqYi4ch+5ev+eiToriOPEa3ktdzdJuhaQITVT9H4ecRE8lU2dkwCb0h7noqVxCvVMCcEnQFeYm8yxrfuATZBVDVoY+WVt40LAOO7yhEY8GM1rx8Yk4z1Q5vgBajLub0MzD+ymhq9dP+2ViV7h1Krrb8iNzJhxG/VGJFpPo52M2iOBhDpYxjsOT96LJRwaa0ZW7puYfTpQc97upTEJ4Q+1RWjWRZ3b/6MTS1Wjo75IwvjMZfcrSIy1mhYEQ7ltbl2wEN7yjcZyNvkvpbBaQOx4mnmd1/B7315gY6oXkNkoGnu9wcLO6yaIGxBrxUYXVYtIxTx5+vZZZ7Zkfgo4FU31S400AZz6SLpH1hXCpxoh+84FR1AGRxzbtuF/D9Hz5T6CbjtzUvogCtZwtK8KKyKRQiJeqB7zLhgZbPOdPlVdzxPjCkzwalo6eJi7z1BeKP+2PLviiCtLjm0Vg3bPuFTxAudbE7o38IPWFk/KUrCOXRZmDRQ0QxoHdHKD57WP+ztwxEHTRIbhuQlLHD9PwHctTzmbB8k09gIgUbPiCremANpNY4z3IcfRNwfkQrXl7ydGzB8/b4DPobAis2MzObceYaV4K1CSe8Z4vi54MQoB94ZSOzfhI9W1Txyd4OAC/fiYpvC2PAR5DClCudsUMf78QSSz9KWqdNx5IA5Fw6+Ue7ike7NdYD4qjdhOhQC18xtlNBbNAbMFfCa5Jp306D75tnS+BYGOUixzCVtc6AxNw9LyEdG7FgJYu5Xv25V1sF64x7MQsIJ0T3v30Cn/O3V8CTg2C8J57u2yiNhgJnQbZu449Vx7hQGpC7v5EJ7TY8R5LVa9nSmeza3oU+ojx0AQ5n0iMTHx8k779ZVqyDSHeB1flPO8DvRrjfU/8J6h8LYIMNhlkzo9Pu0TyLBVBTaIPAYGUEVdteObXzPA7RbRfqU2LTXwHO6dL2pbEbwSB4RDvbQmEVSXPevg66O1IqLdaTxDldIRxWYkMwYLTfbziREIB8iawpi15Re5NbEu2MsbUvDLHXlAwRRN6mzzxmy05Kt8x7AsUODeK/MfLyjKyNU2cU7kUarJTH8dTNjPjsDWvGH8kFHod0HS1LDdQiFZgS9zGuAiqhlAJyBIhW+//2gqdCEwRD+zSXGJkiH22CB6ZNmI5+ehkDF3eS7wMQw="},{"id":"38e0cc55-da9f-4918-a1f2-75915446628c","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Testing","description":"testing","prompt":"Create comprehensive testing documentation for the Dynamic Pterodactyl extension. Explain the test isolation strategy using array cache/session/queue and sync queue configuration. Document unit tests for service layer components, model tests for data validation and business logic, and feature tests for API endpoints and integration scenarios. Include guidance on writing new tests, mocking external dependencies like Pterodactyl API, and running the test suite. Document test database setup, fixture management, and assertion patterns. Provide examples of testing reservation workflows, availability calculations, and alert systems. Include debugging techniques for failing tests and performance profiling approaches.","order":8,"progress_status":"completed","dependent_files":"tests/Unit/,tests/Feature/,phpunit.xml,tests/bootstrap.php,tests/LaravelTestCase.php,tests/TestCase.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:34:38.6234582+10:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cJe9KawViinxS2+7PJ4zWF1rrTftkwDEls6S2T0QV1ucEPoUFZro9LJO7G9GwE72MTGAtfPLOdeumQS14HNLDQG+5w4Yj0EjNpVhDD/LYTb2Z+TFs2fph6r9HcoGga5J5CJENUVHHME+3w4T3sY7r1LbxmdyPyW/xEAihsXE2dpetej7CLbeC1ZFh+U3gV4SvltqWUgNnGpayo+DBxvn77MG3ES/O4YJdySlj+1Os12BTtIxH1K6BgefwkkLYKVhgq1qNaxEeeA8f4iCvWUELrEHKYhNqLjLD1FVVjFIVA1zPA/OJtr1otj3VY4RIP1r1D1jkZXHfh2lOleGajqCZ2+CmLnzYZ8F6aM73iAGAKdhShDFP5/32OMgERPFerb74wjZkBxgatUeyeMqAZM6OuHF2EtFkIJS2+JxkR+BRW7kMUxi1/cZDsWt9L6euxUocDZ5e796Z2VrjzNuJway3Taxlx7h9OOQ7J3WN24bd9go3mjqH9etx6tpAvVqZfTrasdIghz0BbxZwLlxEEWUsyBQzCgUaMf+8gP05aQouS9KkMU3v1xI+yDyU1xJ71eYALrPbEb3pV/OTNOdtiB0JWJ9L0KE0/n4a0aimCjQgzhe6e57MNf/iXmxt7QylkXutJICSzp0RmhRGKcOMCE9FqawGQOzO5L7BxVssk5XAWPcBl3iUp/hgsyFIisTTa5LpuCkkTLwl02IeQ1bAl6BZtytVfjSR6f6699Tss64OOxmcOiBBP6v6z9P8oPdn/dMnixDxMvd9kqoMKu57ICbmrXyElUSpM8v8Sbft0whvl6N2iHJuA7k1oB3MdSiryLFiZcLnN3OXOm/7zKjJlJwZjLKAPqWwszjuUarPKQIURllo6WDAswpfY5YGYqGaAKL7BRf87paYF14rlJAVIqYm0jFEYkDz6YUnX8Z2fQW/BCG3QJCKgwKOOr46mK0jytSonHY5QcfES9Nss0JdrE1/mWiKF6pNUWEWhBsHUVHJ3QKuxeJRARxJxalnGP+Gv74TvrIQB1wha0lCEDmn/AbZTSEGVDPxxuI1D1QAjQn7CN1NSFpsCyjmsizENXXfK3iKBeG+qUsDV8VdS36SFapxDf49uBOe1dCQm14xLuA1x+2y5AwvWVXGXKEv+1RMjoJerAe/Uuzw6UffOY/6O9M7CaRczAqdnvxopqj9X8k0Jq877ULSWgOfvMdVH7nif00lIV9ZR9ZCkMvKPepX90mlbWxcbDjnRKCQ6HhOHzRlQbQSGGvU8DoFpCxbpMuh5iSBV8RVz+O8Rrm1eiv+qd6QCk8g/GPct4MgI5HgFa41lM6qkCBQ0wHflr4c7vxJIEPye91CASnHMUaa6HTvOw+qVJ/4HMHATad7rP4wIXFR8cbYFWOIPqUEfo30zCwD1OsqNQfVEbhoEnoGXfqtKhUZAO5TcmNwC7r1g0BdV4QbONnwrC5sRDHhpeHKtgFv6/+6RDlo6demcQ2byICHPqcp4zBDOrUkzeYgDb+ceBG0ZcP"},{"id":"b4342e47-a056-4254-9690-dc5da63d95a5","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Deployment","description":"deployment","prompt":"Create deployment documentation for production environments. Cover installation procedures within Paymenter extensions directory, database migration execution, and environment configuration requirements. Document scaling considerations for high-volume deployments, monitoring setup for API rate limits and database performance, and backup strategies for reservation and audit data. Include troubleshooting guides for common deployment issues, performance optimization tips, and maintenance procedures. Document upgrade paths, version compatibility matrices, and rollback procedures. Provide checklists for production readiness including security hardening, logging configuration, and alert setup.","order":9,"progress_status":"completed","dependent_files":"DynamicPterodactyl.php,database/migrations/","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:35:51.3476266+10:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0KU7kGval8hY4joZr7NlOcelXJ6LZUytJe6IZ8coCeFm9zKznvGyDJ7LwZPGHo0EjzEqz6/3zcywNYNJLGSlRWTPPq87v1g2PkP1EIClkfcI63o4J/bue5dLpbCh2NAqpEuqwr3B4TY7c+NHgmFdFKx8p5wTsybENJtwmxt+vg+sE13RDqTrKj3Ep2nzJOxC4FDSSUzN8xW85LvIA7TDKBGpas/5mjljfPAzLq6r0WZRKO/c7TNSph3WOafiu4mx/skAbSsao2qXXnjtdZBmH8eJ9JrBzNJRy8nbXuWMhWWl48Q2wwnuT2poCyzR1Dg6WgndAhAO0lBYBboukRMX/oolcYmYmyz0/7ruwYvTvFm9ZO1s+z7u8jFMd0FAU3VG8awgD6x1wTbsFID9g6Ajrvpw+WuFV1szydlDgJoFUmxj7oJqUbX4W2gdn+fhGfTzH8HANr2Nwdblt1Mz0fVt5MgAT/fSZc8F7YLk2tZdsjVCP0rSc5O7W9wLPDNXrPwcDXeamUPVOLajY6iQ7oEzbee+25uamYUXUfUX3TAyDcO51rhBG4Ftp1KOoIrd2kqn+QvwAC9ncHJ9c7XPEIEnSvsEsum/aCxzq5xnxerVeHc9kCgPhC5IEN+4gqlrHsq66QBxTe23e/7gbH7iekc+R+1ZtDKyZKBaFCXT3sE38LglG3lXqNT5Z/T8L0X7Eh4tWhyMY5ahHGiRiH+f7v1JVZkRYIk731WBuD3vYycgrCEzufUAG4X8h6MD/j81KNAQgqBgZhepeaBZ5wOsUo//6ALtkrc8nd4IArLy4DCQ91Uv0g8i1rLP7uGMzQWdFXuVkoa4mQ3Uv4YccHv6euJ+PqB8oM85zBRp1UJzr5isxMOttbYNggJFzqAj5GGETiblr78n4nMFmcoTTlimkw1zxxE19DTDa+Dg+iS1vyPeHB/aVwVjDJMKk03MpPyU4TA3pmHF1Ycn6bMLsb4SeEgUl4AUaIrcfs/oxOVUPjODxJXwXhs7EIQeRGe17NnAd9nxIqfl0T55ToCEAwjP2Nrpw6PyFnxFHH3uhoRbqbsezdeAbIHOOGapEaAlR4CP9GBnBQ0nS97uB2UG1ud2B1hWwrKIMMnUMDVoIEXu4qjcFKmpSZCRudkqcO6T4hbIYXONNnNzVWp8FWJJrNI6dJyhEUION/PH9GDSxHbtyzxHPuqT3NJeqeAE1bedpi4PUvPBHRk7p5XIrodzlHuojBM6PgJr1J5s4AKCjMX1jVHcbxlVNDq4cAxNvKSmmhBLKIaalGfkpczkyXL755JxrAWnSv/RmsPQy3xpgJNCcVJwfT4GsPuDmyEN1Gr062Y8XWFnt0ErqUp6pohdqjcRP955K0="},{"id":"d7805c08-5769-42f3-baf3-7d26d02b0309","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"Troubleshooting","description":"troubleshooting","prompt":"Create comprehensive troubleshooting documentation for common issues and their solutions. Document problems with Pterodactyl API connectivity, authentication failures, and rate limiting responses. Include debugging guides for reservation conflicts, database locking deadlocks, and timeout issues. Provide diagnostic commands, log analysis techniques, and performance profiling approaches. Document known limitations, workarounds for edge cases, and escalation procedures for critical issues. Include FAQ sections addressing frequent questions about availability discrepancies, reservation expiration behavior, and alert configuration problems. Provide step-by-step resolution guides for each identified issue category.","order":10,"progress_status":"completed","dependent_files":"Services/ResourceCalculationService.php,Services/ReservationService.php,Services/AlertService.php,Models/AuditLog.php","gmt_create":"2026-08-14T18:29:54.7097527+10:00","gmt_modified":"2026-08-14T18:36:13.4250001+10:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0hGGy7zXJE5t3XZJK+9x87U7MbBuSJQZj5VKy37lfAZW3q2vRlHn50goW+5RwQbDeoMhFpFZEEzDL5gCwCaITqqH/4PA5QAC8SQsK/m9Stg8CVfgSwRPcjqeDdnoDypBh1fdMvLZF0RYierFYZDwPeH2eMVmCKB4YBkznINpKg6pp0bhtP7QFAud4i5eI0mrWTnnmQM0/Fm8D/URDk2jxiu8HZrJijSeYp/9pRUbdT94xkQJt8lGsPFE8IOfqkvxBlhDvWMDe1EVYm0bVSA0tN7xWAIPREED3slkF3NxFzG1NTXW9zSr6uUMqSGt08YWnaf/7n2BZPcTAG18DUrn5u+nqPa5vFvmMy/k6ytnMDVEJLhcMuL+XeIIpEeQ7ad/8/smz8tXqgOFLdRsTQzBjYpeeuiX3uaxX9b63cDwSpukMekATk1QYaBENPYVfSlvyCBVES4Y7MnQtOnEiTzkQoEVIujF4YP1DVy5ICDSOqmr5LqFvlN0vIryrzyz0GT36ID6QO0qlmx8d33pTOo9OQ1l1Bzk4PtDkRJOLTfTX17NHEcZb3mdq5/I2IcGZXb0pXbBfMiTNqT2aWiNekFYLUgIMJoi+2CFR5qpZk0sNm3zcTEqO9sw4NprNvQNguhzy98n5yjPqYfvddIwsEa1O3MRlTDY2L+62G18vVm8h+0OPer1e+3A9eAom5Z/JlDr3C63JN0NjbN89/wZQTGfnRCUxM1cElIir+YYRT9IWeoirPRiopMlnVN3FbifarTQq24TD1OiKZhJI46I3h2wCbgYbDHrMNKR/mafngJUOiDVrmXPtXVPqesn0gc2dwIlzWlsCiRRV80CyHNJ8+w39zR12sPT9uZ4AWuwJpCR9zG8VywlyjfRaswQklwJ4vKLDFA0f+AK9BywEGxTXAeEu8aX3BDkZb1aZYfFSKVR/aAUdGGfcNPANPR7uQIismqhLqb3k6XrUJYFVl9/KAOa1P7vyTICi9RzuhoT8v6BmVxIPrvkXR4R2Q8prWTJXsplBYcysZQ5zSyP9Ryq5waFYjJ6N8lJF21pi+qT0JnbTvWnSev3RXONIRDgpRI1Ij82UXEQbil79Fwdn9PXyRUMaxX7JTCBUuZPCQuQuI2bgoHTLelipVQopSszl2+tijWULGG5mnMO6ZPFI9kVrjfYbO3RSJcftTevqvzT5vQh+J3A4iPS2BZHMAQDxcFESeeRCeePgTebTmEjKFiwfeTdo6CJtPt80xcD7kCeD7nqVT6YUyzPUTnMYSFR+H7lwbt3fxfSmMn/7hUuf8GuwmfXWaOnNUhyk1QPsebyzm+ope/uTmTo1uSScPcVCnLFS2niKLuCY36cklv2V5hlvv/UAHvOLZFKqd/XSq8rJRIsFQJVz1FgL12PbymZcgcEOGh3e1vbdBs/oObQhh1D0juCgwcjR/LE6fthIY3mMUyehrrBpM+Q7KLl126EKSLPUHbr8aQQ77k5H7ysWpUdrXCvkjUgUFtB/zIJ522tyIv/zBWo"}],"wiki_items":[{"catalog_id":"b187b195-6ed5-46b6-b51f-7908cd7a817a","title":"Getting Started","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"cb817d16-6d74-4b19-862f-7f35d8fbe2f7","gmt_create":"2026-08-14T18:31:48.3101788+10:00","gmt_modified":"2026-08-14T18:31:48.3153438+10:00"},{"catalog_id":"b37e64ce-adc2-46b9-8313-fb2e0630ccf6","title":"Core Services","description":"core-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"24a7e201-6cbf-483a-aa9d-07769f8ab369","gmt_create":"2026-08-14T18:31:48.7603804+10:00","gmt_modified":"2026-08-14T18:31:48.7650642+10:00"},{"catalog_id":"cae4c946-defa-419b-88db-55655e77ad15","title":"Architecture Overview","description":"architecture-overview","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"752bcc4b-21c9-48f2-9375-e4a7d290edbf","gmt_create":"2026-08-14T18:32:00.8097338+10:00","gmt_modified":"2026-08-14T18:32:00.8191346+10:00"},{"catalog_id":"eb6a03a2-b42b-4ba3-9260-ca99600a7ba1","title":"API Reference","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"188acf53-87c9-4598-b284-fc851204c59f","gmt_create":"2026-08-14T18:33:07.2502892+10:00","gmt_modified":"2026-08-14T18:33:07.2561025+10:00"},{"catalog_id":"81339392-0da9-49e2-9a37-807e51b40b06","title":"Event System","description":"event-system","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4e131740-4a2e-4e72-8579-cac21302f79f","gmt_create":"2026-08-14T18:33:07.7183655+10:00","gmt_modified":"2026-08-14T18:33:07.7268419+10:00"},{"catalog_id":"48f92aa5-8812-4b8d-86e7-4a57b5265eed","title":"Database Schema","description":"database-schema","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"18e54911-5366-49c0-8103-29d10e4e011f","gmt_create":"2026-08-14T18:33:14.4799917+10:00","gmt_modified":"2026-08-14T18:33:14.4875222+10:00"},{"catalog_id":"268e6157-30a8-4047-8abc-f7116c8c4969","title":"Configuration","description":"configuration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2f8efed0-50ff-4219-890b-30cafedcb7bb","gmt_create":"2026-08-14T18:34:12.6286194+10:00","gmt_modified":"2026-08-14T18:34:12.6349718+10:00"},{"catalog_id":"70c4a2bf-ad15-40c9-9444-cf940febe76a","title":"Admin Interface","description":"admin-interface","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ddc45e78-a548-4483-8c73-8d225fb09de0","gmt_create":"2026-08-14T18:34:38.2805369+10:00","gmt_modified":"2026-08-14T18:34:38.293766+10:00"},{"catalog_id":"38e0cc55-da9f-4918-a1f2-75915446628c","title":"Testing","description":"testing","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"86ac6693-61e7-4765-aec0-21a789d6f26e","gmt_create":"2026-08-14T18:34:38.6054896+10:00","gmt_modified":"2026-08-14T18:46:24.6647446+10:00"},{"catalog_id":"b4342e47-a056-4254-9690-dc5da63d95a5","title":"Deployment","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"16154bc2-4252-47b6-a053-e966c87c4343","gmt_create":"2026-08-14T18:35:51.3422689+10:00","gmt_modified":"2026-08-14T18:35:51.3481463+10:00"},{"catalog_id":"747fc3af-47c3-4d1c-9afe-b9b2ddbc6e99","title":"Public API Endpoints","description":"public-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9573fec1-f465-4fe6-8c91-0bb4bba9d247","gmt_create":"2026-08-14T18:35:51.7774049+10:00","gmt_modified":"2026-08-14T18:35:51.7838723+10:00"},{"catalog_id":"d7805c08-5769-42f3-baf3-7d26d02b0309","title":"Troubleshooting","description":"troubleshooting","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"382a8981-d857-41cc-ba76-b0604b2c2b41","gmt_create":"2026-08-14T18:36:13.4174124+10:00","gmt_modified":"2026-08-14T18:36:13.4255738+10:00"},{"catalog_id":"3fa530c8-657f-45e1-bfb4-39afe8443e9f","title":"ResourceCalculationService","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c673875c-4422-476d-ab2d-b9a260baa620","gmt_create":"2026-08-14T18:37:08.3998082+10:00","gmt_modified":"2026-08-14T18:37:08.4061304+10:00"},{"catalog_id":"e3386639-745b-4c62-9148-1ee933d1e0b6","title":"Companion Extension Pattern","description":"companion-extension-pattern","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"210fa0aa-e1aa-448c-bfce-fbf72a83ecea","gmt_create":"2026-08-14T18:37:13.2534237+10:00","gmt_modified":"2026-08-14T18:37:13.2587676+10:00"},{"catalog_id":"366e7e10-0359-4523-8ce2-a28bf6870f63","title":"Resource Reservations Table","description":"resource-reservations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0ca0beb3-87ec-4453-af30-6fbd3e60b82d","gmt_create":"2026-08-14T18:37:33.4246073+10:00","gmt_modified":"2026-08-14T18:37:33.4309965+10:00"},{"catalog_id":"f36492de-4fea-4b83-8237-0f42aaca10bd","title":"Admin API Endpoints","description":"admin-api","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f70303b7-4f5e-4d4c-a3cd-920ef1064fd7","gmt_create":"2026-08-14T18:38:16.0146152+10:00","gmt_modified":"2026-08-14T18:38:16.0214739+10:00"},{"catalog_id":"2babb181-df9a-4da5-b222-f75f0ec91241","title":"Event-Driven Architecture","description":"event-driven-architecture","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6037ff6d-e047-45ad-a568-3493aa4a5351","gmt_create":"2026-08-14T18:38:24.0139017+10:00","gmt_modified":"2026-08-14T18:38:24.0201114+10:00"},{"catalog_id":"f090ff65-6cf6-4648-8dce-03419ae86c77","title":"NodeSelectionService","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2970fe7b-6d2f-497f-9362-3e73a595927f","gmt_create":"2026-08-14T18:38:31.2002859+10:00","gmt_modified":"2026-08-14T18:38:31.2045805+10:00"},{"catalog_id":"2a7c8252-2ad4-4ae0-a99a-39d48b4f2218","title":"Audit Logs Table","description":"audit-logs","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"8ad6f733-a3db-49b6-a00c-339663ececfb","gmt_create":"2026-08-14T18:39:21.8099259+10:00","gmt_modified":"2026-08-14T18:39:21.8195394+10:00"},{"catalog_id":"23e784fc-87fe-4042-aea4-f06d5fbddd59","title":"Service Layer Design","description":"service-layer-design","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3c632a4e-8679-49dc-82c7-17ae7c52c2d8","gmt_create":"2026-08-14T18:39:30.3683013+10:00","gmt_modified":"2026-08-14T18:39:30.3769574+10:00"},{"catalog_id":"b7bf7508-7549-477c-aa0b-c0ccaf33f95d","title":"ReservationService","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"3f58949e-c164-4ba4-8839-a5db0e9d04a4","gmt_create":"2026-08-14T18:39:48.115098+10:00","gmt_modified":"2026-08-14T18:39:48.1240262+10:00"},{"catalog_id":"7fb2ab09-a1bb-486a-b39e-9cff1a180980","title":"Alert Configurations Table","description":"alert-configurations","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c0fb3667-0a53-468a-bf69-5b8c23b9764b","gmt_create":"2026-08-14T18:40:33.2193788+10:00","gmt_modified":"2026-08-14T18:40:33.227889+10:00"},{"catalog_id":"8e2180ce-6afc-4199-856d-14944750075c","title":"Real-Time Integration Strategy","description":"real-time-integration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0e6b8371-2ac1-4df0-a22b-347f3d0d8af8","gmt_create":"2026-08-14T18:40:38.6121131+10:00","gmt_modified":"2026-08-14T18:40:38.6195007+10:00"},{"catalog_id":"46b9fc6e-218d-4212-a930-0fc7713261c8","title":"AlertService","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"9f7b7836-6cee-42ec-8b13-c25eea79ab76","gmt_create":"2026-08-14T18:41:26.6797165+10:00","gmt_modified":"2026-08-14T18:41:26.6873261+10:00"},{"catalog_id":"db81e08e-4803-4640-b5e0-202e80fb914b","title":"Model Relationships and Eloquent Models","description":"model-relationships","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"6b790301-e99f-4c01-abc6-c1d2251b04da","gmt_create":"2026-08-14T18:41:52.6755452+10:00","gmt_modified":"2026-08-14T18:41:52.6850373+10:00"},{"catalog_id":"f3550273-5462-4317-b2c2-6354a1b8c98d","title":"Data Consistency Model","description":"data-consistency-model","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"397c6189-f7af-4992-b081-938fbeb2a16a","gmt_create":"2026-08-14T18:42:18.2848019+10:00","gmt_modified":"2026-08-14T18:42:18.292848+10:00"},{"catalog_id":"999dcde4-2ab7-43a2-862f-b76e65b760a3","title":"SliderConfigReaderService","description":"slider-config-reader-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52e74833-e71c-416c-abef-6a52d5e7d237","gmt_create":"2026-08-14T18:43:02.8864404+10:00","gmt_modified":"2026-08-14T18:43:02.8944335+10:00"},{"catalog_id":"41003932-cd5b-45a8-b46b-cceb2353eb97","title":"ConfigOptionSetupService","description":"config-option-setup-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"05d603ca-5277-40cd-8db1-42b50d13a2d5","gmt_create":"2026-08-14T18:43:06.0109013+10:00","gmt_modified":"2026-08-14T18:43:06.0180514+10:00"},{"catalog_id":"52295bf9-bad3-435f-beac-e59e3eb28421","title":"Availability Endpoints","description":"availability-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"4cc16489-70c5-4fc7-a82a-79f9f722f7b9","gmt_create":"2026-08-14T18:43:09.3656506+10:00","gmt_modified":"2026-08-14T19:47:29.1142518+10:00"},{"catalog_id":"055b0b2b-5a30-4340-8b5b-46fdad73194e","title":"Capacity Monitoring Endpoints","description":"capacity-monitoring","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e1b71f1f-22cb-4fd6-8ad6-87d2fc6387e5","gmt_create":"2026-08-14T18:44:06.2380949+10:00","gmt_modified":"2026-08-14T18:44:06.2448873+10:00"},{"catalog_id":"c34de209-e200-4523-a028-b7ee197969b3","title":"Resource Calculation Service","description":"resource-calculation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"f39634e8-6feb-40fc-9768-344eb9186ee9","gmt_create":"2026-08-14T18:44:10.5530618+10:00","gmt_modified":"2026-08-14T18:44:10.5588405+10:00"},{"catalog_id":"abf4996e-16c8-46c6-b4ad-37b49bb8c97d","title":"Cart Events and Listeners","description":"cart-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"2fe41d24-0d24-46ad-98fb-df79d8b27b3e","gmt_create":"2026-08-14T18:44:28.6567971+10:00","gmt_modified":"2026-08-14T18:44:28.6794473+10:00"},{"catalog_id":"913242e6-7d04-45ba-a668-73d34ddbb9d0","title":"Pricing Endpoints","description":"pricing-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"52362e7c-a29c-48b5-a121-0b96dfffcf2f","gmt_create":"2026-08-14T18:45:18.0483469+10:00","gmt_modified":"2026-08-14T18:45:18.0547461+10:00"},{"catalog_id":"7e59ce25-92a2-4b6e-b318-305975e4774c","title":"Reservation Management Endpoints","description":"reservation-management","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"5cba8ef2-84da-408b-a7c3-cd8446bdc98f","gmt_create":"2026-08-14T18:45:29.2467058+10:00","gmt_modified":"2026-08-14T18:45:29.2548347+10:00"},{"catalog_id":"e4440356-2ecf-4549-8210-5c3cf1b1a2e7","title":"Reservation Service","description":"reservation-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"a5435748-2119-4c51-be75-2fd8ff52c01a","gmt_create":"2026-08-14T18:46:01.7047629+10:00","gmt_modified":"2026-08-14T18:46:01.7137182+10:00"},{"catalog_id":"a191d7b6-ba0b-4866-8261-f94c5cd3c0e5","title":"Payment and Service Events","description":"payment-events","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"c369ac8b-b519-4da2-8d55-bf32c404a6ae","gmt_create":"2026-08-14T18:46:34.3130528+10:00","gmt_modified":"2026-08-14T18:46:34.3209892+10:00"},{"catalog_id":"d5d94dac-0c5c-4d8c-a1de-a4dffbfe1aa5","title":"Reservation Endpoints","description":"reservation-endpoints","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ec0ad9e8-7d9c-462b-a339-516dbb9234e3","gmt_create":"2026-08-14T18:46:46.3597638+10:00","gmt_modified":"2026-08-14T18:46:46.3671881+10:00"},{"catalog_id":"0137d01c-f5c8-4b0f-9a00-c3f58340cff9","title":"Node Selection Service","description":"node-selection-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0b25fb2d-b932-496f-b6c4-d4bc9bd91a08","gmt_create":"2026-08-14T18:47:04.1837676+10:00","gmt_modified":"2026-08-14T18:47:04.1962743+10:00"},{"catalog_id":"bb865521-1431-40fe-8fdd-d248c151919e","title":"Event Registration and Configuration","description":"event-registration","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"e02882bb-0384-4cdb-84f8-774469b89c09","gmt_create":"2026-08-14T18:47:44.0963803+10:00","gmt_modified":"2026-08-14T18:47:44.1111826+10:00"},{"catalog_id":"2c2143bb-a6f1-4903-bbec-853144163068","title":"Alert Service","description":"alert-service","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"ccb27e95-0867-425f-b0d9-148c2a46646e","gmt_create":"2026-08-14T18:48:01.1870607+10:00","gmt_modified":"2026-08-14T18:48:01.1963661+10:00"},{"catalog_id":"632eace8-7d7d-41e6-9c29-2c85e645491d","title":"Complete Checkout Flow Integration","description":"checkout-flow","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"0db89115-1be8-40f6-a930-ca751cc20e05","gmt_create":"2026-08-14T18:48:16.8273712+10:00","gmt_modified":"2026-08-14T18:48:16.8373835+10:00"},{"catalog_id":"675ef40f-cabb-4c8a-ae9a-4e18e2f7ea0f","title":"Supporting Services","description":"supporting-services","extend":"{}","progress_status":"completed","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","reference_count":0,"id":"84c24e35-8404-439b-ae58-deb60a3a485b","gmt_create":"2026-08-14T18:48:47.7414129+10:00","gmt_modified":"2026-08-14T18:48:47.7461706+10:00"}],"wiki_overview":{"content":"\u003c/think\u003e\n\n\u003cblog\u003e\n\n# Dynamic Pterodactyl Extension - Comprehensive Project Analysis\n\n## 1. Project Introduction\n\n### Purpose Statement\nDynamic Pterodactyl is a companion extension for Paymenter that enables dynamic resource allocation for Pterodactyl game server products. It provides real-time availability tracking, intelligent node selection, and temporary resource reservations during the checkout process.\n\n### Core Goals and Objectives\n- **Dynamic Resource Allocation**: Allow customers to select exact RAM, CPU, and Disk amounts using interactive sliders during checkout\n- **Real-Time Availability**: Query Pterodactyl API directly to ensure accurate resource availability without caching issues\n- **Resource Reservation System**: Implement 15-minute TTL-based reservations to prevent overselling during checkout\n- **Intelligent Node Selection**: Use weighted algorithms to allocate resources across optimal nodes based on memory, disk, and CPU headroom\n- **Seamless Integration**: Work alongside existing Pterodactyl server extension without reimplementing core functionality\n\n### Target Audience\n- Game server hosting providers using Paymenter and Pterodactyl\n- System administrators managing multi-node Pterodactyl installations\n- E-commerce platforms selling customizable game server resources\n\n## 2. Technical Architecture\n\n### Component Breakdown\n\nThe project follows a clean separation of concerns with distinct layers:\n\n```mermaid\ngraph TD\n A[Paymenter Core] --\u003e B[DynamicPterodactyl Extension]\n B --\u003e C[API Layer]\n B --\u003e D[Service Layer]\n B --\u003e E[Event Listeners]\n B --\u003e F[Admin Interface]\n \n C --\u003e G[AvailabilityController]\n C --\u003e H[PricingController]\n C --\u003e I[ReservationController]\n \n D --\u003e J[ResourceCalculationService]\n D --\u003e K[NodeSelectionService]\n D --\u003e L[ReservationService]\n D --\u003e M[AlertService]\n \n E --\u003e N[CartItemCreatedListener]\n E --\u003e O[InvoicePaidListener]\n E --\u003e P[ServiceCreatedListener]\n \n J --\u003e Q[Pterodactyl API]\n K --\u003e J\n L --\u003e K\n```\n\n### Design Patterns\n\n**Companion Extension Pattern**: The extension integrates with Paymenter's built-in Pterodactyl server extension rather than replacing it, ensuring automatic bug fixes and reduced maintenance overhead.\n\n**Event-Driven Architecture**: Uses Paymenter's event system to hook into cart and checkout lifecycle events for automatic reservation management.\n\n**Service-Oriented Architecture**: Business logic is encapsulated in dedicated services with clear responsibilities and dependency injection.\n\n**Repository Pattern**: Database operations are abstracted through service methods with proper transaction handling and pessimistic locking.\n\n### System Relationships\n\n```mermaid\nsequenceDiagram\n participant Client as Customer Browser\n participant API as API Layer\n participant Service as Service Layer\n participant DB as Database\n participant Ptero as Pterodactyl API\n \n Client-\u003e\u003e+API: GET /availability/{locationId}\n API-\u003e\u003e+Service: ResourceCalculationService::getLocationAvailability()\n Service-\u003e\u003e+Ptero: GET /api/application/nodes\n Ptero--\u003e\u003e-Service: Node data\n Service-\u003e\u003e+DB: Get pending reservations\n DB--\u003e\u003e-Service: Reservation data\n Service--\u003e\u003e-API: Availability data\n API--\u003e\u003e-Client: JSON response\n \n Client-\u003e\u003e+API: POST /reservation\n API-\u003e\u003e+Service: ReservationService::create()\n Service-\u003e\u003e+DB: lockForUpdate()\n Service-\u003e\u003e+Service: NodeSelectionService::selectBestNode()\n Service-\u003e\u003e+Ptero: Real-time availability check\n Service-\u003e\u003e+DB: Insert reservation\n DB--\u003e\u003e-Service: Reservation created\n Service--\u003e\u003e-API: Reservation token\n API--\u003e\u003e-Client: Token response\n```\n\n## 3. Key Implementation\n\n### Main Entry Points\n- **Extension Bootstrap**: `DynamicPterodactyl.php` - Registers routes, listeners, scheduled jobs, and policies\n- **Route Definitions**: `routes/api.php` - Defines RESTful endpoints for availability, pricing, and reservations\n\n### Core Modules\n\n**Service Layer**:\n- `Services/ResourceCalculationService.php` - Real-time Pterodactyl API integration for resource availability\n- `Services/NodeSelectionService.php` - Best-fit algorithm with weighted scoring for optimal node allocation\n- `Services/ReservationService.php` - Transactional reservation management with pessimistic locking\n- `Services/AlertService.php` - Capacity monitoring and notification system\n\n**Models**:\n- `Models/ResourceReservation.php` - Eloquent model for reservation tracking with scopes and relationships\n- `Models/AlertConfig.php` - Configuration for capacity alerts and thresholds\n\n**Controllers**:\n- `Http/Controllers/Api/AvailabilityController.php` - Handles availability queries and node details\n- `Http/Controllers/Api/PricingController.php` - Delegates pricing calculation to Paymenter core\n- `Http/Controllers/Api/ReservationController.php` - Manages reservation lifecycle (create, get, cancel, extend)\n\n### Configuration Approach\nConfiguration is managed through Paymenter's extension settings system with validation rules defined in the main extension class. Key configuration includes Pterodactyl API credentials, reservation TTL, and alert thresholds.\n\n### External Dependencies\n- **Pterodactyl Panel API**: Direct HTTP requests for real-time resource availability\n- **Paymenter Core**: Event system, models, and native slider components\n- **Laravel Framework**: Database transactions, scheduling, and HTTP client\n\n### Integration Points\n- **Paymenter Events**: Hooks into cart item creation, deletion, invoice payment, and service creation\n- **Database Schema**: Custom tables for reservations, audit logs, and alert configurations\n- **Admin Interface**: Filament-based dashboard for monitoring and management\n\n### Component Relationship Diagrams\n\n```mermaid\nclassDiagram\n class DynamicPterodactyl {\n +getConfig() array\n +boot() void\n +installed() void\n }\n \n class ReservationService {\n +create() array\n +confirm() bool\n +cancel() bool\n +extend() bool\n +cleanupExpired() int\n }\n \n class NodeSelectionService {\n +selectBestNode() ?array\n +getMaxAvailable() array\n }\n \n class ResourceCalculationService {\n +getLocationAvailability() array\n +calculateNodeAvailability() array\n +verifyAvailability() bool\n }\n \n class AlertService {\n +checkCapacityAlerts() void\n }\n \n DynamicPterodactyl --\u003e ReservationService\n DynamicPterodactyl --\u003e AlertService\n ReservationService --\u003e NodeSelectionService\n NodeSelectionService --\u003e ResourceCalculationService\n```\n\n## 4. Key Features\n\n### Functionality Overview\n\n**Real-Time Availability Checking**: Queries Pterodactyl API directly to provide accurate resource availability without cache staleness issues. Supports location-based filtering and per-node utilization metrics.\n\n**Intelligent Resource Allocation**: Implements a weighted best-fit algorithm that prioritizes memory headroom (50%), disk headroom (35%), and CPU headroom (15%) for optimal resource distribution across nodes.\n\n**Temporary Resource Reservations**: 15-minute TTL-based reservations prevent overselling during checkout with database-level pessimistic locking and automatic cleanup of expired reservations.\n\n**Dynamic Pricing Integration**: Leverages Paymenter's native pricing engine through `Plan::dynamicSliderBasePrice()` and `ConfigOption::calculateDynamicPriceDelta()` for consistent pricing calculations.\n\n**Administrative Dashboard**: Filament-based admin interface for monitoring reservations, capacity alerts, and system health with comprehensive audit logging.\n\n### Implementation Highlights\n\n**Event-Driven Checkout Flow**: Automatic reservation creation when cart items are added, confirmation upon successful payment, and cleanup when items are removed from cart.\n\n**Idempotent Operations**: Support for idempotency keys to handle duplicate requests gracefully during network retries or user actions.\n\n**Multi-Tier Alerting**: Configurable capacity alerts with cooldown periods and multiple notification channels for proactive capacity management.\n\n**Audit Trail**: Comprehensive logging of all administrative actions and system events for compliance and debugging purposes.\n\n### Feature Architecture Diagrams\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e Available: Product Page Load\n Available --\u003e Reserved: User Selects Resources\n Reserved --\u003e Confirmed: Payment Successful\n Reserved --\u003e Expired: TTL Exceeded\n Reserved --\u003e Cancelled: User Removes Item\n Confirmed --\u003e [*]: Server Provisioned\n Expired --\u003e [*]: Cleanup Job\n Cancelled --\u003e [*]: Resource Released\n \n note right of Reserved\n 15-minute TTL\n Pessimistic locking\n Real-time verification\n end note\n```\n\n## 5. Conclusion and Recommendations\n\n### Project Architecture Summary\nDynamic Pterodactyl demonstrates excellent architectural decisions through its companion extension pattern, event-driven design, and service-oriented architecture. The project successfully balances complexity with maintainability while providing robust resource management capabilities for multi-node Pterodactyl deployments.\n\n### Architectural Strengths\n- **Clean Separation of Concerns**: Clear boundaries between API, service, and data layers\n- **Real-Time Data Access**: Eliminates cache staleness issues by querying Pterodactyl API directly\n- **Robust Concurrency Handling**: Database-level pessimistic locking prevents race conditions\n- **Extensible Design**: Event system allows easy integration with Paymenter's ecosystem\n- **Comprehensive Testing**: Well-structured test suite covering both unit and feature tests\n\n### Potential Improvement Areas\n- **Caching Strategy**: Consider implementing intelligent caching for frequently accessed node information to reduce API calls\n- **Performance Monitoring**: Add detailed performance metrics for API calls and database queries\n- **Configuration Validation**: Enhance configuration validation with more granular error reporting\n- **Documentation**: Expand inline documentation for complex business logic in services\n\n### Actionable Recommendations\n1. **Implement Circuit Breaker Pattern**: Add circuit breaker logic for Pterodactyl API calls to handle service degradation gracefully\n2. **Add Metrics Collection**: Integrate application performance monitoring for better observability\n3. **Enhance Error Handling**: Implement more specific exception types for better error categorization\n4. **Optimize Database Queries**: Review and optimize complex queries in reservation and availability services\n\n### Next Steps for Project Evolution\n- **Advanced Analytics**: Implement predictive capacity planning based on historical usage patterns\n- **Multi-Provider Support**: Extend support for additional game server panels beyond Pterodactyl\n- **Mobile Optimization**: Enhance mobile experience for resource selection and monitoring\n- **API Versioning**: Implement proper API versioning strategy for backward compatibility\n\nSources:\n- [DynamicPterodactyl.php](DynamicPterodactyl.php)\n- [README.md](README.md)\n- [02-SERVICES.md](02-SERVICES.md)\n- [03-API.md](03-API.md)\n- [Services/ReservationService.php](Services/ReservationService.php)\n- [Models/ResourceReservation.php](Models/ResourceReservation.php)\n- [database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php](database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php)\n- [Listeners/CartItemCreatedListener.php](Listeners/CartItemCreatedListener.php)\n\n\u003c/blog\u003e","gmt_create":"2026-08-14T18:27:43.9614238+10:00","gmt_modified":"2026-08-14T18:27:43.9614238+10:00","id":"50fd549e-249f-48b8-8a9e-2d30f0dc5e42","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-08-14T18:26:55.7592208+10:00","gmt_modified":"2026-08-14T18:26:55.7592208+10:00","id":"9d36a6e4-42b9-4eb4-a05c-fe27cc67efbc","repo_id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e"},"wiki_repo":{"id":"82f4a940-d059-4f38-8f3d-5d4a66cec71e","name":"dynamic-pterodactyl","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── Admin\\\\\\n│ ├── Pages\\\\\\n│ │ ├── AuditLogPage.php\\n│ │ ├── Dashboard.php\\n│ │ ├── NodeMonitoring.php\\n│ │ └── SetupWizard.php\\n│ ├── Resources\\\\\\n│ │ ├── AlertConfigResource\\\\Pages\\\\\\n│ │ │ ├── CreateAlertConfig.php\\n│ │ │ ├── EditAlertConfig.php\\n│ │ │ └── ListAlertConfigs.php\\n│ │ ├── ReservationResource\\\\Pages\\\\\\n│ │ │ └── ListReservations.php\\n│ │ ├── AlertConfigResource.php\\n│ │ └── ReservationResource.php\\n│ └── AGENTS.md\\n├── Events\\\\\\n│ └── AlertDeliveryFailed.php\\n├── Http\\\\\\n│ ├── Controllers\\\\Api\\\\\\n│ │ ├── Admin\\\\\\n│ │ │ ├── AdminCapacityController.php\\n│ │ │ └── AdminReservationController.php\\n│ │ ├── AvailabilityController.php\\n│ │ ├── PricingController.php\\n│ │ └── ReservationController.php\\n│ ├── Middleware\\\\\\n│ │ └── EnsureUserIsAdmin.php\\n│ └── Requests\\\\\\n│ └── StoreReservationRequest.php\\n├── Listeners\\\\\\n│ ├── CartItemCreatedListener.php\\n│ ├── CartItemDeletedListener.php\\n│ ├── InvoicePaidListener.php\\n│ └── ServiceCreatedListener.php\\n├── Models\\\\\\n│ ├── Observers\\\\\\n│ │ └── AlertConfigObserver.php\\n│ ├── AlertConfig.php\\n│ ├── AlertDeliveryLog.php\\n│ ├── AuditLog.php\\n│ └── ResourceReservation.php\\n├── Notifications\\\\\\n│ ├── CapacityAlertNotification.php\\n│ └── ReservationShortfallNotification.php\\n├── Policies\\\\\\n│ └── ResourceReservationPolicy.php\\n├── Services\\\\\\n│ ├── Concerns\\\\\\n│ │ └── AuditsExtensionActions.php\\n│ ├── AlertService.php\\n│ ├── AuditLogService.php\\n│ ├── ConfigOptionSetupService.php\\n│ ├── NodeSelectionService.php\\n│ ├── ReservationService.php\\n│ ├── ResourceCalculationService.php\\n│ └── SliderConfigReaderService.php\\n├── database\\\\migrations\\\\\\n│ ├── 2025_01_01_000001_create_ptero_resource_reservations_table.php\\n│ ├── 2025_01_01_000002_create_ptero_pricing_configs_table.php\\n│ ├── 2025_01_01_000003_create_ptero_audit_logs_table.php\\n│ ├── 2025_01_01_000004_create_ptero_alert_configs_table.php\\n│ ├── 2025_01_01_000005_drop_ptero_pricing_configs_table.php\\n│ ├── 2026_04_22_000001_drop_released_from_reservation_status.php\\n│ ├── 2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php\\n│ └── 2026_04_26_000001_create_ptero_alert_delivery_log_table.php\\n├── resources\\\\views\\\\admin\\\\\\n│ ├── audit-log.blade.php\\n│ ├── dashboard.blade.php\\n│ ├── node-monitoring.blade.php\\n│ └── setup-wizard.blade.php\\n├── routes\\\\\\n│ └── api.php\\n├── tests\\\\\\n│ ├── Feature\\\\\\n│ │ ├── AdminApiTest.php\\n│ │ ├── AlertScheduleTest.php\\n│ │ ├── AvailabilityApiTest.php\\n│ │ ├── PricingPreviewParityTest.php\\n│ │ ├── ReservationApiTest.php\\n│ │ └── SetupWizardValidationTest.php\\n│ ├── Unit\\\\\\n│ │ ├── AlertConfigObserverTest.php\\n│ │ ├── AlertServiceTest.php\\n│ │ ├── CartItemDeletedListenerTest.php\\n│ │ ├── ConfigOptionSetupServiceTest.php\\n│ │ ├── InvoicePaidListenerTest.php\\n│ │ ├── NodeSelectionServiceTest.php\\n│ │ ├── ReservationServiceTest.php\\n│ │ ├── ResourceCalculationServiceTest.php\\n│ │ ├── SliderConfigReaderServiceTest.php\\n│ │ └── StoreReservationRequestTest.php\\n│ ├── AGENTS.md\\n│ ├── LaravelTestCase.php\\n│ ├── TestCase.php\\n│ └── bootstrap.php\\n├── AGENTS.md\\n├── DECISIONS.md\\n├── DynamicPterodactyl.php\\n└── phpunit.xml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"6b7f83bda6f7c3fe014d52428b31af1638daa6cc","last_commit_update":"2026-08-14T19:47:29.7066198+10:00","gmt_create":"2026-08-14T18:23:46.9403433+10:00","gmt_modified":"2026-08-14T19:47:29.7066198+10:00","extend_info":"{\"language\":\"en\",\"active\":true,\"branch\":\"dynamic-slider\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"1.24.2\"}"}} \ No newline at end of file From b8b0f2d557de4856fd7ac9ab3a43d0f8b1a935f9 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 22:57:26 +1000 Subject: [PATCH 26/30] docs: name strict relationship parser --- .../en/content/Core Services/ResourceCalculationService.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md index 06caf82..6febf97 100644 --- a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md +++ b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md @@ -226,7 +226,7 @@ Behavior: - pterodactylGet(): Centralized HTTP call with retry on connection errors, rate limit detection, and sanitized error messages. - pterodactylGetPaginatedData(): Paginates through Pterodactyl lists. - getPendingReservations()/getPendingReservationsForNodes(): Sums pending reservations by node to subtract from available resources. -- extractRelationshipData(): Normalizes relationship payloads from Pterodactyl. +- requireRelationshipData(): Requires an array relationship payload and distinguishes a genuinely absent relationship from a present but malformed container or data value. Integration with reservation system: - Pending reservations are read from the local DB and subtracted from available resources to prevent overselling. From 87f21b8b71a7920ccfb6ca33b9051460ff090f13 Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 23:11:46 +1000 Subject: [PATCH 27/30] docs: require full safety rebase --- .qoder/repowiki/en/content/Deployment.md | 2 +- 02-SERVICES.md | 5 +++-- PROGRESS.md | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.qoder/repowiki/en/content/Deployment.md b/.qoder/repowiki/en/content/Deployment.md index 8dcea68..4fa2b01 100644 --- a/.qoder/repowiki/en/content/Deployment.md +++ b/.qoder/repowiki/en/content/Deployment.md @@ -144,7 +144,7 @@ Operational requirements: - Scheduler must be running to execute cleanup and alert checks. - Database must support transactions and pessimistic locking. - Network access to the Pterodactyl Panel API must be allowed from the Paymenter host. -- Node payloads must provide an integer `cpu_threads` capacity value; missing, fractional, or malformed node/server capacity fields and incomplete pagination fail closed instead of advertising unverified capacity. Stock Pterodactyl does not expose this node field. Keep deployment paused until PR #22's explicit local `NodeCapacityPolicy` is rebased onto this reconciliation (or an equivalent trusted capacity source is installed). +- Node payloads must provide an integer `cpu_threads` capacity value; missing, fractional, or malformed node/server capacity fields and incomplete pagination fail closed instead of advertising unverified capacity. Stock Pterodactyl does not expose this node field and uses zero server limits to mean unlimited, while this branch does not yet encrypt/migrate the stored API key. Keep deployment paused until PR #22 is fully rebased so its `NodeCapacityPolicy`, zero-as-unlimited rejection, and API-key encryption migration are all retained alongside every PR #23 safety and Wiki change. A partial CPU-only cherry-pick is not deployable. **Section sources** - [DynamicPterodactyl.php:48-75](file://DynamicPterodactyl.php#L48-L75) diff --git a/02-SERVICES.md b/02-SERVICES.md index aea9be9..ce7a06f 100644 --- a/02-SERVICES.md +++ b/02-SERVICES.md @@ -101,8 +101,9 @@ class ResourceCalculationService // resource shapes before calculating totals. The fetch layer also // rejects duplicate node, server, and location identities so repeated // upstream records cannot distort capacity. Stock Pterodactyl has no - // node CPU-capacity field, so cpu_threads remains a fail-closed gate - // until the explicit local NodeCapacityPolicy is rebased from PR #22. + // node CPU-capacity field, so cpu_threads remains a fail-closed gate. + // Production also requires PR #22's zero-as-unlimited rejection and + // API-key encryption migration; the full PR must be safely rebased. return $this->buildNodeAvailabilityFromServers($node, $servers, $pendingReservations); } diff --git a/PROGRESS.md b/PROGRESS.md index 4c2e31d..7ed42cf 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -71,8 +71,8 @@ All dp-NN backlog items are implemented. The active reconciliation is staged on **Working on**: Draft PR #23 reconciliation and Wiki verification **Status**: Panel changes are preserved on the reconciliation branch; Qoder Wiki pages are migrated to GitHub Wiki and refreshed for the final batched location API flow. **Current file**: PROGRESS.md -**Next action**: Complete exact-SHA review, then rebase PR #22's explicit `NodeCapacityPolicy` onto this reconciliation before any production merge or deployment. Resume Mutagen only as a separately authorized deployment step. -**Blockers**: Stock Pterodactyl does not expose node CPU capacity, so PR #23 must not deploy alone. PR #22 overlaps this reconciliation and must be rebased while preserving the hardened test guard, sanitized errors, and Wiki changes. No CI checks are configured on PR #23. +**Next action**: Complete exact-SHA review, then fully rebase PR #22 onto this reconciliation before any production merge or deployment. The rebase must retain its explicit `NodeCapacityPolicy`, rejection of Pterodactyl's zero-as-unlimited resource limits, and API-key encryption migration while preserving every PR #23 safety and Wiki change. Resume Mutagen only as a separately authorized deployment step. +**Blockers**: PR #23 must not deploy alone. Stock Pterodactyl does not expose node CPU capacity, uses zero resource limits to mean unlimited, and this branch does not yet encrypt/migrate the stored API key. PR #22 supplies all three protections but overlaps this reconciliation, so it must be fully rebased rather than partially cherry-picked or merged unchanged. No CI checks are configured on PR #23. ### This Session's Changes: From 3202e2c43cd8a3b7b55f6bda289fa0cf8cd5f98f Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Mon, 17 Aug 2026 23:44:09 +1000 Subject: [PATCH 28/30] docs: repair qoder source anchors --- .../en/content/API Reference/API Reference.md | 20 +++---- .../Admin API Endpoints.md | 4 +- .../Availability Endpoints.md | 2 +- .../Public API Endpoints.md | 2 +- .../Reservation Endpoints.md | 16 ++--- .qoder/repowiki/en/content/Admin Interface.md | 38 ++++++------ .../Companion Extension Pattern.md | 20 +++---- .../Service Layer Design/Alert Service.md | 10 ++-- .../Node Selection Service.md | 8 +-- .../Service Layer Design.md | 18 +++--- .../Supporting Services.md | 12 ++-- .../Core Services/ConfigOptionSetupService.md | 4 +- .../ResourceCalculationService.md | 6 +- .../SliderConfigReaderService.md | 4 +- .../Database Schema/Database Schema.md | 4 +- ...Model Relationships and Eloquent Models.md | 58 +++++++++---------- .../Resource Reservations Table.md | 38 ++++++------ .qoder/repowiki/en/content/Getting Started.md | 2 +- .qoder/repowiki/en/content/Testing.md | 26 ++++----- 19 files changed, 146 insertions(+), 146 deletions(-) diff --git a/.qoder/repowiki/en/content/API Reference/API Reference.md b/.qoder/repowiki/en/content/API Reference/API Reference.md index 47f13f5..8d0c7d9 100644 --- a/.qoder/repowiki/en/content/API Reference/API Reference.md +++ b/.qoder/repowiki/en/content/API Reference/API Reference.md @@ -59,7 +59,7 @@ F --> I["AvailabilityController
GET /availability/{locationId}/nodes"] - [routes/api.php:17-40](file://routes/api.php#L17-L40) **Section sources** -- [routes/api.php:1-41](file://routes/api.php#L1-L41) +- [routes/api.php:1-41](file://routes/api.php#L1-L40) ## Core Components - AvailabilityController: Returns per-location availability aggregates and, when authenticated as admin, detailed node information. @@ -70,10 +70,10 @@ F --> I["AvailabilityController
GET /availability/{locationId}/nodes"] **Section sources** - [AvailabilityController.php:9-70](file://Http/Controllers/Api/AvailabilityController.php#L9-L70) -- [PricingController.php:12-158](file://Http/Controllers/Api/PricingController.php#L12-L158) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L138) -- [AdminCapacityController.php:8-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L63) -- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L76) +- [PricingController.php:12-158](file://Http/Controllers/Api/PricingController.php#L12-L157) +- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminCapacityController.php:8-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L62) +- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) ## Architecture Overview The API integrates with Paymenter core models and services and with the Pterodactyl panel via HTTP. Services encapsulate business logic and data aggregation. @@ -204,7 +204,7 @@ Important: **Section sources** - [routes/api.php:17-22](file://routes/api.php#L17-L22) -- [PricingController.php:24-158](file://Http/Controllers/Api/PricingController.php#L24-L158) +- [PricingController.php:24-158](file://Http/Controllers/Api/PricingController.php#L24-L157) - [StoreReservationRequest.php:38-112](file://Http/Requests/StoreReservationRequest.php#L38-L112) #### Reservations @@ -288,8 +288,8 @@ Notes: **Section sources** - [routes/api.php:24-30](file://routes/api.php#L24-L30) -- [ReservationController.php:24-138](file://Http/Controllers/Api/ReservationController.php#L24-L138) -- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L163) +- [ReservationController.php:24-138](file://Http/Controllers/Api/ReservationController.php#L24-L137) +- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L162) - [ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) - [ResourceReservationPolicy.php:25-58](file://Policies/ResourceReservationPolicy.php#L25-L58) @@ -318,7 +318,7 @@ Notes: **Section sources** - [routes/api.php:32-40](file://routes/api.php#L32-L40) -- [AdminCapacityController.php:17-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L17-L63) +- [AdminCapacityController.php:17-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L17-L62) - [ResourceCalculationService.php:69-141](file://Services/ResourceCalculationService.php#L69-L141) #### Admin Reservations @@ -353,7 +353,7 @@ Notes: **Section sources** - [routes/api.php:32-40](file://routes/api.php#L32-L40) -- [AdminReservationController.php:18-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L18-L76) +- [AdminReservationController.php:18-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L18-L75) - [ReservationService.php:208-241](file://Services/ReservationService.php#L208-L241) ## Dependency Analysis diff --git a/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md b/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md index 97fd20b..b356ffd 100644 --- a/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md @@ -349,10 +349,10 @@ RESOURCE_RESERVATION ||--o| SERVICE : "service_id" ``` **Diagram sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) +- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) **Section sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) +- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) ## Dependency Analysis - Admin controllers depend on services: diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md index c0ce99d..e85607b 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Availability Endpoints.md @@ -215,7 +215,7 @@ ForEachNode --> |No| ReturnData["Return {location_id, nodes[], max_available, to ``` **Diagram sources** -- [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-67) +- [ResourceCalculationService.php:23-67](file://Services/ResourceCalculationService.php#L23-L67) - [ResourceCalculationService.php:227-257](file://Services/ResourceCalculationService.php#L227-L257) **Section sources** diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md index 26ae260..4a1f07c 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md @@ -80,7 +80,7 @@ ResSvc --> DB["Database (ptero_resource_reservations)"] - [Http/Controllers/Api/ReservationController.php:24-136](file://Http/Controllers/Api/ReservationController.php#L24-L136) - [Http/Requests/StoreReservationRequest.php:38-113](file://Http/Requests/StoreReservationRequest.php#L38-L113) - [Services/ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) -- [Models/ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) +- [Models/ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) - [Policies/ResourceReservationPolicy.php:9-69](file://Policies/ResourceReservationPolicy.php#L9-L69) ## Architecture Overview diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Reservation Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Reservation Endpoints.md index 79b8941..708ceb5 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Reservation Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Reservation Endpoints.md @@ -48,8 +48,8 @@ Controller --> Policy["ResourceReservationPolicy"] **Diagram sources** - [routes/api.php:24-30](file://routes/api.php#L24-L30) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L138) -- [ReservationService.php:43-454](file://Services/ReservationService.php#L43-L454) +- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [ReservationService.php:43-454](file://Services/ReservationService.php#L43-L453) - [ResourceReservationPolicy.php:9-69](file://Policies/ResourceReservationPolicy.php#L9-L69) **Section sources** @@ -73,7 +73,7 @@ Key responsibilities: - [routes/api.php:24-30](file://routes/api.php#L24-L30) - [ReservationController.php:24-136](file://Http/Controllers/Api/ReservationController.php#L24-L136) - [StoreReservationRequest.php:31-113](file://Http/Requests/StoreReservationRequest.php#L31-L113) -- [ReservationService.php:43-454](file://Services/ReservationService.php#L43-L454) +- [ReservationService.php:43-454](file://Services/ReservationService.php#L43-L453) - [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) - [ResourceReservationPolicy.php:9-69](file://Policies/ResourceReservationPolicy.php#L9-L69) @@ -380,15 +380,15 @@ Service --> DB["Database"] **Diagram sources** - [routes/api.php:24-30](file://routes/api.php#L24-L30) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L138) -- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L163) +- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L162) - [ResourceReservationPolicy.php:9-69](file://Policies/ResourceReservationPolicy.php#L9-L69) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L454) +- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) **Section sources** - [routes/api.php:24-30](file://routes/api.php#L24-L30) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L138) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L454) +- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) ## Performance Considerations - Pessimistic locking: Uses lockForUpdate to prevent concurrent modifications during node selection and reservation creation. diff --git a/.qoder/repowiki/en/content/Admin Interface.md b/.qoder/repowiki/en/content/Admin Interface.md index 31c00c0..945ee2a 100644 --- a/.qoder/repowiki/en/content/Admin Interface.md +++ b/.qoder/repowiki/en/content/Admin Interface.md @@ -89,10 +89,10 @@ AL --> ALS - [AuditLogPage.php:15-29](file://Admin/Pages/AuditLogPage.php#L15-L29) - [ReservationResource.php:15-27](file://Admin/Resources/ReservationResource.php#L15-L27) - [AlertConfigResource.php:27-39](file://Admin/Resources/AlertConfigResource.php#L27-L39) -- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L104) -- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L110) -- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L6) -- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L48) +- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L103) +- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L109) +- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L5) +- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L47) - [ResourceCalculationService.php:10-22](file://Services/ResourceCalculationService.php#L10-L22) - [ReservationService.php:16-35](file://Services/ReservationService.php#L16-L35) - [AuditLogService.php:10-41](file://Services/AuditLogService.php#L10-L41) @@ -115,13 +115,13 @@ AL --> ALS **Section sources** - [Dashboard.php:27-73](file://Admin/Pages/Dashboard.php#L27-L73) -- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L104) +- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L103) - [NodeMonitoring.php:22-61](file://Admin/Pages/NodeMonitoring.php#L22-L61) -- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L110) +- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L109) - [SetupWizard.php:50-427](file://Admin/Pages/SetupWizard.php#L50-L427) -- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L6) +- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L5) - [AuditLogPage.php:31-103](file://Admin/Pages/AuditLogPage.php#L31-L103) -- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L48) +- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L47) - [ReservationResource.php:34-127](file://Admin/Resources/ReservationResource.php#L34-L127) - [AlertConfigResource.php:41-176](file://Admin/Resources/AlertConfigResource.php#L41-L176) @@ -176,12 +176,12 @@ ShowErr --> Render **Diagram sources** - [Dashboard.php:27-73](file://Admin/Pages/Dashboard.php#L27-L73) -- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L104) +- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L103) - [ResourceCalculationService.php:158-195](file://Services/ResourceCalculationService.php#L158-L195) **Section sources** - [Dashboard.php:27-115](file://Admin/Pages/Dashboard.php#L27-L115) -- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L104) +- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L103) ### Node Monitoring - Purpose: Real-time view of node utilization and availability per location. @@ -208,11 +208,11 @@ NM-->>Admin : Render table with utilization **Diagram sources** - [NodeMonitoring.php:22-61](file://Admin/Pages/NodeMonitoring.php#L22-L61) - [ResourceCalculationService.php:69-141](file://Services/ResourceCalculationService.php#L69-L141) -- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L110) +- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L109) **Section sources** - [NodeMonitoring.php:22-61](file://Admin/Pages/NodeMonitoring.php#L22-L61) -- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L110) +- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L109) ### Setup Wizard - Purpose: Configure dynamic slider options for a selected product, including pricing models and allowed locations. @@ -239,11 +239,11 @@ G --> |Yes| I["Success Notification & Reset Form"] **Diagram sources** - [SetupWizard.php:50-427](file://Admin/Pages/SetupWizard.php#L50-L427) -- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L6) +- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L5) **Section sources** - [SetupWizard.php:50-509](file://Admin/Pages/SetupWizard.php#L50-L509) -- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L6) +- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L5) ### Audit Log Viewer - Purpose: Track administrative actions and display recent alert delivery failures. @@ -274,7 +274,7 @@ AuditLogPage --> AuditLog : "queries" **Section sources** - [AuditLogPage.php:31-103](file://Admin/Pages/AuditLogPage.php#L31-L103) -- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L48) +- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L47) ### Reservation Management Resource - Purpose: Manual intervention for pending reservations (extend TTL, cancel) and bulk cleanup of expired ones. @@ -433,10 +433,10 @@ The Filament 4 admin interface provides a comprehensive operational view of syst - Extensibility: Add custom columns, filters, or actions in resources; customize views with standard Blade patterns. **Section sources** -- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L104) -- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L110) -- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L6) -- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L48) +- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L103) +- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L109) +- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L5) +- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L47) ### Integration Points - Pterodactyl API: diff --git a/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md b/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md index 3d9d4df..2decfce 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md @@ -84,12 +84,12 @@ G --> M["Admin Recipients"] **Section sources** - [DynamicPterodactyl.php:48-127](file://DynamicPterodactyl.php#L48-L127) -- [Services/ReservationService.php:16-454](file://Services/ReservationService.php#L16-L454) +- [Services/ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) - [Services/ResourceCalculationService.php:10-545](file://Services/ResourceCalculationService.php#L10-L545) -- [Services/AlertService.php:19-393](file://Services/AlertService.php#L19-L393) -- [Services/SliderConfigReaderService.php:7-69](file://Services/SliderConfigReaderService.php#L7-L69) -- [Listeners/CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L174) -- [Listeners/InvoicePaidListener.php:12-136](file://Listeners/InvoicePaidListener.php#L12-L136) +- [Services/AlertService.php:19-393](file://Services/AlertService.php#L19-L392) +- [Services/SliderConfigReaderService.php:7-69](file://Services/SliderConfigReaderService.php#L7-L68) +- [Listeners/CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L173) +- [Listeners/InvoicePaidListener.php:12-136](file://Listeners/InvoicePaidListener.php#L12-L135) ## Architecture Overview The extension follows a companion pattern: @@ -245,11 +245,11 @@ IPay->>IPay : notifyShortfall on failure **Diagram sources** - [Listeners/CartItemCreatedListener.php:13-87](file://Listeners/CartItemCreatedListener.php#L13-L87) -- [Listeners/InvoicePaidListener.php:14-136](file://Listeners/InvoicePaidListener.php#L14-L136) +- [Listeners/InvoicePaidListener.php:14-136](file://Listeners/InvoicePaidListener.php#L14-L135) **Section sources** -- [Listeners/CartItemCreatedListener.php:13-174](file://Listeners/CartItemCreatedListener.php#L13-L174) -- [Listeners/InvoicePaidListener.php:14-136](file://Listeners/InvoicePaidListener.php#L14-L136) +- [Listeners/CartItemCreatedListener.php:13-174](file://Listeners/CartItemCreatedListener.php#L13-L173) +- [Listeners/InvoicePaidListener.php:14-136](file://Listeners/InvoicePaidListener.php#L14-L135) ### Pricing Coexistence: Native Slider Metadata Only - SliderConfigReaderService reads dynamic_slider ConfigOption metadata (min, max, step, default, unit, display_unit, display_divisor, pricing model/rates) for frontend consumption. @@ -270,7 +270,7 @@ SliderConfigReaderService --> ConfigOption : "reads metadata" ``` **Diagram sources** -- [Services/SliderConfigReaderService.php:7-69](file://Services/SliderConfigReaderService.php#L7-L69) +- [Services/SliderConfigReaderService.php:7-69](file://Services/SliderConfigReaderService.php#L7-L68) **Section sources** - [Services/SliderConfigReaderService.php:14-53](file://Services/SliderConfigReaderService.php#L14-L53) @@ -353,7 +353,7 @@ Common issues and diagnostics: - Alert delivery failures: check AlertService sendNotifications and delivery logs; ensure email/webhook channels are configured and recipients exist. **Section sources** -- [Listeners/InvoicePaidListener.php:58-136](file://Listeners/InvoicePaidListener.php#L58-L136) +- [Listeners/InvoicePaidListener.php:58-136](file://Listeners/InvoicePaidListener.php#L58-L135) - [Services/ResourceCalculationService.php:452-498](file://Services/ResourceCalculationService.php#L452-L498) - [Services/ReservationService.php:125-141](file://Services/ReservationService.php#L125-L141) - [Services/AlertService.php:128-248](file://Services/AlertService.php#L128-L248) diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Alert Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Alert Service.md index 6a5b778..deadc8d 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Alert Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Alert Service.md @@ -75,14 +75,14 @@ AlertSvc --> Event["AlertDeliveryFailed event"] - Admin AlertConfigResource: Filament resource exposing CRUD and a “Test” action to send a sample alert. **Section sources** -- [AlertService.php:19-393](file://Services/AlertService.php#L19-L393) +- [AlertService.php:19-393](file://Services/AlertService.php#L19-L392) - [AlertConfig.php:8-56](file://Models/AlertConfig.php#L8-L56) - [AlertDeliveryLog.php:8-33](file://Models/AlertDeliveryLog.php#L8-L33) - [CapacityAlertNotification.php:10-47](file://Notifications/CapacityAlertNotification.php#L10-L47) - [ReservationShortfallNotification.php:10-40](file://Notifications/ReservationShortfallNotification.php#L10-L40) - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) - [AlertConfigObserver.php:8-69](file://Models/Observers/AlertConfigObserver.php#L8-L69) -- [AlertConfigResource.php:150-197](file://Admin/Resources/AlertConfigResource.php#L150-L197) +- [AlertConfigResource.php:150-197](file://Admin/Resources/AlertConfigResource.php#L150-L196) ## Architecture Overview The service is invoked by a scheduled task registered during extension boot. For each active alert configuration, it determines the scope (global or specific location), fetches current availability from Pterodactyl via ResourceCalculationService, evaluates memory and disk utilization against configured warning/critical thresholds, and dispatches notifications if any thresholds are breached. Cooldown prevents repeated alerts within a configured window. Delivery attempts are recorded, and failures emit an event for downstream handling. @@ -216,7 +216,7 @@ Migration highlights: **Section sources** - [DynamicPterodactyl.php:118-126](file://DynamicPterodactyl.php#L118-L126) -- [AlertConfigResource.php:150-197](file://Admin/Resources/AlertConfigResource.php#L150-L197) +- [AlertConfigResource.php:150-197](file://Admin/Resources/AlertConfigResource.php#L150-L196) - [AlertConfigObserver.php:12-69](file://Models/Observers/AlertConfigObserver.php#L12-L69) ## Dependency Analysis @@ -261,7 +261,7 @@ AlertService --> AlertDeliveryFailed : "dispatches on failure" ``` **Diagram sources** -- [AlertService.php:19-393](file://Services/AlertService.php#L19-L393) +- [AlertService.php:19-393](file://Services/AlertService.php#L19-L392) - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) - [AlertConfig.php:8-56](file://Models/AlertConfig.php#L8-L56) - [AlertDeliveryLog.php:8-33](file://Models/AlertDeliveryLog.php#L8-L33) @@ -270,7 +270,7 @@ AlertService --> AlertDeliveryFailed : "dispatches on failure" - [AlertDeliveryFailed.php:9-16](file://Events/AlertDeliveryFailed.php#L9-L16) **Section sources** -- [AlertService.php:19-393](file://Services/AlertService.php#L19-L393) +- [AlertService.php:19-393](file://Services/AlertService.php#L19-L392) - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) ## Performance Considerations diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md index 96a84ee..44eb7bd 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md @@ -50,8 +50,8 @@ RCSvc --> DB **Section sources** - [NodeSelectionService.php:1-88](file://Services/NodeSelectionService.php#L1-L88) - [ResourceCalculationService.php:1-545](file://Services/ResourceCalculationService.php#L1-L545) -- [ReservationService.php:1-454](file://Services/ReservationService.php#L1-L454) -- [ResourceReservation.php:1-66](file://Models/ResourceReservation.php#L1-L66) +- [ReservationService.php:1-454](file://Services/ReservationService.php#L1-L453) +- [ResourceReservation.php:1-66](file://Models/ResourceReservation.php#L1-L65) ## Core Components - NodeSelectionService: Selects the best node using weighted headroom scoring and filters out unsuitable nodes (maintenance mode or insufficient resources). @@ -257,11 +257,11 @@ Pending --> Cancelled : "cancel(token)" ``` **Diagram sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) +- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) - [2026_04_22_000001_drop_released_from_reservation_status.php:8-19](file://database/migrations/2026_04_22_000001_drop_released_from_reservation_status.php#L8-L19) **Section sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) +- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) - [2026_04_22_000001_drop_released_from_reservation_status.php:8-19](file://database/migrations/2026_04_22_000001_drop_released_from_reservation_status.php#L8-L19) ## Dependency Analysis diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md index 6559184..dc14f03 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md @@ -72,11 +72,11 @@ ResCalcSvc --> DB **Section sources** - [ResourceCalculationService.php:10-222](file://Services/ResourceCalculationService.php#L10-L222) - [NodeSelectionService.php:5-86](file://Services/NodeSelectionService.php#L5-L86) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L454) -- [AlertService.php:19-393](file://Services/AlertService.php#L19-L393) +- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) +- [AlertService.php:19-393](file://Services/AlertService.php#L19-L392) - [AvailabilityController.php:9-71](file://Http/Controllers/Api/AvailabilityController.php#L9-L71) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L138) -- [AdminCapacityController.php:8-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L63) +- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminCapacityController.php:8-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L62) ## Architecture Overview The service layer enforces strict boundaries: @@ -226,7 +226,7 @@ end **Section sources** - [ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) - [ReservationService.php:166-281](file://Services/ReservationService.php#L166-L281) -- [ReservationService.php:387-454](file://Services/ReservationService.php#L387-L454) +- [ReservationService.php:387-454](file://Services/ReservationService.php#L387-L453) ### AlertService Responsibilities: @@ -300,11 +300,11 @@ AdminCapacityController --> ResourceCalculationService : "uses" **Diagram sources** - [NodeSelectionService.php:5-86](file://Services/NodeSelectionService.php#L5-L86) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L454) -- [AlertService.php:19-393](file://Services/AlertService.php#L19-L393) +- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) +- [AlertService.php:19-393](file://Services/AlertService.php#L19-L392) - [AvailabilityController.php:9-71](file://Http/Controllers/Api/AvailabilityController.php#L9-L71) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L138) -- [AdminCapacityController.php:8-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L63) +- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminCapacityController.php:8-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L62) **Section sources** - [DynamicPterodactyl.php:96-127](file://DynamicPterodactyl.php#L96-L127) diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Supporting Services.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Supporting Services.md index 6873bd6..d0a0c2c 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Supporting Services.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Supporting Services.md @@ -72,12 +72,12 @@ A --> I - [2025_01_01_000003_create_ptero_audit_logs_table.php:11-47](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L11-L47) **Section sources** -- [AuditLogService.php:1-83](file://Services/AuditLogService.php#L1-L83) -- [ConfigOptionSetupService.php:1-260](file://Services/ConfigOptionSetupService.php#L1-L260) -- [SliderConfigReaderService.php:1-69](file://Services/SliderConfigReaderService.php#L1-L69) -- [PricingController.php:1-158](file://Http/Controllers/Api/PricingController.php#L1-L158) -- [AuditLogPage.php:1-105](file://Admin/Pages/AuditLogPage.php#L1-L105) -- [2025_01_01_000003_create_ptero_audit_logs_table.php:1-55](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L1-L55) +- [AuditLogService.php:1-83](file://Services/AuditLogService.php#L1-L82) +- [ConfigOptionSetupService.php:1-260](file://Services/ConfigOptionSetupService.php#L1-L259) +- [SliderConfigReaderService.php:1-69](file://Services/SliderConfigReaderService.php#L1-L68) +- [PricingController.php:1-158](file://Http/Controllers/Api/PricingController.php#L1-L157) +- [AuditLogPage.php:1-105](file://Admin/Pages/AuditLogPage.php#L1-L104) +- [2025_01_01_000003_create_ptero_audit_logs_table.php:1-55](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L1-L54) ## Core Components - AuditLogService: Provides methods to log actions and retrieve filtered logs. Captures user context, request metadata, and before/after values for changes. diff --git a/.qoder/repowiki/en/content/Core Services/ConfigOptionSetupService.md b/.qoder/repowiki/en/content/Core Services/ConfigOptionSetupService.md index bed9ce6..f13a6ee 100644 --- a/.qoder/repowiki/en/content/Core Services/ConfigOptionSetupService.md +++ b/.qoder/repowiki/en/content/Core Services/ConfigOptionSetupService.md @@ -50,8 +50,8 @@ H["StoreReservationRequest"] --> C - [StoreReservationRequest.php:75-140](file://Http/Requests/StoreReservationRequest.php#L75-L140) **Section sources** -- [ConfigOptionSetupService.php:1-260](file://Services/ConfigOptionSetupService.php#L1-L260) -- [SliderConfigReaderService.php:1-69](file://Services/SliderConfigReaderService.php#L1-L69) +- [ConfigOptionSetupService.php:1-260](file://Services/ConfigOptionSetupService.php#L1-L259) +- [SliderConfigReaderService.php:1-69](file://Services/SliderConfigReaderService.php#L1-L68) ## Core Components - ConfigOptionSetupService: Creates/updates dynamic_slider ConfigOptions for memory, CPU, disk, and optionally Location; validates pricing metadata; audits setup runs. diff --git a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md index 6febf97..4a01018 100644 --- a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md +++ b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md @@ -76,7 +76,7 @@ Responsibilities summary: - [ResourceCalculationService.php:26-222](file://Services/ResourceCalculationService.php#L26-L222) - [ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) - [NodeSelectionService.php:22-86](file://Services/NodeSelectionService.php#L22-L86) -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) +- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) ## Architecture Overview The service uses a thin HTTP client wrapper around Pterodactyl’s Application API with retries on transient connection errors, strict timeouts, and sanitized error propagation. For cluster-wide snapshots, it batches node and server data retrieval to reduce API calls while preserving accuracy. @@ -286,9 +286,9 @@ ResourceCalculationService --> ResourceReservation : "reads pending" **Diagram sources** - [ResourceCalculationService.php:10-545](file://Services/ResourceCalculationService.php#L10-L545) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L454) +- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) - [NodeSelectionService.php:5-88](file://Services/NodeSelectionService.php#L5-L88) -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) +- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) ## Dependency Analysis - External dependency: Pterodactyl Application API via HTTP client diff --git a/.qoder/repowiki/en/content/Core Services/SliderConfigReaderService.md b/.qoder/repowiki/en/content/Core Services/SliderConfigReaderService.md index 115e5b6..e4e0f43 100644 --- a/.qoder/repowiki/en/content/Core Services/SliderConfigReaderService.md +++ b/.qoder/repowiki/en/content/Core Services/SliderConfigReaderService.md @@ -239,7 +239,7 @@ ConfigOptionSetupService --> ConfigOption : "creates/updates" **Section sources** - [ConfigOptionSetupService.php:117-171](file://Services/ConfigOptionSetupService.php#L117-L171) - [07-PRICING-MODELS.md:31-53](file://07-PRICING-MODELS.md#L31-L53) -- [07-PRICING-MODELS.md:290-330](file://07-PRICING-MODELS.md#L290-L330) +- [07-PRICING-MODELS.md:290-330](file://07-PRICING-MODELS.md#L290-L329) ### Example Slider Configuration Structures Typical structures produced by the service for frontend consumption: @@ -377,4 +377,4 @@ SliderConfigReaderService provides a clean, read-only interface to dynamic slide **Section sources** - [PricingController.php:24-145](file://Http/Controllers/Api/PricingController.php#L24-L145) -- [07-PRICING-MODELS.md:290-330](file://07-PRICING-MODELS.md#L290-L330) \ No newline at end of file +- [07-PRICING-MODELS.md:290-330](file://07-PRICING-MODELS.md#L290-L329) \ No newline at end of file diff --git a/.qoder/repowiki/en/content/Database Schema/Database Schema.md b/.qoder/repowiki/en/content/Database Schema/Database Schema.md index bba6e65..b8c83b4 100644 --- a/.qoder/repowiki/en/content/Database Schema/Database Schema.md +++ b/.qoder/repowiki/en/content/Database Schema/Database Schema.md @@ -278,7 +278,7 @@ Insert --> End([Done]) **Section sources** - [2025_01_01_000003_create_ptero_audit_logs_table.php:11-40](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L11-L40) - [AuditLog.php:7-37](file://Models/AuditLog.php#L7-L37) -- [AuditLogService.php:15-83](file://Services/AuditLogService.php#L15-L83) +- [AuditLogService.php:15-83](file://Services/AuditLogService.php#L15-L82) ### Alert Configurations - Purpose: Define capacity monitoring thresholds and notification preferences per location or globally @@ -493,5 +493,5 @@ USERS ||--o{ PTERO_AUDIT_LOGS : "user_id FK" - [ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) - [ReservationService.php:166-281](file://Services/ReservationService.php#L166-L281) - [ReservationService.php:335-405](file://Services/ReservationService.php#L335-L405) -- [AuditLogService.php:15-83](file://Services/AuditLogService.php#L15-L83) +- [AuditLogService.php:15-83](file://Services/AuditLogService.php#L15-L82) - [AlertService.php:77-101](file://Services/AlertService.php#L77-L101) \ No newline at end of file diff --git a/.qoder/repowiki/en/content/Database Schema/Model Relationships and Eloquent Models.md b/.qoder/repowiki/en/content/Database Schema/Model Relationships and Eloquent Models.md index 7703da2..9f74e90 100644 --- a/.qoder/repowiki/en/content/Database Schema/Model Relationships and Eloquent Models.md +++ b/.qoder/repowiki/en/content/Database Schema/Model Relationships and Eloquent Models.md @@ -73,24 +73,24 @@ M4 -.enum change.-> RR ``` **Diagram sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) -- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L57) -- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L34) -- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L38) -- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L70) -- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L83) +- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L56) +- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L33) +- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L37) +- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L69) +- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L82) - [2025_01_01_000001_create_ptero_resource_reservations_table.php:11-78](file://database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php#L11-L78) - [2025_01_01_000004_create_ptero_alert_configs_table.php:11-42](file://database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php#L11-L42) - [2025_01_01_000003_create_ptero_audit_logs_table.php:11-47](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L11-L47) - [2026_04_22_000001_drop_released_from_reservation_status.php:8-27](file://database/migrations/2026_04_22_000001_drop_released_from_reservation_status.php#L8-L27) **Section sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) -- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L57) -- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L38) -- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L34) -- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L70) -- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L83) +- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L56) +- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L37) +- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L33) +- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L69) +- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L82) - [2025_01_01_000001_create_ptero_resource_reservations_table.php:11-78](file://database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php#L11-L78) - [2025_01_01_000004_create_ptero_alert_configs_table.php:11-42](file://database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php#L11-L42) - [2025_01_01_000003_create_ptero_audit_logs_table.php:11-47](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L11-L47) @@ -109,11 +109,11 @@ Key behaviors: - AlertConfigObserver writes audit entries on create/update/delete, redacting sensitive webhook URLs before logging. **Section sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) -- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L57) -- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L38) -- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L34) -- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L70) +- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L56) +- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L37) +- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L33) +- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L69) ## Architecture Overview The models interact through relationships and observers to enforce business rules and maintain auditability. @@ -190,12 +190,12 @@ AuditLogService --> "AuditLog" : writes ``` **Diagram sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) -- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L57) -- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L34) -- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L38) -- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L70) -- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L83) +- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L56) +- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L33) +- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L37) +- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L69) +- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L82) ## Detailed Component Analysis @@ -228,7 +228,7 @@ Best practices: - When updating status, ensure idempotency and avoid race conditions using pessimistic locking where appropriate. **Section sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) +- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) - [2025_01_01_000001_create_ptero_resource_reservations_table.php:11-78](file://database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php#L11-L78) - [2026_04_22_000001_drop_released_from_reservation_status.php:8-27](file://database/migrations/2026_04_22_000001_drop_released_from_reservation_status.php#L8-L27) - [ReservationService.php:296-330](file://Services/ReservationService.php#L296-L330) @@ -272,9 +272,9 @@ Best practices: - Ensure webhook_url is never exposed in logs or responses; rely on observer redaction. **Section sources** -- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L57) -- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L34) -- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L70) +- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L56) +- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L33) +- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L69) - [2025_01_01_000004_create_ptero_alert_configs_table.php:11-42](file://database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php#L11-L42) #### AlertConfig Observer Sequence @@ -324,8 +324,8 @@ Best practices: - Use getEntityHistory for UIs showing change timelines. **Section sources** -- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L38) -- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L83) +- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L37) +- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L82) - [2025_01_01_000003_create_ptero_audit_logs_table.php:11-47](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L11-L47) ### Common Model Interactions and Best Practices diff --git a/.qoder/repowiki/en/content/Database Schema/Resource Reservations Table.md b/.qoder/repowiki/en/content/Database Schema/Resource Reservations Table.md index fe1220c..4f0de77 100644 --- a/.qoder/repowiki/en/content/Database Schema/Resource Reservations Table.md +++ b/.qoder/repowiki/en/content/Database Schema/Resource Reservations Table.md @@ -58,22 +58,22 @@ RQ --> C **Diagram sources** - [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L454) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L138) -- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L76) -- [CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L174) -- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L163) -- [ResourceReservationPolicy.php:9-70](file://Policies/ResourceReservationPolicy.php#L9-L70) +- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) +- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) +- [CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L173) +- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L162) +- [ResourceReservationPolicy.php:9-70](file://Policies/ResourceReservationPolicy.php#L9-L69) **Section sources** - [2025_01_01_000001_create_ptero_resource_reservations_table.php:11-78](file://database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php#L11-L78) - [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L454) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L138) -- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L76) -- [CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L174) -- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L163) -- [ResourceReservationPolicy.php:9-70](file://Policies/ResourceReservationPolicy.php#L9-L70) +- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) +- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) +- [CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L173) +- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L162) +- [ResourceReservationPolicy.php:9-70](file://Policies/ResourceReservationPolicy.php#L9-L69) ## Core Components - Schema and constraints are defined in the initial migration and subsequent migrations that adjust status values and add idempotency support. @@ -89,12 +89,12 @@ RQ --> C - [2026_04_22_000001_drop_released_from_reservation_status.php:8-27](file://database/migrations/2026_04_22_000001_drop_released_from_reservation_status.php#L8-L27) - [2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php:9-31](file://database/migrations/2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php#L9-L31) - [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L454) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L138) -- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L76) -- [CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L174) -- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L163) -- [ResourceReservationPolicy.php:9-70](file://Policies/ResourceReservationPolicy.php#L9-L70) +- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) +- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) +- [CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L173) +- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L162) +- [ResourceReservationPolicy.php:9-70](file://Policies/ResourceReservationPolicy.php#L9-L69) ## Architecture Overview The reservation lifecycle ensures temporary resource holds until payment completes or TTL expires. Creation uses pessimistic locking to avoid overselling, and idempotency prevents duplicate reservations under concurrent requests. Status transitions are enforced at the service layer with authorization checks via policies. @@ -262,7 +262,7 @@ Authorization: - Supports idempotency_key via header or body **Section sources** -- [StoreReservationRequest.php:12-163](file://Http/Requests/StoreReservationRequest.php#L12-L163) +- [StoreReservationRequest.php:12-163](file://Http/Requests/StoreReservationRequest.php#L12-L162) ### Listener: CartItemCreatedListener - Detects products with dynamic_slider config options diff --git a/.qoder/repowiki/en/content/Getting Started.md b/.qoder/repowiki/en/content/Getting Started.md index 33b6c8e..d062585 100644 --- a/.qoder/repowiki/en/content/Getting Started.md +++ b/.qoder/repowiki/en/content/Getting Started.md @@ -181,7 +181,7 @@ Expire --> EndExpired["Released back to pool"] **Section sources** - [Services/ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) - [Services/ReservationService.php:384-405](file://Services/ReservationService.php#L384-L405) -- [Models/ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L66) +- [Models/ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) ### Relationship to Paymenter’s Built-in Pterodactyl Server Extension - This extension is a companion enhancement. It handles dynamic sliders, availability, and reservations. diff --git a/.qoder/repowiki/en/content/Testing.md b/.qoder/repowiki/en/content/Testing.md index 9a8c2c4..5101eea 100644 --- a/.qoder/repowiki/en/content/Testing.md +++ b/.qoder/repowiki/en/content/Testing.md @@ -69,18 +69,18 @@ U --> AC **Diagram sources** - [phpunit.xml:1-43](file://phpunit.xml#L1-L43) - [tests/bootstrap.php:1-21](file://tests/bootstrap.php#L1-L21) -- [tests/TestCase.php:1-64](file://tests/TestCase.php#L1-L64) +- [tests/TestCase.php:1-64](file://tests/TestCase.php#L1-L63) - [tests/LaravelTestCase.php:1-183](file://tests/LaravelTestCase.php#L1-L183) -- [Services/ReservationService.php:1-454](file://Services/ReservationService.php#L1-L454) +- [Services/ReservationService.php:1-454](file://Services/ReservationService.php#L1-L453) - [Services/ResourceCalculationService.php:1-545](file://Services/ResourceCalculationService.php#L1-L545) -- [Services/AlertService.php:1-393](file://Services/AlertService.php#L1-L393) -- [Models/ResourceReservation.php:1-66](file://Models/ResourceReservation.php#L1-L66) -- [Models/AlertConfig.php:1-57](file://Models/AlertConfig.php#L1-L57) +- [Services/AlertService.php:1-393](file://Services/AlertService.php#L1-L392) +- [Models/ResourceReservation.php:1-66](file://Models/ResourceReservation.php#L1-L65) +- [Models/AlertConfig.php:1-57](file://Models/AlertConfig.php#L1-L56) **Section sources** - [phpunit.xml:1-43](file://phpunit.xml#L1-L43) - [tests/bootstrap.php:1-21](file://tests/bootstrap.php#L1-L21) -- [tests/TestCase.php:1-64](file://tests/TestCase.php#L1-L64) +- [tests/TestCase.php:1-64](file://tests/TestCase.php#L1-L63) - [tests/LaravelTestCase.php:1-183](file://tests/LaravelTestCase.php#L1-L183) ## Core Components @@ -91,11 +91,11 @@ Key components under test: - Models: ResourceReservation and AlertConfig define data contracts and scopes used by services. **Section sources** -- [Services/ReservationService.php:1-454](file://Services/ReservationService.php#L1-L454) +- [Services/ReservationService.php:1-454](file://Services/ReservationService.php#L1-L453) - [Services/ResourceCalculationService.php:1-545](file://Services/ResourceCalculationService.php#L1-L545) -- [Services/AlertService.php:1-393](file://Services/AlertService.php#L1-L393) -- [Models/ResourceReservation.php:1-66](file://Models/ResourceReservation.php#L1-L66) -- [Models/AlertConfig.php:1-57](file://Models/AlertConfig.php#L1-L57) +- [Services/AlertService.php:1-393](file://Services/AlertService.php#L1-L392) +- [Models/ResourceReservation.php:1-66](file://Models/ResourceReservation.php#L1-L65) +- [Models/AlertConfig.php:1-57](file://Models/AlertConfig.php#L1-L56) ## Architecture Overview The testing architecture isolates external dependencies and enforces deterministic environments: @@ -251,9 +251,9 @@ Key test patterns: - Assert AlertDeliveryFailed event dispatch when all channels fail. **Section sources** -- [tests/Unit/AlertServiceTest.php:1-771](file://tests/Unit/AlertServiceTest.php#L1-L771) +- [tests/Unit/AlertServiceTest.php:1-771](file://tests/Unit/AlertServiceTest.php#L1-L770) - [Services/AlertService.php:33-248](file://Services/AlertService.php#L33-L248) -- [Models/AlertConfig.php:1-57](file://Models/AlertConfig.php#L1-L57) +- [Models/AlertConfig.php:1-57](file://Models/AlertConfig.php#L1-L56) ### Feature Tests for API Endpoints Focus areas: @@ -291,7 +291,7 @@ Key test patterns: - Assert throttling behavior at both guest IP and user levels. **Section sources** -- [tests/Feature/ReservationApiTest.php:1-491](file://tests/Feature/ReservationApiTest.php#L1-L491) +- [tests/Feature/ReservationApiTest.php:1-491](file://tests/Feature/ReservationApiTest.php#L1-L490) - [tests/Feature/AvailabilityApiTest.php:1-95](file://tests/Feature/AvailabilityApiTest.php#L1-L95) ## Dependency Analysis From fcc3df97d133f1ce9eef8c9231626e128730210a Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Tue, 18 Aug 2026 00:14:08 +1000 Subject: [PATCH 29/30] docs: align qoder anchor labels --- .../en/content/API Reference/API Reference.md | 20 +++---- .../Admin API Endpoints.md | 4 +- .../Public API Endpoints.md | 2 +- .../Reservation Endpoints.md | 16 ++--- .qoder/repowiki/en/content/Admin Interface.md | 38 ++++++------ .../Companion Extension Pattern.md | 20 +++---- .../Service Layer Design/Alert Service.md | 10 ++-- .../Node Selection Service.md | 8 +-- .../Service Layer Design.md | 18 +++--- .../Supporting Services.md | 12 ++-- .../Core Services/ConfigOptionSetupService.md | 4 +- .../ResourceCalculationService.md | 6 +- .../SliderConfigReaderService.md | 4 +- .../Database Schema/Database Schema.md | 4 +- ...Model Relationships and Eloquent Models.md | 58 +++++++++---------- .../Resource Reservations Table.md | 38 ++++++------ .qoder/repowiki/en/content/Getting Started.md | 2 +- .qoder/repowiki/en/content/Testing.md | 26 ++++----- 18 files changed, 145 insertions(+), 145 deletions(-) diff --git a/.qoder/repowiki/en/content/API Reference/API Reference.md b/.qoder/repowiki/en/content/API Reference/API Reference.md index 8d0c7d9..b44aa9d 100644 --- a/.qoder/repowiki/en/content/API Reference/API Reference.md +++ b/.qoder/repowiki/en/content/API Reference/API Reference.md @@ -59,7 +59,7 @@ F --> I["AvailabilityController
GET /availability/{locationId}/nodes"] - [routes/api.php:17-40](file://routes/api.php#L17-L40) **Section sources** -- [routes/api.php:1-41](file://routes/api.php#L1-L40) +- [routes/api.php:1-40](file://routes/api.php#L1-L40) ## Core Components - AvailabilityController: Returns per-location availability aggregates and, when authenticated as admin, detailed node information. @@ -70,10 +70,10 @@ F --> I["AvailabilityController
GET /availability/{locationId}/nodes"] **Section sources** - [AvailabilityController.php:9-70](file://Http/Controllers/Api/AvailabilityController.php#L9-L70) -- [PricingController.php:12-158](file://Http/Controllers/Api/PricingController.php#L12-L157) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) -- [AdminCapacityController.php:8-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L62) -- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) +- [PricingController.php:12-157](file://Http/Controllers/Api/PricingController.php#L12-L157) +- [ReservationController.php:13-137](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminCapacityController.php:8-62](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L62) +- [AdminReservationController.php:9-75](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) ## Architecture Overview The API integrates with Paymenter core models and services and with the Pterodactyl panel via HTTP. Services encapsulate business logic and data aggregation. @@ -204,7 +204,7 @@ Important: **Section sources** - [routes/api.php:17-22](file://routes/api.php#L17-L22) -- [PricingController.php:24-158](file://Http/Controllers/Api/PricingController.php#L24-L157) +- [PricingController.php:24-157](file://Http/Controllers/Api/PricingController.php#L24-L157) - [StoreReservationRequest.php:38-112](file://Http/Requests/StoreReservationRequest.php#L38-L112) #### Reservations @@ -288,8 +288,8 @@ Notes: **Section sources** - [routes/api.php:24-30](file://routes/api.php#L24-L30) -- [ReservationController.php:24-138](file://Http/Controllers/Api/ReservationController.php#L24-L137) -- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L162) +- [ReservationController.php:24-137](file://Http/Controllers/Api/ReservationController.php#L24-L137) +- [StoreReservationRequest.php:10-162](file://Http/Requests/StoreReservationRequest.php#L10-L162) - [ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) - [ResourceReservationPolicy.php:25-58](file://Policies/ResourceReservationPolicy.php#L25-L58) @@ -318,7 +318,7 @@ Notes: **Section sources** - [routes/api.php:32-40](file://routes/api.php#L32-L40) -- [AdminCapacityController.php:17-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L17-L62) +- [AdminCapacityController.php:17-62](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L17-L62) - [ResourceCalculationService.php:69-141](file://Services/ResourceCalculationService.php#L69-L141) #### Admin Reservations @@ -353,7 +353,7 @@ Notes: **Section sources** - [routes/api.php:32-40](file://routes/api.php#L32-L40) -- [AdminReservationController.php:18-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L18-L75) +- [AdminReservationController.php:18-75](file://Http/Controllers/Api/Admin/AdminReservationController.php#L18-L75) - [ReservationService.php:208-241](file://Services/ReservationService.php#L208-L241) ## Dependency Analysis diff --git a/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md b/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md index b356ffd..4581b92 100644 --- a/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Admin API Endpoints/Admin API Endpoints.md @@ -349,10 +349,10 @@ RESOURCE_RESERVATION ||--o| SERVICE : "service_id" ``` **Diagram sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) **Section sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) ## Dependency Analysis - Admin controllers depend on services: diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md index 4a1f07c..6d8b5f5 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Public API Endpoints.md @@ -80,7 +80,7 @@ ResSvc --> DB["Database (ptero_resource_reservations)"] - [Http/Controllers/Api/ReservationController.php:24-136](file://Http/Controllers/Api/ReservationController.php#L24-L136) - [Http/Requests/StoreReservationRequest.php:38-113](file://Http/Requests/StoreReservationRequest.php#L38-L113) - [Services/ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) -- [Models/ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [Models/ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) - [Policies/ResourceReservationPolicy.php:9-69](file://Policies/ResourceReservationPolicy.php#L9-L69) ## Architecture Overview diff --git a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Reservation Endpoints.md b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Reservation Endpoints.md index 708ceb5..31faf8d 100644 --- a/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Reservation Endpoints.md +++ b/.qoder/repowiki/en/content/API Reference/Public API Endpoints/Reservation Endpoints.md @@ -48,8 +48,8 @@ Controller --> Policy["ResourceReservationPolicy"] **Diagram sources** - [routes/api.php:24-30](file://routes/api.php#L24-L30) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) -- [ReservationService.php:43-454](file://Services/ReservationService.php#L43-L453) +- [ReservationController.php:13-137](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [ReservationService.php:43-453](file://Services/ReservationService.php#L43-L453) - [ResourceReservationPolicy.php:9-69](file://Policies/ResourceReservationPolicy.php#L9-L69) **Section sources** @@ -73,7 +73,7 @@ Key responsibilities: - [routes/api.php:24-30](file://routes/api.php#L24-L30) - [ReservationController.php:24-136](file://Http/Controllers/Api/ReservationController.php#L24-L136) - [StoreReservationRequest.php:31-113](file://Http/Requests/StoreReservationRequest.php#L31-L113) -- [ReservationService.php:43-454](file://Services/ReservationService.php#L43-L453) +- [ReservationService.php:43-453](file://Services/ReservationService.php#L43-L453) - [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) - [ResourceReservationPolicy.php:9-69](file://Policies/ResourceReservationPolicy.php#L9-L69) @@ -380,15 +380,15 @@ Service --> DB["Database"] **Diagram sources** - [routes/api.php:24-30](file://routes/api.php#L24-L30) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) -- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L162) +- [ReservationController.php:13-137](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [StoreReservationRequest.php:10-162](file://Http/Requests/StoreReservationRequest.php#L10-L162) - [ResourceReservationPolicy.php:9-69](file://Policies/ResourceReservationPolicy.php#L9-L69) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) +- [ReservationService.php:16-453](file://Services/ReservationService.php#L16-L453) **Section sources** - [routes/api.php:24-30](file://routes/api.php#L24-L30) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) +- [ReservationController.php:13-137](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [ReservationService.php:16-453](file://Services/ReservationService.php#L16-L453) ## Performance Considerations - Pessimistic locking: Uses lockForUpdate to prevent concurrent modifications during node selection and reservation creation. diff --git a/.qoder/repowiki/en/content/Admin Interface.md b/.qoder/repowiki/en/content/Admin Interface.md index 945ee2a..b8509f2 100644 --- a/.qoder/repowiki/en/content/Admin Interface.md +++ b/.qoder/repowiki/en/content/Admin Interface.md @@ -89,10 +89,10 @@ AL --> ALS - [AuditLogPage.php:15-29](file://Admin/Pages/AuditLogPage.php#L15-L29) - [ReservationResource.php:15-27](file://Admin/Resources/ReservationResource.php#L15-L27) - [AlertConfigResource.php:27-39](file://Admin/Resources/AlertConfigResource.php#L27-L39) -- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L103) -- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L109) -- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L5) -- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L47) +- [dashboard.blade.php:1-103](file://resources/views/admin/dashboard.blade.php#L1-L103) +- [node-monitoring.blade.php:1-109](file://resources/views/admin/node-monitoring.blade.php#L1-L109) +- [setup-wizard.blade.php:1-5](file://resources/views/admin/setup-wizard.blade.php#L1-L5) +- [audit-log.blade.php:1-47](file://resources/views/admin/audit-log.blade.php#L1-L47) - [ResourceCalculationService.php:10-22](file://Services/ResourceCalculationService.php#L10-L22) - [ReservationService.php:16-35](file://Services/ReservationService.php#L16-L35) - [AuditLogService.php:10-41](file://Services/AuditLogService.php#L10-L41) @@ -115,13 +115,13 @@ AL --> ALS **Section sources** - [Dashboard.php:27-73](file://Admin/Pages/Dashboard.php#L27-L73) -- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L103) +- [dashboard.blade.php:1-103](file://resources/views/admin/dashboard.blade.php#L1-L103) - [NodeMonitoring.php:22-61](file://Admin/Pages/NodeMonitoring.php#L22-L61) -- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L109) +- [node-monitoring.blade.php:1-109](file://resources/views/admin/node-monitoring.blade.php#L1-L109) - [SetupWizard.php:50-427](file://Admin/Pages/SetupWizard.php#L50-L427) -- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L5) +- [setup-wizard.blade.php:1-5](file://resources/views/admin/setup-wizard.blade.php#L1-L5) - [AuditLogPage.php:31-103](file://Admin/Pages/AuditLogPage.php#L31-L103) -- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L47) +- [audit-log.blade.php:1-47](file://resources/views/admin/audit-log.blade.php#L1-L47) - [ReservationResource.php:34-127](file://Admin/Resources/ReservationResource.php#L34-L127) - [AlertConfigResource.php:41-176](file://Admin/Resources/AlertConfigResource.php#L41-L176) @@ -176,12 +176,12 @@ ShowErr --> Render **Diagram sources** - [Dashboard.php:27-73](file://Admin/Pages/Dashboard.php#L27-L73) -- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L103) +- [dashboard.blade.php:1-103](file://resources/views/admin/dashboard.blade.php#L1-L103) - [ResourceCalculationService.php:158-195](file://Services/ResourceCalculationService.php#L158-L195) **Section sources** - [Dashboard.php:27-115](file://Admin/Pages/Dashboard.php#L27-L115) -- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L103) +- [dashboard.blade.php:1-103](file://resources/views/admin/dashboard.blade.php#L1-L103) ### Node Monitoring - Purpose: Real-time view of node utilization and availability per location. @@ -208,11 +208,11 @@ NM-->>Admin : Render table with utilization **Diagram sources** - [NodeMonitoring.php:22-61](file://Admin/Pages/NodeMonitoring.php#L22-L61) - [ResourceCalculationService.php:69-141](file://Services/ResourceCalculationService.php#L69-L141) -- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L109) +- [node-monitoring.blade.php:1-109](file://resources/views/admin/node-monitoring.blade.php#L1-L109) **Section sources** - [NodeMonitoring.php:22-61](file://Admin/Pages/NodeMonitoring.php#L22-L61) -- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L109) +- [node-monitoring.blade.php:1-109](file://resources/views/admin/node-monitoring.blade.php#L1-L109) ### Setup Wizard - Purpose: Configure dynamic slider options for a selected product, including pricing models and allowed locations. @@ -239,11 +239,11 @@ G --> |Yes| I["Success Notification & Reset Form"] **Diagram sources** - [SetupWizard.php:50-427](file://Admin/Pages/SetupWizard.php#L50-L427) -- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L5) +- [setup-wizard.blade.php:1-5](file://resources/views/admin/setup-wizard.blade.php#L1-L5) **Section sources** - [SetupWizard.php:50-509](file://Admin/Pages/SetupWizard.php#L50-L509) -- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L5) +- [setup-wizard.blade.php:1-5](file://resources/views/admin/setup-wizard.blade.php#L1-L5) ### Audit Log Viewer - Purpose: Track administrative actions and display recent alert delivery failures. @@ -274,7 +274,7 @@ AuditLogPage --> AuditLog : "queries" **Section sources** - [AuditLogPage.php:31-103](file://Admin/Pages/AuditLogPage.php#L31-L103) -- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L47) +- [audit-log.blade.php:1-47](file://resources/views/admin/audit-log.blade.php#L1-L47) ### Reservation Management Resource - Purpose: Manual intervention for pending reservations (extend TTL, cancel) and bulk cleanup of expired ones. @@ -433,10 +433,10 @@ The Filament 4 admin interface provides a comprehensive operational view of syst - Extensibility: Add custom columns, filters, or actions in resources; customize views with standard Blade patterns. **Section sources** -- [dashboard.blade.php:1-104](file://resources/views/admin/dashboard.blade.php#L1-L103) -- [node-monitoring.blade.php:1-110](file://resources/views/admin/node-monitoring.blade.php#L1-L109) -- [setup-wizard.blade.php:1-6](file://resources/views/admin/setup-wizard.blade.php#L1-L5) -- [audit-log.blade.php:1-48](file://resources/views/admin/audit-log.blade.php#L1-L47) +- [dashboard.blade.php:1-103](file://resources/views/admin/dashboard.blade.php#L1-L103) +- [node-monitoring.blade.php:1-109](file://resources/views/admin/node-monitoring.blade.php#L1-L109) +- [setup-wizard.blade.php:1-5](file://resources/views/admin/setup-wizard.blade.php#L1-L5) +- [audit-log.blade.php:1-47](file://resources/views/admin/audit-log.blade.php#L1-L47) ### Integration Points - Pterodactyl API: diff --git a/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md b/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md index 2decfce..726cf6e 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Companion Extension Pattern.md @@ -84,12 +84,12 @@ G --> M["Admin Recipients"] **Section sources** - [DynamicPterodactyl.php:48-127](file://DynamicPterodactyl.php#L48-L127) -- [Services/ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) +- [Services/ReservationService.php:16-453](file://Services/ReservationService.php#L16-L453) - [Services/ResourceCalculationService.php:10-545](file://Services/ResourceCalculationService.php#L10-L545) -- [Services/AlertService.php:19-393](file://Services/AlertService.php#L19-L392) -- [Services/SliderConfigReaderService.php:7-69](file://Services/SliderConfigReaderService.php#L7-L68) -- [Listeners/CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L173) -- [Listeners/InvoicePaidListener.php:12-136](file://Listeners/InvoicePaidListener.php#L12-L135) +- [Services/AlertService.php:19-392](file://Services/AlertService.php#L19-L392) +- [Services/SliderConfigReaderService.php:7-68](file://Services/SliderConfigReaderService.php#L7-L68) +- [Listeners/CartItemCreatedListener.php:11-173](file://Listeners/CartItemCreatedListener.php#L11-L173) +- [Listeners/InvoicePaidListener.php:12-135](file://Listeners/InvoicePaidListener.php#L12-L135) ## Architecture Overview The extension follows a companion pattern: @@ -245,11 +245,11 @@ IPay->>IPay : notifyShortfall on failure **Diagram sources** - [Listeners/CartItemCreatedListener.php:13-87](file://Listeners/CartItemCreatedListener.php#L13-L87) -- [Listeners/InvoicePaidListener.php:14-136](file://Listeners/InvoicePaidListener.php#L14-L135) +- [Listeners/InvoicePaidListener.php:14-135](file://Listeners/InvoicePaidListener.php#L14-L135) **Section sources** -- [Listeners/CartItemCreatedListener.php:13-174](file://Listeners/CartItemCreatedListener.php#L13-L173) -- [Listeners/InvoicePaidListener.php:14-136](file://Listeners/InvoicePaidListener.php#L14-L135) +- [Listeners/CartItemCreatedListener.php:13-173](file://Listeners/CartItemCreatedListener.php#L13-L173) +- [Listeners/InvoicePaidListener.php:14-135](file://Listeners/InvoicePaidListener.php#L14-L135) ### Pricing Coexistence: Native Slider Metadata Only - SliderConfigReaderService reads dynamic_slider ConfigOption metadata (min, max, step, default, unit, display_unit, display_divisor, pricing model/rates) for frontend consumption. @@ -270,7 +270,7 @@ SliderConfigReaderService --> ConfigOption : "reads metadata" ``` **Diagram sources** -- [Services/SliderConfigReaderService.php:7-69](file://Services/SliderConfigReaderService.php#L7-L68) +- [Services/SliderConfigReaderService.php:7-68](file://Services/SliderConfigReaderService.php#L7-L68) **Section sources** - [Services/SliderConfigReaderService.php:14-53](file://Services/SliderConfigReaderService.php#L14-L53) @@ -353,7 +353,7 @@ Common issues and diagnostics: - Alert delivery failures: check AlertService sendNotifications and delivery logs; ensure email/webhook channels are configured and recipients exist. **Section sources** -- [Listeners/InvoicePaidListener.php:58-136](file://Listeners/InvoicePaidListener.php#L58-L135) +- [Listeners/InvoicePaidListener.php:58-135](file://Listeners/InvoicePaidListener.php#L58-L135) - [Services/ResourceCalculationService.php:452-498](file://Services/ResourceCalculationService.php#L452-L498) - [Services/ReservationService.php:125-141](file://Services/ReservationService.php#L125-L141) - [Services/AlertService.php:128-248](file://Services/AlertService.php#L128-L248) diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Alert Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Alert Service.md index deadc8d..151fcc5 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Alert Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Alert Service.md @@ -75,14 +75,14 @@ AlertSvc --> Event["AlertDeliveryFailed event"] - Admin AlertConfigResource: Filament resource exposing CRUD and a “Test” action to send a sample alert. **Section sources** -- [AlertService.php:19-393](file://Services/AlertService.php#L19-L392) +- [AlertService.php:19-392](file://Services/AlertService.php#L19-L392) - [AlertConfig.php:8-56](file://Models/AlertConfig.php#L8-L56) - [AlertDeliveryLog.php:8-33](file://Models/AlertDeliveryLog.php#L8-L33) - [CapacityAlertNotification.php:10-47](file://Notifications/CapacityAlertNotification.php#L10-L47) - [ReservationShortfallNotification.php:10-40](file://Notifications/ReservationShortfallNotification.php#L10-L40) - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) - [AlertConfigObserver.php:8-69](file://Models/Observers/AlertConfigObserver.php#L8-L69) -- [AlertConfigResource.php:150-197](file://Admin/Resources/AlertConfigResource.php#L150-L196) +- [AlertConfigResource.php:150-196](file://Admin/Resources/AlertConfigResource.php#L150-L196) ## Architecture Overview The service is invoked by a scheduled task registered during extension boot. For each active alert configuration, it determines the scope (global or specific location), fetches current availability from Pterodactyl via ResourceCalculationService, evaluates memory and disk utilization against configured warning/critical thresholds, and dispatches notifications if any thresholds are breached. Cooldown prevents repeated alerts within a configured window. Delivery attempts are recorded, and failures emit an event for downstream handling. @@ -216,7 +216,7 @@ Migration highlights: **Section sources** - [DynamicPterodactyl.php:118-126](file://DynamicPterodactyl.php#L118-L126) -- [AlertConfigResource.php:150-197](file://Admin/Resources/AlertConfigResource.php#L150-L196) +- [AlertConfigResource.php:150-196](file://Admin/Resources/AlertConfigResource.php#L150-L196) - [AlertConfigObserver.php:12-69](file://Models/Observers/AlertConfigObserver.php#L12-L69) ## Dependency Analysis @@ -261,7 +261,7 @@ AlertService --> AlertDeliveryFailed : "dispatches on failure" ``` **Diagram sources** -- [AlertService.php:19-393](file://Services/AlertService.php#L19-L392) +- [AlertService.php:19-392](file://Services/AlertService.php#L19-L392) - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) - [AlertConfig.php:8-56](file://Models/AlertConfig.php#L8-L56) - [AlertDeliveryLog.php:8-33](file://Models/AlertDeliveryLog.php#L8-L33) @@ -270,7 +270,7 @@ AlertService --> AlertDeliveryFailed : "dispatches on failure" - [AlertDeliveryFailed.php:9-16](file://Events/AlertDeliveryFailed.php#L9-L16) **Section sources** -- [AlertService.php:19-393](file://Services/AlertService.php#L19-L392) +- [AlertService.php:19-392](file://Services/AlertService.php#L19-L392) - [ResourceCalculationService.php:26-67](file://Services/ResourceCalculationService.php#L26-L67) ## Performance Considerations diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md index 44eb7bd..c843445 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Node Selection Service.md @@ -50,8 +50,8 @@ RCSvc --> DB **Section sources** - [NodeSelectionService.php:1-88](file://Services/NodeSelectionService.php#L1-L88) - [ResourceCalculationService.php:1-545](file://Services/ResourceCalculationService.php#L1-L545) -- [ReservationService.php:1-454](file://Services/ReservationService.php#L1-L453) -- [ResourceReservation.php:1-66](file://Models/ResourceReservation.php#L1-L65) +- [ReservationService.php:1-453](file://Services/ReservationService.php#L1-L453) +- [ResourceReservation.php:1-65](file://Models/ResourceReservation.php#L1-L65) ## Core Components - NodeSelectionService: Selects the best node using weighted headroom scoring and filters out unsuitable nodes (maintenance mode or insufficient resources). @@ -257,11 +257,11 @@ Pending --> Cancelled : "cancel(token)" ``` **Diagram sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) - [2026_04_22_000001_drop_released_from_reservation_status.php:8-19](file://database/migrations/2026_04_22_000001_drop_released_from_reservation_status.php#L8-L19) **Section sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) - [2026_04_22_000001_drop_released_from_reservation_status.php:8-19](file://database/migrations/2026_04_22_000001_drop_released_from_reservation_status.php#L8-L19) ## Dependency Analysis diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md index dc14f03..d4bdb90 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Service Layer Design.md @@ -72,11 +72,11 @@ ResCalcSvc --> DB **Section sources** - [ResourceCalculationService.php:10-222](file://Services/ResourceCalculationService.php#L10-L222) - [NodeSelectionService.php:5-86](file://Services/NodeSelectionService.php#L5-L86) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) -- [AlertService.php:19-393](file://Services/AlertService.php#L19-L392) +- [ReservationService.php:16-453](file://Services/ReservationService.php#L16-L453) +- [AlertService.php:19-392](file://Services/AlertService.php#L19-L392) - [AvailabilityController.php:9-71](file://Http/Controllers/Api/AvailabilityController.php#L9-L71) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) -- [AdminCapacityController.php:8-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L62) +- [ReservationController.php:13-137](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminCapacityController.php:8-62](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L62) ## Architecture Overview The service layer enforces strict boundaries: @@ -226,7 +226,7 @@ end **Section sources** - [ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) - [ReservationService.php:166-281](file://Services/ReservationService.php#L166-L281) -- [ReservationService.php:387-454](file://Services/ReservationService.php#L387-L453) +- [ReservationService.php:387-453](file://Services/ReservationService.php#L387-L453) ### AlertService Responsibilities: @@ -300,11 +300,11 @@ AdminCapacityController --> ResourceCalculationService : "uses" **Diagram sources** - [NodeSelectionService.php:5-86](file://Services/NodeSelectionService.php#L5-L86) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) -- [AlertService.php:19-393](file://Services/AlertService.php#L19-L392) +- [ReservationService.php:16-453](file://Services/ReservationService.php#L16-L453) +- [AlertService.php:19-392](file://Services/AlertService.php#L19-L392) - [AvailabilityController.php:9-71](file://Http/Controllers/Api/AvailabilityController.php#L9-L71) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) -- [AdminCapacityController.php:8-63](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L62) +- [ReservationController.php:13-137](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminCapacityController.php:8-62](file://Http/Controllers/Api/Admin/AdminCapacityController.php#L8-L62) **Section sources** - [DynamicPterodactyl.php:96-127](file://DynamicPterodactyl.php#L96-L127) diff --git a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Supporting Services.md b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Supporting Services.md index d0a0c2c..7c1bd63 100644 --- a/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Supporting Services.md +++ b/.qoder/repowiki/en/content/Architecture Overview/Service Layer Design/Supporting Services.md @@ -72,12 +72,12 @@ A --> I - [2025_01_01_000003_create_ptero_audit_logs_table.php:11-47](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L11-L47) **Section sources** -- [AuditLogService.php:1-83](file://Services/AuditLogService.php#L1-L82) -- [ConfigOptionSetupService.php:1-260](file://Services/ConfigOptionSetupService.php#L1-L259) -- [SliderConfigReaderService.php:1-69](file://Services/SliderConfigReaderService.php#L1-L68) -- [PricingController.php:1-158](file://Http/Controllers/Api/PricingController.php#L1-L157) -- [AuditLogPage.php:1-105](file://Admin/Pages/AuditLogPage.php#L1-L104) -- [2025_01_01_000003_create_ptero_audit_logs_table.php:1-55](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L1-L54) +- [AuditLogService.php:1-82](file://Services/AuditLogService.php#L1-L82) +- [ConfigOptionSetupService.php:1-259](file://Services/ConfigOptionSetupService.php#L1-L259) +- [SliderConfigReaderService.php:1-68](file://Services/SliderConfigReaderService.php#L1-L68) +- [PricingController.php:1-157](file://Http/Controllers/Api/PricingController.php#L1-L157) +- [AuditLogPage.php:1-104](file://Admin/Pages/AuditLogPage.php#L1-L104) +- [2025_01_01_000003_create_ptero_audit_logs_table.php:1-54](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L1-L54) ## Core Components - AuditLogService: Provides methods to log actions and retrieve filtered logs. Captures user context, request metadata, and before/after values for changes. diff --git a/.qoder/repowiki/en/content/Core Services/ConfigOptionSetupService.md b/.qoder/repowiki/en/content/Core Services/ConfigOptionSetupService.md index f13a6ee..0505482 100644 --- a/.qoder/repowiki/en/content/Core Services/ConfigOptionSetupService.md +++ b/.qoder/repowiki/en/content/Core Services/ConfigOptionSetupService.md @@ -50,8 +50,8 @@ H["StoreReservationRequest"] --> C - [StoreReservationRequest.php:75-140](file://Http/Requests/StoreReservationRequest.php#L75-L140) **Section sources** -- [ConfigOptionSetupService.php:1-260](file://Services/ConfigOptionSetupService.php#L1-L259) -- [SliderConfigReaderService.php:1-69](file://Services/SliderConfigReaderService.php#L1-L68) +- [ConfigOptionSetupService.php:1-259](file://Services/ConfigOptionSetupService.php#L1-L259) +- [SliderConfigReaderService.php:1-68](file://Services/SliderConfigReaderService.php#L1-L68) ## Core Components - ConfigOptionSetupService: Creates/updates dynamic_slider ConfigOptions for memory, CPU, disk, and optionally Location; validates pricing metadata; audits setup runs. diff --git a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md index 4a01018..dbe54de 100644 --- a/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md +++ b/.qoder/repowiki/en/content/Core Services/ResourceCalculationService.md @@ -76,7 +76,7 @@ Responsibilities summary: - [ResourceCalculationService.php:26-222](file://Services/ResourceCalculationService.php#L26-L222) - [ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) - [NodeSelectionService.php:22-86](file://Services/NodeSelectionService.php#L22-L86) -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) ## Architecture Overview The service uses a thin HTTP client wrapper around Pterodactyl’s Application API with retries on transient connection errors, strict timeouts, and sanitized error propagation. For cluster-wide snapshots, it batches node and server data retrieval to reduce API calls while preserving accuracy. @@ -286,9 +286,9 @@ ResourceCalculationService --> ResourceReservation : "reads pending" **Diagram sources** - [ResourceCalculationService.php:10-545](file://Services/ResourceCalculationService.php#L10-L545) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) +- [ReservationService.php:16-453](file://Services/ReservationService.php#L16-L453) - [NodeSelectionService.php:5-88](file://Services/NodeSelectionService.php#L5-L88) -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) ## Dependency Analysis - External dependency: Pterodactyl Application API via HTTP client diff --git a/.qoder/repowiki/en/content/Core Services/SliderConfigReaderService.md b/.qoder/repowiki/en/content/Core Services/SliderConfigReaderService.md index e4e0f43..9674e5a 100644 --- a/.qoder/repowiki/en/content/Core Services/SliderConfigReaderService.md +++ b/.qoder/repowiki/en/content/Core Services/SliderConfigReaderService.md @@ -239,7 +239,7 @@ ConfigOptionSetupService --> ConfigOption : "creates/updates" **Section sources** - [ConfigOptionSetupService.php:117-171](file://Services/ConfigOptionSetupService.php#L117-L171) - [07-PRICING-MODELS.md:31-53](file://07-PRICING-MODELS.md#L31-L53) -- [07-PRICING-MODELS.md:290-330](file://07-PRICING-MODELS.md#L290-L329) +- [07-PRICING-MODELS.md:290-329](file://07-PRICING-MODELS.md#L290-L329) ### Example Slider Configuration Structures Typical structures produced by the service for frontend consumption: @@ -377,4 +377,4 @@ SliderConfigReaderService provides a clean, read-only interface to dynamic slide **Section sources** - [PricingController.php:24-145](file://Http/Controllers/Api/PricingController.php#L24-L145) -- [07-PRICING-MODELS.md:290-330](file://07-PRICING-MODELS.md#L290-L329) \ No newline at end of file +- [07-PRICING-MODELS.md:290-329](file://07-PRICING-MODELS.md#L290-L329) \ No newline at end of file diff --git a/.qoder/repowiki/en/content/Database Schema/Database Schema.md b/.qoder/repowiki/en/content/Database Schema/Database Schema.md index b8c83b4..633270c 100644 --- a/.qoder/repowiki/en/content/Database Schema/Database Schema.md +++ b/.qoder/repowiki/en/content/Database Schema/Database Schema.md @@ -278,7 +278,7 @@ Insert --> End([Done]) **Section sources** - [2025_01_01_000003_create_ptero_audit_logs_table.php:11-40](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L11-L40) - [AuditLog.php:7-37](file://Models/AuditLog.php#L7-L37) -- [AuditLogService.php:15-83](file://Services/AuditLogService.php#L15-L82) +- [AuditLogService.php:15-82](file://Services/AuditLogService.php#L15-L82) ### Alert Configurations - Purpose: Define capacity monitoring thresholds and notification preferences per location or globally @@ -493,5 +493,5 @@ USERS ||--o{ PTERO_AUDIT_LOGS : "user_id FK" - [ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) - [ReservationService.php:166-281](file://Services/ReservationService.php#L166-L281) - [ReservationService.php:335-405](file://Services/ReservationService.php#L335-L405) -- [AuditLogService.php:15-83](file://Services/AuditLogService.php#L15-L82) +- [AuditLogService.php:15-82](file://Services/AuditLogService.php#L15-L82) - [AlertService.php:77-101](file://Services/AlertService.php#L77-L101) \ No newline at end of file diff --git a/.qoder/repowiki/en/content/Database Schema/Model Relationships and Eloquent Models.md b/.qoder/repowiki/en/content/Database Schema/Model Relationships and Eloquent Models.md index 9f74e90..6e8332b 100644 --- a/.qoder/repowiki/en/content/Database Schema/Model Relationships and Eloquent Models.md +++ b/.qoder/repowiki/en/content/Database Schema/Model Relationships and Eloquent Models.md @@ -73,24 +73,24 @@ M4 -.enum change.-> RR ``` **Diagram sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) -- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L56) -- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L33) -- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L37) -- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L69) -- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L82) +- [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) +- [AlertConfig.php:8-56](file://Models/AlertConfig.php#L8-L56) +- [AlertDeliveryLog.php:8-33](file://Models/AlertDeliveryLog.php#L8-L33) +- [AuditLog.php:7-37](file://Models/AuditLog.php#L7-L37) +- [AlertConfigObserver.php:8-69](file://Models/Observers/AlertConfigObserver.php#L8-L69) +- [AuditLogService.php:10-82](file://Services/AuditLogService.php#L10-L82) - [2025_01_01_000001_create_ptero_resource_reservations_table.php:11-78](file://database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php#L11-L78) - [2025_01_01_000004_create_ptero_alert_configs_table.php:11-42](file://database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php#L11-L42) - [2025_01_01_000003_create_ptero_audit_logs_table.php:11-47](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L11-L47) - [2026_04_22_000001_drop_released_from_reservation_status.php:8-27](file://database/migrations/2026_04_22_000001_drop_released_from_reservation_status.php#L8-L27) **Section sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) -- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L56) -- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L37) -- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L33) -- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L69) -- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L82) +- [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) +- [AlertConfig.php:8-56](file://Models/AlertConfig.php#L8-L56) +- [AuditLog.php:7-37](file://Models/AuditLog.php#L7-L37) +- [AlertDeliveryLog.php:8-33](file://Models/AlertDeliveryLog.php#L8-L33) +- [AlertConfigObserver.php:8-69](file://Models/Observers/AlertConfigObserver.php#L8-L69) +- [AuditLogService.php:10-82](file://Services/AuditLogService.php#L10-L82) - [2025_01_01_000001_create_ptero_resource_reservations_table.php:11-78](file://database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php#L11-L78) - [2025_01_01_000004_create_ptero_alert_configs_table.php:11-42](file://database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php#L11-L42) - [2025_01_01_000003_create_ptero_audit_logs_table.php:11-47](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L11-L47) @@ -109,11 +109,11 @@ Key behaviors: - AlertConfigObserver writes audit entries on create/update/delete, redacting sensitive webhook URLs before logging. **Section sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) -- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L56) -- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L37) -- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L33) -- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L69) +- [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) +- [AlertConfig.php:8-56](file://Models/AlertConfig.php#L8-L56) +- [AuditLog.php:7-37](file://Models/AuditLog.php#L7-L37) +- [AlertDeliveryLog.php:8-33](file://Models/AlertDeliveryLog.php#L8-L33) +- [AlertConfigObserver.php:8-69](file://Models/Observers/AlertConfigObserver.php#L8-L69) ## Architecture Overview The models interact through relationships and observers to enforce business rules and maintain auditability. @@ -190,12 +190,12 @@ AuditLogService --> "AuditLog" : writes ``` **Diagram sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) -- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L56) -- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L33) -- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L37) -- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L69) -- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L82) +- [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) +- [AlertConfig.php:8-56](file://Models/AlertConfig.php#L8-L56) +- [AlertDeliveryLog.php:8-33](file://Models/AlertDeliveryLog.php#L8-L33) +- [AuditLog.php:7-37](file://Models/AuditLog.php#L7-L37) +- [AlertConfigObserver.php:8-69](file://Models/Observers/AlertConfigObserver.php#L8-L69) +- [AuditLogService.php:10-82](file://Services/AuditLogService.php#L10-L82) ## Detailed Component Analysis @@ -228,7 +228,7 @@ Best practices: - When updating status, ensure idempotency and avoid race conditions using pessimistic locking where appropriate. **Section sources** -- [ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) - [2025_01_01_000001_create_ptero_resource_reservations_table.php:11-78](file://database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php#L11-L78) - [2026_04_22_000001_drop_released_from_reservation_status.php:8-27](file://database/migrations/2026_04_22_000001_drop_released_from_reservation_status.php#L8-L27) - [ReservationService.php:296-330](file://Services/ReservationService.php#L296-L330) @@ -272,9 +272,9 @@ Best practices: - Ensure webhook_url is never exposed in logs or responses; rely on observer redaction. **Section sources** -- [AlertConfig.php:8-57](file://Models/AlertConfig.php#L8-L56) -- [AlertDeliveryLog.php:8-34](file://Models/AlertDeliveryLog.php#L8-L33) -- [AlertConfigObserver.php:8-70](file://Models/Observers/AlertConfigObserver.php#L8-L69) +- [AlertConfig.php:8-56](file://Models/AlertConfig.php#L8-L56) +- [AlertDeliveryLog.php:8-33](file://Models/AlertDeliveryLog.php#L8-L33) +- [AlertConfigObserver.php:8-69](file://Models/Observers/AlertConfigObserver.php#L8-L69) - [2025_01_01_000004_create_ptero_alert_configs_table.php:11-42](file://database/migrations/2025_01_01_000004_create_ptero_alert_configs_table.php#L11-L42) #### AlertConfig Observer Sequence @@ -324,8 +324,8 @@ Best practices: - Use getEntityHistory for UIs showing change timelines. **Section sources** -- [AuditLog.php:7-38](file://Models/AuditLog.php#L7-L37) -- [AuditLogService.php:10-83](file://Services/AuditLogService.php#L10-L82) +- [AuditLog.php:7-37](file://Models/AuditLog.php#L7-L37) +- [AuditLogService.php:10-82](file://Services/AuditLogService.php#L10-L82) - [2025_01_01_000003_create_ptero_audit_logs_table.php:11-47](file://database/migrations/2025_01_01_000003_create_ptero_audit_logs_table.php#L11-L47) ### Common Model Interactions and Best Practices diff --git a/.qoder/repowiki/en/content/Database Schema/Resource Reservations Table.md b/.qoder/repowiki/en/content/Database Schema/Resource Reservations Table.md index 4f0de77..cbadded 100644 --- a/.qoder/repowiki/en/content/Database Schema/Resource Reservations Table.md +++ b/.qoder/repowiki/en/content/Database Schema/Resource Reservations Table.md @@ -58,22 +58,22 @@ RQ --> C **Diagram sources** - [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) -- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) -- [CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L173) -- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L162) -- [ResourceReservationPolicy.php:9-70](file://Policies/ResourceReservationPolicy.php#L9-L69) +- [ReservationService.php:16-453](file://Services/ReservationService.php#L16-L453) +- [ReservationController.php:13-137](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminReservationController.php:9-75](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) +- [CartItemCreatedListener.php:11-173](file://Listeners/CartItemCreatedListener.php#L11-L173) +- [StoreReservationRequest.php:10-162](file://Http/Requests/StoreReservationRequest.php#L10-L162) +- [ResourceReservationPolicy.php:9-69](file://Policies/ResourceReservationPolicy.php#L9-L69) **Section sources** - [2025_01_01_000001_create_ptero_resource_reservations_table.php:11-78](file://database/migrations/2025_01_01_000001_create_ptero_resource_reservations_table.php#L11-L78) - [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) -- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) -- [CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L173) -- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L162) -- [ResourceReservationPolicy.php:9-70](file://Policies/ResourceReservationPolicy.php#L9-L69) +- [ReservationService.php:16-453](file://Services/ReservationService.php#L16-L453) +- [ReservationController.php:13-137](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminReservationController.php:9-75](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) +- [CartItemCreatedListener.php:11-173](file://Listeners/CartItemCreatedListener.php#L11-L173) +- [StoreReservationRequest.php:10-162](file://Http/Requests/StoreReservationRequest.php#L10-L162) +- [ResourceReservationPolicy.php:9-69](file://Policies/ResourceReservationPolicy.php#L9-L69) ## Core Components - Schema and constraints are defined in the initial migration and subsequent migrations that adjust status values and add idempotency support. @@ -89,12 +89,12 @@ RQ --> C - [2026_04_22_000001_drop_released_from_reservation_status.php:8-27](file://database/migrations/2026_04_22_000001_drop_released_from_reservation_status.php#L8-L27) - [2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php:9-31](file://database/migrations/2026_04_23_000001_add_idempotency_key_to_ptero_resource_reservations.php#L9-L31) - [ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) -- [ReservationService.php:16-454](file://Services/ReservationService.php#L16-L453) -- [ReservationController.php:13-138](file://Http/Controllers/Api/ReservationController.php#L13-L137) -- [AdminReservationController.php:9-76](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) -- [CartItemCreatedListener.php:11-174](file://Listeners/CartItemCreatedListener.php#L11-L173) -- [StoreReservationRequest.php:10-163](file://Http/Requests/StoreReservationRequest.php#L10-L162) -- [ResourceReservationPolicy.php:9-70](file://Policies/ResourceReservationPolicy.php#L9-L69) +- [ReservationService.php:16-453](file://Services/ReservationService.php#L16-L453) +- [ReservationController.php:13-137](file://Http/Controllers/Api/ReservationController.php#L13-L137) +- [AdminReservationController.php:9-75](file://Http/Controllers/Api/Admin/AdminReservationController.php#L9-L75) +- [CartItemCreatedListener.php:11-173](file://Listeners/CartItemCreatedListener.php#L11-L173) +- [StoreReservationRequest.php:10-162](file://Http/Requests/StoreReservationRequest.php#L10-L162) +- [ResourceReservationPolicy.php:9-69](file://Policies/ResourceReservationPolicy.php#L9-L69) ## Architecture Overview The reservation lifecycle ensures temporary resource holds until payment completes or TTL expires. Creation uses pessimistic locking to avoid overselling, and idempotency prevents duplicate reservations under concurrent requests. Status transitions are enforced at the service layer with authorization checks via policies. @@ -262,7 +262,7 @@ Authorization: - Supports idempotency_key via header or body **Section sources** -- [StoreReservationRequest.php:12-163](file://Http/Requests/StoreReservationRequest.php#L12-L162) +- [StoreReservationRequest.php:12-162](file://Http/Requests/StoreReservationRequest.php#L12-L162) ### Listener: CartItemCreatedListener - Detects products with dynamic_slider config options diff --git a/.qoder/repowiki/en/content/Getting Started.md b/.qoder/repowiki/en/content/Getting Started.md index d062585..05f33c0 100644 --- a/.qoder/repowiki/en/content/Getting Started.md +++ b/.qoder/repowiki/en/content/Getting Started.md @@ -181,7 +181,7 @@ Expire --> EndExpired["Released back to pool"] **Section sources** - [Services/ReservationService.php:43-141](file://Services/ReservationService.php#L43-L141) - [Services/ReservationService.php:384-405](file://Services/ReservationService.php#L384-L405) -- [Models/ResourceReservation.php:10-66](file://Models/ResourceReservation.php#L10-L65) +- [Models/ResourceReservation.php:10-65](file://Models/ResourceReservation.php#L10-L65) ### Relationship to Paymenter’s Built-in Pterodactyl Server Extension - This extension is a companion enhancement. It handles dynamic sliders, availability, and reservations. diff --git a/.qoder/repowiki/en/content/Testing.md b/.qoder/repowiki/en/content/Testing.md index 5101eea..0ae8a56 100644 --- a/.qoder/repowiki/en/content/Testing.md +++ b/.qoder/repowiki/en/content/Testing.md @@ -69,18 +69,18 @@ U --> AC **Diagram sources** - [phpunit.xml:1-43](file://phpunit.xml#L1-L43) - [tests/bootstrap.php:1-21](file://tests/bootstrap.php#L1-L21) -- [tests/TestCase.php:1-64](file://tests/TestCase.php#L1-L63) +- [tests/TestCase.php:1-63](file://tests/TestCase.php#L1-L63) - [tests/LaravelTestCase.php:1-183](file://tests/LaravelTestCase.php#L1-L183) -- [Services/ReservationService.php:1-454](file://Services/ReservationService.php#L1-L453) +- [Services/ReservationService.php:1-453](file://Services/ReservationService.php#L1-L453) - [Services/ResourceCalculationService.php:1-545](file://Services/ResourceCalculationService.php#L1-L545) -- [Services/AlertService.php:1-393](file://Services/AlertService.php#L1-L392) -- [Models/ResourceReservation.php:1-66](file://Models/ResourceReservation.php#L1-L65) -- [Models/AlertConfig.php:1-57](file://Models/AlertConfig.php#L1-L56) +- [Services/AlertService.php:1-392](file://Services/AlertService.php#L1-L392) +- [Models/ResourceReservation.php:1-65](file://Models/ResourceReservation.php#L1-L65) +- [Models/AlertConfig.php:1-56](file://Models/AlertConfig.php#L1-L56) **Section sources** - [phpunit.xml:1-43](file://phpunit.xml#L1-L43) - [tests/bootstrap.php:1-21](file://tests/bootstrap.php#L1-L21) -- [tests/TestCase.php:1-64](file://tests/TestCase.php#L1-L63) +- [tests/TestCase.php:1-63](file://tests/TestCase.php#L1-L63) - [tests/LaravelTestCase.php:1-183](file://tests/LaravelTestCase.php#L1-L183) ## Core Components @@ -91,11 +91,11 @@ Key components under test: - Models: ResourceReservation and AlertConfig define data contracts and scopes used by services. **Section sources** -- [Services/ReservationService.php:1-454](file://Services/ReservationService.php#L1-L453) +- [Services/ReservationService.php:1-453](file://Services/ReservationService.php#L1-L453) - [Services/ResourceCalculationService.php:1-545](file://Services/ResourceCalculationService.php#L1-L545) -- [Services/AlertService.php:1-393](file://Services/AlertService.php#L1-L392) -- [Models/ResourceReservation.php:1-66](file://Models/ResourceReservation.php#L1-L65) -- [Models/AlertConfig.php:1-57](file://Models/AlertConfig.php#L1-L56) +- [Services/AlertService.php:1-392](file://Services/AlertService.php#L1-L392) +- [Models/ResourceReservation.php:1-65](file://Models/ResourceReservation.php#L1-L65) +- [Models/AlertConfig.php:1-56](file://Models/AlertConfig.php#L1-L56) ## Architecture Overview The testing architecture isolates external dependencies and enforces deterministic environments: @@ -251,9 +251,9 @@ Key test patterns: - Assert AlertDeliveryFailed event dispatch when all channels fail. **Section sources** -- [tests/Unit/AlertServiceTest.php:1-771](file://tests/Unit/AlertServiceTest.php#L1-L770) +- [tests/Unit/AlertServiceTest.php:1-770](file://tests/Unit/AlertServiceTest.php#L1-L770) - [Services/AlertService.php:33-248](file://Services/AlertService.php#L33-L248) -- [Models/AlertConfig.php:1-57](file://Models/AlertConfig.php#L1-L56) +- [Models/AlertConfig.php:1-56](file://Models/AlertConfig.php#L1-L56) ### Feature Tests for API Endpoints Focus areas: @@ -291,7 +291,7 @@ Key test patterns: - Assert throttling behavior at both guest IP and user levels. **Section sources** -- [tests/Feature/ReservationApiTest.php:1-491](file://tests/Feature/ReservationApiTest.php#L1-L490) +- [tests/Feature/ReservationApiTest.php:1-490](file://tests/Feature/ReservationApiTest.php#L1-L490) - [tests/Feature/AvailabilityApiTest.php:1-95](file://tests/Feature/AvailabilityApiTest.php#L1-L95) ## Dependency Analysis From a9e5b25e257b812ddd74446c610cf689bd0ea69b Mon Sep 17 00:00:00 2001 From: Jordan <164892154+Jordanmuss99@users.noreply.github.com> Date: Tue, 18 Aug 2026 00:32:56 +1000 Subject: [PATCH 30/30] docs: normalize qoder whitespace --- .qoder/repowiki/en/content/Testing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qoder/repowiki/en/content/Testing.md b/.qoder/repowiki/en/content/Testing.md index 0ae8a56..2247f18 100644 --- a/.qoder/repowiki/en/content/Testing.md +++ b/.qoder/repowiki/en/content/Testing.md @@ -111,7 +111,7 @@ sequenceDiagram participant L as "LaravelTestCase" participant S as "Service Under Test" participant E as "External System" - + T->>B: "Load bootstrap" B-->>T: "Guard DB name; require base classes" T->>L: "createApplication()"