
# Protokol událostí workflow

Protokol událostí workflow zaznamenává průběh na každé trvalé hranici workflow. Každá událost může obsahovat vstup a výstup kroku, veřejný stav před krokem a po něm, kontext běhu, odkazy na artefakty, datové bloky streamu, časové údaje a podrobnosti o chybách.

## Co se zaznamenává

| Událost | Kdy | Zachycená data |
|---|---|---|
| `step_started` | Před spuštěním obslužné rutiny kroku | ID úlohy, fronta, pokus, název kroku, typ kroku, vstup a stav před spuštěním |
| `step_completed` | Po úspěšném dokončení obslužné rutiny kroku | Vstup, výstup, stav před krokem, stav po něm, kontext, artefakty, datové bloky a délka trvání |
| `step_failed` | Když obslužná rutina kroku vyvolá výjimku | Vstup, stav před krokem, stav po něm (je-li dostupný), kontext, třída chyby, zpráva o chybě, trasování a délka trvání |
| `step_branch_completed` | Po úspěchu jedné paralelní větve | Vstup větve, výstup, stav před krokem, stav po něm, kontext a délka trvání |
| `step_item_completed` | Po úspěchu jedné položky cyklu for-each | Vstup položky, výstup, stav před krokem, stav po něm, metadata položky, kontext a délka trvání |
| `workflow_waiting` | Když čekací krok pozastaví běh | Typ čekání, cíle čekání, režim čekání, klíč výsledku, metadata shody a stav během čekání |
| `workflow_resumed` | Po splnění čekacího kroku | Data pro obnovení, stav před obnovením a stav po něm |
| `workflow_replayed` | Při opětovném vytvoření exportu | Metadata zdrojového workflow a stav přehrání |

## Dotazování nad časovou osou

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

foreach ( $events as $event ) {
    echo $event['step_index'] . ' ' . $event['event'] . ' ' . $event['handler'] . "\n";

    if ( 'step_completed' === $event['event'] ) {
        $input        = $event['input'];
        $output       = $event['output'];
        $state_before = $event['state_before'];
        $state_after  = $event['state_after'];
    }

    if ( 'step_failed' === $event['event'] ) {
        echo 'Error: ' . $event['error']['message'] . "\n";
    }
}
```

Každý řádek události 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`
- `duration_ms`
- `created_at`

## Normalizovaný balíček trasování

Při tvorbě ladicího nástroje UI použijte `workflow_trace()`:

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

Balíček trasování obsahuje:

- `workflow`
- `steps`
- `events`
- `jobs`
- `logs`
- `artifacts`
- `chunks`
- `signals`
- `wait_dependencies`

`steps` seskupuje události podle indexu kroku a zahrnuje nejnovější důležitou událost pro každý krok.

## Vyhledání stavu kroku

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

Vrátí veřejný `state_after` z poslední dokončené nebo obnovené události daného kroku, případně `null`, pokud nebyl zaznamenán žádný stav.

## Metadata trasování běhu

Obslužné rutiny mohou během běhu přidávat podrobnosti o trasování na úrovni aplikace:

```php
Queuety::trace_input( [ 'resolved' => $resolved_input ] );
Queuety::trace_context( [ 'ability' => 'content/load-post' ] );
Queuety::trace_output( [ 'post' => $post ] );
```

Obslužné rutiny kroků mohou také vracet vyhrazená metadata trasování:

```php
return [
    'result' => 'done',
    '_queuety_trace' => [
        'input' => [ 'resolved' => $resolved_input ],
        'context' => [ 'node_id' => 'loadPost' ],
        'artifacts' => [
            [ 'key' => 'brief', 'kind' => 'markdown' ],
        ],
    ],
];
```

Klíč `_queuety_trace` se ukládá do protokolu událostí a neslučuje se se stavem workflow.

## CLI

Zobrazte časovou osu jako tabulku:

```bash
wp queuety workflow timeline 42
```

Zobrazte stav po kroku:

```bash
wp queuety workflow state-at 42 0
```

## Uchovávání

Protokoly událostí se časem hromadí. Pomocí `prune()` odstraňte staré události trasování:

```php
$deleted = Queuety::workflow_events()->prune( 30 );
```
