
# PHP API

Všetko v Queuety je dostupné cez statickú triedu `Queuety\Queuety`. Je jediným vstupným bodom na odosielanie úloh, vytváranie pracovných postupov, riadenie stavových automatov, správu frontov a prístup k interným subsystémom.

```php
use Queuety\Queuety;
```

## Samostatný prístup k jadru

Behové prostredie Queuety založené na databáze možno inicializovať mimo WordPress.

Táto samostatná cesta slúži jadru orchestrace:

- úlohy a pracovníci (skupiny pracovníkov potrebujú aj konštanty `DB_HOST`, `DB_NAME`, `DB_USER` a `DB_PASSWORD`; pozri nižšie)
- pracovné postupy a signály
- stavové automaty a udalosti
- artefakty, záznamy, metriky a plánovače

Nenahrádza adaptér WordPress. `Queuety::on_action()`,
`replace_wp_cron()`, inicializácia doplnku a skutočná cesta registrácie `wp queuety ...`
stále vyžadujú WordPress.

### `Queuety::init( Connection $conn )`

Inicializujte Queuety priamym pripojením k databáze.

```php
use Queuety\Connection;
use Queuety\Queuety;

$conn = new Connection(
    host: '127.0.0.1:3306',
    dbname: 'wordpress',
    user: 'root',
    password: 'secret',
    prefix: 'wp_',
);

Queuety::init( $conn );
```

Voliteľný argument `table_prefix` mení časť názvov runtime tabuliek Queuety pre každé pripojenie:

```php
$conn = new Connection(
    host: '127.0.0.1:3306',
    dbname: 'wordpress',
    user: 'root',
    password: 'secret',
    prefix: 'wp_',
    table_prefix: 'themequeue_',
);
```

Tým sa názvy tabuliek, napríklad `queuety_jobs`, prevedú na `wp_themequeue_jobs`.

### `Queuety::ensure_schema()`

Uistite sa, že pre aktívne pripojenie existujú runtime tabuľky Queuety.

```php
Queuety::init( $conn );
Queuety::ensure_schema();
```

Úplný model a hranice WordPress nájdete v časti [Samostatné použitie](https://queuety.inline0.dev/sk/docs/features/standalone-use).

## Úlohy

### `Queuety::dispatch( $handler, $payload )`

Odošle úlohu. Prijíma buď reťazec s názvom obslužnej funkcie, alebo inštanciu `Contracts\Job`. Vráti zostavovač `PendingJob` na reťazenie možností.

```php
// Handler name + payload (original API)
Queuety::dispatch( 'send_email', [ 'to' => 'user@example.com' ] );

// Contracts\Job instance (v0.6.0+)
Queuety::dispatch( new SendEmailJob( to: 'user@example.com' ) );

// With options
Queuety::dispatch( 'send_email', [ 'to' => 'user@example.com' ] )
    ->on_queue( 'emails' )
    ->with_priority( Priority::High )
    ->delay( 300 )
    ->max_attempts( 5 )
    ->rate_limit( 10, 60 )
    ->unique()
    ->after( $other_job_id );

// Get the job ID
$job_id = Queuety::dispatch( 'send_email', $payload )->id();
```

Keď sa odovzdá inštancia `Contracts\Job`, serializátor použije FQCN ako názov obslužnej funkcie a verejné vlastnosti ako údaje. Parameter `$payload` sa ignoruje, ak je `$handler` inštanciou `Job`.

### Metódy `PendingJob`

| Metóda | Opis |
|---|---|
| `on_queue( string $queue )` | Nastaví cieľový front |
| `with_priority( Priority $priority )` | Nastaví úroveň priority |
| `delay( int $seconds )` | Čas, po ktorom bude úloha dostupná |
| `max_attempts( int $max )` | Maximálny počet pokusov o opakovanie |
| `rate_limit( int $max, int $window )` | Obmedzenie frekvencie: maximum vykonaní za počet sekúnd intervalu |
| `unique()` | Zabráni duplicitnému odoslaniu |
| `after( int $job_id )` | Počká, kým sa najprv dokončí iná úloha |
| `concurrency_group( string $group, int $limit )` | Zaradí úlohu do zdieľanej skupiny na prijímanie pracovníkov |
| `cost_units( int $units )` | Pripojí k odoslaniu metadáta o relatívnej náročnosti vykonania |
| `id()` | Vynúti odoslanie a vráti ID úlohy |

`concurrency_group()` a `cost_units()` sú súčasťou širšieho modelu [Správa zdrojov](https://queuety.inline0.dev/sk/docs/features/resource-management), takže to isté odoslanie môže podliehať limitom súbežnosti podľa počtu, váženým rozpočtom frontu alebo poskytovateľa a heuristikám prijímania pracovníkov.

### `Queuety::dispatch_sync( $handler, $payload )`

Vykoná úlohu synchrónne v aktuálnom procese bez pridania do frontu.

```php
// With a Job instance
Queuety::dispatch_sync( new SendEmailJob( to: 'user@example.com', subject: 'Hi', body: 'Hello' ) );

// With a handler name and payload
Queuety::dispatch_sync( 'send_email', [ 'to' => 'user@example.com' ] );
```

Metóda `handle()` úlohy sa zavolá priamo. Nevytvorí sa žiadny riadok v databáze, nepoužije sa pracovník a neuplatní sa middleware.

### `Queuety::batch( $jobs )`

Odošle viacero úloh jediným viacriadkovým príkazom INSERT.

```php
$job_ids = Queuety::batch( [
    [ 'handler' => 'send_email', 'payload' => [ 'to' => 'a@example.com' ], 'queue' => 'emails' ],
    [ 'handler' => 'send_email', 'payload' => [ 'to' => 'b@example.com' ], 'priority' => 2 ],
] );
```

### `Queuety::create_batch( $jobs )`

Vytvorí `BatchBuilder` na odosielanie skupiny úloh so spätnými volaniami a sledovaním priebehu. Podrobnosti nájdete v časti [Dávkové spracovanie](https://queuety.inline0.dev/sk/docs/features/batching).

```php
$batch = Queuety::create_batch( [
    new ImportUsersJob( $chunk_1 ),
    new ImportUsersJob( $chunk_2 ),
] )
    ->name( 'Import users' )
    ->then( ImportCompleteHandler::class )
    ->catch( ImportFailedHandler::class )
    ->finally( ImportCleanupHandler::class )
    ->allow_failures()
    ->on_queue( 'imports' )
    ->dispatch();
```

### Metódy `BatchBuilder`

| Metóda | Vráti | Opis |
|---|---|---|
| `name( string $name )` | `self` | Nastaví názov dávky |
| `on_queue( string $queue )` | `self` | Nastaví front pre všetky úlohy v dávke |
| `then( string $handler_class )` | `self` | Obslužná funkcia volaná po úspešnom dokončení dávky |
| `catch( string $handler_class )` | `self` | Obslužná funkcia volaná pri zlyhaní prvej úlohy v dávke |
| `finally( string $handler_class )` | `self` | Obslužná funkcia volaná po dokončení dávky (úspešnom alebo neúspešnom) |
| `allow_failures()` | `self` | Umožní spustenie spätného volania `then` aj pri zlyhaniach |
| `dispatch()` | `Batch` | Vytvorí riadok dávky a všetky úlohy, vráti objekt s hodnotou `Batch` |

### `Queuety::find_batch( $id )`

Vyhľadá dávku podľa ID. Vráti objekt s hodnotou `Batch` alebo `null`.

```php
$batch = Queuety::find_batch( $batch_id );

if ( null !== $batch ) {
    echo $batch->progress() . '% complete';
}
```

## Riadenie pracovníkov

### `Queuety::run_worker( $queue = 'default', $once = false )`

Spustí priamo jednu slučku pracovníka.

```php
Queuety::run_worker( 'default' );
Queuety::run_worker( 'critical,default', true );
```

### `Queuety::run_worker_pool( $workers, $queue = 'default' )`

Spustí priamo skupinu pracovníkov s pevnou veľkosťou. Vyžaduje rozšírenia `pcntl` a `posix`. Skupina pre pripojenia svojich podprocesov načítava konštanty WordPress, `DB_HOST`, `DB_NAME`, `DB_USER` a `DB_PASSWORD` (z inicializovaného pripojenia preberá iba predpony tabuliek), preto ich definujte pri spustení skupiny mimo WordPress ([#5](https://github.com/inline0/queuety/issues/5)).

```php
Queuety::run_worker_pool( 4, 'providers' );
```

### `Queuety::run_auto_scaling_worker_pool( $min_workers, $max_workers, $queue = 'default' )`

Spustí priamo adaptívnu skupinu pracovníkov. Platí rovnaké požiadavky ako pre `run_worker_pool()`.

```php
Queuety::run_auto_scaling_worker_pool( 2, 6, 'providers' );
```

### Objekt s hodnotou `Batch`

| Metóda/vlastnosť | Typ | Opis |
|---|---|---|
| `$id` | `int` | ID dávky |
| `$name` | `string\|null` | Voliteľný názov dávky |
| `$total_jobs` | `int` | Celkový počet úloh v dávke |
| `$pending_jobs` | `int` | Zostávajúce čakajúce úlohy |
| `$failed_jobs` | `int` | Počet neúspešných úloh |
| `$failed_job_ids` | `array` | ID neúspešných úloh |
| `$created_at` | `DateTimeImmutable` | Čas vytvorenia dávky |
| `$finished_at` | `DateTimeImmutable\|null` | Čas dokončenia dávky |
| `$cancelled_at` | `DateTimeImmutable\|null` | Čas zrušenia dávky |
| `progress()` | `int` | Percento dokončenia (0 – 100) |
| `finished()` | `bool` | Či je dávka dokončená |
| `has_failures()` | `bool` | Či zlyhala niektorá úloha |
| `cancelled()` | `bool` | Či bola dávka zrušená |

### `Queuety::chain( $jobs )`

Vytvorí `ChainBuilder` na postupné vykonávanie úloh. Každá úloha závisí od úspešného dokončenia predchádzajúcej.

```php
$first_job_id = Queuety::chain( [
    new FetchDataJob( $url ),
    new ProcessDataJob(),
    new NotifyCompleteJob(),
] )
    ->on_queue( 'pipeline' )
    ->catch( ChainFailedHandler::class )
    ->dispatch();
```

### Metódy `ChainBuilder`

| Metóda | Vráti | Opis |
|---|---|---|
| `on_queue( string $queue )` | `self` | Nastaví front pre všetky úlohy v reťazci |
| `catch( string $handler_class )` | `self` | Obslužná funkcia volaná, keď je niektorá úloha v reťazci natrvalo presunutá do úložiska neúspešných úloh |
| `dispatch()` | `int` | Vytvorí všetky úlohy so sekvenčnými závislosťami a vráti ID prvej úlohy |

### `Queuety::retry( $job_id )`

Zopakuje konkrétnu úlohu a obnoví jej stav na `pending`.

```php
Queuety::retry( 42 );
```

### `Queuety::retry_buried()`

Zopakuje všetky úlohy presunuté do úložiska neúspešných úloh. Vráti počet zopakovaných úloh.

```php
$count = Queuety::retry_buried();
```

### `Queuety::purge( $older_than_days )`

Odstráni dokončené úlohy. Vráti počet odstránených úloh.

```php
$count = Queuety::purge();     // uses QUEUETY_RETENTION_DAYS
$count = Queuety::purge( 30 ); // purge jobs older than 30 days
```

## Fronty

### `Queuety::stats( $queue )`

Získa počty úloh zoskupené podľa stavu.

```php
$stats = Queuety::stats();          // all queues
$stats = Queuety::stats( 'emails' ); // specific queue
// ['pending' => 12, 'processing' => 3, 'completed' => 150, 'failed' => 2, 'buried' => 1]
```

### `Queuety::buried( $queue )`

Získa všetky úlohy presunuté do úložiska neúspešných úloh.

```php
$jobs = Queuety::buried();
$jobs = Queuety::buried( 'emails' );
```

### `Queuety::pause( $queue )`

Pozastaví front, aby ho pracovníci preskakovali.

```php
Queuety::pause( 'emails' );
```

### `Queuety::resume( $queue )`

Obnoví pozastavený front.

```php
Queuety::resume( 'emails' );
```

### `Queuety::is_paused( $queue )`

Skontroluje, či je front pozastavený.

```php
if ( Queuety::is_paused( 'emails' ) ) {
    // Queue is paused
}
```

## Pracovné postupy

### `Queuety::workflow( $name )`

Začne vytvárať pracovný postup. Vráti `WorkflowBuilder`.

```php
$workflow_id = Queuety::workflow( 'generate_report' )
    ->then( FetchDataHandler::class )
    ->then( CallLLMHandler::class )
    ->then( FormatOutputHandler::class )
    ->dispatch( [ 'user_id' => 42 ] );
```

### Metódy `WorkflowBuilder`

| Metóda | Opis |
|---|---|
| `then( string $handler_class, ?string $name = null )` | Pridá sekvenčný krok. Voliteľný názov umožňuje podmienené vetvenie. |
| `parallel( array $handler_classes )` | Pridá skupinu paralelných krokov. |
| `for_each( string $items_key, string $handler_class, ?string $result_key = null, ForEachMode $mode = ForEachMode::All, ?int $quorum = null, ?string $reducer_class = null, ?string $name = null )` | Pridá dynamický krok for-each, ktorý v stave pracovného postupu vytvorí jednu vetviacu úlohu pre každú položku. |
| `repeat_while( string $target_step, ?string $state_key = null, mixed $expected = true, ?string $name = null, ?string $condition_class = null, ?int $max_iterations = null )` | Vráti sa k predchádzajúcemu pomenovanému kroku, kým sa nezhoduje verejný kľúč stavu alebo trieda `RepeatCondition`. |
| `repeat_until( string $target_step, ?string $state_key = null, mixed $expected = true, ?string $name = null, ?string $condition_class = null, ?int $max_iterations = null )` | Vráti sa k predchádzajúcemu pomenovanému kroku, kým sa nezhoduje verejný kľúč stavu alebo trieda `RepeatCondition`. |
| `run_workflow( string $workflow_name, WorkflowBuilder $sub_builder )` | Pridá krok na spustenie pracovného postupu. |
| `delay( int $seconds = 0, int $minutes = 0, int $hours = 0, int $days = 0 )` | Pridá trvalý krok čakania. Sčítajú sa všetky trvania. |
| `wait_for_signal( string $name, ?string $result_key = null, ?string $step_name = null, array $match_payload = [], ?string $correlation_key = null )` | Pridá krok čakania na signál. Voliteľné `match_payload` a `correlation_key` umožňujú ignorovať nesúvisiace udalosti. |
| `wait_for_signals( array $signal_names, WaitMode $mode = WaitMode::All, ?string $result_key = null, ?string $name = null, array $match_payload = [], ?string $correlation_key = null )` | Čaká na všetky alebo ľubovoľné z viacerých signálov; umožňuje voliteľné porovnávanie údajov a koreláciu. |
| `wait_for_approval( string $signal_name = 'approval', ?string $result_key = 'approval', ?string $name = null, array $match_payload = [], ?string $correlation_key = null )` | Čaká na signál schválenia od človeka. |
| `wait_for_decision( string $approve_signal = 'approved', string $reject_signal = 'rejected', ?string $result_key = 'decision', ?string $name = null, array $match_payload = [], ?string $correlation_key = null )` | Čaká na schválenie alebo zamietnutie a uloží štruktúrované údaje o rozhodnutí. |
| `wait_for_input( string $signal_name = 'input', ?string $result_key = 'input', ?string $name = null, array $match_payload = [], ?string $correlation_key = null )` | Čaká na signál s ľudským vstupom. |
| `wait_for_workflow( int\|string $workflow, ?string $result_key = null, ?string $name = null )` | Čaká na dokončenie jedného pracovného postupu alebo pracovného postupu, ktorého ID je uložené vo verejnom stave. |
| `wait_for_workflows( array\|string $workflows, WaitMode $mode = WaitMode::All, ?string $result_key = null, ?string $name = null, ?int $quorum = null )` | Čaká na dokončenie všetkých, ľubovoľných alebo kvóra viacerých pracovných postupov. |
| `wait_for_workflow_group( string $group_key, WaitMode $mode = WaitMode::All, ?int $quorum = null, ?string $result_key = null, ?string $name = null )` | Čaká na už spustenú skupinu pracovných postupov podľa interného kľúča skupiny. |
| `start_workflows( string $items_key, WorkflowBuilder $workflow_builder, string $result_key = 'started_workflow_ids', string $payload_key = 'item', bool $inherit_state = true, ?string $name = null, ?string $group_key = null )` | Odoslať jeden pracovný postup najvyššej úrovne pre každú položku za behu a voliteľne označiť spustenú skupinu trvalým kľúčom skupiny. |
| `start_agents( string $items_key, WorkflowBuilder $workflow_builder, string $result_key = 'agent_workflow_ids', string $payload_key = 'agent_task', bool $inherit_state = true, ?string $name = null, ?string $group_key = null )` | Alias orientovaný na agentov pre `start_workflows()`. |
| `wait_for_agents( array\|string $workflows = 'agent_workflow_ids', WaitMode $mode = WaitMode::All, ?string $result_key = 'agent_results', ?string $name = null, ?int $quorum = null )` | Alias orientovaný na agentov pre `wait_for_workflows()`. |
| `wait_for_agent_group( string $group_key = 'agents', WaitMode $mode = WaitMode::All, ?int $quorum = null, ?string $result_key = 'agent_results', ?string $name = null )` | Alias orientovaný na agentov pre `wait_for_workflow_group()`. |
| `version( string $version )` | Označiť definíciu pracovného postupu verziou na úrovni aplikácie, aby ju bolo možné kontrolovať a exportovať. |
| `idempotency_key( string $key )` | Zabezpečiť trvalé odoslanie pracovného postupu pre kľúč zadaný volajúcim. Opätovné odoslanie s rovnakým kľúčom vráti pôvodné ID pracovného postupu. |
| `max_transitions( int $max )` | Zlyhať pracovný postup, ak sa dokončí viac než `$max` prechodov krokov. |
| `max_for_each_items( int $max )` | Zlyhať pracovný postup, ak sa krok `for_each()` pokúsi rozšíriť na viac než `$max` položiek. |
| `max_state_bytes( int $bytes )` | Zlyhať pracovný postup, ak verejný stav prekročí veľkosť `$bytes`. |
| `max_cost_units( int $max )` | Zlyhať pracovný postup, ak dokončené kroky spotrebujú viac než `$max` jednotiek nákladov. |
| `max_started_workflows( int $max )` | Zlyhať pracovný postup pred odoslaním viac než `$max` podriadených pracovných postupov. |
| `compensate_with( string $handler_class )` | Pripojiť obslužnú rutinu kompenzácie k naposledy pridanému kroku. |
| `compensate_on_failure()` | Pri zlyhaní pracovného postupu automaticky spustiť kompenzácie dokončených krokov. |
| `on_queue( string $queue )` | Nastaviť front pre všetky kroky. |
| `with_priority( Priority $priority )` | Nastaviť prioritu všetkých krokov. |
| `max_attempts( int $max )` | Nastaviť maximálny počet opakovaní pre každý krok. |
| `on_cancel( string $handler_class )` | Zaregistrovať triedu obslužnej rutiny na čistenie pri zrušení. Podrobnosti nájdete v časti [Zrušenie](https://queuety.inline0.dev/sk/docs/workflows/cancellation). |
| `prune_state_after( int $steps = 2 )` | Povoliť automatické orezávanie stavu. Odstráni výstupy krokov staršie než stanovený limit. Pozrite si časť [Orezávanie stavu](https://queuety.inline0.dev/sk/docs/features/state-pruning). |
| `must_complete_within( int $seconds = 0, int $minutes = 0, int $hours = 0, int $days = 0 )` | Nastaviť časový limit pracovného postupu. Sčítajú sa všetky trvania. Pozrite si časť [Časové limity](https://queuety.inline0.dev/sk/docs/workflows/deadlines). |
| `on_deadline( string $handler_class )` | Zaregistrovať obslužnú rutinu, ktorá sa zavolá po prekročení časového limitu pracovného postupu. Pozrite si časť [Časové limity](https://queuety.inline0.dev/sk/docs/workflows/deadlines). |
| `dispatch( array $initial_payload = [] )` | Odoslať pracovný postup. Vráti jeho ID. |

### `Queuety::workflow_status( $workflow_id )`

Získať stav pracovného postupu. Vráti objekt `WorkflowState` alebo `null`.

```php
$state = Queuety::workflow_status( $workflow_id );
echo $state->name;          // 'generate_report'
echo $state->status->value; // 'running'
echo $state->current_step;  // 1
echo $state->total_steps;   // 3
print_r( $state->state );   // accumulated public state array
echo $state->wait_type;     // 'signal' or 'workflow' while blocked
echo $state->wait_mode;     // 'all', 'any', or 'quorum'
echo $state->definition_version; // 'research.v2'
echo $state->definition_hash;    // '4c7a...'
echo $state->idempotency_key;    // 'brief:42:research'
echo $state->artifact_count;     // 2
print_r( $state->budget );       // configured workflow budget + current usage
print_r( $state->wait_details ); // matched/remaining blockers, result key, correlation info
print_r( $state->artifact_keys ); // ['draft', 'citations']
```

`WorkflowState` navyše sprístupňuje:

- `waiting_for`: názvy signálov alebo ID pracovných postupov, ktoré momentálne blokujú beh
- `current_step_name`: nakonfigurovaný názov aktuálneho kroku, ak je nastavený
- `wait_mode`: aktuálny režim čakania (`all`, `any` alebo `quorum`) počas blokovania
- `wait_details`: ďalšie údaje na kontrolu, napríklad počet zodpovedajúcich a zostávajúcich blokujúcich položiek
- `definition_version`: hodnota nastavená pomocou `version()`, ak je nastavená
- `definition_hash`: deterministický hash definície pracovného postupu
- `idempotency_key`: trvalý kľúč odoslania, ak je nastavený
- `budget`: nakonfigurované limity a aktuálne využitie, ak sú zapnuté ochranné limity
- `artifact_count`: počet uložených artefaktov pracovného postupu
- `artifact_keys`: kľúče uložených artefaktov na rýchlu kontrolu

### `Queuety::retry_workflow( $workflow_id )`

Zopakovať neúspešný pracovný postup od kroku, pri ktorom zlyhal.

```php
Queuety::retry_workflow( $workflow_id );
```

Vyvolá `RuntimeException`, ak už bol pracovný postup po zlyhaní kompenzovaný.

### `Queuety::pause_workflow( $workflow_id )`

Pozastaviť spustený pracovný postup. Práca aktuálneho kroku, ktorá už bola zaradená do frontu, sa môže dokončiť, ale ďalšie kroky sa nezaradia do frontu, kým pracovný postup neobnovíte.

```php
Queuety::pause_workflow( $workflow_id );
```

### `Queuety::resume_workflow( $workflow_id )`

Obnoviť pozastavený pracovný postup.

```php
Queuety::resume_workflow( $workflow_id );
```

### `Queuety::cancel_workflow( $workflow_id )`

Zrušiť pracovný postup a spustiť všetky zaregistrované obslužné rutiny na čistenie. Nastaví stav na `cancelled` a odloží všetky čakajúce aj spracúvané úlohy pracovného postupu.

```php
Queuety::cancel_workflow( $workflow_id );
```

Vyvolá `RuntimeException`, ak je pracovný postup už v stave `completed` alebo `cancelled`. Podrobnosti nájdete v časti [Zrušenie](https://queuety.inline0.dev/sk/docs/workflows/cancellation).

### `Queuety::rewind_workflow( $workflow_id, $to_step )`

Vrátiť pracovný postup na predchádzajúci krok a spustiť ho znova odtiaľ. Stav sa obnoví zo záznamu udalostí `state_after` pre daný krok a nasledujúci krok sa zaradí do frontu.

```php
Queuety::rewind_workflow( $workflow_id, to_step: 1 );
```

Vyvolá `RuntimeException`, ak pre cieľový krok neexistuje zaznamenaný stav. Vyžaduje [Záznam udalostí pracovného postupu](https://queuety.inline0.dev/sk/docs/workflows/event-log). Podrobnosti nájdete v časti [Cestovanie v čase](https://queuety.inline0.dev/sk/docs/workflows/time-travel).

### `Queuety::fork_workflow( $workflow_id )`

Vytvoriť z bežiaceho pracovného postupu nezávislú kópiu v jeho aktuálnom stave. Vráti ID nového pracovného postupu.

```php
$forked_id = Queuety::fork_workflow( $workflow_id );
```

Rozvetvený pracovný postup má vlastné ID a funguje nezávisle od pôvodného. Podrobnosti nájdete v časti [Vetvenie](https://queuety.inline0.dev/sk/docs/workflows/forking).

### `Queuety::export_workflow( $workflow_id )`

Exportovať úplnú históriu vykonávania pracovného postupu ako pole serializovateľné vo formáte JSON. Zahŕňa záznam pracovného postupu, všetky úlohy, udalosti pracovného postupu a záznamy v protokole.

```php
$data = Queuety::export_workflow( $workflow_id );
```

Štruktúru JSON a prípady použitia nájdete v časti [Export a opätovné prehratie](https://queuety.inline0.dev/sk/docs/workflows/export-replay).

### `Queuety::replay_workflow( $data )`

Opätovne prehrať exportovaný pracovný postup v aktuálnom prostredí. Z exportovaných údajov vytvorí nový pracovný postup a vráti jeho ID.

```php
$new_id = Queuety::replay_workflow( $data );
```

Podrobnosti nájdete v časti [Export a opätovné prehratie](https://queuety.inline0.dev/sk/docs/workflows/export-replay).

### `Queuety::replace_wp_cron()`

Nahradiť vstavaný systém WordPress cron plánovačom od Queuety. Zachytáva `wp_schedule_event()`, `wp_unschedule_event()` a `wp_get_scheduled_event()` a smeruje opakujúce sa udalosti cez pracovníka Queuety.

```php
Queuety::replace_wp_cron();
```

Funguje iba po načítaní WordPress. Podrobnosti nájdete v časti [WP-CronNáhrada](https://queuety.inline0.dev/sk/docs/features/wp-cron).

### `Queuety::restore_wp_cron()`

Obnoviť predvolené správanie WordPress cron odstránením prepojovacích hákov Queuety cron.

```php
Queuety::restore_wp_cron();
```

Obmedzenia nájdete v časti [WP-CronNáhrada](https://queuety.inline0.dev/sk/docs/features/wp-cron).

### `Queuety::signal( $workflow_id, $name, $data )`

Odoslať signál pracovného postupu. Ak pracovný postup práve čaká na tento signál, okamžite sa obnoví. V opačnom prípade sa signál uloží a spracuje, keď pracovný postup dospeje k zodpovedajúcemu kroku `wait_for_signal`.

```php
Queuety::signal( $workflow_id, 'approved' );

// With data merged into workflow state
Queuety::signal( $workflow_id, 'approved', [
    'approved_by' => 'admin@example.com',
] );
```

Podrobnosti nájdete v časti [Signály pracovného postupu](https://queuety.inline0.dev/sk/docs/workflows/signals).

### `Queuety::approve_workflow( $workflow_id, $data = [], $signal_name = 'approval' )`

Sémantický obal okolo `signal()` pre schvaľovacie postupy.

```php
Queuety::approve_workflow( $workflow_id, [
    'reviewer' => 'editor@example.com',
] );
```

### `Queuety::reject_workflow( $workflow_id, $data = [], $signal_name = 'rejected' )`

Sémantický obal okolo `signal()` pre zamietacie postupy.

```php
Queuety::reject_workflow( $workflow_id, [
    'reason' => 'needs citations',
] );
```

### `Queuety::submit_workflow_input( $workflow_id, $data = [], $signal_name = 'input' )`

Sémantický obal okolo `signal()` pre štruktúrovaný vstup od používateľa.

```php
Queuety::submit_workflow_input( $workflow_id, [
    'notes' => 'Ship after legal review',
] );
```

### `Queuety::put_artifact( $workflow_id, $artifact_key, $content, $kind = 'json', $step_index = null, $metadata = [] )`

Uložiť jeden trvalý artefakt pracovného postupu.

```php
Queuety::put_artifact(
    $workflow_id,
    'research_brief',
    [ 'summary' => 'done' ],
    'json',
    metadata: [ 'source' => 'agent' ],
);
```

### `Queuety::put_current_artifact( $artifact_key, $content, $kind = 'json', $metadata = [] )`

Uložiť jeden artefakt pre práve vykonávaný krok pracovného postupu.

```php
Queuety::put_current_artifact(
    'draft',
    [ 'status' => 'ready' ],
    'json',
);
```

### `Queuety::workflow_artifact( $workflow_id, $artifact_key )`

Načítať jeden uložený artefakt pracovného postupu.

```php
$artifact = Queuety::workflow_artifact( $workflow_id, 'draft' );
```

### `Queuety::workflow_artifacts( $workflow_id, $include_content = false )`

Zobraziť zoznam artefaktov pracovného postupu.

```php
$artifacts = Queuety::workflow_artifacts( $workflow_id );
```

### `Queuety::delete_workflow_artifact( $workflow_id, $artifact_key )`

Odstrániť jeden artefakt pracovného postupu.

```php
Queuety::delete_workflow_artifact( $workflow_id, 'draft' );
```

## Stavové automaty

### `Queuety::machine( $name )`

Začať vytvárať stavový automat. Vráti objekt `StateMachineBuilder`.

```php
use Queuety\Enums\StateMachineStatus;

$machine_id = Queuety::machine( 'agent_session' )
    ->state( 'awaiting_user' )
    ->on( 'user_message', 'planning' )
    ->state( 'planning' )
    ->action( PlanSessionAction::class )
    ->on( 'planned', 'completed' )
    ->state( 'completed', StateMachineStatus::Completed )
    ->dispatch( [ 'thread_id' => 42 ] );
```

### Metódy `StateMachineBuilder`

| Metóda | Popis |
|---|---|
| `initial( string $state_name )` | Explicitne nastaviť počiatočný stav. |
| `state( string $state_name, ?StateMachineStatus $terminal_status = null )` | Začať konfigurovať jeden stav. |
| `action( string\|array $action_class )` | Zaregistrovať akciu vstupu do aktuálneho stavu, ktorá sa zaradí do frontu. Zadajte názov triedy alebo štruktúrovanú definíciu s položkami `class`, `payload` a `config`; `payload` dosiahne `StateAction::handle()` ako `$payload`. |
| `on( string $event, string $target, string\|array\|null $guard_class = null, ?string $name = null )` | Zaregistrovať jeden prechod udalosti z aktuálneho stavu. Podmienka prijíma rovnaký štruktúrovaný formát ako `action()`. |
| `on_queue( string $queue )` | Nastaviť front používaný pre akcie stavov zaraďované do frontu. |
| `with_priority( Priority $priority )` | Nastaviť prioritu akcií stavov zaraďovaných do frontu. |
| `max_attempts( int $max_attempts )` | Nastaviť limit opakovaní akcií stavov zaraďovaných do frontu. |
| `version( string $version )` | Označiť definíciu automatu verziou na úrovni aplikácie. |
| `idempotency_key( string $key )` | Zabezpečiť trvalé odoslanie pre kľúč zadaný volajúcim. Opätovné odoslanie s rovnakým kľúčom vráti pôvodné ID automatu. |
| `dispatch( array $initial_state = [] )` | Odoslať automat a vrátiť jeho ID. |

Triedy akcií pri vstupe do stavu môžu sprístupňovať aj voliteľnú metódu `config()` s rovnakými kľúčmi pravidiel pre zdroje, aké podporujú kroky pracovného postupu: `concurrency_group`, `concurrency_limit` a `cost_units`.

### `Queuety::dispatch_state_machine_definition( $definition, $initial_state = [], $options = [] )`

Odoslať serializovaný balík definície stavového automatu. Vo väčšine aplikačného kódu sa uprednostňuje `machine()->dispatch()`. Táto nízkoúrovňová metóda umožňuje adaptérom spustiť automat bez priamej závislosti od nástroja na jeho vytváranie.

```php
$machine_id = Queuety::dispatch_state_machine_definition(
    $definition,
    [ 'thread_id' => 42 ],
    [ 'idempotency_key' => 'thread:42' ],
);
```

### `Queuety::machine_status( $machine_id )`

Získať aktuálny stav automatu. Vráti objekt `StateMachineState` alebo `null`.

```php
$status = Queuety::machine_status( $machine_id );

echo $status->name;               // 'agent_session'
echo $status->status->value;      // 'waiting_event'
echo $status->current_state;      // 'awaiting_review'
print_r( $status->state );        // public machine state
print_r( $status->available_events ); // valid incoming events in the current state
```

`StateMachineState` navyše sprístupňuje:

- `definition_version`
- `definition_hash`
- `idempotency_key`
- `error_message`
- `current_action`
- `terminal_status`

### `Queuety::machine_event( $machine_id, $event_name, $payload = [] )`

Odoslať externú udalosť čakajúcemu automatu.

```php
Queuety::machine_event(
    $machine_id,
    'approve',
    [
        'approved' => true,
        'reviewer' => 'editor@example.com',
    ]
);
```

Údaje udalosti sú dostupné podmienkam prechodu a po prijatí udalosti sa zlúčia s verejným stavom automatu.

### `Queuety::list_machines( $limit = 50, $status = null )`

Zobraziť zoznam trvalo uložených záznamov automatov na kontrolu.

```php
$machines = Queuety::list_machines();
$waiting  = Queuety::list_machines( status: 'waiting_event' );
```

Každý záznam obsahuje ID automatu, názov, stav, aktuálny stavový uzol,
verziu definície, hash definície, idempotency kľúč a časové pečiatky životného cyklu.

### `Queuety::machine_timeline( $machine_id, $limit = 100, $offset = 0 )`

Získať trvalú časovú os udalostí jedného automatu.

```php
$timeline = Queuety::machine_timeline( $machine_id );
$page_two = Queuety::machine_timeline( $machine_id, 100, 100 );
```

Každý záznam udalosti obsahuje: `id`, `machine_id`, `job_id`, `state_name`, `handler`, `event`, `event_name`, `transition_name`, `queue`, `attempt`, `input`, `output`, `state_before`, `state_after`, `context`, `artifacts`, `chunks`, `error`, `duration_ms` a `created_at`.

### `Queuety::machine_trace( $machine_id )`

Získať normalizovaný balík trasovania na ladenie stavového automatu UI.

```php
$trace = Queuety::machine_trace( $machine_id );
```

Trasovanie obsahuje `machine`, zoskupené `states`, surové `events`, korelované akcie `jobs`, `logs`, `artifacts` a `chunks`.

### `Queuety::machine_state_at( $machine_id, $event_id )`

Získať verejný stav po konkrétnej udalosti trasovania automatu alebo `null`, ak sa nenájde.

```php
$state = Queuety::machine_state_at( $machine_id, $event_id );
```

Model životného cyklu a spôsoby použitia nájdete v časti [Stavové automaty](https://queuety.inline0.dev/sk/docs/state-machines).

## Šablóny pracovných postupov

### `Queuety::define_workflow( $name )`

Vytvoriť nástroj na zostavenie pracovného postupu, ktorý sa použije ako šablóna.

```php
$builder = Queuety::define_workflow( 'onboarding' )
    ->then( CreateAccountHandler::class )
    ->then( SendWelcomeEmailHandler::class );
```

### `Queuety::register_workflow_template( $builder )`

Zaregistrovať šablónu pracovného postupu.

```php
Queuety::register_workflow_template( $builder );
```

### `Queuety::run_workflow( $name, $payload, $options = [] )`

Odoslať zaregistrovanú šablónu pracovného postupu podľa názvu. Vráti ID pracovného postupu.

```php
$workflow_id = Queuety::run_workflow( 'onboarding', [ 'email' => 'user@example.com' ] );

$workflow_id = Queuety::run_workflow(
    'onboarding',
    [ 'email' => 'user@example.com' ],
    [ 'idempotency_key' => 'onboarding:user@example.com' ],
);
```

Vyvolá `RuntimeException`, ak šablóna nie je zaregistrovaná.

### `Queuety::dispatch_workflow_definition( $definition, $payload, $options = [] )`

Odoslať pracovný postup z balíka definície za behu.

Vo väčšine aplikačného kódu sa uprednostňuje `run_workflow()` alebo `workflow()->dispatch()`. Táto nízkoúrovňová metóda umožňuje opakovane použiteľným adaptérom odoslať serializovanú definíciu pracovného postupu bez závislosti od interných metód správcu pracovných postupov.

```php
$workflow_id = Queuety::dispatch_workflow_definition(
    $definition,
    [ 'email' => 'user@example.com' ],
    [ 'idempotency_key' => 'onboarding:user@example.com' ],
);
```

### `Queuety::on_action( $hook, $workflow, $map = null, $when = null, $idempotency_key = null, $priority = 10, $accepted_args = null )`

Zaregistrovať akciu WordPress, ktorá odošle pracovný postup.

```php
Queuety::on_action(
    'save_post',
    workflow: 'content_review',
    map: static fn ( int $post_id, object $post, bool $update ): array => [
        'post_id' => $post_id,
        'post_type' => $post->post_type,
        'update' => $update,
    ],
    when: static fn ( int $post_id, object $post ): bool => 'post' === $post->post_type,
    idempotency_key: static fn ( int $post_id ): string => "save_post:{$post_id}",
);
```

`$workflow` môže byť:

- názov zaregistrovanej šablóny pracovného postupu
- vložený `WorkflowBuilder`

`map`, `when` a `idempotency_key` sa spúšťajú synchrónne v rámci aktuálnej požiadavky WordPress. Asynchrónne sa po odoslaní spúšťajú iba samotné kroky pracovného postupu.

Úplnú príručku nájdete v časti [Spúšťače akcií](https://queuety.inline0.dev/sk/docs/features/action-triggers).

### `Queuety::workflow_templates()`

Získať register šablón pracovných postupov.

```php
$registry = Queuety::workflow_templates();
$template = $registry->get( 'onboarding' ); // WorkflowTemplate or null
```

### `Queuety::load_workflows( $directory, $recursive )`

Načítať a zaregistrovať všetky súbory pracovných postupov z adresára. Každý súbor `.php` má vracať `WorkflowBuilder`. Vráti počet zaregistrovaných pracovných postupov.

```php
$count = Queuety::load_workflows( __DIR__ . '/workflows/' );
$count = Queuety::load_workflows( __DIR__ . '/workflows/', recursive: true );
```

### `Queuety::load_workflow_file( $file_path )`

Načítať a zaregistrovať jeden súbor pracovného postupu. Vráti `WorkflowTemplate` alebo `null`, ak súbor nevráti nástroj na zostavenie.

```php
$template = Queuety::load_workflow_file( __DIR__ . '/workflows/onboard-user.php' );
```

## Plánovanie

### `Queuety::schedule( $handler, $payload )`

Vytvoriť opakovaný plán. Vráti objekt `PendingSchedule`.

```php
Queuety::schedule( 'cleanup_handler' )
    ->every( '1 hour' )
    ->on_queue( 'maintenance' );

Queuety::schedule( 'nightly_report' )
    ->cron( '0 3 * * *' )
    ->on_queue( 'reports' );
```

### Metódy `PendingSchedule`

| Metóda | Popis |
|---|---|
| `every( string $interval )` | Nastaviť výraz intervalu (e.g. `1 hour`, `30 minutes`) |
| `cron( string $expression )` | Nastaviť päťpolový výraz cron |
| `overlap( OverlapPolicy $policy )` | Nastaviť pravidlá pre súbehy (predvolené: `Allow`). Pozrite si časť [Plánovanie](https://queuety.inline0.dev/sk/docs/features/scheduling). |
| `on_queue( string $queue )` | Nastaviť cieľový front (predvolený: `default`) |
| `id()` | Vynútiť odoslanie a vrátiť ID plánu |

### `Queuety::scheduler()`

Získať internú inštanciu `Scheduler`.

```php
$scheduler = Queuety::scheduler();
$schedules = $scheduler->list();
$scheduler->remove( 'handler_name' );
$count = $scheduler->tick(); // manually trigger
```

## Registrácia obslužných rutín

### `Queuety::register( $name, $class )`

Zaregistrovať triedu obslužnej rutiny pod názvom.

```php
Queuety::register( 'send_email', SendEmailHandler::class );
```

### `Queuety::discover_handlers( $directory, $namespace )`

Automaticky vyhľadať a zaregistrovať triedy obslužných rutín z adresára. Vráti počet zaregistrovaných obslužných rutín.

```php
$count = Queuety::discover_handlers( __DIR__ . '/handlers', 'MyPlugin\\Handlers' );
```

### `Queuety::registry()`

Získať register obslužných rutín.

```php
$registry = Queuety::registry();
```

## Pozorovateľnosť

### `Queuety::logger()`

Získať inštanciu `Logger` na vyhľadávanie záznamov v protokole.

```php
$logger = Queuety::logger();
$logs   = $logger->for_job( 42 );
$logs   = $logger->for_workflow( 7 );
$logs   = $logger->for_handler( 'send_email', 50 );
$logs   = $logger->for_event( LogEvent::Failed, 50 );
$logs   = $logger->since( new \DateTimeImmutable( '-1 hour' ), 100 );
$count  = $logger->purge( 30 );
```

### `Queuety::metrics()`

Získať inštanciu `Metrics`.

```php
$stats = Queuety::metrics()->handler_stats( 60 ); // last 60 minutes
```

### `Queuety::webhook_notifier()`

Získať inštanciu `WebhookNotifier`.

```php
$notifier = Queuety::webhook_notifier();
$id       = $notifier->register( 'job.buried', 'https://hooks.slack.com/...' );
$webhooks = $notifier->list();
$notifier->remove( $id );
```

### `Queuety::rate_limiter()`

Získať inštanciu `RateLimiter`.

```php
$limiter = Queuety::rate_limiter();
$limiter->register( 'call_openai', 60, 60 );
```

## Vyrovnávacia pamäť

### `Queuety::cache()`

Získať inštanciu aktívneho backendu vyrovnávacej pamäte.

```php
$cache = Queuety::cache();
$cache->set( 'my_key', 'my_value', 60 );
$value = $cache->get( 'my_key' );
```

### `Queuety::set_cache( $cache )`

Prepísať backend vyrovnávacej pamäte. Ak chcete použiť vlastnú implementáciu, zavolajte túto metódu pred `Queuety::init()`.

```php
Queuety::set_cache( new RedisCache() );
Queuety::init( $connection );
```

### `QUEUETY_CACHE_TTL`

Predvolená životnosť záznamov vo vyrovnávacej pamäti v sekundách (predvolené: `5`). Ak chcete zmeniť predvolenú životnosť používanú internými operáciami vyrovnávacej pamäte, nastavte túto konštantu v `wp-config.php`.

```php
define( 'QUEUETY_CACHE_TTL', 10 );
```

Podrobnosti o backendoch a automatickej detekcii nájdete v časti [Ukladanie do vyrovnávacej pamäte](https://queuety.inline0.dev/sk/docs/features/caching).

## Záznam udalostí stavového automatu

### `Queuety::machine_events()`

Získať inštanciu `StateMachineEventLog`.

```php
$log = Queuety::machine_events();
```

## Záznam udalostí pracovného postupu

### `Queuety::workflow_events()`

Získať inštanciu `WorkflowEventLog`.

```php
$log = Queuety::workflow_events();
```

### `Queuety::workflow_timeline( $workflow_id, $limit = 100, $offset = 0 )`

Získať úplnú časovú os udalostí pracovného postupu. Vráti pole záznamov udalostí zoradených podľa ID.

```php
$events = Queuety::workflow_timeline( $workflow_id );
$next   = Queuety::workflow_timeline( $workflow_id, 100, 100 );
```

Každý záznam udalosti obsahuje: `id`, `workflow_id`, `job_id`, `parent_event_id`, `step_index`, `step_name`, `step_type`, `handler`, `event`, `queue`, `attempt`, `input`, `output`, `state_before`, `state_after`, `context`, `artifacts`, `chunks`, `error`, `error_message` (skopírované z `error.message`), `duration_ms` a `created_at`.

### `Queuety::workflow_trace( $workflow_id )`

Získať normalizovaný balík trasovania na ladenie pracovného postupu UI.

```php
$trace = Queuety::workflow_trace( $workflow_id );
```

Trasovanie obsahuje `workflow`, zoskupené `steps`, surové `events`, `jobs`, `logs`, `artifacts`, `chunks`, `signals` a `wait_dependencies`.

### `Queuety::trace_input( $input )`

Nastaviť vstup na úrovni aplikácie pre práve vykonávaný krok pracovného postupu.

### `Queuety::trace_output( $output )`

Nastaviť výstup na úrovni aplikácie pre práve vykonávaný krok pracovného postupu.

### `Queuety::trace_context( array $context )`

Zlúčiť kontext na úrovni aplikácie s práve vykonávaným krokom pracovného postupu.

### `Queuety::workflow_state_at( $workflow_id, $step_index )`

Získať verejný stav po dokončení alebo obnovení konkrétneho kroku pracovného postupu alebo `null`, ak sa nenájde.

```php
$state = Queuety::workflow_state_at( $workflow_id, 2 );
```

Prípady použitia a príkazy CLI nájdete v časti [Záznam udalostí pracovného postupu](https://queuety.inline0.dev/sk/docs/workflows/event-log).

## Interné inštancie

Tieto metódy vracajú interné inštancie pre pokročilé prípady použitia.

| Metóda | Návratová hodnota | Popis |
|---|---|---|
| `Queuety::queue()` | `Queue` | Operácie s frontom (prevzatie, uvoľnenie, odloženie) |
| `Queuety::worker()` | `Worker` | Ovládanie procesu pracovníka |
| `Queuety::workflow_manager()` | `Workflow` | Orchestrácia pracovných postupov |
| `Queuety::machines()` | `StateMachine` | Správa životného cyklu stavových automatov |
| `Queuety::connection()` | `Connection` | Pripojenie k databáze |
| `Queuety::batch_manager()` | `BatchManager` | Správa životného cyklu dávok (zrušenie, orezanie) |
| `Queuety::chunk_store()` | `ChunkStore` | Ukladanie častí pre streamované kroky |
| `Queuety::machine_events()` | `StateMachineEventLog` | Udalosti trasovania stavového automatu a normalizované balíky trasovania |
| `Queuety::workflow_events()` | `WorkflowEventLog` | Udalosti trasovania pracovného postupu a normalizované balíky trasovania |
| `Queuety::resource_manager()` | `ResourceManager` | Profily prijímania úloh pracovníkom, vážené rozpočty a kontrola systémovej pamäte |
| `Queuety::cache()` | `Cache` | Inštancia backendu vyrovnávacej pamäte |

## Testovanie

### `Queuety::fake()`

Nahradiť front falošnou implementáciou v pamäti na účely testovania. Vráti inštanciu `QueueFake`, ktorá zaznamenáva odoslané úlohy bez prístupu k databáze. `create_batch()` zaznamenáva aj falošné metadáta dávok; reťazce sa overujú prostredníctvom jednotlivých odoslaných úloh, ktoré spúšťajú.

```php
$fake = Queuety::fake();
SendEmailJob::dispatch( 'user@example.com', 'Hello', 'Hi!' );
$fake->assert_pushed( SendEmailJob::class );
```

### `Queuety::reset()`

Obnoviť celý interný stav vrátane falošného frontu. Zavolajte v `tearDown()`.

```php
Queuety::reset();
```

### Metódy `QueueFake`

| Metóda | Popis |
|---|---|
| `assert_pushed( string $class, ?Closure $callback )` | Overiť, že bola zaradená úloha danej triedy. Voliteľné spätné volanie filtruje podľa údajov úlohy. |
| `assert_pushed_times( string $class, int $count )` | Overiť, že úloha bola zaradená presne N-krát. |
| `assert_not_pushed( string $class )` | Overiť, že úloha nebola nikdy zaradená. |
| `assert_nothing_pushed()` | Overiť, že nebola zaradená žiadna úloha. |
| `assert_batched( ?Closure $callback )` | Overiť, že bola odoslaná dávka. Voliteľné spätné volanie filtruje podľa údajov dávky. |
| `pushed( string $class )` | Získať všetky zaznamenané odoslania pre danú triedu. Vráti pole. |
| `batches()` | Získať všetky zaznamenané dávky. Vráti pole. |
| `reset()` | Vymazať všetky zaznamenané úlohy a dávky. |

Úplné príklady nájdete v časti [Testovanie](https://queuety.inline0.dev/sk/docs/features/testing).

## Rozhrania

### `Handler`

Rozhranie pre jednoduché obslužné rutiny úloh.

```php
interface Handler {
    public function handle( array $payload ): void;
    public function config(): array;
}
```

`config()` môže vrátiť `queue`, `max_attempts`, `backoff`, `rate_limit`, `concurrency_group`, `concurrency_limit` a `cost_units`.

### `Step`

Rozhranie pre obslužné rutiny krokov pracovného postupu.

```php
interface Step {
    public function handle( array $state ): array;
    public function config(): array;
}
```

`config()` môže vrátiť `max_attempts`, `backoff`, `concurrency_group`, `concurrency_limit` a `cost_units`.

### `Contracts\ForEachHandler`

Rozhranie pre obslužné rutiny dynamických vetiev cyklu for-each.

```php
namespace Queuety\Contracts;

interface ForEachHandler {
    public function handle_item( array $state, mixed $item, int $index ): array;
    public function config(): array;
}
```

`config()` môže vrátiť `max_attempts`, `backoff`, `rate_limit`, `concurrency_group`, `concurrency_limit` a `cost_units`.

### `Contracts\ForEachReducer`

Voliteľná redukčná funkcia pre výsledky iterácie cez jednotlivé prvky.

```php
namespace Queuety\Contracts;

interface ForEachReducer {
    public function reduce( array $state, array $for_each ): array;
}
```

### `Contracts\Compensation`

Rozhranie pre obslužné rutiny kompenzácie krokov.

```php
namespace Queuety\Contracts;

interface Compensation {
    public function handle( array $state ): void;
}
```

### `Contracts\RepeatCondition`

Rozhranie pre predikáty cyklov používané v `repeat_until()` a `repeat_while()`, keď je porovnanie kľúčov stavu príliš obmedzené.

```php
namespace Queuety\Contracts;

interface RepeatCondition {
    public function matches( array $state ): bool;
}
```

### `Contracts\StateAction`

Rozhranie pre akcie vstupu do stavu vo fronte.

```php
namespace Queuety\Contracts;

interface StateAction {
    public function handle( array $state, ?string $event = null, array $event_payload = [], array $payload = [] ): array|string;
}
```

`$payload` obsahuje štruktúrované `payload` z definície akcie, ak bol takto definovaný stavový automat. Vráťte verejné aktualizácie stavu. Ak sa má akcia okamžite presunúť do ďalšieho stavu, zahrňte `_event` a voliteľne aj `_event_payload`.

Akcie stavu môžu definovať aj voliteľnú metódu `config()`. Queuety z nej načíta `concurrency_group`, `concurrency_limit` a `cost_units` pri zaradení vstupnej akcie do frontu.

### `Contracts\StateGuard`

Rozhranie pre ochranné podmienky prechodov stavového automatu.

```php
namespace Queuety\Contracts;

interface StateGuard {
    public function allows( array $state, array $event_payload, string $event, array $payload = [] ): bool;
}
```

### `Contracts\Job`

Rozhranie pre samostatné triedy úloh, ktoré možno odosielať. Triedy úloh zapuzdrujú svoje dáta vo verejných vlastnostiach a logiku vykonávania v `handle()`.

```php
namespace Queuety\Contracts;

interface Job {
    public function handle(): void;
}
```

Triedy úloh môžu voliteľne definovať metódu `middleware()`, ktorá vracia pole inštancií `Contracts\Middleware`.

### `Contracts\Cache`

Rozhranie pre vyrovnávacie úložiská. Vstavané implementácie a vlastné úložiská nájdete v časti [Ukladanie do vyrovnávacej pamäte](https://queuety.inline0.dev/sk/docs/features/caching).

```php
namespace Queuety\Contracts;

interface Cache {
    public function get( string $key ): mixed;
    public function set( string $key, mixed $value, int $ttl = 0 ): void;
    public function delete( string $key ): void;
    public function has( string $key ): bool;
    public function add( string $key, mixed $value, int $ttl = 0 ): bool;
    public function flush(): void;
}
```

| Metóda | Vracia | Opis |
|---|---|---|
| `get( $key )` | `mixed` | Načíta hodnotu. Ak sa hodnota nenájde alebo jej platnosť vypršala, vráti `null`. |
| `set( $key, $value, $ttl )` | `void` | Uloží hodnotu. TTL 0 znamená, že platnosť nevyprší. |
| `delete( $key )` | `void` | Odstráni hodnotu. |
| `has( $key )` | `bool` | Overí, či kľúč existuje a jeho platnosť nevypršala. |
| `add( $key, $value, $ttl )` | `bool` | Atómové nastavenie iba v prípade, že hodnota ešte neexistuje. Ak sa hodnota nastavila, vráti `true`. |
| `flush()` | `void` | Odstráni všetky položky z vyrovnávacej pamäte. |

### `WorkflowEventLog`

Zaznamenáva prechody medzi krokmi pracovného postupu vrátane úplného kontextu trasovania. Prístup cez `Queuety::workflow_events()`.

| Metóda | Vracia | Opis |
|---|---|---|
| `record_event( array $event )` | `void` | Zaznamená surovú udalosť trasovania |
| `record_step_started( ... )` | `void` | Zaznamená udalosť step_started so vstupom a stavom pred vykonaním |
| `record_step_completed( ... )` | `void` | Zaznamená udalosť step_completed so vstupom, výstupom, stavom pred vykonaním a po ňom |
| `record_step_failed( ... )` | `void` | Zaznamená udalosť step_failed s kontextom trasovania a štruktúrovanými podrobnosťami o chybe |
| `get_timeline( int $workflow_id, ?int $limit = 100, int $offset = 0 )` | `array` | Získa udalosti trasovania pracovného postupu v poradí, prípadne s podporou stránkovania |
| `get_trace( int $workflow_id )` | `array` | Získa normalizovaný balík trasovania |
| `get_state_at_step( int $workflow_id, int $step_index )` | `array\|null` | Získa verejný stav po dokončení alebo obnovení konkrétneho kroku |
| `prune( int $older_than_days )` | `int` | Odstráni udalosti staršie než zadaný počet dní. Vráti počet odstránených riadkov. |

### `StateMachineEventLog`

Zaznamenáva udalosti životného cyklu stavového automatu, akcií, prechodov a ochranných podmienok s rovnakými poľami trasovania ako udalosti pracovného postupu.

| Metóda | Vracia | Opis |
|---|---|---|
| `record_event( array $event )` | `void` | Zaznamená surovú udalosť trasovania stavového automatu |
| `get_timeline( int $machine_id, ?int $limit = 100, int $offset = 0 )` | `array` | Získa udalosti trasovania stavového automatu v poradí, prípadne s podporou stránkovania |
| `get_trace( int $machine_id )` | `array` | Získa normalizovaný balík trasovania stavového automatu |
| `get_state_at_event( int $machine_id, int $event_id )` | `array\|null` | Získa verejný stav po konkrétnej udalosti trasovania stavového automatu |
| `prune( int $older_than_days )` | `int` | Odstráni udalosti staršie než zadaný počet dní. Vráti počet odstránených riadkov. |

### `Contracts\StreamingStep`

Rozhranie pre obslužné rutiny krokov pracovného postupu, ktoré vytvárajú prúd častí. Každá vygenerovaná hodnota sa okamžite uloží do databázy. Pozrite si [Prúdové kroky](https://queuety.inline0.dev/sk/docs/workflows/streaming).

```php
namespace Queuety\Contracts;

interface StreamingStep {
    public function stream( array $state, array $existing_chunks = [] ): \Generator;
    public function on_complete( array $chunks, array $state ): array;
    public function config(): array;
}
```

| Metóda | Opis |
|---|---|
| `stream( $state, $existing_chunks )` | Generátor, ktorý vytvára časti reťazca. Každé vytvorenie časti spustí okamžitý zápis do databázy. Pri opakovanom pokuse obsahuje `$existing_chunks` predtým uložené časti. |
| `on_complete( $chunks, $state )` | Volá sa po skončení prúdu. Vráti údaje, ktoré sa zlúčia so stavom pracovného postupu. |
| `config()` | Voliteľná konfigurácia. Podporuje `max_attempts`, `backoff`, `concurrency_group`, `concurrency_limit` a `cost_units`. |

### `ChunkStore`

Spravuje ukladanie častí pri prúdových krokoch. Prístup cez `Queuety::chunk_store()`.

| Metóda | Vracia | Opis |
|---|---|---|
| `get_chunks( int $job_id )` | `string[]` | Načíta všetky časti úlohy zoradené podľa indexu časti |
| `append_chunk( int $job_id, int $chunk_index, string $content, ?int $workflow_id, ?int $step_index )` | `void` | Pridá jednu časť |
| `clear_chunks( int $job_id )` | `void` | Odstráni všetky časti úlohy |
| `chunk_count( int $job_id )` | `int` | Spočíta časti úlohy |
| `get_accumulated( int $job_id )` | `string` | Spojí všetky časti do jedného reťazca |

### `Heartbeat`

Statická pomocná trieda na odosielanie signálov aktivity z obslužných rutín krokov a prúdových krokov. Pozrite si [Signály aktivity](https://queuety.inline0.dev/sk/docs/features/heartbeats).

| Metóda | Opis |
|---|---|
| `Heartbeat::init( int $job_id, Connection $conn )` | Nastaví kontext úlohy. Pracovník ju zavolá automaticky. |
| `Heartbeat::beat( array $progress = [] )` | Odošle signál aktivity. Aktualizuje `reserved_at` a voliteľne uloží údaje o priebehu do `heartbeat_data`. |
| `Heartbeat::clear()` | Vymaže kontext úlohy. Pracovník ju zavolá automaticky. |
| `Heartbeat::current_job_id()` | Získa aktuálne ID úlohy (na testovanie). |

### `Contracts\Middleware`

Rozhranie pre middleware úloh. Middleware obaluje vykonávanie úloh do reťazového spracovateľského toku.

```php
namespace Queuety\Contracts;

interface Middleware {
    public function handle( object $job, \Closure $next ): void;
}
```

## Vlastnosti

### `Dispatchable`

Poskytuje statické metódy na odosielanie úloh pre triedy úloh implementujúce `Contracts\Job`. Argumenty konštruktora sa odovzdajú na vytvorenie inštancie úlohy.

```php
use Queuety\Contracts\Job;
use Queuety\Dispatchable;

class SendEmailJob implements Job {
    use Dispatchable;
    // ...
}

// Dispatches a new SendEmailJob instance
SendEmailJob::dispatch( 'user@example.com', 'Subject', 'Body' );
```

| Metóda | Vracia | Opis |
|---|---|---|
| `dispatch( ...$args )` | `PendingJob` | Vytvorí inštanciu a odošle ju |
| `dispatch_if( bool $condition, ...$args )` | `PendingJob\|null` | Odošle úlohu iba vtedy, ak je `$condition` pravdivé |
| `dispatch_unless( bool $condition, ...$args )` | `PendingJob\|null` | Odošle úlohu iba vtedy, ak je `$condition` nepravdivé |
| `with_chain( array $jobs )` | `ChainBuilder` | Spustí reťazec úloh z tejto triedy |

```php
// Conditional dispatch
SendEmailJob::dispatch_if( $user->wants_email, $user->email, 'Hello', 'Hi!' );
SendEmailJob::dispatch_unless( $maintenance_mode, $user->email, 'Hello', 'Hi!' );

// Chain from a job class
FetchDataJob::with_chain( [
    new ProcessDataJob(),
    new NotifyCompleteJob(),
] )->dispatch();
```

### Vlastnosti úloh

Triedy úloh môžu deklarovať verejné vlastnosti, ktoré pracovník číta pomocou reflexie na účely prepísania správania pri opakovaných pokusoch a časových limitoch.

| Vlastnosť | Typ | Opis |
|---|---|---|
| `$tries` | `int` | Maximálny počet pokusov, po ktorom sa úloha odloží |
| `$timeout` | `int` | Maximálny čas vykonávania v sekundách (vyžaduje `pcntl`) |
| `$backoff` | `array` | Postupne sa predlžujúce oneskorenia v sekundách pre každý opakovaný pokus |

```php
class ImportProductsJob implements Job {
    use Dispatchable;

    public int $tries = 5;
    public int $timeout = 120;
    public array $backoff = [ 10, 30, 60, 120 ];

    // ...
}
```

### Hook `failed()`

Keď sa úloha po vyčerpaní všetkých opakovaných pokusov odloží, pracovník zavolá metódu `failed()` na inštancii úlohy, ak je definovaná.

```php
public function failed( \Throwable $exception ): void {
    error_log( "Job failed: {$exception->getMessage()}" );
}
```

## Vstavaný middleware

Všetky triedy middleware implementujú `Contracts\Middleware` a nachádzajú sa v mennom priestore `Queuety\Middleware`.

| Trieda | Opis |
|---|---|
| `RateLimited( int $max, int $window )` | Vynúti limit `$max` vykonaní za `$window` sekúnd |
| `Timeout( int $seconds )` | Ukončí úlohu po `$seconds` sekundách (vyžaduje `pcntl`) |
| `UniqueJob( ?string $key )` | Zabráni súbežnému vykonávaniu pomocou zámku databázy |
| `WithoutOverlapping( string $key, int $release_after )` | Zabráni prekrývaniu vykonávania s automatickým vypršaním platnosti zámku |
| `ThrottlesExceptions( int $max_attempts, int $decay_minutes )` | Obmedzí výnimky, aby pri výpadku externej služby nedošlo k návalu úloh |

Podrobnosti o použití a príklady nájdete v časti [Middleware](https://queuety.inline0.dev/sk/docs/features/middleware).

## Výčtové typy

### `Priority`

```php
enum Priority: int {
    case Low    = 0;
    case Normal = 1;
    case High   = 2;
    case Urgent = 3;
}
```

### `JobStatus`

```php
enum JobStatus: string {
    case Pending    = 'pending';
    case Processing = 'processing';
    case Completed  = 'completed';
    case Failed     = 'failed';
    case Buried     = 'buried';
}
```

### `WorkflowStatus`

```php
enum WorkflowStatus: string {
    case Running        = 'running';
    case Completed      = 'completed';
    case Failed         = 'failed';
    case Paused         = 'paused';
    case WaitingForSignal  = 'waiting_for_signal';
    case WaitingForWorkflows = 'waiting_for_workflows';
    case Cancelled      = 'cancelled';
}
```

### `StateMachineStatus`

```php
enum StateMachineStatus: string {
    case Running = 'running';
    case WaitingEvent = 'waiting_event';
    case Completed = 'completed';
    case Failed = 'failed';
    case Paused = 'paused';
    case Cancelled = 'cancelled';
}
```

### `BackoffStrategy`

```php
enum BackoffStrategy: string {
    case Fixed       = 'fixed';
    case Linear      = 'linear';
    case Exponential = 'exponential';
}
```

### `ForEachMode`

```php
enum ForEachMode: string {
    case All = 'all';
    case FirstSuccess = 'first_success';
    case Quorum = 'quorum';
}
```

### `WaitMode`

```php
enum WaitMode: string {
    case All    = 'all';
    case Any    = 'any';
    case Quorum = 'quorum';
}
```

### `LogEvent`

```php
enum LogEvent: string {
    case Started                  = 'started';
    case Completed                = 'completed';
    case Failed                   = 'failed';
    case Buried                   = 'buried';
    case Retried                  = 'retried';
    case WorkflowStarted          = 'workflow_started';
    case WorkflowCompleted        = 'workflow_completed';
    case WorkflowFailed           = 'workflow_failed';
    case WorkflowPaused           = 'workflow_paused';
    case WorkflowResumed          = 'workflow_resumed';
    case WorkflowCancelled        = 'workflow_cancelled';
    case WorkflowRewound          = 'workflow_rewound';
    case WorkflowForked           = 'workflow_forked';
    case WorkflowDeadlineExceeded = 'workflow_deadline_exceeded';
    case Debug                    = 'debug';
}
```

### `OverlapPolicy`

```php
enum OverlapPolicy: string {
    case Allow  = 'allow';
    case Skip   = 'skip';
    case Buffer = 'buffer';
}
```

Podrobnosti o fungovaní jednotlivých politík nájdete v časti [Plánovanie](https://queuety.inline0.dev/sk/docs/features/scheduling).

## Atribúty

### `#[QueuetyHandler]`

PHP 8 atribút na automatickú registráciu. Pozrite si [PHP Atribúty](https://queuety.inline0.dev/sk/docs/features/attributes).

```php
use Queuety\Attributes\QueuetyHandler;

#[QueuetyHandler( name: 'send_email', queue: 'emails', max_attempts: 5 )]
class SendEmailHandler implements Handler {
    // ...
}
```

## Mostík CLI

### `Queuety::cli_command()`

Vráti zverejnený názov koreňového príkazu WP-CLI.

Predvolený koreňový príkaz je `queuety`. Ak sa má príkaz zverejniť pod iným názvom, definujte `QUEUETY_CLI_COMMAND` pred spustením Queuety.

### `Queuety::cli_command_map()`

Vráti serializovateľný katalóg príkazov Queuety CLI pre testovacie prostredia, ktoré potrebujú poznať dostupné príkazy bez prehľadávania tried WP-CLI.

Každá položka obsahuje:
- stabilné ID operácie
- relatívnu cestu CLI
- triedu a metódu obslužnej rutiny WP-CLI
- možné ciele vykonania
- adaptér, ktorý normalizuje nespracované argumenty CLI na plán vykonávania

### `Queuety::resolve_cli_command( $path, $args, $assoc_args )`

Premení analyzované vyvolanie CLI na plán vykonávania, ktorý má testovacie prostredie spustiť.

```php
$plan = Queuety::resolve_cli_command(
    [ 'workflow', 'export' ],
    [ '42' ],
    [ 'output' => '/tmp/workflow.json' ]
);

echo $plan['callable']; // Queuety\Queuety::export_workflow_to_file
print_r( $plan['arguments'] );
```

Plány vykonávania zohľadňujú prenosové vrstvy:
- príkazy sa namapujú na verejne dostupné funkcie PHP s normalizovanými argumentmi
- katalóg vopred uvádza všetky možné ciele vykonania, zatiaľ čo `callable` a `transport` určujú vetvu zvolenú pre analyzovaný vstup

Toto je štandardné použitie Queuety pre testovacie prostredia agentov: stabilné ID operácie, verejný cieľ API a normalizácia v správe adaptéra pre záležitosti špecifické pre CLI, ako sú predvolené hodnoty frontu, dekódovanie dát JSON, výber vetvy fondu pracovníkov a spracovanie súborov pri exporte pracovného postupu.
