mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-05 06:42:12 +03:00
* chore(rtk): initialize compression roadmap branch * feat(compression): add RTK engine and compression combos Introduce RTK command-aware tool-output compression alongside stacked RTK -> Caveman pipelines for mixed prompt contexts. Add engine registration, declarative RTK filter packs, language-aware Caveman rule loading, compression combo persistence and assignments, analytics grouped by engine/combo, and new MCP/API endpoints for configuration, previews, filters, and combo management. Expose the new capabilities in the dashboard with dedicated Context & Cache pages for Caveman, RTK, and compression combos, and update docs, i18n strings, migrations, and tests to cover the expanded compression surface. * feat(compression): expand RTK DSL, filter catalog, and recovery APIs Add RTK parity features across the compression pipeline, dashboard, and management APIs. This expands the built-in filter catalog, adds trust-gated custom filter loading, inline filter verification, code stripping, smarter detection, and optional redacted raw-output retention for authenticated recovery. Also extend Caveman with file-based multilingual rule packs, localized output-mode instructions, stricter preview/config schemas, engine registry metadata, analytics fields, and broad unit test coverage for RTK, rule loading, and stacked compression behavior. * fix(auth): protect oauth routes and health reset operations Require authenticated dashboard access for OAuth endpoints that can create or import provider connections when login enforcement is enabled. Move `/api/monitoring/health` to the readonly public route list so safe methods remain public while DELETE now returns 401 for anonymous requests. Also update Next.js native `.node` handling to avoid webpack parse failures from external packages such as ngrok and keytar, and add coverage for the new auth behavior. * build(compression): ship RTK rule and filter assets with app bundles Include compression JSON assets in Next output tracing, prepublish copies, and pack artifact policy checks so standalone and packaged builds can load RTK filters and caveman rule packs at runtime. Also harden compression runtime behavior by resolving alternate asset directories, scoping rule cache entries by source path, carrying RTK raw output pointers through stacked runs, degrading oversized preview diffs, and applying combo language/output mode defaults during chat routing. Add coverage for packaging rules, provider-scoped model parsing, smart truncate edge cases, raw output retention, and combo-driven compression behavior. * docs(workflows): update local repo paths to OmniRoute Replace outdated `/home/diegosouzapw/dev/proxys/9router` references with the current `OmniRoute` directory across deploy, release, and version bump workflow guides so local command examples match the renamed repository layout * feat(compression): complete RTK parity coverage * test(build): align next config assertions --------- Co-authored-by: diegosouzapw <diego.souza.pw@gmail.com>
224 lines
8.3 KiB
Markdown
224 lines
8.3 KiB
Markdown
# RTK Compression
|
|
|
|
RTK compression is OmniRoute's command-aware compression engine for terminal and tool output. It is
|
|
designed for coding-agent sessions where most context growth comes from test logs, build output,
|
|
package manager noise, shell transcripts, Docker output, git output, and stack traces.
|
|
|
|
RTK can run directly with `defaultMode: "rtk"` or as the first step in a stacked pipeline, usually:
|
|
|
|
```txt
|
|
rtk -> caveman
|
|
```
|
|
|
|
That order compresses noisy machine output first, then lets Caveman condense remaining prose.
|
|
|
|
## What It Compresses
|
|
|
|
The built-in catalog currently ships 39 filters across these categories:
|
|
|
|
| Category | Examples |
|
|
| --------- | ------------------------------------------------------------- |
|
|
| `git` | `git status`, `git branch`, `git diff`, `git log` |
|
|
| `test` | Vitest, Jest, Pytest, Playwright, Go tests, Cargo tests |
|
|
| `build` | TypeScript, ESLint, Biome, Prettier, Vite, Webpack, Turbo, Nx |
|
|
| `package` | `npm install`, `npm audit`, `pip`, `uv sync`, Poetry, Bundler |
|
|
| `shell` | `ls`, `find`, `grep`, generic shell logs |
|
|
| `docker` | `docker ps`, Docker logs |
|
|
| `infra` | Terraform, OpenTofu, `systemctl status` |
|
|
| `generic` | JSON output, stack traces, generic output fallback |
|
|
|
|
The detector in `open-sse/services/compression/engines/rtk/commandDetector.ts` classifies output
|
|
before filter selection. Filters can also match by command pattern or output regex when a command
|
|
class is not enough.
|
|
|
|
## Filter Resolution
|
|
|
|
RTK loads filters in this order:
|
|
|
|
1. Project filters from `.rtk/filters.json`, only when trusted.
|
|
2. Global filters from `DATA_DIR/rtk/filters.json`.
|
|
3. Built-in filters from `open-sse/services/compression/engines/rtk/filters/`.
|
|
|
|
Project filters are intentionally trust-gated because regex filters can change how tool output is
|
|
shown to agents. A project filter file is accepted when one of these is true:
|
|
|
|
- `rtkConfig.trustProjectFilters` is `true`.
|
|
- `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS=1` is set.
|
|
- `.rtk/trust.json` contains the SHA-256 hash of `.rtk/filters.json`.
|
|
|
|
Trust file example:
|
|
|
|
```json
|
|
{
|
|
"filtersSha256": "0123456789abcdef..."
|
|
}
|
|
```
|
|
|
|
Custom filters can be one filter object or an array of filter objects. Invalid custom filters are
|
|
skipped and reported by `/api/context/rtk/filters` diagnostics. Invalid built-in filters fail fast.
|
|
|
|
## Filter DSL
|
|
|
|
Filters use the JSON schema described in [Compression Rules Format](compression-rules-format.md).
|
|
The runtime applies these stages in order:
|
|
|
|
```txt
|
|
stripAnsi -> filterStderr -> replace -> matchOutput -> drop/include lines
|
|
-> truncateLineAt -> head/tail/maxLines -> onEmpty
|
|
```
|
|
|
|
Important fields:
|
|
|
|
| Field | Purpose |
|
|
| ---------------------------- | -------------------------------------------------------------- |
|
|
| `rules.stripAnsi` | Remove terminal color/control sequences before matching |
|
|
| `rules.filterStderr` | Normalize common stderr prefixes before matching/filtering |
|
|
| `rules.replace` | Apply ordered regex replacements |
|
|
| `rules.matchOutput` | Return a compact summary when output matches a known condition |
|
|
| `rules.matchOutput[].unless` | Skip the shortcut when an error/failure pattern is present |
|
|
| `rules.dropPatterns` | Remove noisy lines |
|
|
| `rules.includePatterns` | Prefer actionable lines |
|
|
| `rules.collapsePatterns` | Collapse repeated matching lines |
|
|
| `rules.truncateLineAt` | Unicode-safe per-line truncation |
|
|
| `rules.onEmpty` | Fallback message if all lines are filtered out |
|
|
| `tests[]` | Inline samples used by the verify gate |
|
|
|
|
Built-in filters are expected to include inline `tests[]` samples. Custom filters should include
|
|
them too, especially when they are shared across projects.
|
|
|
|
## Configuration
|
|
|
|
Global settings are available through `/api/settings/compression`. RTK-specific settings are also
|
|
available through `/api/context/rtk/config`.
|
|
|
|
```json
|
|
{
|
|
"defaultMode": "stacked",
|
|
"autoTriggerMode": "stacked",
|
|
"autoTriggerTokens": 32000,
|
|
"stackedPipeline": [
|
|
{ "engine": "rtk", "intensity": "standard" },
|
|
{ "engine": "caveman", "intensity": "full" }
|
|
],
|
|
"rtkConfig": {
|
|
"enabled": true,
|
|
"intensity": "standard",
|
|
"applyToToolResults": true,
|
|
"applyToCodeBlocks": false,
|
|
"applyToAssistantMessages": false,
|
|
"enabledFilters": [],
|
|
"disabledFilters": [],
|
|
"maxLinesPerResult": 120,
|
|
"maxCharsPerResult": 12000,
|
|
"deduplicateThreshold": 3,
|
|
"customFiltersEnabled": true,
|
|
"trustProjectFilters": false,
|
|
"rawOutputRetention": "never",
|
|
"rawOutputMaxBytes": 1048576
|
|
}
|
|
}
|
|
```
|
|
|
|
`enabledFilters` and `disabledFilters` use filter ids, for example `test-vitest` or `git-diff`.
|
|
|
|
## API
|
|
|
|
| Route | Method | Purpose |
|
|
| ---------------------------------- | ------ | -------------------------------------------- |
|
|
| `/api/context/rtk/config` | GET | Read RTK config |
|
|
| `/api/context/rtk/config` | PUT | Update RTK config |
|
|
| `/api/context/rtk/filters` | GET | List filter catalog and load diagnostics |
|
|
| `/api/context/rtk/test` | POST | Preview RTK compression for one text payload |
|
|
| `/api/context/rtk/raw-output/[id]` | GET | Read retained redacted raw output |
|
|
| `/api/compression/preview` | POST | Preview any compression mode |
|
|
|
|
RTK test payload:
|
|
|
|
```json
|
|
{
|
|
"command": "npm test",
|
|
"text": "FAIL tests/example.test.ts\nAssertionError: expected true\nTest Files 1 failed",
|
|
"config": {
|
|
"intensity": "standard"
|
|
}
|
|
}
|
|
```
|
|
|
|
Compression preview payload:
|
|
|
|
```json
|
|
{
|
|
"mode": "stacked",
|
|
"messages": [
|
|
{
|
|
"role": "tool",
|
|
"content": "FAIL tests/example.test.ts\nAssertionError: expected true\nTest Files 1 failed"
|
|
}
|
|
],
|
|
"config": {
|
|
"rtkConfig": {
|
|
"rawOutputRetention": "failures"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Management routes require dashboard management auth or the matching API-key policy.
|
|
|
|
## Raw Output Recovery
|
|
|
|
RTK normally returns only compressed text. For debugging, `rawOutputRetention` can retain redacted
|
|
raw output:
|
|
|
|
| Value | Behavior |
|
|
| ---------- | ------------------------------------------------------- |
|
|
| `never` | Do not retain raw output |
|
|
| `failures` | Retain only likely failure output |
|
|
| `always` | Retain every compressed RTK raw output, after redaction |
|
|
|
|
Retained files are written under:
|
|
|
|
```txt
|
|
DATA_DIR/rtk/raw-output/
|
|
```
|
|
|
|
Secrets are redacted before persistence, including common bearer tokens, API keys, Slack tokens,
|
|
AWS access keys, and assignment-style `token=...`, `secret=...`, `password=...` values. Analytics
|
|
stores only the pointer id, size, and hash metadata.
|
|
|
|
## Verify Gate
|
|
|
|
The focused verify gate runs built-in inline filter tests without shelling out to external commands:
|
|
|
|
```bash
|
|
node --import tsx/esm --test tests/unit/compression/rtk-verify.test.ts
|
|
```
|
|
|
|
The broader RTK gate is:
|
|
|
|
```bash
|
|
node --import tsx/esm --test \
|
|
tests/unit/compression/rtk-*.test.ts \
|
|
tests/unit/compression/pipeline-integration.test.ts \
|
|
tests/unit/compression/context-compression-api.test.ts
|
|
```
|
|
|
|
Run the broad compression gate before release:
|
|
|
|
```bash
|
|
node --import tsx/esm --test \
|
|
tests/unit/compression/*.test.ts \
|
|
tests/golden-set/*.test.ts \
|
|
tests/integration/compression-pipeline.test.ts \
|
|
tests/unit/api/compression/compression-api.test.ts
|
|
```
|
|
|
|
## Extending RTK
|
|
|
|
1. Add or update a filter JSON file.
|
|
2. Include at least one `tests[]` sample that proves the important behavior.
|
|
3. Add a fixture under `tests/unit/compression/fixtures/rtk/` for new command families.
|
|
4. Add command detection coverage when introducing a new output class.
|
|
5. Run the verify and broad RTK gates.
|
|
6. If the filter is project-local, commit `.rtk/filters.json` and refresh `.rtk/trust.json` only after review.
|