---
title: "Aggregator"
description: "Aggregate and summarize TenXObjects to publish as metrics"
source: "https://github.com/log-10x/modules/tree/main/pipelines/run/units/aggregate/unit.yaml"
icon: "material/sigma"

---
Groups [TenXObjects](https://doc.log10x.com/api/js/#TenXObject "Provide structured, reflective access to log/trace events read from input(s).") by specified field values and generates [TenXSummary](https://doc.log10x.com/api/js/#TenXSummary "Access aggregate values of tenxObjects which share a target set of field values.") instances for [metric outputs](https://doc.log10x.com/run/output/metric "Write aggregated TenXSummary instances to metric outputs (e.g., Prometheus, Datadog)") (Prometheus, Datadog, CloudWatch).

### :material-table: How It Works

Each configured aggregator maintains an in-memory table where each row correlates to a unique combination of field values extracted from input TenXObjects.

When the number of TenXObjects _upserted_ into the table exceeds a target threshold (e.g., 1000) or a specified interval (e.g., 2s) elapses, the aggregator creates a [TenXSummary](https://doc.log10x.com/api/js/#TenXSummary "Access aggregate values of tenxObjects which share a target set of field values.") instance for each of the table's rows and flushes it to [output](https://doc.log10x.com/run/output/ "Filter and output TenXObjects to remote and local destinations").
Once summaries are flushes, in-memory table is cleared for the next set of TenXObjects to aggregate, and so on.

### :material-cog-transfer-outline: Workflow

The aggregation process follows these key steps:

<div style="text-align: center;">

```mermaid
graph LR
    A["<div style='font-size: 14px;'>📥 Receive</div><div style='font-size: 10px; text-align: center;'>TenXObjects</div>"] --> B["<div style='font-size: 14px;'>🔍 Extract</div><div style='font-size: 10px; text-align: center;'>Field Values</div>"]
    B --> C["<div style='font-size: 14px;'>🗃️ Group</div><div style='font-size: 10px; text-align: center;'>In-Memory Table</div>"]
    C --> D{"<div style='font-size: 14px;'>⏰ Trigger</div><div style='font-size: 10px; text-align: center;'>Threshold/Interval</div>"}
    D -->|Yes| E["<div style='font-size: 14px;'>📊 Generate</div><div style='font-size: 10px; text-align: center;'>TenXSummaries</div>"]
    D -->|No| C
    E --> F["<div style='font-size: 14px;'>📤 Flush</div><div style='font-size: 10px; text-align: center;'>To Output</div>"]
    F --> G["<div style='font-size: 14px;'>🧹 Clear</div><div style='font-size: 10px; text-align: center;'>Table</div>"]
    G --> A
    
    classDef receive fill:#7c3aed88,stroke:#6d28d9,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef extract fill:#9333ea88,stroke:#7c3aed,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef group fill:#2563eb88,stroke:#1d4ed8,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef trigger fill:#059669,stroke:#047857,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef generate fill:#dc2626,stroke:#b91c1c,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef flush fill:#ea580c88,stroke:#c2410c,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef clear fill:#7c2d12,stroke:#9a3412,color:#ffffff,stroke-width:2px,rx:8,ry:8
    
    class A receive
    class B extract
    class C group
    class D trigger
    class E generate
    class F flush
    class G clear
```

</div>

<div style="text-align: center;">
<button onclick="enlargeAggregateDiagram(this)" class="md-button md-button--primary" style="margin: 10px;">
    Click to enlarge
</button>
</div>

<script>
function enlargeAggregateDiagram(button) {
    const aggregateDiagramCode = `graph LR
    A["<div style='font-size: 14px;'>📥 Receive</div><div style='font-size: 10px; text-align: center;'>TenXObjects</div>"] --> B["<div style='font-size: 14px;'>🔍 Extract</div><div style='font-size: 10px; text-align: center;'>Field Values</div>"]
    B --> C["<div style='font-size: 14px;'>🗃️ Group</div><div style='font-size: 10px; text-align: center;'>In-Memory Table</div>"]
    C --> D{"<div style='font-size: 14px;'>⏰ Trigger</div><div style='font-size: 10px; text-align: center;'>Threshold/Interval</div>"}
    D -->|Yes| E["<div style='font-size: 14px;'>📊 Generate</div><div style='font-size: 10px; text-align: center;'>TenXSummaries</div>"]
    D -->|No| C
    E --> F["<div style='font-size: 14px;'>📤 Flush</div><div style='font-size: 10px; text-align: center;'>To Output</div>"]
    F --> G["<div style='font-size: 14px;'>🧹 Clear</div><div style='font-size: 10px; text-align: center;'>Table</div>"]
    G --> A
    
    classDef receive fill:#7c3aed88,stroke:#6d28d9,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef extract fill:#9333ea88,stroke:#7c3aed,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef group fill:#2563eb88,stroke:#1d4ed8,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef trigger fill:#059669,stroke:#047857,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef generate fill:#dc2626,stroke:#b91c1c,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef flush fill:#ea580c88,stroke:#c2410c,color:#ffffff,stroke-width:2px,rx:8,ry:8
    classDef clear fill:#7c2d12,stroke:#9a3412,color:#ffffff,stroke-width:2px,rx:8,ry:8
    
    class A receive
    class B extract
    class C group
    class D trigger
    class E generate
    class F flush
    class G clear`;
    
    if (window.enlargeDiagram) {
        window.enlargeDiagram(button, aggregateDiagramCode);
    }
}
</script>

📥 **Receive TenXObjects**: Receives [TenXObjects](https://doc.log10x.com/api/js/#TenXObject "Provide structured, reflective access to log/trace events read from input(s).") from the processing pipeline

🔍 **Extract Field Values**: Extracts configured [field values](https://doc.log10x.com/run/aggregate/#aggregatorfields "list of field names by which to aggregate TenXObjects") from each TenXObject for grouping

🗃️ **Group in Table**: Maintains [in-memory table](https://doc.log10x.com/run/aggregate/#aggregatormaxcardinality "max number of concurrent rows within the aggregator in-mem table within the flush interval") where rows correspond to unique field value combinations

⏰ **Check Triggers**: Monitors [flush threshold](https://doc.log10x.com/run/aggregate/#aggregatorflushthreshold "maximum the number of TenXObjects to aggregate before the aggregator flushes") and [flush interval](https://doc.log10x.com/run/aggregate/#aggregatorflushinterval "interval to wait before the aggregator flushes") conditions

📊 **Generate Summaries**: Creates [TenXSummary](https://doc.log10x.com/api/js/#TenXSummary "Access aggregate values of tenxObjects which share a target set of field values.") instances from each table row when triggered

📤 **Flush to Output**: Sends TenXSummaries to configured [outputs](https://doc.log10x.com/run/output/ "Filter and output TenXObjects to remote and local destinations") for metric publishing

🧹 **Clear Table**: Resets in-memory table to begin next aggregation cycle

### :material-group: Grouped Instances

Aggregators operate on [grouped instances](https://doc.log10x.com/run/transform/group/ "Group and sequence TenXObjects") (e.g., stack traces) as a single logical unit allowing them to be reported collectively vs. aggregating each element. b (e.g., tallying stack traces jointly vs. generating a metric for each separate line) .

### :material-sigma: Summary Fields

Each generated [TenXSummary](https://doc.log10x.com/api/js/#TenXSummary "Access aggregate values of tenxObjects which share a target set of field values.") instance provides access to the following intrinsic fields:

|Field|Description|
|---|---|
|[summaryVolume](https://doc.log10x.com/api/js/#TenXSummary+summaryVolume "The number of tenxObjects whose values have been aggregated into this summary instance.")|Number of TenXObjects aggregated into this summary instance|
|[summaryBytes](https://doc.log10x.com/api/js/#TenXSummary+summaryBytes "The accumulative number of bytes in the values of text fields")|Accumulative number of bytes in the `text` field value of TenXObjects aggregated into this instance|
|[summaryValues](https://doc.log10x.com/api/js/#TenXSummary+summaryValues "Array of values by which tenxObjects have been grouped into this summary instance.")|Array of values by which TenXObjects were aggregated into this instance. This value commonly specifies [metric tags](https://www.baeldung.com/micrometer#1-tags){target="\_blank"} when writing TenXSummaries to [time-series](https://doc.log10x.com/run/output/metric/ "Write aggregated TenXSummary instances to metric outputs (e.g., Prometheus, Datadog)") outputs.|
|[summaryTotals](https://doc.log10x.com/api/js/#TenXSummary+summaryTotals "Sum values of the aggregatorTotalFields value of tenxObjects aggregated into this instance.")|The sum values of the [aggregatorTotalFields](https://doc.log10x.com/run/aggregate/#aggregatortotalfields "list of fields whose values to tally into generated TenXSummaries") value of TenXObjects aggregated into this instance. This value commonly specifies [metric counter](https://www.baeldung.com/micrometer#2-counter){target="\_blank"} values when writing TenXSummaries to [time-series](https://doc.log10x.com/run/output/metric/ "Write aggregated TenXSummary instances to metric outputs (e.g., Prometheus, Datadog)") outputs.|
|[summaryValuesHash](https://doc.log10x.com/api/js/#TenXSummary+summaryValuesHash "A hash value of the summaryValues field used to")|Hash value of the [summaryValues](https://doc.log10x.com/api/js/#TenXSummary+summaryValues "Array of values by which tenxObjects have been grouped into this summary instance.") field, providing a concise alphanumeric hash representation of the values of TenXObjects aggregated into this TenXSummary instance.|

## :material-wrench-outline: Config Files

To configure the Aggregator unit, [:material-cog: Edit](https://doc.log10x.com/config/app/#module-config "Learn how to edit app and module configurations") these files:
??? tenx-dev "Dev"

    <a id="dev"></a>
    ### Dev {.hidden-heading}



    Below is the default configuration from: [dev/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/dev/config.yaml "dev/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/dev/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml0-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml0-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml0-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit config.yaml Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml0-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/run/aggregate/dev/config.yaml"
                                data-copy-nix="/etc/log10x/config/run/aggregate/dev/config.yaml"
                                data-copy-win="C:\log10x\configs/run/aggregate/dev/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/run/aggregate/dev/config.yaml">$TENX_CONFIG/run/aggregate/dev/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/run/aggregate/dev/config.yaml">./pipelines/run/aggregate/dev/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogInN0cmluZyIKICAgIH0sCiAgICAiYWdncmVnYXRvciIgOiB7CiAgICAgICJ0eXBlIiA6ICJhcnJheSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTG9naWNhbCBuYW1lIG9mIGFnZ3JlZ2F0b3JcblxuUHJvdmlkZXMgYSBsb2dpY2FsIG5hbWUgZm9yIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgJ2Vycm9ycycpLiBUaGlzIHZhbHVlIGlzIGFjY2Vzc2libGUgYXQgcnVuLXRpbWUgdmlhIHRoZSBpbnRyaW5zaWMgJ2lucHV0TmFtZScgZmllbGQgdG8gaWRlbnRpZnkgVGVuWFN1bW1hcmllcyBvcmlnaW5hdGluZyBmcm9tIHRoaXMgYWdncmVnYXRvci4iCiAgICAgICAgICB9LAogICAgICAgICAgImVuYWJsZWQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiRW5hYmxlL2Rpc2FibGUgdGhpcyBhZ2dyZWdhdG9yXG5cblNldHMgd2hldGhlciB0byBvcGVuIHRoZSBpbnB1dCBzdHJlYW0uIFRvIGVuYWJsZSB0aGlzIGlucHV0IG9ubHkgd2hlbiBhbiAnYWdncmVnYXRlRXJyb3JzJyBzdGFydHVwIGFyZ3VtZW50IHZhbHVlIGlzIHRydXRoeTogIGBgYCB5YW1sIC4uLiBhZ2dyZWdhdG9yOiAgIGVuYWJsZWQ6ICQ9VGVuWEVudi5nZXQoXCJhZ2dyZWdhdGVFcnJvcnNcIikgYGBgIChEZWZhdWx0OiB0cnVlKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICJ0cnVlIgogICAgICAgICAgfSwKICAgICAgICAgICJmaWVsZHMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgZmllbGQgbmFtZXMgYnkgd2hpY2ggdG8gYWdncmVnYXRlIFRlblhPYmplY3RzXG5cblByb3ZpZGVzIGEgbGlzdCBvZiBpbnRyaW5zaWMvZXh0cmFjdGVkL2NhbGN1bGF0ZWQgW1RlblhPYmplY3RdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2pzLyNUZW5YT2JqZWN0KSBmaWVsZCBuYW1lcyBieSB3aGljaCB0byBhZ2dyZWdhdGUgaW5zdGFuY2VzLiAgV2hlbiB0aGUgYWdncmVnYXRvciBmbHVzaGVzIHRoZSBpbi1tZW0gdGFibGUgdG8gcHJvZHVjZWQgVGVuWFN1bW1hcmllcywgZWFjaCBnZW5lcmF0ZWQgVGVuWFN1bW1hcnkgaW5zdGFuY2UgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB0b3RhbCB2YWx1ZXMgdmlhIGl0cyBbc3VtbWFyeVRvdGFsc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvanMvI1RlblhTdW1tYXJ5K3N1bW1hcnlWYWx1ZXMpIGFycmF5IGZpZWxkLiIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJkZWZhdWx0VmFsdWUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJBIGNvbnN0YW50IHZhbHVlIHRvIGRlZmF1bHQgaWYgJ21heENhcmRpbmFsaXR5JyBpcyBleGNlZWRlZFxuXG5EZWZpbmVzIGEgY29uc3RhbnQgdmFsdWUgdG8gdXNlIGluc3RlYWQgb2YgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSB3aGVuIHRoZSBjdXJyZW50IG51bWJlciBvZiByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpIGV4Y2VlZHMgW21heENhcmRpbmFsaXR5XShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JtYXhjYXJkaW5hbGl0eSkuICBUaGlzIHZhbHVlIHByZXZlbnRzIGFuIG91dC1vZi1tZW0gZXJyb3IgaWYgVGVuWE9iamVjdHMgd2hvc2UgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSBhcmUgb2YgaGlnaCBjYXJkaW5hbGl0eSwgd2hpY2ggY2FuIGNhdXNlIHRoZSBpbi1tZW0gdGFibGUgdG8gZ3JvdyBiZXlvbmQgdGhlIGNvbmZpbmVzIG9mIHRoZSBob3N0IEpWTSBoZWFwLiAgVGhpcyBlcnJvciBpcyBwb3NzaWJsZSBpZiBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGNvbnRhaW5zIGEgY2FsY3VsYXRlZC9leHRyYWN0ZWQgZmllbGQgd2hvc2UgdmFsdWUgaXMgYWxwaGFudW1lcmljIChlLmcuLCAnc3BhbklEJykgYW5kIGlzIHByYWN0aWNhbGx5IHVuaXF1ZSB0byBlYWNoIFRlblhPYmplY3QuIgogICAgICAgICAgfSwKICAgICAgICAgICJ0b3RhbEZpZWxkcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBmaWVsZHMgd2hvc2UgdmFsdWVzIHRvIHRhbGx5IGludG8gZ2VuZXJhdGVkIFRlblhTdW1tYXJpZXNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBpbnRyaW5zaWMgY2FsY3VsYXRlZC9leHRyYWN0ZWQgVGVuWE9iamVjdCBmaWVsZCBuYW1lcyB0byB0YWxseSBhbmQgd3JpdGUgaW50byBhZ2dyZWdhdGVkIFRlblhTdW1tYXJ5IGluc3RhbmNlcyB3aXRoaW4gYSB0YXJnZXQgZmx1c2ggIFt0aHJlc2hvbGRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNodGhyZXNob2xkKSBvciBbaW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpLiAgRm9yIGV4YW1wbGUsIHNldHRpbmcgYSB2YWx1ZSBvZjogYHByaWNlYCBpbnRvIHRoaXMgYXJyYXkgd2lsbCB0YWxseSB0aGUgcHJpY2VzIG9mIGFsbCBUZW5YT2JqZWN0cyBhZ2dyZWdhdGVkIGludG8gYSB0YXJnZXQgb3V0cHV0IFRlblhTdW1tYXJ5IGluc3RhbmNlLiAgIEEgbWF0Y2hpbmcgYHByaWNlYCB2YWx1ZSBjb250YWluaW5nIHRoZSBzdW0gb2YgYWdncmVnYXRlZCBwcmljZXMgd2lsbCBiZSBhY2Nlc3NpYmxlIGZvciBlYWNoIFRlblhTdW1tYXJ5IGluc3RhbmNlIHZpYSBpdHMgIFtzdW1tYXJ5VG90YWxzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWFN1bW1hcnkrc3VtbWFyeVRvdGFscykgYXJyYXkuIiwKICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgIm1heENhcmRpbmFsaXR5IiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTWF4IG51bWJlciBvZiBjb25jdXJyZW50IHJvd3Mgd2l0aGluIHRoZSBhZ2dyZWdhdG9yIGluLW1lbSB0YWJsZSB3aXRoaW4gdGhlIGZsdXNoIGludGVydmFsXG5cblNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZS4gSWYgdGhlIG51bWJlciBvZiByb3dzIGV4Y2VlZHMgdGhpcyB2YWx1ZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpICwgdGhlICdhZ2dyZWdhdG9yRGVmYXVsdFZhbHVlJyB2YWx1ZSB3aWxsIGJlIGZvciBhbGwgVGVuWE9iamVjdHMgaW5zdGVhZCBvZiBbZmllbGQgdmFsdWVzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIHVudGlsIHRoZSBhZ2dyZWdhdG9yIGlzIGZsdXNoZWQuICBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBiYWNrc3RvcCB0byBlbnN1cmUgdGhhdCB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkb2VzIG5vdCBvdmVyZmxvdyB3aGVuIGV4dHJhY3RpbmcgYW5kICBhZ2dyZWdhdGluZyB2ZXJ5IGhpZ2ggY2FyZGluYWxpdHkgdmFsdWVzIGZyb20gdGhlIGZpZWxkcyBvZiBUZW5YT2JqZWN0cyBwYXNzZWQgdG8gdGhpcyBhZ2dyZWdhdG9yLiAgSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQgb3Igc2V0IHRvIDAsIHRoZSBhZ2dyZWdhdG9yIGhhcyBubyBjYXAuIFRoaXMgbWF5IHJlc3VsdCBpbiBhbiBvdXQtb2YtbWVtIGVycm9yIHdoZW4gdmVyeSBoaWdoIGNhcmRpbmFsaXR5IChlLmcuLCAnc3BhbklEJywgJ0dVSUQnKSBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGFyZSBzcGVjaWZpZWQuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImZpbHRlciIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGFuIFRlblhPYmplY3QgbXVzdCBldmFsdWF0ZSBhcyAndHJ1dGh5JyBhZ2FpbnN0IHRvIGJlIGFnZ3JlZ2F0ZWRcblxuUHJvdmlkZXMgYSB3YXkgdG8gY29udHJvbCB3aGljaCBUZW5YT2JqZWN0cyBhcmUgaW5jb3Jwb3JhdGVkIGludG8gdGhpcyBhZ2dyZWdhdG9yLiBVbmxpa2UgdGhlICdhZ2dyZWdhdG9yRW5hYmxlZCcsIHdoaWNoIGVuYWJsZXMvZGlzYWJsZXMgdGhpcyBhZ2dyZWdhdG9yIGFsdG9nZXRoZXIsIHRoaXMgSmF2YVNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBwZXIgVGVuWE9iamVjdCB0byBwcm92aWRlIGdyYW51bGFyIGNvbnRyb2wgb3ZlciB3aGF0IGluZm9ybWF0aW9uIHRvIGFnZ3JlZ2F0ZS4gIEZvciBleGFtcGxlLCB0byBvbmx5IGFnZ3JlZ2F0ZSBUZW5YT2JqZWN0cyByZWFkIGZyb20gYSBzcGVjaWZpZWQgaW5wdXQ6ICBgYGAgeWFtbCBhZ2dyZWdhdG9yOiAgIGZpbHRlcjogdGhpcy5pbnB1dE5hbWUgPT0gXCJlbGFzdGljXCIgYGBgICBUbyBhcHBseSBtb3JlIGNvbXBsZXggbG9naWMsIGludm9rZSBhbiAxMHggSmF2YVNjcmlwdCBmdW5jdGlvbiBkZWNsYXJlZCBpbiBhIC5qcyBmaWxlIGJ5IHBhc3NpbmcgaXQgdG8gdGhlIDEweCBFbmdpbmUgYXQgc3RhcnR1cCAoZS5nLiwgJCB0ZW54IHJ1biBAbXkuanMpLiAgYGBgIHlhbWwgYWdncmVnYXRvcjogICAuLi4gICBmaWx0ZXI6IG15QWdncmVnYXRvckZpbHRlcigpIGBgYCAgRm9yIGEgcmVhbC13b3JsZCBhZ2dyZWdhdG9yIGV4YW1wbGUgc2VlIFthZ2dyZWdhdGUvc3RyZWFtLnlhbWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9sb2ctMTB4L21vZHVsZXMvYmxvYi9tYWluL3BpcGVsaW5lcy9ydW4vbW9kdWxlcy9hZ2dyZWdhdGUvc3RyZWFtLnlhbWwpLiIKICAgICAgICAgIH0sCiAgICAgICAgICAiZmx1c2hUaHJlc2hvbGQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXhpbXVtIHRoZSBudW1iZXIgb2YgVGVuWE9iamVjdHMgdG8gYWdncmVnYXRlIGJlZm9yZSB0aGUgYWdncmVnYXRvciBmbHVzaGVzXG5cbkNvbnRyb2xzIGhvdyBtYW55IFRlblhPYmplY3RzIHRvIHVwc2VydCBpbnRvIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgMTAwMDApIGJlZm9yZSB0aGUgYWdncmVnYXRvciB0cmFuc2Zvcm1zIHRoZSByb3dzIG9mIGl0cyBpbi1tZW0gdGFibGUgaW50byBUZW5YU3VtbWFyaWVzIGluc3RhbmNlcyBhbmQgZmx1c2hlcyB0aGVtIGludG8gdGhlIHBpcGVsaW5lLiAgSWYgbm90IHNldCwgdGhlIFtmbHVzaEludGVydmFsXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmbHVzaGludGVydmFsKSBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIgogICAgICAgICAgfSwKICAgICAgICAgICJmbHVzaEludGVydmFsIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSW50ZXJ2YWwgdG8gd2FpdCBiZWZvcmUgdGhlIGFnZ3JlZ2F0b3IgZmx1c2hlc1xuXG5TZXRzIHRoZSBwZXJpb2QgKGUuZy4sICczMHMnKSwgYWZ0ZXIgd2hpY2ggdGhlIGFnZ3JlZ2F0b3IgdHJhbnNmb3JtcyB0aGUgcm93cyBvZiBpdHMgaW4tbWVtIHRhYmxlIGludG8gVGVuWFN1bW1hcmllcyBpbnN0YW5jZXMgYW5kIGZsdXNoZXMgdGhlbSBpbnRvIHRoZSBwaXBlbGluZS4gIElmIHNldCwgdGhlIFtmbHVzaFRocmVzaG9sZF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmx1c2h0aHJlc2hvbGQpICBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXF1aXJlZCIgOiBbCiAgICAgICAgICAibmFtZSIsCiAgICAgICAgICAiZmllbGRzIgogICAgICAgIF0KICAgICAgfQogICAgfQogIH0sCiAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlCn0=</template>

    ```yaml
    # 🔟❎ 'run' dev app aggregator config
    
    # This file configures aggregators for the dev app.
    # To learn more see https://doc.log10x.com/run/aggregate/
    
    # Set the 10x pipeline to 'run'
    tenx: run
    
    # ============================== Aggregator Options ===========================
    
    # Multiple aggregators can be defined below
    aggregator:
    
      - name: devAggregator
    
        # 'filter' sets a JavaScript expression that TenXObjects must evaluate as truthy to be aggregated.
        #  To learn more see https://doc.log10x.com/run/output/receive/#filter-expressions
        filter: null
    
        # 'fields' set the names of intrinsic/extracted/calculated fields whose combined values
        #  identify a unique row within the aggregator's in-mem table for
        #  each object passed to it. This aggregator defaults to enrichment fields.
        #  To learn more see https://doc.log10x.com/run/initialize/#enrichmentFields
        fields:
          - $=yield TenXEnv.get("enrichmentFields")
          
        # 'totalFields' specifies fields to extract and tally into generated TenXSummaries
        totalFields: []
    
        # 'flushThreshold' sets the max number of TenXObjects whose values to upsert into
        #  the aggregator's in-mem table. Once exceeded, the aggregator instantiates TenXSummaries 
        #  from the table rows to send to output and reset the table.
        flushThreshold: 0 
    
        # 'flushInterval' sets a periodic interval, after which the aggregator
        #  flushes the rows of its in-mem table into the pipeline as TenXSummary instances.
        flushInterval: null
    
        # 'maxCardinality' sets the maximum number of rows for the aggregator's
        #  in-mem table. If an TenXObjects whose 'values' are not contained in the table
        #  is passed to the aggregator, 'defaultValue' will be used for it instead
        #  until the aggregator flushes its in-mem table after 'flushInterval' or 'flushThreshold'
        #  are exceeded.
        maxCardinality: 65536
    
        # 'defaultValue' sets a constant value that is used instead of 'values' when
        #  'maxCardinality' is exceeded within 'flushInterval'
        defaultValue: unknown
    ```

??? tenx-mcp "Mcp"

    <a id="mcp"></a>
    ### Mcp {.hidden-heading}



    Below is the default configuration from: [mcp/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/mcp/config.yaml "mcp/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/mcp/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml1-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml1-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml1-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit config.yaml Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml1-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/run/aggregate/mcp/config.yaml"
                                data-copy-nix="/etc/log10x/config/run/aggregate/mcp/config.yaml"
                                data-copy-win="C:\log10x\configs/run/aggregate/mcp/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/run/aggregate/mcp/config.yaml">$TENX_CONFIG/run/aggregate/mcp/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/run/aggregate/mcp/config.yaml">./pipelines/run/aggregate/mcp/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogInN0cmluZyIKICAgIH0sCiAgICAiYWdncmVnYXRvciIgOiB7CiAgICAgICJ0eXBlIiA6ICJhcnJheSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTG9naWNhbCBuYW1lIG9mIGFnZ3JlZ2F0b3JcblxuUHJvdmlkZXMgYSBsb2dpY2FsIG5hbWUgZm9yIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgJ2Vycm9ycycpLiBUaGlzIHZhbHVlIGlzIGFjY2Vzc2libGUgYXQgcnVuLXRpbWUgdmlhIHRoZSBpbnRyaW5zaWMgJ2lucHV0TmFtZScgZmllbGQgdG8gaWRlbnRpZnkgVGVuWFN1bW1hcmllcyBvcmlnaW5hdGluZyBmcm9tIHRoaXMgYWdncmVnYXRvci4iCiAgICAgICAgICB9LAogICAgICAgICAgImVuYWJsZWQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiRW5hYmxlL2Rpc2FibGUgdGhpcyBhZ2dyZWdhdG9yXG5cblNldHMgd2hldGhlciB0byBvcGVuIHRoZSBpbnB1dCBzdHJlYW0uIFRvIGVuYWJsZSB0aGlzIGlucHV0IG9ubHkgd2hlbiBhbiAnYWdncmVnYXRlRXJyb3JzJyBzdGFydHVwIGFyZ3VtZW50IHZhbHVlIGlzIHRydXRoeTogIGBgYCB5YW1sIC4uLiBhZ2dyZWdhdG9yOiAgIGVuYWJsZWQ6ICQ9VGVuWEVudi5nZXQoXCJhZ2dyZWdhdGVFcnJvcnNcIikgYGBgIChEZWZhdWx0OiB0cnVlKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICJ0cnVlIgogICAgICAgICAgfSwKICAgICAgICAgICJmaWVsZHMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgZmllbGQgbmFtZXMgYnkgd2hpY2ggdG8gYWdncmVnYXRlIFRlblhPYmplY3RzXG5cblByb3ZpZGVzIGEgbGlzdCBvZiBpbnRyaW5zaWMvZXh0cmFjdGVkL2NhbGN1bGF0ZWQgW1RlblhPYmplY3RdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2pzLyNUZW5YT2JqZWN0KSBmaWVsZCBuYW1lcyBieSB3aGljaCB0byBhZ2dyZWdhdGUgaW5zdGFuY2VzLiAgV2hlbiB0aGUgYWdncmVnYXRvciBmbHVzaGVzIHRoZSBpbi1tZW0gdGFibGUgdG8gcHJvZHVjZWQgVGVuWFN1bW1hcmllcywgZWFjaCBnZW5lcmF0ZWQgVGVuWFN1bW1hcnkgaW5zdGFuY2UgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB0b3RhbCB2YWx1ZXMgdmlhIGl0cyBbc3VtbWFyeVRvdGFsc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvanMvI1RlblhTdW1tYXJ5K3N1bW1hcnlWYWx1ZXMpIGFycmF5IGZpZWxkLiIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJkZWZhdWx0VmFsdWUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJBIGNvbnN0YW50IHZhbHVlIHRvIGRlZmF1bHQgaWYgJ21heENhcmRpbmFsaXR5JyBpcyBleGNlZWRlZFxuXG5EZWZpbmVzIGEgY29uc3RhbnQgdmFsdWUgdG8gdXNlIGluc3RlYWQgb2YgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSB3aGVuIHRoZSBjdXJyZW50IG51bWJlciBvZiByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpIGV4Y2VlZHMgW21heENhcmRpbmFsaXR5XShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JtYXhjYXJkaW5hbGl0eSkuICBUaGlzIHZhbHVlIHByZXZlbnRzIGFuIG91dC1vZi1tZW0gZXJyb3IgaWYgVGVuWE9iamVjdHMgd2hvc2UgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSBhcmUgb2YgaGlnaCBjYXJkaW5hbGl0eSwgd2hpY2ggY2FuIGNhdXNlIHRoZSBpbi1tZW0gdGFibGUgdG8gZ3JvdyBiZXlvbmQgdGhlIGNvbmZpbmVzIG9mIHRoZSBob3N0IEpWTSBoZWFwLiAgVGhpcyBlcnJvciBpcyBwb3NzaWJsZSBpZiBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGNvbnRhaW5zIGEgY2FsY3VsYXRlZC9leHRyYWN0ZWQgZmllbGQgd2hvc2UgdmFsdWUgaXMgYWxwaGFudW1lcmljIChlLmcuLCAnc3BhbklEJykgYW5kIGlzIHByYWN0aWNhbGx5IHVuaXF1ZSB0byBlYWNoIFRlblhPYmplY3QuIgogICAgICAgICAgfSwKICAgICAgICAgICJ0b3RhbEZpZWxkcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBmaWVsZHMgd2hvc2UgdmFsdWVzIHRvIHRhbGx5IGludG8gZ2VuZXJhdGVkIFRlblhTdW1tYXJpZXNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBpbnRyaW5zaWMgY2FsY3VsYXRlZC9leHRyYWN0ZWQgVGVuWE9iamVjdCBmaWVsZCBuYW1lcyB0byB0YWxseSBhbmQgd3JpdGUgaW50byBhZ2dyZWdhdGVkIFRlblhTdW1tYXJ5IGluc3RhbmNlcyB3aXRoaW4gYSB0YXJnZXQgZmx1c2ggIFt0aHJlc2hvbGRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNodGhyZXNob2xkKSBvciBbaW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpLiAgRm9yIGV4YW1wbGUsIHNldHRpbmcgYSB2YWx1ZSBvZjogYHByaWNlYCBpbnRvIHRoaXMgYXJyYXkgd2lsbCB0YWxseSB0aGUgcHJpY2VzIG9mIGFsbCBUZW5YT2JqZWN0cyBhZ2dyZWdhdGVkIGludG8gYSB0YXJnZXQgb3V0cHV0IFRlblhTdW1tYXJ5IGluc3RhbmNlLiAgIEEgbWF0Y2hpbmcgYHByaWNlYCB2YWx1ZSBjb250YWluaW5nIHRoZSBzdW0gb2YgYWdncmVnYXRlZCBwcmljZXMgd2lsbCBiZSBhY2Nlc3NpYmxlIGZvciBlYWNoIFRlblhTdW1tYXJ5IGluc3RhbmNlIHZpYSBpdHMgIFtzdW1tYXJ5VG90YWxzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWFN1bW1hcnkrc3VtbWFyeVRvdGFscykgYXJyYXkuIiwKICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgIm1heENhcmRpbmFsaXR5IiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTWF4IG51bWJlciBvZiBjb25jdXJyZW50IHJvd3Mgd2l0aGluIHRoZSBhZ2dyZWdhdG9yIGluLW1lbSB0YWJsZSB3aXRoaW4gdGhlIGZsdXNoIGludGVydmFsXG5cblNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZS4gSWYgdGhlIG51bWJlciBvZiByb3dzIGV4Y2VlZHMgdGhpcyB2YWx1ZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpICwgdGhlICdhZ2dyZWdhdG9yRGVmYXVsdFZhbHVlJyB2YWx1ZSB3aWxsIGJlIGZvciBhbGwgVGVuWE9iamVjdHMgaW5zdGVhZCBvZiBbZmllbGQgdmFsdWVzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIHVudGlsIHRoZSBhZ2dyZWdhdG9yIGlzIGZsdXNoZWQuICBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBiYWNrc3RvcCB0byBlbnN1cmUgdGhhdCB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkb2VzIG5vdCBvdmVyZmxvdyB3aGVuIGV4dHJhY3RpbmcgYW5kICBhZ2dyZWdhdGluZyB2ZXJ5IGhpZ2ggY2FyZGluYWxpdHkgdmFsdWVzIGZyb20gdGhlIGZpZWxkcyBvZiBUZW5YT2JqZWN0cyBwYXNzZWQgdG8gdGhpcyBhZ2dyZWdhdG9yLiAgSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQgb3Igc2V0IHRvIDAsIHRoZSBhZ2dyZWdhdG9yIGhhcyBubyBjYXAuIFRoaXMgbWF5IHJlc3VsdCBpbiBhbiBvdXQtb2YtbWVtIGVycm9yIHdoZW4gdmVyeSBoaWdoIGNhcmRpbmFsaXR5IChlLmcuLCAnc3BhbklEJywgJ0dVSUQnKSBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGFyZSBzcGVjaWZpZWQuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImZpbHRlciIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGFuIFRlblhPYmplY3QgbXVzdCBldmFsdWF0ZSBhcyAndHJ1dGh5JyBhZ2FpbnN0IHRvIGJlIGFnZ3JlZ2F0ZWRcblxuUHJvdmlkZXMgYSB3YXkgdG8gY29udHJvbCB3aGljaCBUZW5YT2JqZWN0cyBhcmUgaW5jb3Jwb3JhdGVkIGludG8gdGhpcyBhZ2dyZWdhdG9yLiBVbmxpa2UgdGhlICdhZ2dyZWdhdG9yRW5hYmxlZCcsIHdoaWNoIGVuYWJsZXMvZGlzYWJsZXMgdGhpcyBhZ2dyZWdhdG9yIGFsdG9nZXRoZXIsIHRoaXMgSmF2YVNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBwZXIgVGVuWE9iamVjdCB0byBwcm92aWRlIGdyYW51bGFyIGNvbnRyb2wgb3ZlciB3aGF0IGluZm9ybWF0aW9uIHRvIGFnZ3JlZ2F0ZS4gIEZvciBleGFtcGxlLCB0byBvbmx5IGFnZ3JlZ2F0ZSBUZW5YT2JqZWN0cyByZWFkIGZyb20gYSBzcGVjaWZpZWQgaW5wdXQ6ICBgYGAgeWFtbCBhZ2dyZWdhdG9yOiAgIGZpbHRlcjogdGhpcy5pbnB1dE5hbWUgPT0gXCJlbGFzdGljXCIgYGBgICBUbyBhcHBseSBtb3JlIGNvbXBsZXggbG9naWMsIGludm9rZSBhbiAxMHggSmF2YVNjcmlwdCBmdW5jdGlvbiBkZWNsYXJlZCBpbiBhIC5qcyBmaWxlIGJ5IHBhc3NpbmcgaXQgdG8gdGhlIDEweCBFbmdpbmUgYXQgc3RhcnR1cCAoZS5nLiwgJCB0ZW54IHJ1biBAbXkuanMpLiAgYGBgIHlhbWwgYWdncmVnYXRvcjogICAuLi4gICBmaWx0ZXI6IG15QWdncmVnYXRvckZpbHRlcigpIGBgYCAgRm9yIGEgcmVhbC13b3JsZCBhZ2dyZWdhdG9yIGV4YW1wbGUgc2VlIFthZ2dyZWdhdGUvc3RyZWFtLnlhbWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9sb2ctMTB4L21vZHVsZXMvYmxvYi9tYWluL3BpcGVsaW5lcy9ydW4vbW9kdWxlcy9hZ2dyZWdhdGUvc3RyZWFtLnlhbWwpLiIKICAgICAgICAgIH0sCiAgICAgICAgICAiZmx1c2hUaHJlc2hvbGQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXhpbXVtIHRoZSBudW1iZXIgb2YgVGVuWE9iamVjdHMgdG8gYWdncmVnYXRlIGJlZm9yZSB0aGUgYWdncmVnYXRvciBmbHVzaGVzXG5cbkNvbnRyb2xzIGhvdyBtYW55IFRlblhPYmplY3RzIHRvIHVwc2VydCBpbnRvIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgMTAwMDApIGJlZm9yZSB0aGUgYWdncmVnYXRvciB0cmFuc2Zvcm1zIHRoZSByb3dzIG9mIGl0cyBpbi1tZW0gdGFibGUgaW50byBUZW5YU3VtbWFyaWVzIGluc3RhbmNlcyBhbmQgZmx1c2hlcyB0aGVtIGludG8gdGhlIHBpcGVsaW5lLiAgSWYgbm90IHNldCwgdGhlIFtmbHVzaEludGVydmFsXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmbHVzaGludGVydmFsKSBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIgogICAgICAgICAgfSwKICAgICAgICAgICJmbHVzaEludGVydmFsIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSW50ZXJ2YWwgdG8gd2FpdCBiZWZvcmUgdGhlIGFnZ3JlZ2F0b3IgZmx1c2hlc1xuXG5TZXRzIHRoZSBwZXJpb2QgKGUuZy4sICczMHMnKSwgYWZ0ZXIgd2hpY2ggdGhlIGFnZ3JlZ2F0b3IgdHJhbnNmb3JtcyB0aGUgcm93cyBvZiBpdHMgaW4tbWVtIHRhYmxlIGludG8gVGVuWFN1bW1hcmllcyBpbnN0YW5jZXMgYW5kIGZsdXNoZXMgdGhlbSBpbnRvIHRoZSBwaXBlbGluZS4gIElmIHNldCwgdGhlIFtmbHVzaFRocmVzaG9sZF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmx1c2h0aHJlc2hvbGQpICBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXF1aXJlZCIgOiBbCiAgICAgICAgICAibmFtZSIsCiAgICAgICAgICAiZmllbGRzIgogICAgICAgIF0KICAgICAgfQogICAgfQogIH0sCiAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlCn0=</template>

    ```yaml
    # 🔟❎ 'run' MCP app aggregator config
    
    # Forked from `pipelines/run/aggregate/dev/config.yaml`. Configures
    # the aggregator that backs `@apps/mcp` and `@apps/mcp-file`. Differs
    # from the dev aggregator only in the periodic `flushInterval`,
    # which keeps summaries flowing through the MCP wrapper continuously
    # (the dev aggregator flushes only at engine shutdown).
    #
    # To learn more see https://doc.log10x.com/run/aggregate/
    
    # Set the 10x pipeline to 'run'
    tenx: run
    
    # ============================== Aggregator Options ===========================
    
    # Multiple aggregators can be defined below
    aggregator:
    
      - name: mcpAggregator
    
        # 'filter' sets a JavaScript expression that TenXObjects must evaluate as truthy to be aggregated.
        #  To learn more see https://doc.log10x.com/run/output/receive/#filter-expressions
        filter: null
    
        # 'fields' set the names of intrinsic/extracted/calculated fields whose combined values
        #  identify a unique row within the aggregator's in-mem table for
        #  each object passed to it. This aggregator defaults to enrichment fields.
        #  To learn more see https://doc.log10x.com/run/initialize/#enrichmentFields
        fields:
          - $=yield TenXEnv.get("enrichmentFields")
          
        # 'totalFields' specifies fields to extract and tally into generated TenXSummaries
        totalFields: []
    
        # 'flushThreshold' sets the max number of TenXObjects whose values to upsert into
        #  the aggregator's in-mem table. Once exceeded, the aggregator instantiates TenXSummaries 
        #  from the table rows to send to output and reset the table.
        flushThreshold: 0 
    
        # 'flushInterval' sets a periodic interval, after which the aggregator
        #  flushes the rows of its in-mem table into the pipeline as TenXSummary instances.
        flushInterval: 2s
    
        # 'maxCardinality' sets the maximum number of rows for the aggregator's
        #  in-mem table. If an TenXObjects whose 'values' are not contained in the table
        #  is passed to the aggregator, 'defaultValue' will be used for it instead
        #  until the aggregator flushes its in-mem table after 'flushInterval' or 'flushThreshold'
        #  are exceeded.
        maxCardinality: 65536
    
        # 'defaultValue' sets a constant value that is used instead of 'values' when
        #  'maxCardinality' is exceeded within 'flushInterval'
        defaultValue: unknown
    ```

??? tenx-report "Report"

    <a id="report"></a>
    ### Report {.hidden-heading}



    Below is the default configuration from: [report/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/report/config.yaml "report/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/report/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml2-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml2-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml2-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit config.yaml Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml2-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/run/aggregate/report/config.yaml"
                                data-copy-nix="/etc/log10x/config/run/aggregate/report/config.yaml"
                                data-copy-win="C:\log10x\configs/run/aggregate/report/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/run/aggregate/report/config.yaml">$TENX_CONFIG/run/aggregate/report/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/run/aggregate/report/config.yaml">./pipelines/run/aggregate/report/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogInN0cmluZyIKICAgIH0sCiAgICAiYWdncmVnYXRvciIgOiB7CiAgICAgICJ0eXBlIiA6ICJhcnJheSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTG9naWNhbCBuYW1lIG9mIGFnZ3JlZ2F0b3JcblxuUHJvdmlkZXMgYSBsb2dpY2FsIG5hbWUgZm9yIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgJ2Vycm9ycycpLiBUaGlzIHZhbHVlIGlzIGFjY2Vzc2libGUgYXQgcnVuLXRpbWUgdmlhIHRoZSBpbnRyaW5zaWMgJ2lucHV0TmFtZScgZmllbGQgdG8gaWRlbnRpZnkgVGVuWFN1bW1hcmllcyBvcmlnaW5hdGluZyBmcm9tIHRoaXMgYWdncmVnYXRvci4iCiAgICAgICAgICB9LAogICAgICAgICAgImVuYWJsZWQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiRW5hYmxlL2Rpc2FibGUgdGhpcyBhZ2dyZWdhdG9yXG5cblNldHMgd2hldGhlciB0byBvcGVuIHRoZSBpbnB1dCBzdHJlYW0uIFRvIGVuYWJsZSB0aGlzIGlucHV0IG9ubHkgd2hlbiBhbiAnYWdncmVnYXRlRXJyb3JzJyBzdGFydHVwIGFyZ3VtZW50IHZhbHVlIGlzIHRydXRoeTogIGBgYCB5YW1sIC4uLiBhZ2dyZWdhdG9yOiAgIGVuYWJsZWQ6ICQ9VGVuWEVudi5nZXQoXCJhZ2dyZWdhdGVFcnJvcnNcIikgYGBgIChEZWZhdWx0OiB0cnVlKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICJ0cnVlIgogICAgICAgICAgfSwKICAgICAgICAgICJmaWVsZHMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgZmllbGQgbmFtZXMgYnkgd2hpY2ggdG8gYWdncmVnYXRlIFRlblhPYmplY3RzXG5cblByb3ZpZGVzIGEgbGlzdCBvZiBpbnRyaW5zaWMvZXh0cmFjdGVkL2NhbGN1bGF0ZWQgW1RlblhPYmplY3RdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2pzLyNUZW5YT2JqZWN0KSBmaWVsZCBuYW1lcyBieSB3aGljaCB0byBhZ2dyZWdhdGUgaW5zdGFuY2VzLiAgV2hlbiB0aGUgYWdncmVnYXRvciBmbHVzaGVzIHRoZSBpbi1tZW0gdGFibGUgdG8gcHJvZHVjZWQgVGVuWFN1bW1hcmllcywgZWFjaCBnZW5lcmF0ZWQgVGVuWFN1bW1hcnkgaW5zdGFuY2UgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB0b3RhbCB2YWx1ZXMgdmlhIGl0cyBbc3VtbWFyeVRvdGFsc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvanMvI1RlblhTdW1tYXJ5K3N1bW1hcnlWYWx1ZXMpIGFycmF5IGZpZWxkLiIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJkZWZhdWx0VmFsdWUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJBIGNvbnN0YW50IHZhbHVlIHRvIGRlZmF1bHQgaWYgJ21heENhcmRpbmFsaXR5JyBpcyBleGNlZWRlZFxuXG5EZWZpbmVzIGEgY29uc3RhbnQgdmFsdWUgdG8gdXNlIGluc3RlYWQgb2YgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSB3aGVuIHRoZSBjdXJyZW50IG51bWJlciBvZiByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpIGV4Y2VlZHMgW21heENhcmRpbmFsaXR5XShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JtYXhjYXJkaW5hbGl0eSkuICBUaGlzIHZhbHVlIHByZXZlbnRzIGFuIG91dC1vZi1tZW0gZXJyb3IgaWYgVGVuWE9iamVjdHMgd2hvc2UgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSBhcmUgb2YgaGlnaCBjYXJkaW5hbGl0eSwgd2hpY2ggY2FuIGNhdXNlIHRoZSBpbi1tZW0gdGFibGUgdG8gZ3JvdyBiZXlvbmQgdGhlIGNvbmZpbmVzIG9mIHRoZSBob3N0IEpWTSBoZWFwLiAgVGhpcyBlcnJvciBpcyBwb3NzaWJsZSBpZiBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGNvbnRhaW5zIGEgY2FsY3VsYXRlZC9leHRyYWN0ZWQgZmllbGQgd2hvc2UgdmFsdWUgaXMgYWxwaGFudW1lcmljIChlLmcuLCAnc3BhbklEJykgYW5kIGlzIHByYWN0aWNhbGx5IHVuaXF1ZSB0byBlYWNoIFRlblhPYmplY3QuIgogICAgICAgICAgfSwKICAgICAgICAgICJ0b3RhbEZpZWxkcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBmaWVsZHMgd2hvc2UgdmFsdWVzIHRvIHRhbGx5IGludG8gZ2VuZXJhdGVkIFRlblhTdW1tYXJpZXNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBpbnRyaW5zaWMgY2FsY3VsYXRlZC9leHRyYWN0ZWQgVGVuWE9iamVjdCBmaWVsZCBuYW1lcyB0byB0YWxseSBhbmQgd3JpdGUgaW50byBhZ2dyZWdhdGVkIFRlblhTdW1tYXJ5IGluc3RhbmNlcyB3aXRoaW4gYSB0YXJnZXQgZmx1c2ggIFt0aHJlc2hvbGRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNodGhyZXNob2xkKSBvciBbaW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpLiAgRm9yIGV4YW1wbGUsIHNldHRpbmcgYSB2YWx1ZSBvZjogYHByaWNlYCBpbnRvIHRoaXMgYXJyYXkgd2lsbCB0YWxseSB0aGUgcHJpY2VzIG9mIGFsbCBUZW5YT2JqZWN0cyBhZ2dyZWdhdGVkIGludG8gYSB0YXJnZXQgb3V0cHV0IFRlblhTdW1tYXJ5IGluc3RhbmNlLiAgIEEgbWF0Y2hpbmcgYHByaWNlYCB2YWx1ZSBjb250YWluaW5nIHRoZSBzdW0gb2YgYWdncmVnYXRlZCBwcmljZXMgd2lsbCBiZSBhY2Nlc3NpYmxlIGZvciBlYWNoIFRlblhTdW1tYXJ5IGluc3RhbmNlIHZpYSBpdHMgIFtzdW1tYXJ5VG90YWxzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWFN1bW1hcnkrc3VtbWFyeVRvdGFscykgYXJyYXkuIiwKICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgIm1heENhcmRpbmFsaXR5IiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTWF4IG51bWJlciBvZiBjb25jdXJyZW50IHJvd3Mgd2l0aGluIHRoZSBhZ2dyZWdhdG9yIGluLW1lbSB0YWJsZSB3aXRoaW4gdGhlIGZsdXNoIGludGVydmFsXG5cblNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZS4gSWYgdGhlIG51bWJlciBvZiByb3dzIGV4Y2VlZHMgdGhpcyB2YWx1ZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpICwgdGhlICdhZ2dyZWdhdG9yRGVmYXVsdFZhbHVlJyB2YWx1ZSB3aWxsIGJlIGZvciBhbGwgVGVuWE9iamVjdHMgaW5zdGVhZCBvZiBbZmllbGQgdmFsdWVzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIHVudGlsIHRoZSBhZ2dyZWdhdG9yIGlzIGZsdXNoZWQuICBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBiYWNrc3RvcCB0byBlbnN1cmUgdGhhdCB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkb2VzIG5vdCBvdmVyZmxvdyB3aGVuIGV4dHJhY3RpbmcgYW5kICBhZ2dyZWdhdGluZyB2ZXJ5IGhpZ2ggY2FyZGluYWxpdHkgdmFsdWVzIGZyb20gdGhlIGZpZWxkcyBvZiBUZW5YT2JqZWN0cyBwYXNzZWQgdG8gdGhpcyBhZ2dyZWdhdG9yLiAgSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQgb3Igc2V0IHRvIDAsIHRoZSBhZ2dyZWdhdG9yIGhhcyBubyBjYXAuIFRoaXMgbWF5IHJlc3VsdCBpbiBhbiBvdXQtb2YtbWVtIGVycm9yIHdoZW4gdmVyeSBoaWdoIGNhcmRpbmFsaXR5IChlLmcuLCAnc3BhbklEJywgJ0dVSUQnKSBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGFyZSBzcGVjaWZpZWQuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImZpbHRlciIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGFuIFRlblhPYmplY3QgbXVzdCBldmFsdWF0ZSBhcyAndHJ1dGh5JyBhZ2FpbnN0IHRvIGJlIGFnZ3JlZ2F0ZWRcblxuUHJvdmlkZXMgYSB3YXkgdG8gY29udHJvbCB3aGljaCBUZW5YT2JqZWN0cyBhcmUgaW5jb3Jwb3JhdGVkIGludG8gdGhpcyBhZ2dyZWdhdG9yLiBVbmxpa2UgdGhlICdhZ2dyZWdhdG9yRW5hYmxlZCcsIHdoaWNoIGVuYWJsZXMvZGlzYWJsZXMgdGhpcyBhZ2dyZWdhdG9yIGFsdG9nZXRoZXIsIHRoaXMgSmF2YVNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBwZXIgVGVuWE9iamVjdCB0byBwcm92aWRlIGdyYW51bGFyIGNvbnRyb2wgb3ZlciB3aGF0IGluZm9ybWF0aW9uIHRvIGFnZ3JlZ2F0ZS4gIEZvciBleGFtcGxlLCB0byBvbmx5IGFnZ3JlZ2F0ZSBUZW5YT2JqZWN0cyByZWFkIGZyb20gYSBzcGVjaWZpZWQgaW5wdXQ6ICBgYGAgeWFtbCBhZ2dyZWdhdG9yOiAgIGZpbHRlcjogdGhpcy5pbnB1dE5hbWUgPT0gXCJlbGFzdGljXCIgYGBgICBUbyBhcHBseSBtb3JlIGNvbXBsZXggbG9naWMsIGludm9rZSBhbiAxMHggSmF2YVNjcmlwdCBmdW5jdGlvbiBkZWNsYXJlZCBpbiBhIC5qcyBmaWxlIGJ5IHBhc3NpbmcgaXQgdG8gdGhlIDEweCBFbmdpbmUgYXQgc3RhcnR1cCAoZS5nLiwgJCB0ZW54IHJ1biBAbXkuanMpLiAgYGBgIHlhbWwgYWdncmVnYXRvcjogICAuLi4gICBmaWx0ZXI6IG15QWdncmVnYXRvckZpbHRlcigpIGBgYCAgRm9yIGEgcmVhbC13b3JsZCBhZ2dyZWdhdG9yIGV4YW1wbGUgc2VlIFthZ2dyZWdhdGUvc3RyZWFtLnlhbWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9sb2ctMTB4L21vZHVsZXMvYmxvYi9tYWluL3BpcGVsaW5lcy9ydW4vbW9kdWxlcy9hZ2dyZWdhdGUvc3RyZWFtLnlhbWwpLiIKICAgICAgICAgIH0sCiAgICAgICAgICAiZmx1c2hUaHJlc2hvbGQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXhpbXVtIHRoZSBudW1iZXIgb2YgVGVuWE9iamVjdHMgdG8gYWdncmVnYXRlIGJlZm9yZSB0aGUgYWdncmVnYXRvciBmbHVzaGVzXG5cbkNvbnRyb2xzIGhvdyBtYW55IFRlblhPYmplY3RzIHRvIHVwc2VydCBpbnRvIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgMTAwMDApIGJlZm9yZSB0aGUgYWdncmVnYXRvciB0cmFuc2Zvcm1zIHRoZSByb3dzIG9mIGl0cyBpbi1tZW0gdGFibGUgaW50byBUZW5YU3VtbWFyaWVzIGluc3RhbmNlcyBhbmQgZmx1c2hlcyB0aGVtIGludG8gdGhlIHBpcGVsaW5lLiAgSWYgbm90IHNldCwgdGhlIFtmbHVzaEludGVydmFsXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmbHVzaGludGVydmFsKSBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIgogICAgICAgICAgfSwKICAgICAgICAgICJmbHVzaEludGVydmFsIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSW50ZXJ2YWwgdG8gd2FpdCBiZWZvcmUgdGhlIGFnZ3JlZ2F0b3IgZmx1c2hlc1xuXG5TZXRzIHRoZSBwZXJpb2QgKGUuZy4sICczMHMnKSwgYWZ0ZXIgd2hpY2ggdGhlIGFnZ3JlZ2F0b3IgdHJhbnNmb3JtcyB0aGUgcm93cyBvZiBpdHMgaW4tbWVtIHRhYmxlIGludG8gVGVuWFN1bW1hcmllcyBpbnN0YW5jZXMgYW5kIGZsdXNoZXMgdGhlbSBpbnRvIHRoZSBwaXBlbGluZS4gIElmIHNldCwgdGhlIFtmbHVzaFRocmVzaG9sZF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmx1c2h0aHJlc2hvbGQpICBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXF1aXJlZCIgOiBbCiAgICAgICAgICAibmFtZSIsCiAgICAgICAgICAiZmllbGRzIgogICAgICAgIF0KICAgICAgfQogICAgfQogIH0sCiAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlCn0=</template>

    ```yaml
    # 🔟❎ 'run' aggregator config for the reporter app.
    
    # This file configures aggregators for tracking emitted (non-dropped) events.
    # To learn more see https://doc.log10x.com/run/aggregate
    
    # Set the 10x pipeline to 'run'
    tenx: run
    
    # ============================== Aggregator Options ===========================
    
    # Multiple aggregators can be defined below
    aggregator:
    
      # Defines an aggregator for tracking emitted (non-dropped) events
      # This enables an output metric to show an accurate (lossless) metric of the
      # data actually emitted to downstream systems.
      - name: emitted_events
    
        # 'filter' sets a JavaScript expression that TenXObjects must evaluate as truthy to be aggregated.
        #  To learn more see https://doc.log10x.com/run/output/receive/#filter-expressions
        #
        # This filter excludes dropped events by checking isRoute("drop"),
        # ensuring only emitted events are tracked.
        #
        # For more info, see https://doc.log10x.com/api/js/#TenXBaseObject+dropped
        filter: "this.isObject && !this.isRoute(\"drop\")"
    
        # 'fields' set the names of intrinsic/extracted/calculated fields whose combined values
        #  identify a unique row within the aggregator's in-mem table for
        #  each object passed to it. This aggregator defaults to enrichment fields.
        #  To learn more see https://doc.log10x.com/run/initialize/#enrichmentFields
        fields:
          - $=yield TenXEnv.get("enrichmentFields")
    
        # 'totalFields' specifies fields to extract and tally into generated TenXSummaries
        totalFields: []
    
        # 'flushThreshold' sets the max number of TenXObjects whose values to upsert into
        #  the aggregator's in-mem table. Once exceeded, the aggregator instantiates TenXSummaries
        #  from the table rows to send to output and reset the table.
        flushThreshold: 10000
    
        # 'flushInterval' sets a periodic interval, after which the aggregator
        #  flushes the rows of its in-mem table into the pipeline as TenXSummary instances.
        flushInterval: 2s
    
        # 'maxCardinality' sets the maximum number of rows for the aggregator's
        #  in-mem table. If an TenXObjects whose 'values' are not contained in the table
        #  is passed to the aggregator, 'defaultValue' will be used for it instead
        #  until the aggregator flushes its in-mem table after 'flushInterval' or 'flushThreshold'
        #  are exceeded.
        maxCardinality: 65536
    
        # 'defaultValue' sets a constant value that is used instead of 'values' when
        #  'maxCardinality' is exceeded within 'flushInterval'
        defaultValue: unknown
    ```

??? tenx-receive "Receive"

    <a id="receive"></a>
    ### Receive {.hidden-heading}



    Below is the default configuration from: [receive/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/receive/config.yaml "receive/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/receive/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml3-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml3-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml3-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit config.yaml Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml3-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/run/aggregate/receive/config.yaml"
                                data-copy-nix="/etc/log10x/config/run/aggregate/receive/config.yaml"
                                data-copy-win="C:\log10x\configs/run/aggregate/receive/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/run/aggregate/receive/config.yaml">$TENX_CONFIG/run/aggregate/receive/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/run/aggregate/receive/config.yaml">./pipelines/run/aggregate/receive/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogInN0cmluZyIKICAgIH0sCiAgICAiYWdncmVnYXRvciIgOiB7CiAgICAgICJ0eXBlIiA6ICJhcnJheSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTG9naWNhbCBuYW1lIG9mIGFnZ3JlZ2F0b3JcblxuUHJvdmlkZXMgYSBsb2dpY2FsIG5hbWUgZm9yIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgJ2Vycm9ycycpLiBUaGlzIHZhbHVlIGlzIGFjY2Vzc2libGUgYXQgcnVuLXRpbWUgdmlhIHRoZSBpbnRyaW5zaWMgJ2lucHV0TmFtZScgZmllbGQgdG8gaWRlbnRpZnkgVGVuWFN1bW1hcmllcyBvcmlnaW5hdGluZyBmcm9tIHRoaXMgYWdncmVnYXRvci4iCiAgICAgICAgICB9LAogICAgICAgICAgImVuYWJsZWQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiRW5hYmxlL2Rpc2FibGUgdGhpcyBhZ2dyZWdhdG9yXG5cblNldHMgd2hldGhlciB0byBvcGVuIHRoZSBpbnB1dCBzdHJlYW0uIFRvIGVuYWJsZSB0aGlzIGlucHV0IG9ubHkgd2hlbiBhbiAnYWdncmVnYXRlRXJyb3JzJyBzdGFydHVwIGFyZ3VtZW50IHZhbHVlIGlzIHRydXRoeTogIGBgYCB5YW1sIC4uLiBhZ2dyZWdhdG9yOiAgIGVuYWJsZWQ6ICQ9VGVuWEVudi5nZXQoXCJhZ2dyZWdhdGVFcnJvcnNcIikgYGBgIChEZWZhdWx0OiB0cnVlKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICJ0cnVlIgogICAgICAgICAgfSwKICAgICAgICAgICJmaWVsZHMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgZmllbGQgbmFtZXMgYnkgd2hpY2ggdG8gYWdncmVnYXRlIFRlblhPYmplY3RzXG5cblByb3ZpZGVzIGEgbGlzdCBvZiBpbnRyaW5zaWMvZXh0cmFjdGVkL2NhbGN1bGF0ZWQgW1RlblhPYmplY3RdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2pzLyNUZW5YT2JqZWN0KSBmaWVsZCBuYW1lcyBieSB3aGljaCB0byBhZ2dyZWdhdGUgaW5zdGFuY2VzLiAgV2hlbiB0aGUgYWdncmVnYXRvciBmbHVzaGVzIHRoZSBpbi1tZW0gdGFibGUgdG8gcHJvZHVjZWQgVGVuWFN1bW1hcmllcywgZWFjaCBnZW5lcmF0ZWQgVGVuWFN1bW1hcnkgaW5zdGFuY2UgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB0b3RhbCB2YWx1ZXMgdmlhIGl0cyBbc3VtbWFyeVRvdGFsc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvanMvI1RlblhTdW1tYXJ5K3N1bW1hcnlWYWx1ZXMpIGFycmF5IGZpZWxkLiIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJkZWZhdWx0VmFsdWUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJBIGNvbnN0YW50IHZhbHVlIHRvIGRlZmF1bHQgaWYgJ21heENhcmRpbmFsaXR5JyBpcyBleGNlZWRlZFxuXG5EZWZpbmVzIGEgY29uc3RhbnQgdmFsdWUgdG8gdXNlIGluc3RlYWQgb2YgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSB3aGVuIHRoZSBjdXJyZW50IG51bWJlciBvZiByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpIGV4Y2VlZHMgW21heENhcmRpbmFsaXR5XShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JtYXhjYXJkaW5hbGl0eSkuICBUaGlzIHZhbHVlIHByZXZlbnRzIGFuIG91dC1vZi1tZW0gZXJyb3IgaWYgVGVuWE9iamVjdHMgd2hvc2UgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSBhcmUgb2YgaGlnaCBjYXJkaW5hbGl0eSwgd2hpY2ggY2FuIGNhdXNlIHRoZSBpbi1tZW0gdGFibGUgdG8gZ3JvdyBiZXlvbmQgdGhlIGNvbmZpbmVzIG9mIHRoZSBob3N0IEpWTSBoZWFwLiAgVGhpcyBlcnJvciBpcyBwb3NzaWJsZSBpZiBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGNvbnRhaW5zIGEgY2FsY3VsYXRlZC9leHRyYWN0ZWQgZmllbGQgd2hvc2UgdmFsdWUgaXMgYWxwaGFudW1lcmljIChlLmcuLCAnc3BhbklEJykgYW5kIGlzIHByYWN0aWNhbGx5IHVuaXF1ZSB0byBlYWNoIFRlblhPYmplY3QuIgogICAgICAgICAgfSwKICAgICAgICAgICJ0b3RhbEZpZWxkcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBmaWVsZHMgd2hvc2UgdmFsdWVzIHRvIHRhbGx5IGludG8gZ2VuZXJhdGVkIFRlblhTdW1tYXJpZXNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBpbnRyaW5zaWMgY2FsY3VsYXRlZC9leHRyYWN0ZWQgVGVuWE9iamVjdCBmaWVsZCBuYW1lcyB0byB0YWxseSBhbmQgd3JpdGUgaW50byBhZ2dyZWdhdGVkIFRlblhTdW1tYXJ5IGluc3RhbmNlcyB3aXRoaW4gYSB0YXJnZXQgZmx1c2ggIFt0aHJlc2hvbGRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNodGhyZXNob2xkKSBvciBbaW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpLiAgRm9yIGV4YW1wbGUsIHNldHRpbmcgYSB2YWx1ZSBvZjogYHByaWNlYCBpbnRvIHRoaXMgYXJyYXkgd2lsbCB0YWxseSB0aGUgcHJpY2VzIG9mIGFsbCBUZW5YT2JqZWN0cyBhZ2dyZWdhdGVkIGludG8gYSB0YXJnZXQgb3V0cHV0IFRlblhTdW1tYXJ5IGluc3RhbmNlLiAgIEEgbWF0Y2hpbmcgYHByaWNlYCB2YWx1ZSBjb250YWluaW5nIHRoZSBzdW0gb2YgYWdncmVnYXRlZCBwcmljZXMgd2lsbCBiZSBhY2Nlc3NpYmxlIGZvciBlYWNoIFRlblhTdW1tYXJ5IGluc3RhbmNlIHZpYSBpdHMgIFtzdW1tYXJ5VG90YWxzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWFN1bW1hcnkrc3VtbWFyeVRvdGFscykgYXJyYXkuIiwKICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgIm1heENhcmRpbmFsaXR5IiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTWF4IG51bWJlciBvZiBjb25jdXJyZW50IHJvd3Mgd2l0aGluIHRoZSBhZ2dyZWdhdG9yIGluLW1lbSB0YWJsZSB3aXRoaW4gdGhlIGZsdXNoIGludGVydmFsXG5cblNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZS4gSWYgdGhlIG51bWJlciBvZiByb3dzIGV4Y2VlZHMgdGhpcyB2YWx1ZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpICwgdGhlICdhZ2dyZWdhdG9yRGVmYXVsdFZhbHVlJyB2YWx1ZSB3aWxsIGJlIGZvciBhbGwgVGVuWE9iamVjdHMgaW5zdGVhZCBvZiBbZmllbGQgdmFsdWVzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIHVudGlsIHRoZSBhZ2dyZWdhdG9yIGlzIGZsdXNoZWQuICBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBiYWNrc3RvcCB0byBlbnN1cmUgdGhhdCB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkb2VzIG5vdCBvdmVyZmxvdyB3aGVuIGV4dHJhY3RpbmcgYW5kICBhZ2dyZWdhdGluZyB2ZXJ5IGhpZ2ggY2FyZGluYWxpdHkgdmFsdWVzIGZyb20gdGhlIGZpZWxkcyBvZiBUZW5YT2JqZWN0cyBwYXNzZWQgdG8gdGhpcyBhZ2dyZWdhdG9yLiAgSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQgb3Igc2V0IHRvIDAsIHRoZSBhZ2dyZWdhdG9yIGhhcyBubyBjYXAuIFRoaXMgbWF5IHJlc3VsdCBpbiBhbiBvdXQtb2YtbWVtIGVycm9yIHdoZW4gdmVyeSBoaWdoIGNhcmRpbmFsaXR5IChlLmcuLCAnc3BhbklEJywgJ0dVSUQnKSBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGFyZSBzcGVjaWZpZWQuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImZpbHRlciIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGFuIFRlblhPYmplY3QgbXVzdCBldmFsdWF0ZSBhcyAndHJ1dGh5JyBhZ2FpbnN0IHRvIGJlIGFnZ3JlZ2F0ZWRcblxuUHJvdmlkZXMgYSB3YXkgdG8gY29udHJvbCB3aGljaCBUZW5YT2JqZWN0cyBhcmUgaW5jb3Jwb3JhdGVkIGludG8gdGhpcyBhZ2dyZWdhdG9yLiBVbmxpa2UgdGhlICdhZ2dyZWdhdG9yRW5hYmxlZCcsIHdoaWNoIGVuYWJsZXMvZGlzYWJsZXMgdGhpcyBhZ2dyZWdhdG9yIGFsdG9nZXRoZXIsIHRoaXMgSmF2YVNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBwZXIgVGVuWE9iamVjdCB0byBwcm92aWRlIGdyYW51bGFyIGNvbnRyb2wgb3ZlciB3aGF0IGluZm9ybWF0aW9uIHRvIGFnZ3JlZ2F0ZS4gIEZvciBleGFtcGxlLCB0byBvbmx5IGFnZ3JlZ2F0ZSBUZW5YT2JqZWN0cyByZWFkIGZyb20gYSBzcGVjaWZpZWQgaW5wdXQ6ICBgYGAgeWFtbCBhZ2dyZWdhdG9yOiAgIGZpbHRlcjogdGhpcy5pbnB1dE5hbWUgPT0gXCJlbGFzdGljXCIgYGBgICBUbyBhcHBseSBtb3JlIGNvbXBsZXggbG9naWMsIGludm9rZSBhbiAxMHggSmF2YVNjcmlwdCBmdW5jdGlvbiBkZWNsYXJlZCBpbiBhIC5qcyBmaWxlIGJ5IHBhc3NpbmcgaXQgdG8gdGhlIDEweCBFbmdpbmUgYXQgc3RhcnR1cCAoZS5nLiwgJCB0ZW54IHJ1biBAbXkuanMpLiAgYGBgIHlhbWwgYWdncmVnYXRvcjogICAuLi4gICBmaWx0ZXI6IG15QWdncmVnYXRvckZpbHRlcigpIGBgYCAgRm9yIGEgcmVhbC13b3JsZCBhZ2dyZWdhdG9yIGV4YW1wbGUgc2VlIFthZ2dyZWdhdGUvc3RyZWFtLnlhbWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9sb2ctMTB4L21vZHVsZXMvYmxvYi9tYWluL3BpcGVsaW5lcy9ydW4vbW9kdWxlcy9hZ2dyZWdhdGUvc3RyZWFtLnlhbWwpLiIKICAgICAgICAgIH0sCiAgICAgICAgICAiZmx1c2hUaHJlc2hvbGQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXhpbXVtIHRoZSBudW1iZXIgb2YgVGVuWE9iamVjdHMgdG8gYWdncmVnYXRlIGJlZm9yZSB0aGUgYWdncmVnYXRvciBmbHVzaGVzXG5cbkNvbnRyb2xzIGhvdyBtYW55IFRlblhPYmplY3RzIHRvIHVwc2VydCBpbnRvIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgMTAwMDApIGJlZm9yZSB0aGUgYWdncmVnYXRvciB0cmFuc2Zvcm1zIHRoZSByb3dzIG9mIGl0cyBpbi1tZW0gdGFibGUgaW50byBUZW5YU3VtbWFyaWVzIGluc3RhbmNlcyBhbmQgZmx1c2hlcyB0aGVtIGludG8gdGhlIHBpcGVsaW5lLiAgSWYgbm90IHNldCwgdGhlIFtmbHVzaEludGVydmFsXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmbHVzaGludGVydmFsKSBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIgogICAgICAgICAgfSwKICAgICAgICAgICJmbHVzaEludGVydmFsIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSW50ZXJ2YWwgdG8gd2FpdCBiZWZvcmUgdGhlIGFnZ3JlZ2F0b3IgZmx1c2hlc1xuXG5TZXRzIHRoZSBwZXJpb2QgKGUuZy4sICczMHMnKSwgYWZ0ZXIgd2hpY2ggdGhlIGFnZ3JlZ2F0b3IgdHJhbnNmb3JtcyB0aGUgcm93cyBvZiBpdHMgaW4tbWVtIHRhYmxlIGludG8gVGVuWFN1bW1hcmllcyBpbnN0YW5jZXMgYW5kIGZsdXNoZXMgdGhlbSBpbnRvIHRoZSBwaXBlbGluZS4gIElmIHNldCwgdGhlIFtmbHVzaFRocmVzaG9sZF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmx1c2h0aHJlc2hvbGQpICBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXF1aXJlZCIgOiBbCiAgICAgICAgICAibmFtZSIsCiAgICAgICAgICAiZmllbGRzIgogICAgICAgIF0KICAgICAgfQogICAgfQogIH0sCiAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlCn0=</template>

    ```yaml
    # 🔟❎ 'run' aggregator config for the receiver app.
    
    # This file configures aggregators for tracking emitted (non-dropped) events with
    # additional metrics for tracking received (dropped) events for cost saving analysis.
    # When 'receiverOptimize' is enabled, the emitted_events aggregator also tracks
    # optimized event sizes to measure optimization effectiveness.
    # To learn more see https://doc.log10x.com/run/aggregate
    
    # Set the 10x pipeline to 'run'
    tenx: run
    
    # ============================== Aggregator Options ===========================
    
    # Multiple aggregators can be defined below
    aggregator:
    
      # Defines an aggregator for tracking emitted (non-dropped) events
      # This enables an output metric to show an accurate (lossless) metric of the
      # data actually emitted to downstream systems.
      - name: emitted_events
    
        # 'filter' sets a JavaScript expression that TenXObjects must evaluate as truthy to be aggregated.
        #  To learn more see https://doc.log10x.com/run/output/receive/#filter-expressions
        #
        # This filter excludes dropped events by checking isRoute("drop"),
        # ensuring only emitted events are tracked.
        #
        # For more info, see https://doc.log10x.com/api/js/#TenXBaseObject+dropped
        filter: "this.isObject && !this.isRoute(\"drop\")"
    
        # 'fields' set the names of intrinsic/extracted/calculated fields whose combined values
        #  identify a unique row within the aggregator's in-mem table for
        #  each object passed to it. This aggregator defaults to enrichment fields.
        #  To learn more see https://doc.log10x.com/run/initialize/#enrichmentFields
        fields:
          - $=yield TenXEnv.get("enrichmentFields")
    
        # 'totalFields' specifies fields to extract and tally into generated TenXSummaries.
        #  When receiverOptimize is enabled, tracks the utf8 byte size of encoded events
        #  to measure optimization effectiveness.
        #  To learn more see https://doc.log10x.com/api/js/#TenXObject+encode
        totalFields:
          - '$=yield TenXEnv.get("receiverOptimize") ? "optimized_size=this.utf8Size(\"encoded=encode()\")" : ""'
    
        # 'flushThreshold' sets the max number of TenXObjects whose values to upsert into
        #  the aggregator's in-mem table. Once exceeded, the aggregator instantiates TenXSummaries
        #  from the table rows to send to output and reset the table.
        flushThreshold: 10000
    
        # 'flushInterval' sets a periodic interval, after which the aggregator
        #  flushes the rows of its in-mem table into the pipeline as TenXSummary instances.
        flushInterval: 2s
    
        # 'maxCardinality' sets the maximum number of rows for the aggregator's
        #  in-mem table. If an TenXObjects whose 'values' are not contained in the table
        #  is passed to the aggregator, 'defaultValue' will be used for it instead
        #  until the aggregator flushes its in-mem table after 'flushInterval' or 'flushThreshold'
        #  are exceeded.
        maxCardinality: 65536
    
        # 'defaultValue' sets a constant value that is used instead of 'values' when
        #  'maxCardinality' is exceeded within 'flushInterval'
        defaultValue: unknown
    
      # Defines an aggregator for all events seen by this pipeline
      # This enables an output metric to show an accurate (lossless) metric of the
      # data processed by this pipeline, even if it was later dropped.
      - name: all_events
    
        # 'filter' sets a JavaScript expression that TenXObjects must evaluate as truthy to be aggregated.
        #  To learn more see https://doc.log10x.com/run/output/receive/#filter-expressions
        filter: isObject
    
        # 'values' set the names of intrinsic/extracted/calculated fields whose combined values
        #  identify a unique row within the aggregator's in-mem table for
        #  each object passed to it.
    
        # By default, this configuration uses the enrichment fields specified below.
        fields:
          - $=yield TenXEnv.get("enrichmentFields")
    
        # 'totalFields' specifies fields to extract and tally into generated TenXSummaries
        totalFields: []
    
        # 'flushThreshold' sets the max number of TenXObjects whose values to upsert into
        #  the aggregator's in-mem table. Once exceeded, the aggregator instantiates TenXSummaries
        #  from the table rows to send to output and reset the table.
        flushThreshold: 10000
    
        # 'flushInterval' sets a periodic interval, after which the aggregator
        #  flushes the rows of its in-mem table into the pipeline as TenXSummary instances.
        flushInterval: 2s
    
        # 'maxCardinality' sets the maximum number of rows for the aggregator's
        #  in-mem table. If an TenXObjects whose 'values' are not contained in the table
        #  is passed to the aggregator, 'defaultValue' will be used for it instead
        #  until the aggregator flushes its in-mem table after 'flushInterval' or 'flushThreshold'
        #  are exceeded.
        maxCardinality: 65536
    
        # 'defaultValue' sets a constant value that is used instead of 'values' when
        #  'maxCardinality' is exceeded within 'flushInterval'
        defaultValue: unknown
    ```

??? tenx-index "Index"

    <a id="index"></a>
    ### Index {.hidden-heading}



    Below is the default configuration from: [index/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/index/config.yaml "index/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/index/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml4-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml4-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml4-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit config.yaml Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml4-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/run/aggregate/index/config.yaml"
                                data-copy-nix="/etc/log10x/config/run/aggregate/index/config.yaml"
                                data-copy-win="C:\log10x\configs/run/aggregate/index/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/run/aggregate/index/config.yaml">$TENX_CONFIG/run/aggregate/index/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/run/aggregate/index/config.yaml">./pipelines/run/aggregate/index/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogInN0cmluZyIKICAgIH0sCiAgICAiYWdncmVnYXRvciIgOiB7CiAgICAgICJ0eXBlIiA6ICJhcnJheSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTG9naWNhbCBuYW1lIG9mIGFnZ3JlZ2F0b3JcblxuUHJvdmlkZXMgYSBsb2dpY2FsIG5hbWUgZm9yIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgJ2Vycm9ycycpLiBUaGlzIHZhbHVlIGlzIGFjY2Vzc2libGUgYXQgcnVuLXRpbWUgdmlhIHRoZSBpbnRyaW5zaWMgJ2lucHV0TmFtZScgZmllbGQgdG8gaWRlbnRpZnkgVGVuWFN1bW1hcmllcyBvcmlnaW5hdGluZyBmcm9tIHRoaXMgYWdncmVnYXRvci4iCiAgICAgICAgICB9LAogICAgICAgICAgImVuYWJsZWQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiRW5hYmxlL2Rpc2FibGUgdGhpcyBhZ2dyZWdhdG9yXG5cblNldHMgd2hldGhlciB0byBvcGVuIHRoZSBpbnB1dCBzdHJlYW0uIFRvIGVuYWJsZSB0aGlzIGlucHV0IG9ubHkgd2hlbiBhbiAnYWdncmVnYXRlRXJyb3JzJyBzdGFydHVwIGFyZ3VtZW50IHZhbHVlIGlzIHRydXRoeTogIGBgYCB5YW1sIC4uLiBhZ2dyZWdhdG9yOiAgIGVuYWJsZWQ6ICQ9VGVuWEVudi5nZXQoXCJhZ2dyZWdhdGVFcnJvcnNcIikgYGBgIChEZWZhdWx0OiB0cnVlKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICJ0cnVlIgogICAgICAgICAgfSwKICAgICAgICAgICJmaWVsZHMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgZmllbGQgbmFtZXMgYnkgd2hpY2ggdG8gYWdncmVnYXRlIFRlblhPYmplY3RzXG5cblByb3ZpZGVzIGEgbGlzdCBvZiBpbnRyaW5zaWMvZXh0cmFjdGVkL2NhbGN1bGF0ZWQgW1RlblhPYmplY3RdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2pzLyNUZW5YT2JqZWN0KSBmaWVsZCBuYW1lcyBieSB3aGljaCB0byBhZ2dyZWdhdGUgaW5zdGFuY2VzLiAgV2hlbiB0aGUgYWdncmVnYXRvciBmbHVzaGVzIHRoZSBpbi1tZW0gdGFibGUgdG8gcHJvZHVjZWQgVGVuWFN1bW1hcmllcywgZWFjaCBnZW5lcmF0ZWQgVGVuWFN1bW1hcnkgaW5zdGFuY2UgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB0b3RhbCB2YWx1ZXMgdmlhIGl0cyBbc3VtbWFyeVRvdGFsc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvanMvI1RlblhTdW1tYXJ5K3N1bW1hcnlWYWx1ZXMpIGFycmF5IGZpZWxkLiIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJkZWZhdWx0VmFsdWUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJBIGNvbnN0YW50IHZhbHVlIHRvIGRlZmF1bHQgaWYgJ21heENhcmRpbmFsaXR5JyBpcyBleGNlZWRlZFxuXG5EZWZpbmVzIGEgY29uc3RhbnQgdmFsdWUgdG8gdXNlIGluc3RlYWQgb2YgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSB3aGVuIHRoZSBjdXJyZW50IG51bWJlciBvZiByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpIGV4Y2VlZHMgW21heENhcmRpbmFsaXR5XShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JtYXhjYXJkaW5hbGl0eSkuICBUaGlzIHZhbHVlIHByZXZlbnRzIGFuIG91dC1vZi1tZW0gZXJyb3IgaWYgVGVuWE9iamVjdHMgd2hvc2UgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSBhcmUgb2YgaGlnaCBjYXJkaW5hbGl0eSwgd2hpY2ggY2FuIGNhdXNlIHRoZSBpbi1tZW0gdGFibGUgdG8gZ3JvdyBiZXlvbmQgdGhlIGNvbmZpbmVzIG9mIHRoZSBob3N0IEpWTSBoZWFwLiAgVGhpcyBlcnJvciBpcyBwb3NzaWJsZSBpZiBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGNvbnRhaW5zIGEgY2FsY3VsYXRlZC9leHRyYWN0ZWQgZmllbGQgd2hvc2UgdmFsdWUgaXMgYWxwaGFudW1lcmljIChlLmcuLCAnc3BhbklEJykgYW5kIGlzIHByYWN0aWNhbGx5IHVuaXF1ZSB0byBlYWNoIFRlblhPYmplY3QuIgogICAgICAgICAgfSwKICAgICAgICAgICJ0b3RhbEZpZWxkcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBmaWVsZHMgd2hvc2UgdmFsdWVzIHRvIHRhbGx5IGludG8gZ2VuZXJhdGVkIFRlblhTdW1tYXJpZXNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBpbnRyaW5zaWMgY2FsY3VsYXRlZC9leHRyYWN0ZWQgVGVuWE9iamVjdCBmaWVsZCBuYW1lcyB0byB0YWxseSBhbmQgd3JpdGUgaW50byBhZ2dyZWdhdGVkIFRlblhTdW1tYXJ5IGluc3RhbmNlcyB3aXRoaW4gYSB0YXJnZXQgZmx1c2ggIFt0aHJlc2hvbGRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNodGhyZXNob2xkKSBvciBbaW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpLiAgRm9yIGV4YW1wbGUsIHNldHRpbmcgYSB2YWx1ZSBvZjogYHByaWNlYCBpbnRvIHRoaXMgYXJyYXkgd2lsbCB0YWxseSB0aGUgcHJpY2VzIG9mIGFsbCBUZW5YT2JqZWN0cyBhZ2dyZWdhdGVkIGludG8gYSB0YXJnZXQgb3V0cHV0IFRlblhTdW1tYXJ5IGluc3RhbmNlLiAgIEEgbWF0Y2hpbmcgYHByaWNlYCB2YWx1ZSBjb250YWluaW5nIHRoZSBzdW0gb2YgYWdncmVnYXRlZCBwcmljZXMgd2lsbCBiZSBhY2Nlc3NpYmxlIGZvciBlYWNoIFRlblhTdW1tYXJ5IGluc3RhbmNlIHZpYSBpdHMgIFtzdW1tYXJ5VG90YWxzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWFN1bW1hcnkrc3VtbWFyeVRvdGFscykgYXJyYXkuIiwKICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgIm1heENhcmRpbmFsaXR5IiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTWF4IG51bWJlciBvZiBjb25jdXJyZW50IHJvd3Mgd2l0aGluIHRoZSBhZ2dyZWdhdG9yIGluLW1lbSB0YWJsZSB3aXRoaW4gdGhlIGZsdXNoIGludGVydmFsXG5cblNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZS4gSWYgdGhlIG51bWJlciBvZiByb3dzIGV4Y2VlZHMgdGhpcyB2YWx1ZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpICwgdGhlICdhZ2dyZWdhdG9yRGVmYXVsdFZhbHVlJyB2YWx1ZSB3aWxsIGJlIGZvciBhbGwgVGVuWE9iamVjdHMgaW5zdGVhZCBvZiBbZmllbGQgdmFsdWVzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIHVudGlsIHRoZSBhZ2dyZWdhdG9yIGlzIGZsdXNoZWQuICBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBiYWNrc3RvcCB0byBlbnN1cmUgdGhhdCB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkb2VzIG5vdCBvdmVyZmxvdyB3aGVuIGV4dHJhY3RpbmcgYW5kICBhZ2dyZWdhdGluZyB2ZXJ5IGhpZ2ggY2FyZGluYWxpdHkgdmFsdWVzIGZyb20gdGhlIGZpZWxkcyBvZiBUZW5YT2JqZWN0cyBwYXNzZWQgdG8gdGhpcyBhZ2dyZWdhdG9yLiAgSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQgb3Igc2V0IHRvIDAsIHRoZSBhZ2dyZWdhdG9yIGhhcyBubyBjYXAuIFRoaXMgbWF5IHJlc3VsdCBpbiBhbiBvdXQtb2YtbWVtIGVycm9yIHdoZW4gdmVyeSBoaWdoIGNhcmRpbmFsaXR5IChlLmcuLCAnc3BhbklEJywgJ0dVSUQnKSBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGFyZSBzcGVjaWZpZWQuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImZpbHRlciIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGFuIFRlblhPYmplY3QgbXVzdCBldmFsdWF0ZSBhcyAndHJ1dGh5JyBhZ2FpbnN0IHRvIGJlIGFnZ3JlZ2F0ZWRcblxuUHJvdmlkZXMgYSB3YXkgdG8gY29udHJvbCB3aGljaCBUZW5YT2JqZWN0cyBhcmUgaW5jb3Jwb3JhdGVkIGludG8gdGhpcyBhZ2dyZWdhdG9yLiBVbmxpa2UgdGhlICdhZ2dyZWdhdG9yRW5hYmxlZCcsIHdoaWNoIGVuYWJsZXMvZGlzYWJsZXMgdGhpcyBhZ2dyZWdhdG9yIGFsdG9nZXRoZXIsIHRoaXMgSmF2YVNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBwZXIgVGVuWE9iamVjdCB0byBwcm92aWRlIGdyYW51bGFyIGNvbnRyb2wgb3ZlciB3aGF0IGluZm9ybWF0aW9uIHRvIGFnZ3JlZ2F0ZS4gIEZvciBleGFtcGxlLCB0byBvbmx5IGFnZ3JlZ2F0ZSBUZW5YT2JqZWN0cyByZWFkIGZyb20gYSBzcGVjaWZpZWQgaW5wdXQ6ICBgYGAgeWFtbCBhZ2dyZWdhdG9yOiAgIGZpbHRlcjogdGhpcy5pbnB1dE5hbWUgPT0gXCJlbGFzdGljXCIgYGBgICBUbyBhcHBseSBtb3JlIGNvbXBsZXggbG9naWMsIGludm9rZSBhbiAxMHggSmF2YVNjcmlwdCBmdW5jdGlvbiBkZWNsYXJlZCBpbiBhIC5qcyBmaWxlIGJ5IHBhc3NpbmcgaXQgdG8gdGhlIDEweCBFbmdpbmUgYXQgc3RhcnR1cCAoZS5nLiwgJCB0ZW54IHJ1biBAbXkuanMpLiAgYGBgIHlhbWwgYWdncmVnYXRvcjogICAuLi4gICBmaWx0ZXI6IG15QWdncmVnYXRvckZpbHRlcigpIGBgYCAgRm9yIGEgcmVhbC13b3JsZCBhZ2dyZWdhdG9yIGV4YW1wbGUgc2VlIFthZ2dyZWdhdGUvc3RyZWFtLnlhbWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9sb2ctMTB4L21vZHVsZXMvYmxvYi9tYWluL3BpcGVsaW5lcy9ydW4vbW9kdWxlcy9hZ2dyZWdhdGUvc3RyZWFtLnlhbWwpLiIKICAgICAgICAgIH0sCiAgICAgICAgICAiZmx1c2hUaHJlc2hvbGQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXhpbXVtIHRoZSBudW1iZXIgb2YgVGVuWE9iamVjdHMgdG8gYWdncmVnYXRlIGJlZm9yZSB0aGUgYWdncmVnYXRvciBmbHVzaGVzXG5cbkNvbnRyb2xzIGhvdyBtYW55IFRlblhPYmplY3RzIHRvIHVwc2VydCBpbnRvIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgMTAwMDApIGJlZm9yZSB0aGUgYWdncmVnYXRvciB0cmFuc2Zvcm1zIHRoZSByb3dzIG9mIGl0cyBpbi1tZW0gdGFibGUgaW50byBUZW5YU3VtbWFyaWVzIGluc3RhbmNlcyBhbmQgZmx1c2hlcyB0aGVtIGludG8gdGhlIHBpcGVsaW5lLiAgSWYgbm90IHNldCwgdGhlIFtmbHVzaEludGVydmFsXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmbHVzaGludGVydmFsKSBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIgogICAgICAgICAgfSwKICAgICAgICAgICJmbHVzaEludGVydmFsIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSW50ZXJ2YWwgdG8gd2FpdCBiZWZvcmUgdGhlIGFnZ3JlZ2F0b3IgZmx1c2hlc1xuXG5TZXRzIHRoZSBwZXJpb2QgKGUuZy4sICczMHMnKSwgYWZ0ZXIgd2hpY2ggdGhlIGFnZ3JlZ2F0b3IgdHJhbnNmb3JtcyB0aGUgcm93cyBvZiBpdHMgaW4tbWVtIHRhYmxlIGludG8gVGVuWFN1bW1hcmllcyBpbnN0YW5jZXMgYW5kIGZsdXNoZXMgdGhlbSBpbnRvIHRoZSBwaXBlbGluZS4gIElmIHNldCwgdGhlIFtmbHVzaFRocmVzaG9sZF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmx1c2h0aHJlc2hvbGQpICBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXF1aXJlZCIgOiBbCiAgICAgICAgICAibmFtZSIsCiAgICAgICAgICAiZmllbGRzIgogICAgICAgIF0KICAgICAgfQogICAgfQogIH0sCiAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlCn0=</template>

    ```yaml
    # 🔟❎ 'run' index aggregator config
    
    # This file configures the aggregators for the Retriever app Index component.
    # To learn more see https://doc.log10x.com/run/aggregate
    
    # Set the 10x pipeline to 'run'
    tenx: run
    
    # ============================== Aggregator Options ===========================
    
    # Multiple aggregators can be defined below
    aggregator:
    
      # Defines an aggregator for all events seen by this pipeline
      # This enables an output metric to show an accurate (lossless) metric of the
      # data processed by this pipeline, even if it was later dropped.
      - name: indexed_events
    
        # 'filter' sets a JavaScript expression that TenXObjects must evaluate as truthy to be aggregated.
        #  To learn more see https://doc.log10x.com/run/output/receive/#filter-expressions
        filter: isObject
    
        # 'fields' set the names of intrinsic/extracted/calculated fields whose combined values
        #  identify a unique row within the aggregator's in-mem table for
        #  each object passed to it. This aggregator defaults to enrichment fields.
        #  To learn more see https://doc.log10x.com/run/initialize/#enrichmentFields
        fields:
          - $=yield TenXEnv.get("enrichmentFields")
    
        # 'totalFields' specifies fields to extract and tally into generated TenXSummaries
        totalFields: []
    
        # 'flushThreshold' sets the max number of TenXObjects whose values to upsert into
        #  the aggregator's in-mem table. Once exceeded, the aggregator instantiates TenXSummaries
        #  from the table rows to send to output and reset the table.
        flushThreshold: 10000
    
        # 'flushInterval' sets a periodic interval, after which the aggregator
        #  flushes the rows of its in-mem table into the pipeline as TenXSummary instances.
        flushInterval: 2s
    
        # 'maxCardinality' sets the maximum number of rows for the aggregator's
        #  in-mem table. If an TenXObjects whose 'values' are not contained in the table
        #  is passed to the aggregator, 'defaultValue' will be used for it instead
        #  until the aggregator flushes its in-mem table after 'flushInterval' or 'flushThreshold'
        #  are exceeded.
        maxCardinality: 65536
    
        # 'defaultValue' sets a constant value that is used instead of 'values' when
        #  'maxCardinality' is exceeded within 'flushInterval'
        defaultValue: unknown
    ```

??? tenx-stream "Stream"

    <a id="stream"></a>
    ### Stream {.hidden-heading}



    Below is the default configuration from: [stream/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/stream/config.yaml "stream/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/run/aggregate/stream/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml5-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml5-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml5-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit config.yaml Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml5-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/run/aggregate/stream/config.yaml"
                                data-copy-nix="/etc/log10x/config/run/aggregate/stream/config.yaml"
                                data-copy-win="C:\log10x\configs/run/aggregate/stream/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/run/aggregate/stream/config.yaml">$TENX_CONFIG/run/aggregate/stream/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/run/aggregate/stream/config.yaml">./pipelines/run/aggregate/stream/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogInN0cmluZyIKICAgIH0sCiAgICAiYWdncmVnYXRvciIgOiB7CiAgICAgICJ0eXBlIiA6ICJhcnJheSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICJuYW1lIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTG9naWNhbCBuYW1lIG9mIGFnZ3JlZ2F0b3JcblxuUHJvdmlkZXMgYSBsb2dpY2FsIG5hbWUgZm9yIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgJ2Vycm9ycycpLiBUaGlzIHZhbHVlIGlzIGFjY2Vzc2libGUgYXQgcnVuLXRpbWUgdmlhIHRoZSBpbnRyaW5zaWMgJ2lucHV0TmFtZScgZmllbGQgdG8gaWRlbnRpZnkgVGVuWFN1bW1hcmllcyBvcmlnaW5hdGluZyBmcm9tIHRoaXMgYWdncmVnYXRvci4iCiAgICAgICAgICB9LAogICAgICAgICAgImVuYWJsZWQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiRW5hYmxlL2Rpc2FibGUgdGhpcyBhZ2dyZWdhdG9yXG5cblNldHMgd2hldGhlciB0byBvcGVuIHRoZSBpbnB1dCBzdHJlYW0uIFRvIGVuYWJsZSB0aGlzIGlucHV0IG9ubHkgd2hlbiBhbiAnYWdncmVnYXRlRXJyb3JzJyBzdGFydHVwIGFyZ3VtZW50IHZhbHVlIGlzIHRydXRoeTogIGBgYCB5YW1sIC4uLiBhZ2dyZWdhdG9yOiAgIGVuYWJsZWQ6ICQ9VGVuWEVudi5nZXQoXCJhZ2dyZWdhdGVFcnJvcnNcIikgYGBgIChEZWZhdWx0OiB0cnVlKSIsCiAgICAgICAgICAgICJkZWZhdWx0IiA6ICJ0cnVlIgogICAgICAgICAgfSwKICAgICAgICAgICJmaWVsZHMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgZmllbGQgbmFtZXMgYnkgd2hpY2ggdG8gYWdncmVnYXRlIFRlblhPYmplY3RzXG5cblByb3ZpZGVzIGEgbGlzdCBvZiBpbnRyaW5zaWMvZXh0cmFjdGVkL2NhbGN1bGF0ZWQgW1RlblhPYmplY3RdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vYXBpL2pzLyNUZW5YT2JqZWN0KSBmaWVsZCBuYW1lcyBieSB3aGljaCB0byBhZ2dyZWdhdGUgaW5zdGFuY2VzLiAgV2hlbiB0aGUgYWdncmVnYXRvciBmbHVzaGVzIHRoZSBpbi1tZW0gdGFibGUgdG8gcHJvZHVjZWQgVGVuWFN1bW1hcmllcywgZWFjaCBnZW5lcmF0ZWQgVGVuWFN1bW1hcnkgaW5zdGFuY2UgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB0b3RhbCB2YWx1ZXMgdmlhIGl0cyBbc3VtbWFyeVRvdGFsc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvanMvI1RlblhTdW1tYXJ5K3N1bW1hcnlWYWx1ZXMpIGFycmF5IGZpZWxkLiIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJkZWZhdWx0VmFsdWUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJBIGNvbnN0YW50IHZhbHVlIHRvIGRlZmF1bHQgaWYgJ21heENhcmRpbmFsaXR5JyBpcyBleGNlZWRlZFxuXG5EZWZpbmVzIGEgY29uc3RhbnQgdmFsdWUgdG8gdXNlIGluc3RlYWQgb2YgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSB3aGVuIHRoZSBjdXJyZW50IG51bWJlciBvZiByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpIGV4Y2VlZHMgW21heENhcmRpbmFsaXR5XShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JtYXhjYXJkaW5hbGl0eSkuICBUaGlzIHZhbHVlIHByZXZlbnRzIGFuIG91dC1vZi1tZW0gZXJyb3IgaWYgVGVuWE9iamVjdHMgd2hvc2UgW2ZpZWxkIHZhbHVlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmllbGRzKSBhcmUgb2YgaGlnaCBjYXJkaW5hbGl0eSwgd2hpY2ggY2FuIGNhdXNlIHRoZSBpbi1tZW0gdGFibGUgdG8gZ3JvdyBiZXlvbmQgdGhlIGNvbmZpbmVzIG9mIHRoZSBob3N0IEpWTSBoZWFwLiAgVGhpcyBlcnJvciBpcyBwb3NzaWJsZSBpZiBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGNvbnRhaW5zIGEgY2FsY3VsYXRlZC9leHRyYWN0ZWQgZmllbGQgd2hvc2UgdmFsdWUgaXMgYWxwaGFudW1lcmljIChlLmcuLCAnc3BhbklEJykgYW5kIGlzIHByYWN0aWNhbGx5IHVuaXF1ZSB0byBlYWNoIFRlblhPYmplY3QuIgogICAgICAgICAgfSwKICAgICAgICAgICJ0b3RhbEZpZWxkcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAiYXJyYXkiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBmaWVsZHMgd2hvc2UgdmFsdWVzIHRvIHRhbGx5IGludG8gZ2VuZXJhdGVkIFRlblhTdW1tYXJpZXNcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBpbnRyaW5zaWMgY2FsY3VsYXRlZC9leHRyYWN0ZWQgVGVuWE9iamVjdCBmaWVsZCBuYW1lcyB0byB0YWxseSBhbmQgd3JpdGUgaW50byBhZ2dyZWdhdGVkIFRlblhTdW1tYXJ5IGluc3RhbmNlcyB3aXRoaW4gYSB0YXJnZXQgZmx1c2ggIFt0aHJlc2hvbGRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNodGhyZXNob2xkKSBvciBbaW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpLiAgRm9yIGV4YW1wbGUsIHNldHRpbmcgYSB2YWx1ZSBvZjogYHByaWNlYCBpbnRvIHRoaXMgYXJyYXkgd2lsbCB0YWxseSB0aGUgcHJpY2VzIG9mIGFsbCBUZW5YT2JqZWN0cyBhZ2dyZWdhdGVkIGludG8gYSB0YXJnZXQgb3V0cHV0IFRlblhTdW1tYXJ5IGluc3RhbmNlLiAgIEEgbWF0Y2hpbmcgYHByaWNlYCB2YWx1ZSBjb250YWluaW5nIHRoZSBzdW0gb2YgYWdncmVnYXRlZCBwcmljZXMgd2lsbCBiZSBhY2Nlc3NpYmxlIGZvciBlYWNoIFRlblhTdW1tYXJ5IGluc3RhbmNlIHZpYSBpdHMgIFtzdW1tYXJ5VG90YWxzXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWFN1bW1hcnkrc3VtbWFyeVRvdGFscykgYXJyYXkuIiwKICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgIm1heENhcmRpbmFsaXR5IiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTWF4IG51bWJlciBvZiBjb25jdXJyZW50IHJvd3Mgd2l0aGluIHRoZSBhZ2dyZWdhdG9yIGluLW1lbSB0YWJsZSB3aXRoaW4gdGhlIGZsdXNoIGludGVydmFsXG5cblNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSByb3dzIHdpdGhpbiB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZS4gSWYgdGhlIG51bWJlciBvZiByb3dzIGV4Y2VlZHMgdGhpcyB2YWx1ZSBkdXJpbmcgW2ZsdXNoSW50ZXJ2YWxdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL2FnZ3JlZ2F0ZS8jYWdncmVnYXRvcmZsdXNoaW50ZXJ2YWwpICwgdGhlICdhZ2dyZWdhdG9yRGVmYXVsdFZhbHVlJyB2YWx1ZSB3aWxsIGJlIGZvciBhbGwgVGVuWE9iamVjdHMgaW5zdGVhZCBvZiBbZmllbGQgdmFsdWVzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIHVudGlsIHRoZSBhZ2dyZWdhdG9yIGlzIGZsdXNoZWQuICBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBiYWNrc3RvcCB0byBlbnN1cmUgdGhhdCB0aGUgYWdncmVnYXRvcidzIGluLW1lbSB0YWJsZSBkb2VzIG5vdCBvdmVyZmxvdyB3aGVuIGV4dHJhY3RpbmcgYW5kICBhZ2dyZWdhdGluZyB2ZXJ5IGhpZ2ggY2FyZGluYWxpdHkgdmFsdWVzIGZyb20gdGhlIGZpZWxkcyBvZiBUZW5YT2JqZWN0cyBwYXNzZWQgdG8gdGhpcyBhZ2dyZWdhdG9yLiAgSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQgb3Igc2V0IHRvIDAsIHRoZSBhZ2dyZWdhdG9yIGhhcyBubyBjYXAuIFRoaXMgbWF5IHJlc3VsdCBpbiBhbiBvdXQtb2YtbWVtIGVycm9yIHdoZW4gdmVyeSBoaWdoIGNhcmRpbmFsaXR5IChlLmcuLCAnc3BhbklEJywgJ0dVSUQnKSBbZmllbGRzXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmaWVsZHMpIGFyZSBzcGVjaWZpZWQuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImZpbHRlciIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGFuIFRlblhPYmplY3QgbXVzdCBldmFsdWF0ZSBhcyAndHJ1dGh5JyBhZ2FpbnN0IHRvIGJlIGFnZ3JlZ2F0ZWRcblxuUHJvdmlkZXMgYSB3YXkgdG8gY29udHJvbCB3aGljaCBUZW5YT2JqZWN0cyBhcmUgaW5jb3Jwb3JhdGVkIGludG8gdGhpcyBhZ2dyZWdhdG9yLiBVbmxpa2UgdGhlICdhZ2dyZWdhdG9yRW5hYmxlZCcsIHdoaWNoIGVuYWJsZXMvZGlzYWJsZXMgdGhpcyBhZ2dyZWdhdG9yIGFsdG9nZXRoZXIsIHRoaXMgSmF2YVNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBwZXIgVGVuWE9iamVjdCB0byBwcm92aWRlIGdyYW51bGFyIGNvbnRyb2wgb3ZlciB3aGF0IGluZm9ybWF0aW9uIHRvIGFnZ3JlZ2F0ZS4gIEZvciBleGFtcGxlLCB0byBvbmx5IGFnZ3JlZ2F0ZSBUZW5YT2JqZWN0cyByZWFkIGZyb20gYSBzcGVjaWZpZWQgaW5wdXQ6ICBgYGAgeWFtbCBhZ2dyZWdhdG9yOiAgIGZpbHRlcjogdGhpcy5pbnB1dE5hbWUgPT0gXCJlbGFzdGljXCIgYGBgICBUbyBhcHBseSBtb3JlIGNvbXBsZXggbG9naWMsIGludm9rZSBhbiAxMHggSmF2YVNjcmlwdCBmdW5jdGlvbiBkZWNsYXJlZCBpbiBhIC5qcyBmaWxlIGJ5IHBhc3NpbmcgaXQgdG8gdGhlIDEweCBFbmdpbmUgYXQgc3RhcnR1cCAoZS5nLiwgJCB0ZW54IHJ1biBAbXkuanMpLiAgYGBgIHlhbWwgYWdncmVnYXRvcjogICAuLi4gICBmaWx0ZXI6IG15QWdncmVnYXRvckZpbHRlcigpIGBgYCAgRm9yIGEgcmVhbC13b3JsZCBhZ2dyZWdhdG9yIGV4YW1wbGUgc2VlIFthZ2dyZWdhdGUvc3RyZWFtLnlhbWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9sb2ctMTB4L21vZHVsZXMvYmxvYi9tYWluL3BpcGVsaW5lcy9ydW4vbW9kdWxlcy9hZ2dyZWdhdGUvc3RyZWFtLnlhbWwpLiIKICAgICAgICAgIH0sCiAgICAgICAgICAiZmx1c2hUaHJlc2hvbGQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXhpbXVtIHRoZSBudW1iZXIgb2YgVGVuWE9iamVjdHMgdG8gYWdncmVnYXRlIGJlZm9yZSB0aGUgYWdncmVnYXRvciBmbHVzaGVzXG5cbkNvbnRyb2xzIGhvdyBtYW55IFRlblhPYmplY3RzIHRvIHVwc2VydCBpbnRvIHRoaXMgYWdncmVnYXRvciAoZS5nLiwgMTAwMDApIGJlZm9yZSB0aGUgYWdncmVnYXRvciB0cmFuc2Zvcm1zIHRoZSByb3dzIG9mIGl0cyBpbi1tZW0gdGFibGUgaW50byBUZW5YU3VtbWFyaWVzIGluc3RhbmNlcyBhbmQgZmx1c2hlcyB0aGVtIGludG8gdGhlIHBpcGVsaW5lLiAgSWYgbm90IHNldCwgdGhlIFtmbHVzaEludGVydmFsXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9hZ2dyZWdhdGUvI2FnZ3JlZ2F0b3JmbHVzaGludGVydmFsKSBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIgogICAgICAgICAgfSwKICAgICAgICAgICJmbHVzaEludGVydmFsIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSW50ZXJ2YWwgdG8gd2FpdCBiZWZvcmUgdGhlIGFnZ3JlZ2F0b3IgZmx1c2hlc1xuXG5TZXRzIHRoZSBwZXJpb2QgKGUuZy4sICczMHMnKSwgYWZ0ZXIgd2hpY2ggdGhlIGFnZ3JlZ2F0b3IgdHJhbnNmb3JtcyB0aGUgcm93cyBvZiBpdHMgaW4tbWVtIHRhYmxlIGludG8gVGVuWFN1bW1hcmllcyBpbnN0YW5jZXMgYW5kIGZsdXNoZXMgdGhlbSBpbnRvIHRoZSBwaXBlbGluZS4gIElmIHNldCwgdGhlIFtmbHVzaFRocmVzaG9sZF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vYWdncmVnYXRlLyNhZ2dyZWdhdG9yZmx1c2h0aHJlc2hvbGQpICBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZW4gdG8gZmx1c2ggdGhlIGFnZ3JlZ2F0b3IuIElmIG5laXRoZXIgYXJndW1lbnQgaXMgcHJlc2VudCwgdGhlIGFnZ3JlZ2F0b3Igb25seSBmbHVzaGVzIHBlbmRpbmcgVGVuWFN1bW1hcmllcyB3aGVuIHRoZSBwaXBlbGluZSB0ZXJtaW5hdGVzLiIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXF1aXJlZCIgOiBbCiAgICAgICAgICAibmFtZSIsCiAgICAgICAgICAiZmllbGRzIgogICAgICAgIF0KICAgICAgfQogICAgfQogIH0sCiAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlCn0=</template>

    ```yaml
    # 🔟❎ 'run' Query Stream application settings
    
    # This configuration defines the settings for use by the Query Stream operation of the Retriever app.
    # To learn more see https://doc.log10x.com/apps/retriever/#query
    
    # Set the 10x pipeline to 'run'
    tenx: run
    
    # ============================== Aggregator Options ===========================
    
    # Multiple aggregators can be defined below
    aggregator:
    
      # Defines an aggregator for all events seen by this pipeline
      # This enables an output metric to show an accurate (lossless) metric of the
      # data processed by this pipeline, even if it was later dropped.
      - name: streamed_events
    
        # 'filter' sets a JavaScript expression that TenXObjects must evaluate as truthy to be aggregated.
        #  To learn more see https://doc.log10x.com/run/output/receive/#filter-expressions
        filter: "this.isObject && !this.isRoute(\"drop\")"
    
        # 'values' set the names of intrinsic/extracted/calculated fields whose combined values
        #  identify a unique row within the aggregator's in-mem table for
        #  each object passed to it.
    
        # By default, this configuration uses the enrichment fields specified below.
        fields:
          - $=yield TenXEnv.get("enrichmentFields")
    
        # 'totalFields' specifies fields to extract and tally into generated TenXSummaries
        totalFields: []
    
        # 'flushThreshold' sets the max number of TenXObjects whose values to upsert into
        #  the aggregator's in-mem table. Once exceeded, the aggregator instantiates TenXSummaries
        #  from the table rows to send to output and reset the table.
        flushThreshold: 10000
    
        # 'flushInterval' sets a periodic interval, after which the aggregator
        #  flushes the rows of its in-mem table into the pipeline as TenXSummary instances.
        flushInterval: 2s
    
        # 'maxCardinality' sets the maximum number of rows for the aggregator's
        #  in-mem table. If an TenXObjects whose 'values' are not contained in the table
        #  is passed to the aggregator, 'defaultValue' will be used for it instead
        #  until the aggregator flushes its in-mem table after 'flushInterval' or 'flushThreshold'
        #  are exceeded.
        maxCardinality: 65536
    
        # 'defaultValue' sets a constant value that is used instead of 'values' when
        #  'maxCardinality' is exceeded within 'flushInterval'
        defaultValue: unknown
    ```

## :material-menu: Options

Specify the options below to [configure](/config "configure") multiple Aggregator:

|Name|Description|
|---|---|
|[aggregatorName](#aggregatorname "logical name of aggregator")|Logical name of aggregator|
|[aggregatorEnabled](#aggregatorenabled "enable/disable this aggregator")|Enable/disable this aggregator|
|[aggregatorFields](#aggregatorfields "list of field names by which to aggregate TenXObjects")|List of field names by which to aggregate TenXObjects|
|[aggregatorDefaultValue](#aggregatordefaultvalue "a constant value to default if 'maxCardinality' is exceeded")|A constant value to default if 'maxCardinality' is exceeded|
|[aggregatorTotalFields](#aggregatortotalfields "list of fields whose values to tally into generated TenXSummaries")|List of fields whose values to tally into generated TenXSummaries|
|[aggregatorMaxCardinality](#aggregatormaxcardinality "max number of concurrent rows within the aggregator in-mem table within the flush interval")|Max number of concurrent rows within the aggregator in-mem table within the flush interval|
|[aggregatorFilter](#aggregatorfilter "a JavaScript expression an TenXObject must evaluate as 'truthy' against to be aggregated")|A JavaScript expression an TenXObject must evaluate as 'truthy' against to be aggregated|
|[aggregatorFlushThreshold](#aggregatorflushthreshold "maximum the number of TenXObjects to aggregate before the aggregator flushes")|Maximum the number of TenXObjects to aggregate before the aggregator flushes|
|[aggregatorFlushInterval](#aggregatorflushinterval "interval to wait before the aggregator flushes")|Interval to wait before the aggregator flushes|

### :material-menu-right-outline:**`aggregatorName`**

Logical name of aggregator.

|Type|Required|
|---|---|
|String|✔|

Provides a logical name for this aggregator (e.g., 'errors').
This value is accessible at run-time via the intrinsic 'inputName' field
to identify TenXSummaries originating from this aggregator.


### :material-menu-right-outline:**`aggregatorEnabled`**

Enable/disable this aggregator.

|Type|Default|
|---|---|
|String|true|

sets whether to open the input stream.

To enable this input only when an 'aggregateErrors' startup argument value is truthy:

```yaml
...
aggregator:
  enabled: $=TenXEnv.get("aggregateErrors")
```


### :material-menu-right-outline:**`aggregatorFields`**

List of field names by which to aggregate TenXObjects.

|Type|Required|
|---|---|
|List|✔|

Provides a list of intrinsic/extracted/calculated [TenXObject](https://doc.log10x.com/api/js/#TenXObject "Provide structured, reflective access to log/trace events read from input(s).") field names by which
to aggregate instances.

When the aggregator flushes the in-mem table to produced TenXSummaries, each generated TenXSummary instance provides access to the total values
via its [summaryTotals](https://doc.log10x.com/api/js/#TenXSummary+summaryValues "Array of values by which tenxObjects have been grouped into this summary instance.") array field.


### :material-menu-right-outline:**`aggregatorDefaultValue`**

A constant value to default if 'maxCardinality' is exceeded.

|Type|Default|
|---|---|
|String|""|

Defines a constant value to use instead of [field values](https://doc.log10x.com/run/aggregate/#aggregatorfields "list of field names by which to aggregate TenXObjects")
when the current number of rows within the aggregator's in-mem table during
[flushInterval](https://doc.log10x.com/run/aggregate/#aggregatorflushinterval "interval to wait before the aggregator flushes") exceeds [maxCardinality](https://doc.log10x.com/run/aggregate/#aggregatormaxcardinality "max number of concurrent rows within the aggregator in-mem table within the flush interval").

This value prevents an out-of-mem error if TenXObjects whose [field values](https://doc.log10x.com/run/aggregate/#aggregatorfields "list of field names by which to aggregate TenXObjects")
are of high cardinality, which can cause the in-mem table to grow beyond the
confines of the host JVM heap.

This error is possible if [fields](https://doc.log10x.com/run/aggregate/#aggregatorfields "list of field names by which to aggregate TenXObjects") contains a calculated/extracted field
whose value is alphanumeric (e.g., 'spanID') and is practically unique to each TenXObject.


### :material-menu-right-outline:**`aggregatorTotalFields`**

List of fields whose values to tally into generated TenXSummaries.

|Type|Default|
|---|---|
|List|\[\]|

Specifies a list of intrinsic calculated/extracted TenXObject field names to tally
and write into aggregated TenXSummary instances within a target flush
[threshold](https://doc.log10x.com/run/aggregate/#aggregatorflushthreshold "maximum the number of TenXObjects to aggregate before the aggregator flushes") or [interval](https://doc.log10x.com/run/aggregate/#aggregatorflushinterval "interval to wait before the aggregator flushes").

For example, setting a value of: `price` into this array will tally the prices of all TenXObjects
aggregated into a target output TenXSummary instance.

A matching `price` value containing the sum of aggregated prices will be accessible for each TenXSummary instance via its
[summaryTotals](https://doc.log10x.com/api/js/#TenXSummary+summaryTotals "Sum values of the aggregatorTotalFields value of tenxObjects aggregated into this instance.") array.


### :material-menu-right-outline:**`aggregatorMaxCardinality`**

Max number of concurrent rows within the aggregator in-mem table within the flush interval.

|Type|Default|
|---|---|
|Number|0|

Sets the maximum number of unique rows within the aggregator's in-mem table.
If the number of rows exceeds this value during [flushInterval](https://doc.log10x.com/run/aggregate/#aggregatorflushinterval "interval to wait before the aggregator flushes") , the 'aggregatorDefaultValue'
value will be for all TenXObjects instead of [field values](https://doc.log10x.com/run/aggregate/#aggregatorfields "list of field names by which to aggregate TenXObjects") until the aggregator is flushed.

This value is used as a backstop to ensure that the aggregator's in-mem table
does not overflow when extracting and  aggregating very high cardinality values
from the fields of TenXObjects passed to this aggregator.

If no value is provided or set to 0, the aggregator has no cap. This may result
in an out-of-mem error when very high cardinality (e.g., 'spanID', 'GUID') [fields](https://doc.log10x.com/run/aggregate/#aggregatorfields "list of field names by which to aggregate TenXObjects")
are specified.


### :material-menu-right-outline:**`aggregatorFilter`**

A JavaScript expression an TenXObject must evaluate as 'truthy' against to be aggregated.

|Type|Default|
|---|---|
|String|""|

Provides a way to control which TenXObjects are incorporated
into this aggregator. Unlike the 'aggregatorEnabled', which enables/disables this aggregator
altogether, this JavaScript expression is evaluated per TenXObject to provide
granular control over what information to aggregate.

For example, to only aggregate TenXObjects read from a specified input:

```yaml
aggregator:
  filter: this.inputName == "elastic"
```

To apply more complex logic, invoke an 10x JavaScript function declared in a .js file by passing it to the 10x Engine
at startup (e.g., $ tenx run @my.js).

```yaml
aggregator:
  ...
  filter: myAggregatorFilter()
```

For a real-world aggregator example see [aggregate/stream.yaml](https://github.com/log-10x/modules/blob/main/pipelines/run/modules/aggregate/stream.yaml){target="\_blank"}.


### :material-menu-right-outline:**`aggregatorFlushThreshold`**

Maximum the number of TenXObjects to aggregate before the aggregator flushes.

|Type|Default|
|---|---|
|Number|0|

Controls how many TenXObjects to upsert into this aggregator (e.g., 10000) before the
aggregator transforms the rows of its in-mem table into TenXSummaries instances and flushes them into the pipeline.

If not set, the [flushInterval](https://doc.log10x.com/run/aggregate/#aggregatorflushinterval "interval to wait before the aggregator flushes") argument determines
when to flush the aggregator. If neither argument is present, the aggregator
only flushes pending TenXSummaries when the pipeline terminates.


### :material-menu-right-outline:**`aggregatorFlushInterval`**

Interval to wait before the aggregator flushes.

|Type|Default|
|---|---|
|String|""|

Sets the period (e.g., '30s'), after which the aggregator transforms the rows of its in-mem table into
TenXSummaries instances and flushes them into the pipeline.

If set, the [flushThreshold](https://doc.log10x.com/run/aggregate/#aggregatorflushthreshold "maximum the number of TenXObjects to aggregate before the aggregator flushes")  argument determines
when to flush the aggregator. If neither argument is present, the aggregator
only flushes pending TenXSummaries when the pipeline terminates.


<br/>:material-github: This unit is defined in [aggregate/unit.yaml](https://github.com/log-10x/modules/tree/main/pipelines/run/units/aggregate/unit.yaml "aggregate/unit.yaml"){target="\_blank"}.

