diff --git a/.agents/audit_logs/customization_map.md b/.agents/audit_logs/customization_map.md new file mode 100644 index 00000000000..be4997858af --- /dev/null +++ b/.agents/audit_logs/customization_map.md @@ -0,0 +1,411 @@ +# EEA Danswer Fork — Customization Map +*Generated: 2026-04-13 | Base: upstream `v3.2.0` → EEA HEAD `v2.5.3-eea.0.0.103` (tag `v3.2.1`)* +*Primary Author: **Zoltan Szabo** (zoltan.szabo@eaudeweb.ro) — 122 EEA-specific commits* +*Second Author: **Matthieu Boret** (matthieu.boret@fr.clara.net) — SharePoint connector* + +--- + +## I. Feature Index + +| # | Feature Block | Files (core) | Risk | Sticky? | +|---|---|---|---|---| +| 1 | Langfuse Tracing & LLM Metadata | `eea_utils.py`, `chat_llm.py`, `run_graph.py`, `langfuse_tracing_processor.py` | 🔴 High | ✅ Yes | +| 2 | EEA Rebranding (AI Hub) | `constants.py`, `EEA_Logo.tsx`, `Header.tsx`, `Footer.tsx`, login/signup pages | 🟡 Medium | ✅ Yes | +| 3 | User Disclaimer Modal | `UserDisclaimerModal.tsx`, backend model + API, admin page | 🟡 Medium | ✅ Yes | +| 4 | Custom Pages (Admin) | `web/src/app/admin/eea_config/pages/` | 🟡 Medium | ✅ Yes | +| 5 | Web Scraping & Playwright | `web/connector.py`, `playwright.py`, `eea_utils.py` | 🟡 Medium | ✅ Yes | +| 6 | Connector Stability & Healthcheck | `connectors_state.py`, `monitoring/tasks.py` | 🟡 Medium | ⚠️ Partial | +| 7 | Diacritic Tag Resolver | `backend/onyx/natural_language_processing/` (DiacriticTagResolver) | 🟡 Medium | ✅ Yes | +| 8 | PDF Indexing Improvements | `backend/onyx/connectors/file/` | 🟢 Low | ⚠️ Partial | +| 9 | Citation & Search Fixes | citation backtracking fix, full content to packets | 🟢 Low | ⚠️ Partial | +| 10 | UI UX Improvements | personas tooltips, connector sort, date filter, knowledge set sort | 🟢 Low | ❌ No | +| 11 | Docker / Deployment EEA | `deployment/docker_compose/eea/` | 🟡 Medium | ✅ Yes | +| 12 | Security Patches & Upstream Fixes | CVE patches, libgnutls, SMTP auth guard, connector deletion | 🟢 Low | ❌ No | + +--- + +## II. Functional Specifications + +### Feature 1 — Langfuse Tracing & LLM Metadata +**Author**: Zoltan Szabo + +**Goal**: Inject comprehensive Langfuse observability into every LLM call with user context, session IDs, and feedback synchronization. This enables monitoring AI usage per user and conversation in the EEA Langfuse instance. + +**Logic**: +1. `eea_utils.py` provides `get_langfuse_callback_handler(metadata)` → constructs a `CallbackHandler` with `LANGFUSE_PUBLIC_KEY`, `LANGFUSE_SECRET_KEY`, `LANGFUSE_HOST` env vars. +2. Metadata dict includes: `user_id` (stripped of any prefix), `session_id` (from chat session), `trace_name` (first 200 chars of user message), `trace_id`. +3. `chat_llm.py` calls `add_metadata_to_llm()` to inject metadata into every `litellm.completion()` call. +4. `run_graph.py` (Deep Research) passes the Langfuse handler through `GraphConfig` to all agent steps. +5. `langfuse_tracing_processor.py` uses `extra_metadata`/`tags` from the LiteLLM call to set custom span names. Clarification steps are named `Clarification needed for ""`. +6. Feedback is synced back to Langfuse via score API (commit `15d51857`). +7. **Batch prevention**: `LANGFUSE_FLUSH_AT=1` env var set to avoid losing traces in batch flush (commit `84ec36f2`). + +**Dependencies**: `LANGFUSE_PUBLIC_KEY`, `LANGFUSE_SECRET_KEY`, `LANGFUSE_HOST` env vars. `langfuse` Python package. `fast_chat_turn.py` for session ID retrieval. + +**Sticky Logic** ⚠️: The `LANGFUSE_FLUSH_AT=1` setting and the `trace_name`/`trace_id` construction logic MUST remain identical. Any upstream change to how `metadata` is passed to `litellm.completion()` is a "Logic Violation" — re-apply from commits `bdc09551`, `8d3f8e1a`, `84ec36f2`. + +**Key Commits**: `84ec36f2`, `8d3f8e1a`, `43f53ec1`, `0f5e4443`, `bdc09551`, `15d51857` + +--- + +### Feature 2 — EEA Rebranding (AI Hub) +**Author**: Zoltan Szabo + +**Goal**: Replace all Onyx/Danswer/GPT Lab branding with EEA-specific "AI Hub" identity including custom logo, footer links, and color scheme. + +**Logic**: +1. `constants.py`: `APPLICATION_NAME = "EEA AI Hub"` (was "GPT Lab", then "AI Hub"). +2. `EEA_Logo.tsx`: Custom SVG component for `EEA_logo_compact_EN.svg`. +3. `Header.tsx`: Replaces title with EEA Logo component. +4. `Footer.tsx`: EEA privacy policy and architecture page links. +5. Login & Signup pages: EEA logo, custom disclaimer text, no 3rd-party resource loading. +6. Auth pages: `fixed logo on auth pages` (commit `76b5cc27`) — logo patched on NextAuth pages. +7. History sidebar: typo fix on branding label (commit `4e4c1840`). + +**Dependencies**: `EEA_logo_compact_EN.svg` static asset. `constants.py` APPLICATION_NAME. + +**Key Commits**: `bcdaf71c`, `7ba9c9fe`, `4b42a026`, `6ba660c3`, `76b5cc27`, `a9d2b7aa` + +--- + +### Feature 3 — User Disclaimer Modal +**Author**: Zoltan Szabo + +**Goal**: Display a legal/usage disclaimer modal to users upon first login. Admins can configure the disclaimer text from the admin panel. + +**Logic**: +1. Backend: New DB model `EEADisclaimer` (or similar) with `text` field. API endpoint at `/api/eea/disclaimer` (GET/POST). +2. `eea_utils.py`: `get_eea_custom_settings()` fetches all EEA-specific config including the disclaimer. +3. Frontend: `UserDisclaimerModal.tsx` checks `localStorage` for a "disclaimerAcknowledged" flag. If not set, shows the modal on login. +4. Admin page: `web/src/app/admin/eea_config/disclaimer/page.tsx` — text editor for the disclaimer. +5. Disclaimer shown as a modal overlay (not a blocking page) with an "I Agree" button. + +**Dependencies**: Backend model requires DB migration. `eea_utils.py` custom settings fetcher. LocalStorage flag. + +**Key Commits**: `f49349d3`, `d19b3cc8`, `65fbca40`, `2824a873`, `49c4b53c`, `921689a1`, `eb460341` + +--- + +### Feature 4 — Custom Admin Pages (EEA Config) +**Author**: Zoltan Szabo + +**Goal**: Allow EEA admins to create custom CMS-style pages (e.g., "What's New", privacy statement) that appear as navigable pages in the user dropdown and admin UI. + +**Logic**: +1. `web/src/app/admin/eea_config/pages/` — Next.js admin section with CRUD for pages. +2. Pages have: `title` (used as URL slug), `content` (markdown), `is_public` flag. Public pages are accessible without admin role. +3. `hooks.tsx` — React hooks for fetching/mutating pages via API. +4. `lib.tsx` — shared helpers for the page admin section. +5. **User popover links** (commit `87536313`) — four EEA legal/info links are rendered in the user account popover (`web/src/sections/sidebar/AccountPopover.tsx`) inside `SettingsPopover`, after the `Help & FAQ` item, using `` from `@opal/icons`: + - `/pages/disclaimer` → "Disclaimer" + - `/pages/privacy` → "Privacy Architecture" + - `/pages/privacy-statement` → "Privacy Statement" + - `/pages/whats-new` → "What's new" +6. Privacy statement page added (commit `62a49359`) — non-EE-restricted. +7. Backend: Pages stored in DB, served via `/api/eea/pages` endpoint. + +**Dependencies**: Backend model + API, `eea_utils.py` settings fetch, user popover component (`AccountPopover.tsx`). + +**Sticky Logic** ⚠️: The four `` entries in `AccountPopover.tsx → SettingsPopover` MUST survive upstream refactors. If upstream renames or recreates the user popover file, find the new file (search for `onyx-user-dropdown` id or `PopoverMenu`) and re-add these entries. + +**Key Commits**: `836e3c3d`, `3dd2c77b`, `875363133`, `c26ce64b7`, `62a49359`, `dfd19cfe` + +--- + +### Feature 5 — Web Scraping & Playwright Enhancements +**Author**: Zoltan Szabo + +**Goal**: Improve web connector reliability with selector-based element removal, sitemap `lastmod` filtering, SSL error tolerance, and Playwright stability fixes. + +**Logic**: +1. `eea_utils.py`: `remove_by_selector(html, selectors)` — removes HTML elements matching CSS selectors before indexing (avoids indexing nav/footer noise). +2. `eea_utils.py`: `get_document_updated_at_batch(urls, sitemaps)` — checks `lastmod` from sitemap XML to skip re-indexing unchanged pages. +3. `web/connector.py`: `get_ssl=False` option for connectors where SSL cert is expired (commit `529f3e5e`). +4. `web/connector.py`: Auto-discover sitemap via common paths if not configured (`acdead91`). Fallback to `ultimate_sitemap_parser` library if primary sitemap yields no URLs. +5. `playwright.py`: Added configurable timeouts (`added timeout for playwright`, commit `fa04e343`). Fixed process stopping by checking `process.returncode` before calling `process.terminate()` — avoids `playwright-python` issue #2238, commit `199a9944`. +6. `headless chrome flags`: Small fix on headless chrome flags (commit `small fix on headless chrome flags`). +7. Docker: `added tini in the image` (commit `79c4c6b0`) — tini as PID 1 to properly handle zombie playwright processes. + +**Dependencies**: `ultimate_sitemap_parser` Python package. `playwright` Python package. `tini` in Dockerfile. + +**Sticky Logic** ⚠️: The playwright process-stopping logic (checking `returncode` before `terminate()`) MUST remain. Upstream may update `playwright.py` and remove this guard. + +**Key Commits**: `199a9944`, `fa04e343`, `529f3e5e`, `acdead91`, `ab5e4cd2` + +--- + +### Feature 6 — Connector Stability & Healthcheck +**Author**: Zoltan Szabo + +**Goal**: Prevent connectors from being auto-paused on single failures, add a healthcheck that only fails after 2 consecutive failures, and fix memory watchdog process identification. + +**Logic**: +1. `connectors_state.py`: Fixed tuple mapping for `cc_pair_to_document_cnt` to handle optional `search_settings` returned from DB. Prevents tuple-unpack crashes. +2. `monitoring/tasks.py` (Celery watchdog): Map `onyx.background.celery.versioned_apps.beat` → `"beat"` to fix process duplication in memory monitoring. +3. Connector healthcheck logic (`35581db8`, `a52ea18c`): Only mark connector as failed if there are **2 consecutive** failed indexing attempts, not just 1. +4. `f8696402`: Updated healthcheck to track consecutive failure count. +5. `0a31435f`: Additional fix for connectors healthcheck edge case. +6. `Don't pause the failed connectors` (commit `0a4e3635`): Removed auto-pause behavior on connector failure. + +**Dependencies**: DB schema for consecutive failure tracking. Celery beat configuration. + +**Key Commits**: `4636caca` (upstream ref), `35581db8`, `a52ea18ca`, `f8696402`, `0a4e3635`, `0a31435f` + +--- + +### Feature 7 — Diacritic Tag Resolver +**Author**: Zoltan Szabo + +**Goal**: Guardrail to restore diacritics in Romanian/other language tags that get stripped during text normalization, ensuring accurate document tagging and search. + +**Logic**: +1. `DiacriticTagResolver` class in `backend/onyx/natural_language_processing/` — built as a registry from document tags at index time. +2. On query: normalizes input (strips diacritics), looks up canonical tag with diacritics restored. +3. Configurable latency tracking via YAML config (toggled via `DIACRITIC_RESOLVER_LOGGING` env var). +4. Class-based implementation (not functional) for streaming support and superior normalization. Registry is built excluding input noise tokens. +5. Fallback: if resolver can't restore, returns original tag unchanged. + +**Dependencies**: Indexing pipeline (registry must be built at index time). YAML config for logging toggle. + +**Sticky Logic** ⚠️: The class-based architecture with streaming must not be simplified to a functional approach. The registry exclusion logic is proprietary EEA logic. + +**Key Commits**: Commits in `ef1bdbea` conversation era (see conversation history). + +--- + +### Feature 8 — PDF Indexing Improvements +**Author**: Zoltan Szabo + +**Goal**: Fix PDF title extraction and improve handling of special characters in filenames during indexing. + +**Logic**: +1. `fix the names of indexed pdf files` (commit `81f1893b`): Extract actual PDF title from metadata instead of filename. +2. `updated pdf indexing` (commit `14679af5`): Handle edge cases in PDF text extraction. +3. `remove special characters in filenames` (commit referenced in log): Sanitize filenames before indexing. +4. `allow indexing of text files` (commit `79d4a2a2`): Extend file connector to accept `.txt` files. +5. `fallback if we can't figure out the encoding from the model name` (commit `91a31c63`): LLM encoding detection fallback for Llama-3.1 and similar models. + +**Key Commits**: `81f1893b`, `14679af5`, `79d4a2a2`, `91a31c63` + +--- + +### Feature 9 — Citation & Search Algorithm Fixes +**Author**: Zoltan Szabo + upstream-merged + +**Goal**: Prevent catastrophic backtracking in the citation regex and add full document content to search tool packets. + +**Logic**: +1. `feat(citation): avoid catastrophic backtracking` (commit `96a33e3b`): Fix in citation regex to avoid polynomial time matching on malformed citations. +2. `feat(search_tool): Add full content to search tool packets` (commit `6ad00f66`): Include full document content (not just excerpts) in search tool response packets for better LLM context. +3. `Replace special brackets used for citations` (commit `325a63ec`): Replace `【】` with standard brackets to avoid encoding issues. + +**Key Commits**: `96a33e3b`, `6ad00f66`, `325a63ec` + +--- + +### Feature 10 — UI/UX Improvements +**Author**: Zoltan Szabo + +**Goal**: Various improvements to the admin and user-facing UI for better EEA usability. + +**Logic**: +1. Personas tooltips (commit `83e33d7e`) — hover tooltips on persona cards. +2. Alphabetically sort knowledge sets (commit `23688f51`). +3. New date filter options in search (commit `ad369a6d`). +4. Show actual default model for personas (commit `206c9c42`). +5. Fixed sort on connectors admin page (commit `995cc5a1`). +6. Connector multi-select improvements. +7. `add fallback value to timeout` (commit `e74cb042`) — avoid undefined timeout crashes. +8. `custom fix for chatting with 'my documents'` (commit `fb35ada6`). +9. `added option to reindex a user file (only for admin users)` (commit `1ec55734`). +10. `quickfix for changing password` (commit `b303e042`). + +**Key Commits**: `83e33d7e`, `23688f51`, `ad369a6d`, `995cc5a1`, `e74cb042`, `fb35ada6` + +--- + +### Feature 11 — Docker / Deployment (EEA-Specific) +**Author**: Zoltan Szabo + +**Goal**: Maintain a complete, self-contained Docker Compose configuration for EEA-specific deployment with resource limits, network policies, and EEA environment defaults. + +**Logic**: +1. `deployment/docker_compose/eea/docker-compose.yml` — EEA-specific compose file with service configs, volume mounts, network policies. +2. `.env.example` — EEA-specific env var template with Langfuse, SMTP, and custom settings pre-filled. +3. `docker-compose.override.yml` — Resource limit overrides (`set the resource limits from an env`). +4. Backend `Dockerfile`: Updated for `tini` as PID 1, custom Python deps including EEA-specific packages. +5. Nginx configuration: Custom volume mounts for EEA static assets (commit `9150a8c1`). +6. Vespa backup image: Updated backup job configs (commit `60d0911c`). +7. Helm chart updates: EEA deployment configs in `deployment/helm/` (commit `3c968b2f`). +8. `update network policies` (commit `1c4f9128`) — Kubernetes NetworkPolicy for EEA deployment. +9. Jenkins CI: `updated jenkinsfile` — EEA-specific CI pipeline. + +**Sticky Logic** ⚠️: The `LANGFUSE_FLUSH_AT=1` in `.env.example` must be preserved. The `tini` entrypoint in Dockerfile is required for playwright process management. + +**Key Commits**: `95f44e1a`, `a48c5275`, `b89157b4`, `9150a8c1`, `60d0911c`, `79c4c6b0` + +--- + +### Feature 12 — Security Patches & Upstream Fixes +**Author**: Zoltan Szabo + +**Goal**: Apply security patches not yet in upstream (CVE fixes, dependency upgrades, SMTP auth guard). + +**Logic**: +1. `don't try to authenticate in case SMTP_USER & SMTP_PASS are not set` (commit `dccd9888`): Guards SMTP auth call to prevent crash when credentials not configured. +2. CVE-2025-55182 fixes (commits `05e9a42c`, `ef922c13`, `02d84bd2`): Three-pass patch for a specific CVE. +3. `updated to libgnutls30=3.7.9-2+deb12u3` (commit `b658f5c5`): Pin security-patched version. +4. `applied security patches` (commit `cf277efc`): Batch security patch application. +5. `pessimistic disconnect handling` (commit `babac3da`): DB connection pessimistic disconnect config to handle stale connections. +6. `workaround for not reachable indexing_model_server using tenacity` (commit `dc3ddeb9`): Retry logic for model server unreachability. + +**Key Commits**: `dccd9888`, `05e9a42c`, `ef922c13`, `02d84bd2`, `b658f5c5`, `babac3dad` + +--- + +### Feature 13 — SharePoint Connector Enhancement +**Author**: Matthieu Boret (matthieu.boret@fr.clara.net) + +**Goal**: Update SharePoint connector behavior for EEA-specific SharePoint environments. + +**Logic**: `Update sharepoint connector behavior` (commit `715e1f37`) — specific change to how the SharePoint connector authenticates or processes documents for the EEA SharePoint instance. + +**Key Commits**: `715e1f37` + +--- + +## III. Sticky Logic Registry + +> Code segments that **MUST remain identical** regardless of upstream changes. + +| ID | Location | Invariant | Reason | +|---|---|---|---| +| SL-01 | `eea_utils.py`: `get_langfuse_callback_handler()` | Full function body | Core Langfuse integration entrypoint | +| SL-02 | `chat_llm.py`: metadata injection call | `metadata` parameter in `litellm.completion()` | Any upstream change removing this is a Logic Violation | +| SL-03 | `run_graph.py`: GraphConfig Langfuse handler | LangfuseCallbackHandler in agent graph | Deep Research tracing depends on this | +| SL-04 | `langfuse_tracing_processor.py`: Clarification Step naming | `"Clarification needed for """` | Langfuse dashboard naming convention | +| SL-05 | `docker-compose.yml` / `.env.example` | `LANGFUSE_FLUSH_AT=1` | Prevents trace loss on process exit | +| SL-06 | `playwright.py`: process stop guard | `if process.returncode is None: process.terminate()` | Prevents playwright zombie processes (GH #2238) | +| SL-07 | `Dockerfile`: tini entrypoint | `ENTRYPOINT ["/usr/bin/tini", "--"]` | Required for playwright subprocess reaping | +| SL-08 | `DiacriticTagResolver`: registry build | Class-based, streaming-compatible | EEA proprietary normalization logic | +| SL-09 | Healthcheck logic: consecutive failure threshold | 2 consecutive failures before marking unhealthy | Prevents connector auto-pause on transient errors | +| SL-10 | `AccountPopover.tsx → SettingsPopover`: EEA page links | Four `` entries for Disclaimer, Privacy Architecture, Privacy Statement, What's new | Legal/informational links required by EEA. Upstream often rewrites the user popover — always re-add these after `Help & FAQ` and before the `null` separator. Search for `onyx-user-dropdown` to find the file. | + +--- + +## IV. Re-implementation Guide + +> Step-by-step instructions to recreate each feature block if the original files are missing or heavily refactored in a new upstream. + +--- + +### RG-01: Langfuse Tracing (CRITICAL — re-implement first) + +**Prompt for re-implementation**: + +> "Create `backend/onyx/utils/eea_utils.py` with a `get_langfuse_callback_handler(metadata: dict) -> CallbackHandler` function. It must import `from langfuse.callback import CallbackHandler` and build the handler using `LANGFUSE_PUBLIC_KEY`, `LANGFUSE_SECRET_KEY`, `LANGFUSE_HOST` from `os.environ`. The `metadata` dict must include keys: `user_id` (strip the `__user__` prefix if present), `session_id`, `trace_name` (first 200 chars of user message), `trace_id` (UUID). +> +> Next, in `backend/onyx/llm/chat_llm.py`, find the `litellm.completion()` call and add a `metadata=` argument populated by `get_langfuse_callback_handler()`. +> +> In `backend/onyx/agents/agent_search/run_graph.py`, add the Langfuse handler to the `GraphConfig`. Ensure it propagates through all agent steps including clarification. +> +> In `backend/onyx/tracing/langfuse_tracing_processor.py`, add logic so that if `'Clarification'` is in the trace metadata, the span name is set to `Clarification needed for ""`. +> +> Set `LANGFUSE_FLUSH_AT=1` in the EEA `.env` file to prevent batch loss." + +**Verification**: Check Langfuse dashboard shows user_id, session_id on every trace. Deep Research sub-spans must appear as children of the parent trace. + +--- + +### RG-02: EEA Rebranding + +**Prompt for re-implementation**: + +> "In `backend/onyx/configs/constants.py`, set `APPLICATION_NAME = 'EEA AI Hub'`. Create `web/src/components/EEA_Logo.tsx` as an SVG component loading `/EEA_logo_compact_EN.svg`. Update `Header.tsx` to use `` instead of the default Onyx logo. In `Footer.tsx`, replace footer links with EEA privacy policy (`https://www.eea.europa.eu/en/legal/eea-data-policy`) and architecture page links. In all auth pages (login, signup), replace the logo and ensure no external scripts (fonts, analytics) are loaded by adding `next.config.js` CSP headers." + +--- + +### RG-03: User Disclaimer Modal + +**Prompt for re-implementation**: + +> "Create a DB model `EEAConfig` with a `disclaimer_text: str` field and a migration. Add GET/POST endpoints at `/api/eea/disclaimer`. Create `web/src/app/admin/eea_config/disclaimer/page.tsx` with a text editor that POSTs to this endpoint. Create `web/src/components/UserDisclaimerModal.tsx` — a modal that reads `localStorage.getItem('eea_disclaimer_acknowledged')`. If null, fetch the disclaimer text from the API and display it with an 'I Acknowledge' button that sets the localStorage key. Mount this modal in `_app.tsx` or the root layout wrapping all authenticated pages." + +--- + +### RG-04: Custom Admin Pages + +**Prompt for re-implementation**: + +> "Create a DB model `EEAPage` with `title: str` (used as URL slug), `content: str` (markdown), `is_restricted: bool`. Add CRUD endpoints at `/api/eea/pages`. Create `web/src/app/admin/eea_config/pages/` with Next.js pages for listing, creating, editing, and viewing pages. Pages with `is_restricted=False` should be accessible without admin role. +> +> **CRITICAL — user popover links**: Find the file containing the user account popover. Search for `onyx-user-dropdown` (the trigger div id) or `PopoverMenu` to locate it — currently `web/src/sections/sidebar/AccountPopover.tsx`. Inside the `SettingsPopover` component's `` array, add the following four `` entries **after** the `Help & FAQ` item and **before** the `null` separator. Import `SvgFileText` from `@opal/icons`: +> ```tsx +> // EEA: legal & informational page links +> +> Disclaimer +> , +> +> Privacy Architecture +> , +> +> Privacy Statement +> , +> +> What's new +> , +> ```" + +--- + +### RG-05: Playwright & Web Connector Stability + +**Prompt for re-implementation**: + +> "In `backend/onyx/utils/playwright.py`, wrap all `process.terminate()` calls in a guard: `if process.returncode is None: process.terminate()`. Add a configurable timeout (default 30s) for page load. In `backend/onyx/connectors/web/connector.py`, add `ignore_ssl_errors=True` option and implement sitemap auto-discovery: try `/sitemap.xml`, `/sitemap_index.xml`, and robots.txt. If the primary sitemap parser returns 0 URLs, fall back to `ultimate_sitemap_parser`. Implement `remove_by_selector(html, selectors)` in `eea_utils.py` and call it before passing HTML to the indexer. In the backend `Dockerfile`, add `tini` as the entrypoint: `RUN apt-get install -y tini` and `ENTRYPOINT ['/usr/bin/tini', '--']`." + +--- + +### RG-06: Connector Healthcheck + +**Prompt for re-implementation**: + +> "In the connector state tracker, add a `consecutive_failure_count: int` field (DB-backed or in-memory with Redis). On each indexing failure, increment it. Only mark a connector as unhealthy if `consecutive_failure_count >= 2`. On success, reset to 0. Remove any auto-pause logic that suspends connectors after a single failure. Update `backend/onyx/server/manage/connectors_state.py` to handle the optional `search_settings` tuple safely using `if settings else default_value`." + +--- + +### RG-07: Diacritic Tag Resolver + +**Prompt for re-implementation**: + +> "Create `backend/onyx/natural_language_processing/diacritic_resolver.py` with a `DiacriticTagResolver` class. Constructor accepts a list of canonical tags (with diacritics). It builds a registry by normalizing each canonical tag (via `unicodedata.normalize('NFD', tag).encode('ascii', 'ignore').decode()` to strip diacritics). The `resolve(query_tag)` method normalizes the input, looks up the canonical tag, and returns it. If not found, return the original. Add configurable latency logging via `DIACRITIC_RESOLVER_LOGGING` env var. The class must be stateful (registry built once) and thread-safe (use a frozen dict or lock)." + +--- + +## V. Gap Analysis: Smart-Sync Protection Rules + +| Feature | Covered by smart-sync.md? | Gap / Action Needed | +|---|---|---| +| Langfuse metadata injection | ✅ Yes — Section "Feature-Specific Rules: Langfuse & LiteLLM" covers call sites | Partially: `run_graph.py` Deep Research path explicitly mentioned. Clarification step naming in `langfuse_tracing_processor.py` is covered in "Onyx Tracing Processor" section. | +| EEA Rebranding | ❌ Not mentioned | **GAP**: Add guard: "If `constants.py` `APPLICATION_NAME` is changed to 'Onyx' by upstream, revert to 'EEA AI Hub'." | +| Disclaimer Modal | ❌ Not mentioned | **GAP**: Add guard for `web/src/app/admin/eea_config/` directory — protect from deletion. | +| Custom Pages | ❌ Not mentioned | **GAP**: Add protection rule for `eea_config/pages/` route tree. | +| Playwright stability | ❌ Not mentioned | **GAP**: Add rule: "After any upstream change to `playwright.py`, verify the `returncode` guard and timeout are present." | +| Connector Healthcheck | ❌ Not mentioned | **GAP**: Add rule: "Consecutive failure threshold must remain 2. Do not merge upstream changes that add auto-pause behavior." | +| Diacritic Resolver | ❌ Not mentioned | **GAP**: Add rule for `DiacriticTagResolver` — protect from upstream refactor that restructures `natural_language_processing/`. | +| LANGFUSE_FLUSH_AT=1 | Partially (env var mentioned) | **GAP**: Add explicit check: after sync, verify `.env.example` contains `LANGFUSE_FLUSH_AT=1`. | +| tini Dockerfile entrypoint | ❌ Not mentioned | **GAP**: Add Dockerfile guard: "Verify ENTRYPOINT uses tini after upstream Dockerfile changes." | +| AccountPopover EEA page links | ✅ Added — SL-10 | **DONE**: Four sidebar links (Disclaimer, Privacy Architecture, Privacy Statement, What's new) documented in SL-10 and RG-04. Smart-sync rule added. | + +**Recommended addition to `smart-sync.md`**: +``` +## EEA Identity Guards +After any upstream sync: +1. Verify `constants.py` APPLICATION_NAME = 'EEA AI Hub' +2. Verify `web/src/app/admin/eea_config/` directory exists and is unchanged +3. Verify `deployment/docker_compose/eea/` is not overwritten +4. Verify backend Dockerfile ENTRYPOINT uses tini +5. Verify `.env.example` contains LANGFUSE_FLUSH_AT=1 +6. Verify playwright.py contains the returncode guard +7. Verify connector healthcheck threshold is 2 consecutive failures +``` diff --git a/.agents/audit_logs/eea_commits.txt b/.agents/audit_logs/eea_commits.txt new file mode 100644 index 00000000000..6aa8303393a --- /dev/null +++ b/.agents/audit_logs/eea_commits.txt @@ -0,0 +1,123 @@ +84ec36f2327c07abe467504059b026d88938c84d|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-03-09|Prevent large batches for langfuse +79c4c6b0238caee3f14e97c7e57e0b492d3cc946|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-03-05|added tini in the image +8d3f8e1af384380d41e0a94892130b1f5340cab3|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-03-04|fixed metadata in langfuse traces when deep research is used +ad4a611a8df859c1d10176cb5da716d77be7415c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-03-04|typo +8ef9f768b1f584fbb121485a46f03e37a7ad0a65|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-02-25|fixed conflicts, updated lock file +b303e0423d6be439952ec4bbe481b02825c5df8d|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-02-20|quickfix for changing password +cf277efc4cec37d4a42025fa1baee43e63d55130|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-02-05|applied security patches +43f53ec13b0a2d90ef8be75460d7e31edf4894c5|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-02-04|fixed metadata in langfuse and feedback functionality +0f5e4443f1b3087de554541738e524b3b7a81179|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-02-02|updated for newer langfuse library +7ba9c9fe91cb0ece87df681a6a95ab186d01aab0|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-01-29|change name from GPT Lab to AI Hub +85d185c34e21c15dc5a188757ca59b5d99322ebf|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-12-12|security patch +a1ef1ec478ab5fb7fce74d9c911ceefceb72591c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-12-12|security patch +02d84bd2253de21412cdcdb89e892c7676869dda|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-12-08|fix for CVE-2025-55182 +ef922c13742ba2dc07c736b3c6f72938421ee4a6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-12-05|FIX for CVE-2025-55182 +05e9a42cb218c7ff3668abb84a3b39e367ff0ae1|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-12-05|FIX for CVE-2025-55182 +d7b63965890b65a7bae4b24528c8ec5d252ab505|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-26|fixed conflict +ea245c9b1cd8c3682de58519b45099f198ad7097|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-25|fixed connectors healthcheck +9150a8c1018aefa84e387282a32189a07b382889|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-24|fixed nginx volume +67ab9b71c03ecd4c0f5b948ec8dd7f2816e0a0ad|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-24|fixes in docker-compose.yml +0a945d46eb270b14bec26cab472465a4a5e5fc91|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|small fix +95f44e1a81b71d482e2501e47153bdc207fdd0e6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|docker-compose +6ba660c310b61697da7acd4c47fc8eba4ee54d7d|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|replaced onyx logo +8753631336ec9505069ed87fb700add3437a1a14|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|added customizable pages to user popover +c26ce64b7be07b6fe21e0b0af5d3c7dd128e1a78|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|fix admin for custom pages +995cc5a1b90b17ab54e7e600e8323e2daaf1fe31|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|fixed sort on connectors +76b5cc276cba681a82d06d7861c6a842c1b9d1bc|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|fixed logo on auth pages +c1ba5b42766c7549f4f9e3c010193db3ff78263c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|fixed login form +d95ee7f484e8aae01a5ad44c8b652a94ce2ab213|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|fixed signup form +9b1b67b6ec42cb9ef119b94553f220cd80bff92a|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|wip sync +72beee3e1f4782d79d1d3c5e94c53f213d8c42d0|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-18|fixed entrypoint +a48c5275dc7659244effdf8bfe6f289e699e2e3f|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-18|added .env.example +b89157b4801078fbf6a8c092b51bb1fee4c5fb6d|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-18|added docker-compose for local development +0a31435fcfb4a6d8a53c8c5db376b39d6267e619|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-10-22|Fix for connectors healthcheck +6e0ded026566aede0ae1b7fabe1749ce67b19f02|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-10-16|don't throw an exception when a github user has no name or email address +b3d194f5e956572a1d1ad08b3799a28ffe1d1693|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-10-14|added timeout, so requests.head don't get stalled +81f1893bb135166a31e94aca92fa8a6728d3417c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-26|fix the names of indexed pdf files +325a63ec1ff5f978d7580e46e4c9d0f4e5b1e4d6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-25|Replace special brackets used for citations +79d4a2a2fe8d57b368f20a0d50782a976ad240b1|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-24|allow indexing of text files +fb35ada65c610490e88ffa75769c0ba4fc22363a|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-03|custom fix for chatting with 'my documents' +1ec557347015005fbc6cf17c47d7a340f038bc93|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-02|added option to reindex a user file (only for admin users) +a7319ffec7fdaf6a1452f2112976bd7f98a7f7e1|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-02|add the assistant to metadata +1c72086495080f129aed190515513910076008dc|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-27|better use of compressed sitemaps +cee184dbe972e713d8ce870371471d38b9c98ef4|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-26|set the resource limits from an env +84fed4077207835ff1255474b1e09d9052b15e87|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-26|increase resource-limits for vespa +dcd639b6b5935f9e9089a7573966c2a84dbf1470|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-19|remove special characters in filenames +5dc48af545e064335cb66ca2cd41ba9e3c6fb7b5|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-13|small fix on headless chrome flags +cb65faf1dba57c78ff136891b7d90b8445b8dc65|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-13|fix +1f1fa5e8696fb63ba15737f38d17bab1b9ad1be0|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-11|Fixed indexing of protected pdf files +77d87a0159a9ce12e85e266b018de1113f00d530|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-11|fixed sync +8ba655dae970d97d45e34c79a6a46cbdf7ef81d2|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-07-02|added back missing configuration pages +c75079136bef26dd9bb3c2059e4001be27d471d4|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-07-01|added option to crawl unpublished documents +534f2b042bfcaafaa4963ef7da54637161c68fc8|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-30|in case we use api_keys, we should pass the keys name as metadata to litellm +5ddb4cac6660f26c24cdb83ca1a23cc13ae9c4b8|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-20|don't try to download chromium-linux.zip +8d3a0887fdf358b6a87010e76b90092283822927|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-19|added missing file +99cbf16b109fda256d80cfd3fde140f76d6e6522|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-19|temporary fix, avoid downloading ffmpeg-linux +c1aaf6b6fa1f7922c74220c3e8b558d4a0eb7c6e|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-18|small fixes +8e807ebfc9cf2264fb8c1d5c02ddf5fecaacc039|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-18|small fix +5c9a44b0ee10c8b10603061630cf7fbc918e3022|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-05-28|updated jenkinsfile +1189a64c3a1e0c5c0ade50bb991368fcfccc0f43|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-05-12|added guardrails to onyx +84643bc0b30fbdc3658f50dbd97928749a1e15b2|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-05-06|updated llm metadata +a9d2b7aae0a8352443c9a566c1fff7a4e1961973|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-17|don't load 3rd party resources +62a493590f4539246c706cadbee2855595b714f6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-17|added privacy statement in user dropdown menu +dfd19cfe127a69c2d4d231f4a0ec0a64393b1200|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-17|pages created in onyx admin should not be restricted +e4d44dd07772a5ddbc2448d414fbc6971c3bda9c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-09|Refs remove debug code +da7a4be39116a709e9fab4713dee141961f752f6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-09|Updated onyx emails +6c010f82fc8725021fae54fed64b1302e3343ad7|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-09|added missing dependency +15d51857fd2db8d4b035a6d7e6d377511c425f6b|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-08|sync feedback with langfuse +bdc09551a69f177cc253efe78b877410ba6e17a1|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-02|configure the metadata so we have nice traces in langfuse +14679af511f97267969f8f6828c9d7460053e16d|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-03-27|updated pdf indexing +46f68844119cef7e126fce5b5a5e34426c43611b|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-03-27|fixed pdf indexing +f2aed2d64f70c991fd39fb8063f302e82df293cb|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-14|customization for eea +199a9944bfecdb9d5a985b6bee63dc8612f0d103|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-10|changed the way how we stop playwright if there was an exception; related to: https://github.com/microsoft/playwright-python/issues/2238 +fa04e34375eb5ef6b5260f321327fd43c3be265c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-07|added timeout for playwright +cd9ffb0e8d3d38c5b326b83f699648444f759bcd|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-06|updated playwright, how to scrape pages +529f3e5e7e503fb942b4c7c7fe7ceb667177d380|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-06|get the sitemap even if the ssl certificate is expired +0a4e36354b8a6ce1edaa7a1e7ec116422396f900|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-06|Don't pause the failed connectors +f8696402278b00d4cd26c7e8eae3346af0c44524|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-06|updated connectors healthcheck +ab5e4cd25d4dc33da0edcfd568ce85602c5e070f|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-06|if no urls found in sitemap, fallback to ultimate sitemap parser +a52ea18ca0e82a69c48da201a020f51420290da3|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-12-31|connectors healthcheck should only fail if there are 2 consecutive failed indexing attempts for a connector +1916b6b277e08420a21bdccf7b90104b333839ad|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-12-27|temporary fix for default prompt_id +91a31c631d7cb922d54d2a5d55c2e242e8c559dd|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-25|fallback if we can't figure out the encoding from the model name +c7001732f5d15094e5f68ea3d0e2dfb69a0f7b70|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-25|added What's new page +ae8bb7426306af977330400dadcfaa011a174d0c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-20|ignore the errors that caused by a restart +35581db8ffc5c4c6072c872519bef19a3f593533|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-19|added healthcheck for connectors +4e4c18401ed41ca97718b9127574d440a94cc720|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-12|fix typo on history sidebar +6e37321786e6c4639d9fdf65adb70dca5d2bf776|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-12|small fix on auth page +e9ae89b4bc84139a54960bdb4ead6f0912660732|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-09-16|fixed upgrade step +5876ed728a1149aab24768048f0b875a38b6dbb4|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-09-02|remove unnecessary retry +4e28bf09cb2e79e5bbfbe61a933ec8890af7d582|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-08-28|updated special case when forcing MAX TOKENS for Meta-Llama-3.1 +199b3430307889b7a0631554c3059b8a9443566c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-07-31|added missing file +b658f5c54c1db4d98d89ab79cfc54ec33b17e082|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-07-18|updated to libgnutls30=3.7.9-2+deb12u3 +93efe2affceaf1f0c363eaaf456e077837717148|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-07-18|fixed typo +51c0dc62d77925f10834a541d2a1cf4b2e959dac|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-07-18|workaround for connector deletion +dc3ddeb9739d4879326dedc664047becf177fa11|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-06-19|workaround for not reachable indexing_model_server using tenacity +810429cd15b60f575d26f1e92f03bfd02b4080bb|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-06-19|updated dockerfile for backend +49c4b53cc1730820ca1a4548f0386c3ea815681a|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-06-10|updated disclaimer modal +921689a11e693a490a92b07afc73ddc768bafc53|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-06-10|updated the way the disclaimer is displayed +c1835a4af7fe78af7ba042a102e81b1a5dbb4af4|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-30|changed the way the eea custom settings are fetched in the web app +acdead91861d10925019091bac83665c33c69a8b|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-29|Try to find the sitemap for a given site +3dd2c77b75fd6de667d697462c2294624846bc95|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-23|small fix for pages admin +c363708e2afc9722246cab67a20c20ead6f0a36a|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-23|updated logo and title +836e3c3dfcc5de77a04c050099bb5da82cbdeacd|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-22|added configuration options for footer, and the possibility to create pages +cb86eba994763c50ba03175522dee74909d95354|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-08|use a state for checking if userGroups is loading +d2ec8d52800fd0baa572bd65ec91108706477b5f|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-08|Only try to get the userGroups if EE is enabled +ad369a6db583c5f4cef212c39256605470732037|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-24|added new options for date filter +23688f512e32623751052bac99640f930726ed41|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-24|alphabetically sort knowledge sets +1409f2ce44a32649c648344061f55c7217013498|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-24|updated how the models are shown for assistants +206c9c4237b215baf5616b752aa2e3daac6529ac|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-24|show the actual default model for personas +babac3daddd420818c9b848c2e518a3a7b281913|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-10|pessimistic disconnect handling +c61780c483fa3a3f0e14e1fe1f34b9f543ee5790|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|updated style +83e33d7efcbece93790c37138f4130c6eb6a0832|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|added tooltips for personas +9c6a5741f1c90859692cd0399e1cf303cf8d9607|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|added new option in admin +eb460341d53126d53cc75db1640f38b19e0c9943|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|updated disclaimer modal +4b42a026497b00f17626c116d5383b1fbb213a55|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|updated header, footer, login, signup +d19b3cc8ca88c1c91d2db42295f2d1bb6866f7ec|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|added admin page for disclaimer configuration +f49349d372928339d9ad1186f7c665b3baf6c626|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|added backend for new configuration option for disclaimer +2824a873e1dac7c3b540cf2a9f49af6d89526b3e|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-26|show modal when user logs in +65fbca40ae9983b8d5a6b3c3d064907856aa98cc|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-26|added disclaimer as modal, when user logs in +732d6658ab799a7d9d3f6c133bf8b8aa53c5ddfc|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-20|layout fixes +d2c33446a0a248923916bbd2e85ce4593e555da6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-14|layout fix for search page +bcdaf71c5b2dcb973414f30cb7598405ed726680|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-13|customizations for logo, header, footer, login & signup page +16da6cf9b302a846cc4aa4421ac2638fe5a90313|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-12|fixed condition +dccd98884ef69a34dd4bb9fbff0cfcae2caea0db|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-12|don't try to authenticate in case SMTP_USER & SMTP_PASS are not set \ No newline at end of file diff --git a/.agents/audit_logs/eea_files_heatmap.txt b/.agents/audit_logs/eea_files_heatmap.txt new file mode 100644 index 00000000000..fe2f711b847 --- /dev/null +++ b/.agents/audit_logs/eea_files_heatmap.txt @@ -0,0 +1,30 @@ + 15 backend/onyx/utils/eea_utils.py + 15 backend/onyx/connectors/web/connector.py + 8 web/src/app/search/page.tsx + 6 web/package-lock.json + 6 web/package.json + 6 backend/requirements/default.txt + 5 web/src/components/search/UserDisclaimerModal.tsx + 5 web/src/components/admin/Layout.tsx + 5 web/src/app/chat/ChatPage.tsx + 5 web/src/app/auth/signup/page.tsx + 5 web/src/app/auth/login/EmailPasswordForm.tsx + 5 deployment/docker_compose/eea/docker-compose.yml + 5 backend/Dockerfile + 4 web/src/components/Footer.tsx + 4 web/src/components/EEA_Logo.tsx + 4 web/src/app/pages/[pageTitle]/page.tsx + 4 web/src/app/auth/login/page.tsx + 3 web/src/components/search/PersonaSelector.tsx + 3 web/src/app/globals.css + 3 web/src/app/chat/page.tsx + 3 web/src/app/chat/ChatPersonaSelector.tsx + 3 web/src/app/chat/ChatIntro.tsx + 3 web/src/app/admin/eea_config/pages/page.tsx + 3 deployment/docker_compose/eea/docker-compose.override.yml + 3 backend/onyx/utils/playwright.py + 3 backend/onyx/chat/process_message.py + 3 backend/onyx/auth/email_utils.py + 3 backend/danswer/server/manage/get_state.py + 2 web/src/components/UserDropdown.tsx + 2 web/src/components/logo/Logo.tsx diff --git a/.agents/audit_logs/git_diff_files.txt b/.agents/audit_logs/git_diff_files.txt new file mode 100644 index 00000000000..e499f34f621 --- /dev/null +++ b/.agents/audit_logs/git_diff_files.txt @@ -0,0 +1,4303 @@ +.claude/skills +.cursor/mcp.json +.cursor/skills/onyx-cli/SKILL.md +.cursor/skills/playwright/SKILL.md +.git-blame-ignore-revs +.github/CODEOWNERS +.github/actions/build-backend-image/action.yml +.github/actions/build-integration-image/action.yml +.github/actions/build-model-server-image/action.yml +.github/actions/prepare-build/action.yml +.github/actions/run-nightly-provider-chat-test/action.yml +.github/actions/setup-python-and-install-dependencies/action.yml +.github/actions/slack-notify/action.yml +.github/actions/slack-notify/user-mappings.json +.github/dependabot.yml +.github/pull_request_template.md +.github/workflows/check-lazy-imports.yml +.github/workflows/deployment.yml +.github/workflows/docker-tag-beta.yml +.github/workflows/docker-tag-latest.yml +.github/workflows/helm-chart-releases.yml +.github/workflows/merge-group.yml +.github/workflows/nightly-close-stale-issues.yml +.github/workflows/nightly-llm-provider-chat.yml +.github/workflows/nightly-scan-licenses.yml +.github/workflows/post-merge-beta-cherry-pick.yml +.github/workflows/pr-database-tests.yml +.github/workflows/pr-desktop-build.yml +.github/workflows/pr-external-dependency-unit-tests.yml +.github/workflows/pr-golang-tests.yml +.github/workflows/pr-helm-chart-testing.yml +.github/workflows/pr-integration-tests.yml +.github/workflows/pr-jest-tests.yml +.github/workflows/pr-labeler.yml +.github/workflows/pr-linear-check.yml +.github/workflows/pr-mit-integration-tests.yml +.github/workflows/pr-playwright-tests.yml +.github/workflows/pr-python-checks.yml +.github/workflows/pr-python-connector-tests.yml +.github/workflows/pr-python-model-tests.yml +.github/workflows/pr-python-tests.yml +.github/workflows/pr-quality-checks.yml +.github/workflows/preview.yml +.github/workflows/release-cli.yml +.github/workflows/release-devtools.yml +.github/workflows/reusable-nightly-llm-provider-chat.yml +.github/workflows/sandbox-deployment.yml +.github/workflows/storybook-deploy.yml +.github/workflows/sync_foss.yml +.github/workflows/tag-nightly.yml +.github/workflows/zizmor.yml +.gitignore +.greptile/config.json +.greptile/files.json +.greptile/rules.md +.pre-commit-config.yaml +.vscode/env.web_template.txt +.vscode/env_template.txt +.vscode/launch.json +.vscode/launch.template.jsonc +AGENTS.md +AGENTS.md.template +CLAUDE.md +CLAUDE.md.template +CONTRIBUTING.md +CONTRIBUTING_MACOS.md +CONTRIBUTING_VSCODE.md +Jenkinsfile +LICENSE +README.md +backend/.dockerignore +backend/.trivyignore +backend/Dockerfile +backend/Dockerfile.model_server +backend/alembic/README.md +backend/alembic/env.py +backend/alembic/run_multitenant_migrations.py +backend/alembic/versions/01f8e6d95a33_populate_flow_mapping_data.py +backend/alembic/versions/03d085c5c38d_backfill_account_type.py +backend/alembic/versions/07b98176f1de_code_interpreter_seed.py +backend/alembic/versions/0bb4558f35df_add_scim_username_to_scim_user_mapping.py +backend/alembic/versions/114a638452db_add_default_app_mode_to_user.py +backend/alembic/versions/12635f6655b7_drive_canonical_ids.py +backend/alembic/versions/175ea04c7087_add_user_preferences.py +backend/alembic/versions/18b5b2524446_add_is_clarification_to_chat_message.py +backend/alembic/versions/19c0ccb01687_migrate_to_contextual_rag_model.py +backend/alembic/versions/1d78c0ca7853_remove_voice_provider_deleted_column.py +backend/alembic/versions/1f60f60c3401_embedding_model_search_settings.py +backend/alembic/versions/2020d417ec84_single_onyx_craft_migration.py +backend/alembic/versions/23957775e5f5_remove_feedback_foreignkey_constraint.py +backend/alembic/versions/25a5501dc766_group_permissions_phase1.py +backend/alembic/versions/2664261bfaab_add_cache_store_table.py +backend/alembic/versions/27fb147a843f_add_timestamps_to_user_table.py +backend/alembic/versions/2a391f840e85_add_last_refreshed_at_mcp_server.py +backend/alembic/versions/2b75d0a8ffcb_user_file_schema_cleanup.py +backend/alembic/versions/2b90f3af54b8_usage_limits.py +backend/alembic/versions/2c2430828bdf_add_unique_constraint_to_inputprompt_.py +backend/alembic/versions/3a78dba1080a_user_file_legacy_data_cleanup.py +backend/alembic/versions/40926a4dab77_reset_userfile_document_id_migrated_.py +backend/alembic/versions/41fa44bef321_remove_default_prompt_shortcuts.py +backend/alembic/versions/47a07e1a38f1_fix_invalid_model_configurations_state.py +backend/alembic/versions/495cb26ce93e_create_knowlege_graph_tables.py +backend/alembic/versions/4a1e4b1c89d2_add_indexing_to_userfilestatus.py +backend/alembic/versions/4cebcbc9b2ae_add_tab_index_to_tool_call.py +backend/alembic/versions/4d58345da04a_lowercase_user_emails.py +backend/alembic/versions/4ea2c93919c1_add_type_to_credentials.py +backend/alembic/versions/4f8a2b3c1d9e_add_open_url_tool.py +backend/alembic/versions/503883791c39_add_effective_permissions.py +backend/alembic/versions/505c488f6662_merge_default_assistants_into_unified.py +backend/alembic/versions/57122d037335_add_python_tool_on_default.py +backend/alembic/versions/5c3dca366b35_backend_driven_notification_details.py +backend/alembic/versions/5e6f7a8b9c0d_update_default_persona_prompt.py +backend/alembic/versions/631fd2504136_add_approx_chunk_count_in_vespa_to_.py +backend/alembic/versions/6436661d5b65_add_created_at_in_project_userfile.py +backend/alembic/versions/689433b0d8de_add_hook_and_hook_execution_log_tables.py +backend/alembic/versions/699221885109_nullify_default_task_prompt.py +backend/alembic/versions/6b3b4083c5aa_persona_cleanup_and_featured.py +backend/alembic/versions/7206234e012a_add_image_generation_config_table.py +backend/alembic/versions/72aa7de2e5cf_make_processing_mode_default_all_caps.py +backend/alembic/versions/73e9983e5091_add_search_query_table.py +backend/alembic/versions/7616121f6e97_add_enterprise_fields_to_scim_user_mapping.py +backend/alembic/versions/776b3bbe9092_remove_remaining_enums.py +backend/alembic/versions/78ebc66946a0_remove_reranking_from_search_settings.py +backend/alembic/versions/7a70b7664e37_add_model_configuration_table.py +backend/alembic/versions/7b9b952abdf6_update_entities.py +backend/alembic/versions/7bd55f264e1b_add_display_name_to_model_configuration.py +backend/alembic/versions/7cb492013621_code_interpreter_server_model.py +backend/alembic/versions/7e490836d179_nullify_default_system_prompt.py +backend/alembic/versions/7ed603b64d5a_add_mcp_server_and_connection_config_.py +backend/alembic/versions/8188861f4e92_csv_to_tabular_chat_file_type.py +backend/alembic/versions/81c22b1e2e78_hierarchy_nodes_v1.py +backend/alembic/versions/8405ca81cc83_notifications_constraint.py +backend/alembic/versions/849b21c732f8_add_demo_data_enabled_to_build_session.py +backend/alembic/versions/87c52ec39f84_update_default_system_prompt.py +backend/alembic/versions/8b5ce697290e_add_discord_bot_tables.py +backend/alembic/versions/8ffcc2bcfc11_add_needs_persona_sync_to_user_file.py +backend/alembic/versions/9087b548dd69_seed_default_image_gen_config.py +backend/alembic/versions/90b409d06e50_add_chat_compression_fields.py +backend/alembic/versions/90e3b9af7da4_tag_fix.py +backend/alembic/versions/93a2e195e25c_add_voice_provider_and_user_voice_prefs.py +backend/alembic/versions/93c15d6a6fbb_add_chunk_error_and_vespa_count_columns_.py +backend/alembic/versions/977e834c1427_seed_default_groups.py +backend/alembic/versions/9a0296d7421e_add_is_auto_mode_to_llm_provider.py +backend/alembic/versions/9b66d3156fc6_user_file_schema_additions.py +backend/alembic/versions/9c54986124c6_add_scim_tables.py +backend/alembic/versions/9d1543a37106_add_processing_duration_seconds_to_chat_.py +backend/alembic/versions/a01bf2971c5d_update_default_tool_descriptions.py +backend/alembic/versions/a1b2c3d4e5f6_add_license_table.py +backend/alembic/versions/a1b2c3d4e5f7_drop_agent_search_metrics_table.py +backend/alembic/versions/a2b3c4d5e6f7_remove_fast_default_model_name.py +backend/alembic/versions/a3b8d9e2f1c4_make_scim_external_id_nullable.py +backend/alembic/versions/a3c1a7904cd0_remove_userfile_related_deprecated_.py +backend/alembic/versions/a3f8b2c1d4e5_add_preferred_response_id_to_chat_message.py +backend/alembic/versions/a852cbe15577_new_chat_history.py +backend/alembic/versions/b4b7e1028dfd_grant_basic_to_existing_groups.py +backend/alembic/versions/b51c6844d1df_seed_memory_tool.py +backend/alembic/versions/b5c4d7e8f9a1_add_hierarchy_node_cc_pair_table.py +backend/alembic/versions/b728689f45b1_rename_persona_is_visible_to_is_listed_.py +backend/alembic/versions/b7bcc991d722_assign_users_to_default_groups.py +backend/alembic/versions/b8c9d0e1f2a3_drop_milestone_table.py +backend/alembic/versions/be87a654d5af_persona_new_default_model_configuration_.py +backend/alembic/versions/c0c937d5c9e5_llm_provider_deprecate_fields.py +backend/alembic/versions/c1d2e3f4a5b6_add_deep_research_tool.py +backend/alembic/versions/c7f2e1b4a9d3_add_sharing_scope_to_build_session.py +backend/alembic/versions/c9e2cd766c29_add_s3_file_store_table.py +backend/alembic/versions/cbc03e08d0f3_add_opensearch_migration_tables.py +backend/alembic/versions/d09fc20a3c66_seed_builtin_tools.py +backend/alembic/versions/d1b637d7050a_sync_exa_api_key_to_content_provider.py +backend/alembic/versions/d25168c2beee_tool_name_consistency.py +backend/alembic/versions/d3fd499c829c_add_file_reader_tool.py +backend/alembic/versions/d56ffa94ca32_add_file_content.py +backend/alembic/versions/d5c86e2c6dc6_add_cascade_delete_to_search_query_user_.py +backend/alembic/versions/d8cdfee5df80_add_skipped_to_userfilestatus.py +backend/alembic/versions/e209dc5a8156_added_prune_frequency.py +backend/alembic/versions/e7f8a9b0c1d2_create_anonymous_user.py +backend/alembic/versions/e8f0d2a38171_add_status_to_mcp_server_and_make_auth_.py +backend/alembic/versions/ed9e44312505_add_icon_name_field.py +backend/alembic/versions/f220515df7b4_add_flow_mapping_table.py +backend/alembic/versions/f7ca3e2f45d9_migrate_no_auth_data_to_placeholder.py +backend/alembic/versions/fb80bdd256de_add_chat_background_to_user.py +backend/alembic/versions/feead2911109_add_opensearch_tenant_migration_columns.py +backend/alembic_tenants/env.py +backend/alembic_tenants/versions/3b9f09038764_add_read_only_kg_user.py +backend/chromium-linux.zip.part.aa +backend/chromium-linux.zip.part.ab +backend/docker-bake.hcl +backend/ee/LICENSE +backend/ee/onyx/access/access.py +backend/ee/onyx/access/hierarchy_access.py +backend/ee/onyx/auth/users.py +backend/ee/onyx/background/celery/apps/background.py +backend/ee/onyx/background/celery/apps/heavy.py +backend/ee/onyx/background/celery/apps/light.py +backend/ee/onyx/background/celery/apps/monitoring.py +backend/ee/onyx/background/celery/apps/primary.py +backend/ee/onyx/background/celery/tasks/beat_schedule.py +backend/ee/onyx/background/celery/tasks/cloud/tasks.py +backend/ee/onyx/background/celery/tasks/doc_permission_syncing/tasks.py +backend/ee/onyx/background/celery/tasks/external_group_syncing/tasks.py +backend/ee/onyx/background/celery/tasks/hooks/tasks.py +backend/ee/onyx/background/celery/tasks/query_history/tasks.py +backend/ee/onyx/background/celery/tasks/tenant_provisioning/tasks.py +backend/ee/onyx/background/celery/tasks/ttl_management/tasks.py +backend/ee/onyx/background/celery/tasks/usage_reporting/tasks.py +backend/ee/onyx/background/celery/tasks/vespa/__init__.py +backend/ee/onyx/background/task_name_builders.py +backend/ee/onyx/configs/app_configs.py +backend/ee/onyx/configs/license_enforcement_config.py +backend/ee/onyx/db/analytics.py +backend/ee/onyx/db/connector_credential_pair.py +backend/ee/onyx/db/document_set.py +backend/ee/onyx/db/external_perm.py +backend/ee/onyx/db/hierarchy.py +backend/ee/onyx/db/license.py +backend/ee/onyx/db/persona.py +backend/ee/onyx/db/scim.py +backend/ee/onyx/db/search.py +backend/ee/onyx/db/standard_answer.py +backend/ee/onyx/db/token_limit.py +backend/ee/onyx/db/usage_export.py +backend/ee/onyx/db/user_group.py +backend/ee/onyx/external_permissions/confluence/doc_sync.py +backend/ee/onyx/external_permissions/confluence/group_sync.py +backend/ee/onyx/external_permissions/confluence/page_access.py +backend/ee/onyx/external_permissions/confluence/space_access.py +backend/ee/onyx/external_permissions/github/doc_sync.py +backend/ee/onyx/external_permissions/github/group_sync.py +backend/ee/onyx/external_permissions/github/utils.py +backend/ee/onyx/external_permissions/gmail/doc_sync.py +backend/ee/onyx/external_permissions/google_drive/doc_sync.py +backend/ee/onyx/external_permissions/google_drive/folder_retrieval.py +backend/ee/onyx/external_permissions/google_drive/group_sync.py +backend/ee/onyx/external_permissions/google_drive/models.py +backend/ee/onyx/external_permissions/google_drive/permission_retrieval.py +backend/ee/onyx/external_permissions/jira/doc_sync.py +backend/ee/onyx/external_permissions/jira/group_sync.py +backend/ee/onyx/external_permissions/jira/page_access.py +backend/ee/onyx/external_permissions/perm_sync_types.py +backend/ee/onyx/external_permissions/post_query_censoring.py +backend/ee/onyx/external_permissions/salesforce/postprocessing.py +backend/ee/onyx/external_permissions/salesforce/utils.py +backend/ee/onyx/external_permissions/sharepoint/doc_sync.py +backend/ee/onyx/external_permissions/sharepoint/group_sync.py +backend/ee/onyx/external_permissions/sharepoint/permission_utils.py +backend/ee/onyx/external_permissions/slack/doc_sync.py +backend/ee/onyx/external_permissions/slack/group_sync.py +backend/ee/onyx/external_permissions/sync_params.py +backend/ee/onyx/external_permissions/teams/doc_sync.py +backend/ee/onyx/external_permissions/utils.py +backend/ee/onyx/feature_flags/posthog_provider.py +backend/ee/onyx/hooks/__init__.py +backend/ee/onyx/hooks/executor.py +backend/ee/onyx/main.py +backend/ee/onyx/prompts/__init__.py +backend/ee/onyx/prompts/query_expansion.py +backend/ee/onyx/prompts/search_flow_classification.py +backend/ee/onyx/search/process_search_query.py +backend/ee/onyx/secondary_llm_flows/__init__.py +backend/ee/onyx/secondary_llm_flows/query_expansion.py +backend/ee/onyx/secondary_llm_flows/search_flow_classification.py +backend/ee/onyx/server/analytics/api.py +backend/ee/onyx/server/auth_check.py +backend/ee/onyx/server/billing/__init__.py +backend/ee/onyx/server/billing/api.py +backend/ee/onyx/server/billing/models.py +backend/ee/onyx/server/billing/service.py +backend/ee/onyx/server/enterprise_settings/api.py +backend/ee/onyx/server/enterprise_settings/models.py +backend/ee/onyx/server/evals/api.py +backend/ee/onyx/server/features/__init__.py +backend/ee/onyx/server/features/hooks/__init__.py +backend/ee/onyx/server/features/hooks/api.py +backend/ee/onyx/server/license/api.py +backend/ee/onyx/server/license/models.py +backend/ee/onyx/server/manage/standard_answer.py +backend/ee/onyx/server/middleware/license_enforcement.py +backend/ee/onyx/server/oauth/api.py +backend/ee/onyx/server/oauth/confluence_cloud.py +backend/ee/onyx/server/oauth/google_drive.py +backend/ee/onyx/server/oauth/slack.py +backend/ee/onyx/server/query_and_chat/chat_backend.py +backend/ee/onyx/server/query_and_chat/models.py +backend/ee/onyx/server/query_and_chat/query_backend.py +backend/ee/onyx/server/query_and_chat/search_backend.py +backend/ee/onyx/server/query_and_chat/streaming_models.py +backend/ee/onyx/server/query_and_chat/token_limit.py +backend/ee/onyx/server/query_history/api.py +backend/ee/onyx/server/reporting/usage_export_api.py +backend/ee/onyx/server/reporting/usage_export_generation.py +backend/ee/onyx/server/scim/__init__.py +backend/ee/onyx/server/scim/api.py +backend/ee/onyx/server/scim/auth.py +backend/ee/onyx/server/scim/filtering.py +backend/ee/onyx/server/scim/models.py +backend/ee/onyx/server/scim/patch.py +backend/ee/onyx/server/scim/providers/__init__.py +backend/ee/onyx/server/scim/providers/base.py +backend/ee/onyx/server/scim/providers/entra.py +backend/ee/onyx/server/scim/providers/okta.py +backend/ee/onyx/server/scim/schema_definitions.py +backend/ee/onyx/server/seeding.py +backend/ee/onyx/server/settings/__init__.py +backend/ee/onyx/server/settings/api.py +backend/ee/onyx/server/tenant_usage_limits.py +backend/ee/onyx/server/tenants/anonymous_users_api.py +backend/ee/onyx/server/tenants/api.py +backend/ee/onyx/server/tenants/billing.py +backend/ee/onyx/server/tenants/billing_api.py +backend/ee/onyx/server/tenants/models.py +backend/ee/onyx/server/tenants/product_gating.py +backend/ee/onyx/server/tenants/provisioning.py +backend/ee/onyx/server/tenants/proxy.py +backend/ee/onyx/server/tenants/schema_management.py +backend/ee/onyx/server/tenants/team_membership_api.py +backend/ee/onyx/server/tenants/tenant_management_api.py +backend/ee/onyx/server/tenants/user_invitations_api.py +backend/ee/onyx/server/tenants/user_mapping.py +backend/ee/onyx/server/token_rate_limits/api.py +backend/ee/onyx/server/usage_limits.py +backend/ee/onyx/server/user_group/api.py +backend/ee/onyx/server/user_group/models.py +backend/ee/onyx/utils/encryption.py +backend/ee/onyx/utils/license.py +backend/ee/onyx/utils/posthog_client.py +backend/ee/onyx/utils/telemetry.py +backend/ffmpeg-linux.zip +backend/hello-vmlinux.bin +backend/keys/license_public_key.pem +backend/model_server/constants.py +backend/model_server/custom_models.py +backend/model_server/encoders.py +backend/model_server/legacy/README.md +backend/model_server/legacy/__init__.py +backend/model_server/legacy/custom_models.py +backend/model_server/legacy/onyx_torch_model.py +backend/model_server/legacy/reranker.py +backend/model_server/main.py +backend/model_server/onyx_torch_model.py +backend/onyx/access/access.py +backend/onyx/access/hierarchy_access.py +backend/onyx/access/models.py +backend/onyx/agents/agent_framework/message_format.py +backend/onyx/agents/agent_framework/models.py +backend/onyx/agents/agent_framework/query.py +backend/onyx/agents/agent_sdk/message_format.py +backend/onyx/agents/agent_sdk/message_types.py +backend/onyx/agents/agent_sdk/monkey_patches.py +backend/onyx/agents/agent_sdk/sync_agent_stream_adapter.py +backend/onyx/agents/agent_search/core_state.py +backend/onyx/agents/agent_search/dc_search_analysis/edges.py +backend/onyx/agents/agent_search/dc_search_analysis/graph_builder.py +backend/onyx/agents/agent_search/dc_search_analysis/nodes/a1_search_objects.py +backend/onyx/agents/agent_search/dc_search_analysis/nodes/a2_research_object_source.py +backend/onyx/agents/agent_search/dc_search_analysis/nodes/a3_structure_research_by_object.py +backend/onyx/agents/agent_search/dc_search_analysis/nodes/a4_consolidate_object_research.py +backend/onyx/agents/agent_search/dc_search_analysis/nodes/a5_consolidate_research.py +backend/onyx/agents/agent_search/dc_search_analysis/ops.py +backend/onyx/agents/agent_search/dc_search_analysis/states.py +backend/onyx/agents/agent_search/deep_search/main/models.py +backend/onyx/agents/agent_search/dr/conditional_edges.py +backend/onyx/agents/agent_search/dr/constants.py +backend/onyx/agents/agent_search/dr/dr_prompt_builder.py +backend/onyx/agents/agent_search/dr/enums.py +backend/onyx/agents/agent_search/dr/graph_builder.py +backend/onyx/agents/agent_search/dr/models.py +backend/onyx/agents/agent_search/dr/nodes/dr_a0_clarification.py +backend/onyx/agents/agent_search/dr/nodes/dr_a1_orchestrator.py +backend/onyx/agents/agent_search/dr/nodes/dr_a2_closer.py +backend/onyx/agents/agent_search/dr/nodes/dr_a3_logger.py +backend/onyx/agents/agent_search/dr/process_llm_stream.py +backend/onyx/agents/agent_search/dr/states.py +backend/onyx/agents/agent_search/dr/sub_agents/basic_search/dr_basic_search_1_branch.py +backend/onyx/agents/agent_search/dr/sub_agents/basic_search/dr_basic_search_2_act.py +backend/onyx/agents/agent_search/dr/sub_agents/basic_search/dr_basic_search_3_reduce.py +backend/onyx/agents/agent_search/dr/sub_agents/basic_search/dr_basic_search_graph_builder.py +backend/onyx/agents/agent_search/dr/sub_agents/basic_search/dr_image_generation_conditional_edges.py +backend/onyx/agents/agent_search/dr/sub_agents/custom_tool/dr_custom_tool_1_branch.py +backend/onyx/agents/agent_search/dr/sub_agents/custom_tool/dr_custom_tool_2_act.py +backend/onyx/agents/agent_search/dr/sub_agents/custom_tool/dr_custom_tool_3_reduce.py +backend/onyx/agents/agent_search/dr/sub_agents/custom_tool/dr_custom_tool_conditional_edges.py +backend/onyx/agents/agent_search/dr/sub_agents/custom_tool/dr_custom_tool_graph_builder.py +backend/onyx/agents/agent_search/dr/sub_agents/generic_internal_tool/dr_generic_internal_tool_1_branch.py +backend/onyx/agents/agent_search/dr/sub_agents/generic_internal_tool/dr_generic_internal_tool_2_act.py +backend/onyx/agents/agent_search/dr/sub_agents/generic_internal_tool/dr_generic_internal_tool_3_reduce.py +backend/onyx/agents/agent_search/dr/sub_agents/generic_internal_tool/dr_generic_internal_tool_conditional_edges.py +backend/onyx/agents/agent_search/dr/sub_agents/generic_internal_tool/dr_generic_internal_tool_graph_builder.py +backend/onyx/agents/agent_search/dr/sub_agents/image_generation/dr_image_generation_1_branch.py +backend/onyx/agents/agent_search/dr/sub_agents/image_generation/dr_image_generation_2_act.py +backend/onyx/agents/agent_search/dr/sub_agents/image_generation/dr_image_generation_3_reduce.py +backend/onyx/agents/agent_search/dr/sub_agents/image_generation/dr_image_generation_conditional_edges.py +backend/onyx/agents/agent_search/dr/sub_agents/image_generation/dr_image_generation_graph_builder.py +backend/onyx/agents/agent_search/dr/sub_agents/image_generation/models.py +backend/onyx/agents/agent_search/dr/sub_agents/kg_search/dr_kg_search_1_branch.py +backend/onyx/agents/agent_search/dr/sub_agents/kg_search/dr_kg_search_2_act.py +backend/onyx/agents/agent_search/dr/sub_agents/kg_search/dr_kg_search_3_reduce.py +backend/onyx/agents/agent_search/dr/sub_agents/kg_search/dr_kg_search_conditional_edges.py +backend/onyx/agents/agent_search/dr/sub_agents/kg_search/dr_kg_search_graph_builder.py +backend/onyx/agents/agent_search/dr/sub_agents/states.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/clients/exa_client.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/clients/firecrawl_client.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/clients/google_pse_client.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/clients/onyx_web_crawler_client.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/clients/serper_client.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/dr_ws_1_branch.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/dr_ws_2_search.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/dr_ws_3_dedup_urls.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/dr_ws_4_fetch.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/dr_ws_5_collect_raw_docs.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/dr_ws_6_summarize.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/dr_ws_7_reduce.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/dr_ws_conditional_edges.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/dr_ws_graph_builder.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/models.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/providers.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/states.py +backend/onyx/agents/agent_search/dr/sub_agents/web_search/utils.py +backend/onyx/agents/agent_search/dr/utils.py +backend/onyx/agents/agent_search/kb_search/conditional_edges.py +backend/onyx/agents/agent_search/kb_search/graph_builder.py +backend/onyx/agents/agent_search/kb_search/graph_utils.py +backend/onyx/agents/agent_search/kb_search/models.py +backend/onyx/agents/agent_search/kb_search/nodes/a1_extract_ert.py +backend/onyx/agents/agent_search/kb_search/nodes/a2_analyze.py +backend/onyx/agents/agent_search/kb_search/nodes/a3_generate_simple_sql.py +backend/onyx/agents/agent_search/kb_search/nodes/b1_construct_deep_search_filters.py +backend/onyx/agents/agent_search/kb_search/nodes/b2p_process_individual_deep_search.py +backend/onyx/agents/agent_search/kb_search/nodes/b2s_filtered_search.py +backend/onyx/agents/agent_search/kb_search/nodes/b3_consolidate_individual_deep_search.py +backend/onyx/agents/agent_search/kb_search/nodes/c1_process_kg_only_answers.py +backend/onyx/agents/agent_search/kb_search/nodes/d1_generate_answer.py +backend/onyx/agents/agent_search/kb_search/nodes/d2_logging_node.py +backend/onyx/agents/agent_search/kb_search/ops.py +backend/onyx/agents/agent_search/kb_search/states.py +backend/onyx/agents/agent_search/kb_search/step_definitions.py +backend/onyx/agents/agent_search/models.py +backend/onyx/agents/agent_search/orchestration/states.py +backend/onyx/agents/agent_search/run_graph.py +backend/onyx/agents/agent_search/shared_graph_utils/agent_prompt_ops.py +backend/onyx/agents/agent_search/shared_graph_utils/calculations.py +backend/onyx/agents/agent_search/shared_graph_utils/constants.py +backend/onyx/agents/agent_search/shared_graph_utils/llm.py +backend/onyx/agents/agent_search/shared_graph_utils/models.py +backend/onyx/agents/agent_search/shared_graph_utils/operators.py +backend/onyx/agents/agent_search/shared_graph_utils/utils.py +backend/onyx/agents/agent_search/utils.py +backend/onyx/auth/anonymous_user.py +backend/onyx/auth/captcha.py +backend/onyx/auth/disposable_email_validator.py +backend/onyx/auth/email_utils.py +backend/onyx/auth/noauth_user.py +backend/onyx/auth/oauth_refresher.py +backend/onyx/auth/oauth_token_manager.py +backend/onyx/auth/permissions.py +backend/onyx/auth/schemas.py +backend/onyx/auth/users.py +backend/onyx/background/README.md +backend/onyx/background/celery/apps/app_base.py +backend/onyx/background/celery/apps/background.py +backend/onyx/background/celery/apps/beat.py +backend/onyx/background/celery/apps/docfetching.py +backend/onyx/background/celery/apps/docprocessing.py +backend/onyx/background/celery/apps/heavy.py +backend/onyx/background/celery/apps/kg_processing.py +backend/onyx/background/celery/apps/light.py +backend/onyx/background/celery/apps/monitoring.py +backend/onyx/background/celery/apps/primary.py +backend/onyx/background/celery/apps/user_file_processing.py +backend/onyx/background/celery/celery_redis.py +backend/onyx/background/celery/celery_utils.py +backend/onyx/background/celery/configs/background.py +backend/onyx/background/celery/configs/kg_processing.py +backend/onyx/background/celery/tasks/beat_schedule.py +backend/onyx/background/celery/tasks/connector_deletion/__init__.py +backend/onyx/background/celery/tasks/connector_deletion/tasks.py +backend/onyx/background/celery/tasks/docfetching/__init__.py +backend/onyx/background/celery/tasks/docfetching/task_creation_utils.py +backend/onyx/background/celery/tasks/docfetching/tasks.py +backend/onyx/background/celery/tasks/docprocessing/__init__.py +backend/onyx/background/celery/tasks/docprocessing/tasks.py +backend/onyx/background/celery/tasks/docprocessing/utils.py +backend/onyx/background/celery/tasks/eea/tasks.py +backend/onyx/background/celery/tasks/evals/__init__.py +backend/onyx/background/celery/tasks/evals/tasks.py +backend/onyx/background/celery/tasks/hierarchyfetching/__init__.py +backend/onyx/background/celery/tasks/hierarchyfetching/tasks.py +backend/onyx/background/celery/tasks/kg_processing/kg_indexing.py +backend/onyx/background/celery/tasks/kg_processing/tasks.py +backend/onyx/background/celery/tasks/kg_processing/utils.py +backend/onyx/background/celery/tasks/llm_model_update/__init__.py +backend/onyx/background/celery/tasks/llm_model_update/tasks.py +backend/onyx/background/celery/tasks/monitoring/__init__.py +backend/onyx/background/celery/tasks/monitoring/tasks.py +backend/onyx/background/celery/tasks/opensearch_migration/__init__.py +backend/onyx/background/celery/tasks/opensearch_migration/constants.py +backend/onyx/background/celery/tasks/opensearch_migration/tasks.py +backend/onyx/background/celery/tasks/opensearch_migration/transformer.py +backend/onyx/background/celery/tasks/periodic/__init__.py +backend/onyx/background/celery/tasks/periodic/tasks.py +backend/onyx/background/celery/tasks/pruning/__init__.py +backend/onyx/background/celery/tasks/pruning/tasks.py +backend/onyx/background/celery/tasks/shared/RetryDocumentIndex.py +backend/onyx/background/celery/tasks/shared/__init__.py +backend/onyx/background/celery/tasks/shared/tasks.py +backend/onyx/background/celery/tasks/user_file_processing/__init__.py +backend/onyx/background/celery/tasks/user_file_processing/tasks.py +backend/onyx/background/celery/tasks/vespa/__init__.py +backend/onyx/background/celery/tasks/vespa/document_sync.py +backend/onyx/background/celery/tasks/vespa/tasks.py +backend/onyx/background/celery/versioned_apps/background.py +backend/onyx/background/celery/versioned_apps/kg_processing.py +backend/onyx/background/indexing/job_client.py +backend/onyx/background/indexing/run_docfetching.py +backend/onyx/background/periodic_poller.py +backend/onyx/background/task_utils.py +backend/onyx/cache/factory.py +backend/onyx/cache/interface.py +backend/onyx/cache/postgres_backend.py +backend/onyx/cache/redis_backend.py +backend/onyx/chat/COMPRESSION.md +backend/onyx/chat/README.md +backend/onyx/chat/answer.py +backend/onyx/chat/chat_processing_checker.py +backend/onyx/chat/chat_state.py +backend/onyx/chat/chat_utils.py +backend/onyx/chat/citation_processor.py +backend/onyx/chat/citation_utils.py +backend/onyx/chat/compression.py +backend/onyx/chat/emitter.py +backend/onyx/chat/llm_loop.py +backend/onyx/chat/llm_step.py +backend/onyx/chat/memories.py +backend/onyx/chat/models.py +backend/onyx/chat/packet_proccessing/process_streamed_packets.py +backend/onyx/chat/packet_sniffing.py +backend/onyx/chat/process_message.py +backend/onyx/chat/prompt_builder/answer_prompt_builder.py +backend/onyx/chat/prompt_builder/citations_prompt.py +backend/onyx/chat/prompt_builder/quotes_prompt.py +backend/onyx/chat/prompt_builder/schemas.py +backend/onyx/chat/prompt_builder/utils.py +backend/onyx/chat/prompt_utils.py +backend/onyx/chat/prune_and_merge.py +backend/onyx/chat/save_chat.py +backend/onyx/chat/stop_signal_checker.py +backend/onyx/chat/stream_processing/answer_response_handler.py +backend/onyx/chat/stream_processing/citation_processing.py +backend/onyx/chat/stream_processing/quotes_processing.py +backend/onyx/chat/stream_processing/utils.py +backend/onyx/chat/tool_call_args_streaming.py +backend/onyx/chat/tool_handling/tool_response_handler.py +backend/onyx/chat/turn/__init__.py +backend/onyx/chat/turn/context_handler/__init__.py +backend/onyx/chat/turn/context_handler/citation.py +backend/onyx/chat/turn/context_handler/reminder.py +backend/onyx/chat/turn/fast_chat_turn.py +backend/onyx/chat/turn/infra/__init__.py +backend/onyx/chat/turn/infra/chat_turn_event_stream.py +backend/onyx/chat/turn/infra/emitter.py +backend/onyx/chat/turn/models.py +backend/onyx/chat/turn/prompts/__init__.py +backend/onyx/chat/turn/prompts/custom_instruction.py +backend/onyx/chat/turn/save_turn.py +backend/onyx/chat/user_files/parse_user_files.py +backend/onyx/configs/app_configs.py +backend/onyx/configs/chat_configs.py +backend/onyx/configs/constants.py +backend/onyx/configs/embedding_configs.py +backend/onyx/configs/model_configs.py +backend/onyx/configs/onyxbot_configs.py +backend/onyx/connectors/README.md +backend/onyx/connectors/airtable/airtable_connector.py +backend/onyx/connectors/asana/asana_api.py +backend/onyx/connectors/asana/connector.py +backend/onyx/connectors/bitbucket/connector.py +backend/onyx/connectors/blob/connector.py +backend/onyx/connectors/bookstack/connector.py +backend/onyx/connectors/canvas/__init__.py +backend/onyx/connectors/canvas/access.py +backend/onyx/connectors/canvas/client.py +backend/onyx/connectors/canvas/connector.py +backend/onyx/connectors/clickup/connector.py +backend/onyx/connectors/coda/__init__.py +backend/onyx/connectors/coda/connector.py +backend/onyx/connectors/confluence/access.py +backend/onyx/connectors/confluence/connector.py +backend/onyx/connectors/confluence/onyx_confluence.py +backend/onyx/connectors/confluence/utils.py +backend/onyx/connectors/connector_runner.py +backend/onyx/connectors/credentials_provider.py +backend/onyx/connectors/cross_connector_utils/miscellaneous_utils.py +backend/onyx/connectors/cross_connector_utils/rate_limit_wrapper.py +backend/onyx/connectors/discord/connector.py +backend/onyx/connectors/discourse/connector.py +backend/onyx/connectors/document360/connector.py +backend/onyx/connectors/dropbox/connector.py +backend/onyx/connectors/drupal_wiki/__init__.py +backend/onyx/connectors/drupal_wiki/connector.py +backend/onyx/connectors/drupal_wiki/models.py +backend/onyx/connectors/drupal_wiki/utils.py +backend/onyx/connectors/egnyte/connector.py +backend/onyx/connectors/factory.py +backend/onyx/connectors/file/connector.py +backend/onyx/connectors/fireflies/connector.py +backend/onyx/connectors/freshdesk/connector.py +backend/onyx/connectors/gitbook/connector.py +backend/onyx/connectors/github/connector.py +backend/onyx/connectors/gitlab/connector.py +backend/onyx/connectors/gmail/connector.py +backend/onyx/connectors/gong/connector.py +backend/onyx/connectors/google_drive/connector.py +backend/onyx/connectors/google_drive/doc_conversion.py +backend/onyx/connectors/google_drive/file_retrieval.py +backend/onyx/connectors/google_drive/models.py +backend/onyx/connectors/google_site/connector.py +backend/onyx/connectors/google_utils/google_auth.py +backend/onyx/connectors/google_utils/google_kv.py +backend/onyx/connectors/google_utils/google_utils.py +backend/onyx/connectors/google_utils/resources.py +backend/onyx/connectors/google_utils/shared_constants.py +backend/onyx/connectors/guru/connector.py +backend/onyx/connectors/highspot/connector.py +backend/onyx/connectors/hubspot/connector.py +backend/onyx/connectors/imap/connector.py +backend/onyx/connectors/interfaces.py +backend/onyx/connectors/jira/access.py +backend/onyx/connectors/jira/connector.py +backend/onyx/connectors/linear/connector.py +backend/onyx/connectors/loopio/connector.py +backend/onyx/connectors/mediawiki/family.py +backend/onyx/connectors/mediawiki/wiki.py +backend/onyx/connectors/microsoft_graph_env.py +backend/onyx/connectors/mock_connector/connector.py +backend/onyx/connectors/models.py +backend/onyx/connectors/notion/connector.py +backend/onyx/connectors/outline/connector.py +backend/onyx/connectors/productboard/connector.py +backend/onyx/connectors/registry.py +backend/onyx/connectors/salesforce/connector.py +backend/onyx/connectors/salesforce/salesforce_calls.py +backend/onyx/connectors/salesforce/sqlite_functions.py +backend/onyx/connectors/salesforce/utils.py +backend/onyx/connectors/sharepoint/connector.py +backend/onyx/connectors/sharepoint/connector_utils.py +backend/onyx/connectors/slab/connector.py +backend/onyx/connectors/slack/connector.py +backend/onyx/connectors/slack/onyx_retry_handler.py +backend/onyx/connectors/slack/onyx_slack_web_client.py +backend/onyx/connectors/teams/connector.py +backend/onyx/connectors/teams/utils.py +backend/onyx/connectors/testrail/connector.py +backend/onyx/connectors/web/connector.py +backend/onyx/connectors/xenforo/connector.py +backend/onyx/connectors/zendesk/connector.py +backend/onyx/connectors/zulip/connector.py +backend/onyx/context/search/enums.py +backend/onyx/context/search/federated/models.py +backend/onyx/context/search/federated/slack_search.py +backend/onyx/context/search/federated/slack_search_utils.py +backend/onyx/context/search/models.py +backend/onyx/context/search/pipeline.py +backend/onyx/context/search/postprocessing/postprocessing.py +backend/onyx/context/search/preprocessing/access_filters.py +backend/onyx/context/search/preprocessing/preprocessing.py +backend/onyx/context/search/retrieval/search_runner.py +backend/onyx/context/search/search_settings.py +backend/onyx/context/search/utils.py +backend/onyx/db/README.md +backend/onyx/db/api_key.py +backend/onyx/db/auth.py +backend/onyx/db/chat.py +backend/onyx/db/chunk.py +backend/onyx/db/code_interpreter.py +backend/onyx/db/connector.py +backend/onyx/db/connector_credential_pair.py +backend/onyx/db/credentials.py +backend/onyx/db/dal.py +backend/onyx/db/discord_bot.py +backend/onyx/db/document.py +backend/onyx/db/document_access.py +backend/onyx/db/document_set.py +backend/onyx/db/engine/async_sql_engine.py +backend/onyx/db/engine/iam_auth.py +backend/onyx/db/engine/sql_engine.py +backend/onyx/db/engine/tenant_utils.py +backend/onyx/db/enums.py +backend/onyx/db/federated.py +backend/onyx/db/feedback.py +backend/onyx/db/file_content.py +backend/onyx/db/file_record.py +backend/onyx/db/hierarchy.py +backend/onyx/db/hook.py +backend/onyx/db/image_generation.py +backend/onyx/db/index_attempt.py +backend/onyx/db/input_prompt.py +backend/onyx/db/kg_temp_view.py +backend/onyx/db/llm.py +backend/onyx/db/mcp.py +backend/onyx/db/memory.py +backend/onyx/db/milestone.py +backend/onyx/db/models.py +backend/onyx/db/notification.py +backend/onyx/db/oauth_config.py +backend/onyx/db/opensearch_migration.py +backend/onyx/db/pat.py +backend/onyx/db/permissions.py +backend/onyx/db/persona.py +backend/onyx/db/projects.py +backend/onyx/db/pydantic_type.py +backend/onyx/db/release_notes.py +backend/onyx/db/rotate_encryption_key.py +backend/onyx/db/search_settings.py +backend/onyx/db/seeding/chat_history_seeding.py +backend/onyx/db/slack_bot.py +backend/onyx/db/slack_channel_config.py +backend/onyx/db/swap_index.py +backend/onyx/db/tag.py +backend/onyx/db/tools.py +backend/onyx/db/usage.py +backend/onyx/db/user_file.py +backend/onyx/db/user_preferences.py +backend/onyx/db/users.py +backend/onyx/db/utils.py +backend/onyx/db/voice.py +backend/onyx/db/web_search.py +backend/onyx/deep_research/__init__.py +backend/onyx/deep_research/dr_loop.py +backend/onyx/deep_research/dr_mock_tools.py +backend/onyx/deep_research/models.py +backend/onyx/deep_research/utils.py +backend/onyx/document_index/FILTER_SEMANTICS.md +backend/onyx/document_index/chunk_content_enrichment.py +backend/onyx/document_index/disabled.py +backend/onyx/document_index/document_index_utils.py +backend/onyx/document_index/factory.py +backend/onyx/document_index/interfaces.py +backend/onyx/document_index/interfaces_new.py +backend/onyx/document_index/opensearch/README.md +backend/onyx/document_index/opensearch/client.py +backend/onyx/document_index/opensearch/cluster_settings.py +backend/onyx/document_index/opensearch/constants.py +backend/onyx/document_index/opensearch/opensearch_document_index.py +backend/onyx/document_index/opensearch/schema.py +backend/onyx/document_index/opensearch/search.py +backend/onyx/document_index/opensearch/string_filtering.py +backend/onyx/document_index/vespa/app_config/schemas/danswer_chunk.sd.jinja +backend/onyx/document_index/vespa/app_config/services.xml.jinja +backend/onyx/document_index/vespa/chunk_retrieval.py +backend/onyx/document_index/vespa/deletion.py +backend/onyx/document_index/vespa/index.py +backend/onyx/document_index/vespa/indexing_utils.py +backend/onyx/document_index/vespa/shared_utils/utils.py +backend/onyx/document_index/vespa/shared_utils/vespa_request_builders.py +backend/onyx/document_index/vespa/vespa_document_index.py +backend/onyx/document_index/vespa_constants.py +backend/onyx/error_handling/__init__.py +backend/onyx/error_handling/error_codes.py +backend/onyx/error_handling/exceptions.py +backend/onyx/evals/README.md +backend/onyx/evals/eval.py +backend/onyx/evals/eval_cli.py +backend/onyx/evals/models.py +backend/onyx/evals/provider.py +backend/onyx/evals/providers/braintrust.py +backend/onyx/evals/providers/local.py +backend/onyx/feature_flags/factory.py +backend/onyx/feature_flags/feature_flags_keys.py +backend/onyx/feature_flags/interface.py +backend/onyx/federated_connectors/federated_retrieval.py +backend/onyx/federated_connectors/interfaces.py +backend/onyx/federated_connectors/oauth_utils.py +backend/onyx/federated_connectors/slack/federated_connector.py +backend/onyx/federated_connectors/slack/models.py +backend/onyx/file_processing/extract_file_text.py +backend/onyx/file_processing/file_types.py +backend/onyx/file_processing/file_validation.py +backend/onyx/file_processing/html_utils.py +backend/onyx/file_processing/image_summarization.py +backend/onyx/file_processing/password_validation.py +backend/onyx/file_processing/unstructured.py +backend/onyx/file_store/README.md +backend/onyx/file_store/document_batch_storage.py +backend/onyx/file_store/file_store.py +backend/onyx/file_store/models.py +backend/onyx/file_store/postgres_file_store.py +backend/onyx/file_store/utils.py +backend/onyx/hooks/__init__.py +backend/onyx/hooks/api_dependencies.py +backend/onyx/hooks/executor.py +backend/onyx/hooks/models.py +backend/onyx/hooks/points/__init__.py +backend/onyx/hooks/points/base.py +backend/onyx/hooks/points/document_ingestion.py +backend/onyx/hooks/points/query_processing.py +backend/onyx/hooks/registry.py +backend/onyx/image_gen/__init__.py +backend/onyx/image_gen/exceptions.py +backend/onyx/image_gen/factory.py +backend/onyx/image_gen/interfaces.py +backend/onyx/image_gen/providers/azure_img_gen.py +backend/onyx/image_gen/providers/openai_img_gen.py +backend/onyx/image_gen/providers/vertex_img_gen.py +backend/onyx/indexing/adapters/document_indexing_adapter.py +backend/onyx/indexing/adapters/user_file_indexing_adapter.py +backend/onyx/indexing/chunk_batch_store.py +backend/onyx/indexing/chunker.py +backend/onyx/indexing/embedder.py +backend/onyx/indexing/indexing_pipeline.py +backend/onyx/indexing/models.py +backend/onyx/indexing/vector_db_insertion.py +backend/onyx/key_value_store/interface.py +backend/onyx/key_value_store/store.py +backend/onyx/kg/clustering/clustering.py +backend/onyx/kg/clustering/normalizations.py +backend/onyx/kg/extractions/extraction_processing.py +backend/onyx/kg/resets/reset_vespa.py +backend/onyx/kg/setup/kg_default_entity_definitions.py +backend/onyx/kg/utils/extraction_utils.py +backend/onyx/kg/utils/formatting_utils.py +backend/onyx/kg/utils/lock_utils.py +backend/onyx/llm/chat_llm.py +backend/onyx/llm/constants.py +backend/onyx/llm/cost.py +backend/onyx/llm/exceptions.py +backend/onyx/llm/factory.py +backend/onyx/llm/interfaces.py +backend/onyx/llm/litellm_singleton/__init__.py +backend/onyx/llm/litellm_singleton/config.py +backend/onyx/llm/litellm_singleton/monkey_patches.py +backend/onyx/llm/llm_provider_options.py +backend/onyx/llm/message_types.py +backend/onyx/llm/model_metadata_enrichments.json +backend/onyx/llm/model_name_parser.py +backend/onyx/llm/model_response.py +backend/onyx/llm/models.py +backend/onyx/llm/multi_llm.py +backend/onyx/llm/override_models.py +backend/onyx/llm/prompt_cache/README.md +backend/onyx/llm/prompt_cache/__init__.py +backend/onyx/llm/prompt_cache/cache_manager.py +backend/onyx/llm/prompt_cache/models.py +backend/onyx/llm/prompt_cache/processor.py +backend/onyx/llm/prompt_cache/providers/__init__.py +backend/onyx/llm/prompt_cache/providers/anthropic.py +backend/onyx/llm/prompt_cache/providers/base.py +backend/onyx/llm/prompt_cache/providers/factory.py +backend/onyx/llm/prompt_cache/providers/noop.py +backend/onyx/llm/prompt_cache/providers/openai.py +backend/onyx/llm/prompt_cache/providers/vertex.py +backend/onyx/llm/prompt_cache/utils.py +backend/onyx/llm/request_context.py +backend/onyx/llm/utils.py +backend/onyx/llm/well_known_providers/auto_update_models.py +backend/onyx/llm/well_known_providers/auto_update_service.py +backend/onyx/llm/well_known_providers/constants.py +backend/onyx/llm/well_known_providers/llm_provider_options.py +backend/onyx/llm/well_known_providers/models.py +backend/onyx/llm/well_known_providers/recommended-models.json +backend/onyx/main.py +backend/onyx/mcp_server/README.md +backend/onyx/mcp_server/auth.py +backend/onyx/mcp_server/tools/search.py +backend/onyx/mcp_server/utils.py +backend/onyx/mcp_server_main.py +backend/onyx/natural_language_processing/english_stopwords.py +backend/onyx/natural_language_processing/search_nlp_models.py +backend/onyx/natural_language_processing/utils.py +backend/onyx/onyxbot/discord/DISCORD_MULTITENANT_README.md +backend/onyx/onyxbot/discord/api_client.py +backend/onyx/onyxbot/discord/cache.py +backend/onyx/onyxbot/discord/client.py +backend/onyx/onyxbot/discord/constants.py +backend/onyx/onyxbot/discord/exceptions.py +backend/onyx/onyxbot/discord/handle_commands.py +backend/onyx/onyxbot/discord/handle_message.py +backend/onyx/onyxbot/discord/utils.py +backend/onyx/onyxbot/slack/blocks.py +backend/onyx/onyxbot/slack/constants.py +backend/onyx/onyxbot/slack/formatting.py +backend/onyx/onyxbot/slack/handlers/handle_buttons.py +backend/onyx/onyxbot/slack/handlers/handle_message.py +backend/onyx/onyxbot/slack/handlers/handle_regular_answer.py +backend/onyx/onyxbot/slack/handlers/handle_standard_answers.py +backend/onyx/onyxbot/slack/handlers/utils.py +backend/onyx/onyxbot/slack/listener.py +backend/onyx/onyxbot/slack/models.py +backend/onyx/onyxbot/slack/utils.py +backend/onyx/prompts/agent_search.py +backend/onyx/prompts/agentic_evaluation.py +backend/onyx/prompts/agents/dc_prompts.py +backend/onyx/prompts/answer_validation.py +backend/onyx/prompts/basic_memory.py +backend/onyx/prompts/chat_prompts.py +backend/onyx/prompts/chat_tools.py +backend/onyx/prompts/compression_prompts.py +backend/onyx/prompts/constants.py +backend/onyx/prompts/contextual_retrieval.py +backend/onyx/prompts/deep_research/__init__.py +backend/onyx/prompts/deep_research/dr_tool_prompts.py +backend/onyx/prompts/deep_research/orchestration_layer.py +backend/onyx/prompts/deep_research/research_agent.py +backend/onyx/prompts/direct_qa_prompts.py +backend/onyx/prompts/dr_prompts.py +backend/onyx/prompts/federated_search.py +backend/onyx/prompts/filter_extration.py +backend/onyx/prompts/llm_chunk_filter.py +backend/onyx/prompts/miscellaneous_prompts.py +backend/onyx/prompts/prompt_utils.py +backend/onyx/prompts/query_validation.py +backend/onyx/prompts/search_prompts.py +backend/onyx/prompts/starter_messages.py +backend/onyx/prompts/token_counts.py +backend/onyx/prompts/tool_prompts.py +backend/onyx/prompts/user_info.py +backend/onyx/redis/redis_connector_delete.py +backend/onyx/redis/redis_connector_doc_perm_sync.py +backend/onyx/redis/redis_connector_ext_group_sync.py +backend/onyx/redis/redis_connector_prune.py +backend/onyx/redis/redis_connector_stop.py +backend/onyx/redis/redis_document_set.py +backend/onyx/redis/redis_hierarchy.py +backend/onyx/redis/redis_pool.py +backend/onyx/redis/redis_usergroup.py +backend/onyx/secondary_llm_flows/agentic_evaluation.py +backend/onyx/secondary_llm_flows/answer_validation.py +backend/onyx/secondary_llm_flows/chat_session_naming.py +backend/onyx/secondary_llm_flows/choose_search.py +backend/onyx/secondary_llm_flows/chunk_usefulness.py +backend/onyx/secondary_llm_flows/document_filter.py +backend/onyx/secondary_llm_flows/memory_update.py +backend/onyx/secondary_llm_flows/query_expansion.py +backend/onyx/secondary_llm_flows/source_filter.py +backend/onyx/secondary_llm_flows/starter_message_creation.py +backend/onyx/secondary_llm_flows/time_filter.py +backend/onyx/seeding/input_prompts.yaml +backend/onyx/seeding/load_yamls.py +backend/onyx/seeding/prebuilt_personas.py +backend/onyx/server/api_key/api.py +backend/onyx/server/api_key_usage.py +backend/onyx/server/auth_check.py +backend/onyx/server/documents/cc_pair.py +backend/onyx/server/documents/connector.py +backend/onyx/server/documents/credential.py +backend/onyx/server/documents/document.py +backend/onyx/server/documents/models.py +backend/onyx/server/documents/standard_oauth.py +backend/onyx/server/eea_config/eea_config_backend.py +backend/onyx/server/eea_config/models.py +backend/onyx/server/features/build/.gitignore +backend/onyx/server/features/build/AGENTS.template.md +backend/onyx/server/features/build/__init__.py +backend/onyx/server/features/build/api/api.py +backend/onyx/server/features/build/api/messages_api.py +backend/onyx/server/features/build/api/models.py +backend/onyx/server/features/build/api/packet_logger.py +backend/onyx/server/features/build/api/packets.py +backend/onyx/server/features/build/api/rate_limit.py +backend/onyx/server/features/build/api/sessions_api.py +backend/onyx/server/features/build/api/subscription_check.py +backend/onyx/server/features/build/api/templates/webapp_hmr_fixer.js +backend/onyx/server/features/build/api/templates/webapp_offline.html +backend/onyx/server/features/build/api/user_library.py +backend/onyx/server/features/build/configs.py +backend/onyx/server/features/build/db/__init__.py +backend/onyx/server/features/build/db/build_session.py +backend/onyx/server/features/build/db/rate_limit.py +backend/onyx/server/features/build/db/sandbox.py +backend/onyx/server/features/build/db/user_library.py +backend/onyx/server/features/build/indexing/persistent_document_writer.py +backend/onyx/server/features/build/s3/s3_client.py +backend/onyx/server/features/build/sandbox/README.md +backend/onyx/server/features/build/sandbox/__init__.py +backend/onyx/server/features/build/sandbox/base.py +backend/onyx/server/features/build/sandbox/kubernetes/__init__.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/Dockerfile +backend/onyx/server/features/build/sandbox/kubernetes/docker/README.md +backend/onyx/server/features/build/sandbox/kubernetes/docker/demo_data.zip +backend/onyx/server/features/build/sandbox/kubernetes/docker/generate_agents_md.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/initial-requirements.txt +backend/onyx/server/features/build/sandbox/kubernetes/docker/run-test.sh +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/image-generation/SKILL.md +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/image-generation/scripts/generate.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/SKILL.md +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/editing.md +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/pptxgenjs.md +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/__init__.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/add_slide.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/clean.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/helpers/__init__.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/helpers/merge_runs.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/helpers/simplify_redlines.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/pack.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/mce/mc.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/soffice.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/unpack.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/validate.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/validators/__init__.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/validators/base.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/validators/docx.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/validators/pptx.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/office/validators/redlining.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/preview.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/skills/pptx/scripts/thumbnail.py +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/.gitignore +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/AGENTS.md +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/app/android-chrome-192x192.png +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/app/android-chrome-512x512.png +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/app/apple-touch-icon.png +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/app/favicon-16x16.png +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/app/favicon-32x32.png +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/app/favicon.ico +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/app/favicon.zip +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/app/globals.css +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/app/layout.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/app/page.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/app/site.webmanifest +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components.json +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/component-example.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/example.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/accordion.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/alert-dialog.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/alert.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/aspect-ratio.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/avatar.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/badge.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/breadcrumb.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/button-group.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/button.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/calendar.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/card.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/carousel.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/chart.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/checkbox.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/collapsible.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/combobox.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/command.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/context-menu.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/dialog.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/drawer.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/dropdown-menu.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/empty.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/field.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/hover-card.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/input-group.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/input.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/item.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/kbd.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/label.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/menubar.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/native-select.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/navigation-menu.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/pagination.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/popover.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/progress.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/radio-group.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/resizable.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/scroll-area.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/select.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/separator.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/sheet.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/sidebar.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/skeleton.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/slider.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/sonner.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/spinner.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/switch.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/table.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/tabs.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/textarea.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/toggle-group.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/toggle.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/components/ui/tooltip.tsx +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/eslint.config.mjs +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/hooks/use-mobile.ts +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/lib/utils.ts +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/next.config.ts +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/package-lock.json +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/package.json +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/postcss.config.mjs +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/public/file.svg +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/public/globe.svg +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/public/next.svg +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/public/vercel.svg +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/public/window.svg +backend/onyx/server/features/build/sandbox/kubernetes/docker/templates/outputs/web/tsconfig.json +backend/onyx/server/features/build/sandbox/kubernetes/docker/test-job.yaml +backend/onyx/server/features/build/sandbox/kubernetes/internal/__init__.py +backend/onyx/server/features/build/sandbox/kubernetes/internal/acp_exec_client.py +backend/onyx/server/features/build/sandbox/kubernetes/kubernetes_sandbox_manager.py +backend/onyx/server/features/build/sandbox/local/__init__.py +backend/onyx/server/features/build/sandbox/local/agent_client.py +backend/onyx/server/features/build/sandbox/local/local_sandbox_manager.py +backend/onyx/server/features/build/sandbox/local/process_manager.py +backend/onyx/server/features/build/sandbox/local/test_agent_client.py +backend/onyx/server/features/build/sandbox/local/test_manager.py +backend/onyx/server/features/build/sandbox/manager/__init__.py +backend/onyx/server/features/build/sandbox/manager/directory_manager.py +backend/onyx/server/features/build/sandbox/manager/snapshot_manager.py +backend/onyx/server/features/build/sandbox/manager/test_directory_manager.py +backend/onyx/server/features/build/sandbox/models.py +backend/onyx/server/features/build/sandbox/tasks/__init__.py +backend/onyx/server/features/build/sandbox/tasks/tasks.py +backend/onyx/server/features/build/sandbox/util/__init__.py +backend/onyx/server/features/build/sandbox/util/agent_instructions.py +backend/onyx/server/features/build/sandbox/util/build_venv_template.py +backend/onyx/server/features/build/sandbox/util/opencode_config.py +backend/onyx/server/features/build/sandbox/util/persona_mapping.py +backend/onyx/server/features/build/session/__init__.py +backend/onyx/server/features/build/session/manager.py +backend/onyx/server/features/build/session/prompts.py +backend/onyx/server/features/build/utils.py +backend/onyx/server/features/default_assistant/api.py +backend/onyx/server/features/default_assistant/models.py +backend/onyx/server/features/document_set/api.py +backend/onyx/server/features/document_set/models.py +backend/onyx/server/features/hierarchy/api.py +backend/onyx/server/features/hierarchy/constants.py +backend/onyx/server/features/hierarchy/models.py +backend/onyx/server/features/hooks/__init__.py +backend/onyx/server/features/input_prompt/api.py +backend/onyx/server/features/mcp/api.py +backend/onyx/server/features/mcp/models.py +backend/onyx/server/features/notifications/api.py +backend/onyx/server/features/oauth_config/api.py +backend/onyx/server/features/password/api.py +backend/onyx/server/features/persona/api.py +backend/onyx/server/features/persona/constants.py +backend/onyx/server/features/persona/models.py +backend/onyx/server/features/projects/api.py +backend/onyx/server/features/projects/models.py +backend/onyx/server/features/projects/projects_file_utils.py +backend/onyx/server/features/release_notes/__init__.py +backend/onyx/server/features/release_notes/constants.py +backend/onyx/server/features/release_notes/models.py +backend/onyx/server/features/release_notes/utils.py +backend/onyx/server/features/tool/api.py +backend/onyx/server/features/tool/models.py +backend/onyx/server/features/tool/tool_visibility.py +backend/onyx/server/features/user_oauth_token/api.py +backend/onyx/server/features/web_search/api.py +backend/onyx/server/features/web_search/models.py +backend/onyx/server/federated/api.py +backend/onyx/server/gpts/api.py +backend/onyx/server/kg/api.py +backend/onyx/server/long_term_logs/long_term_logs_api.py +backend/onyx/server/manage/administrative.py +backend/onyx/server/manage/code_interpreter/__init__.py +backend/onyx/server/manage/code_interpreter/api.py +backend/onyx/server/manage/code_interpreter/models.py +backend/onyx/server/manage/connectors_state.py +backend/onyx/server/manage/discord_bot/api.py +backend/onyx/server/manage/discord_bot/models.py +backend/onyx/server/manage/discord_bot/utils.py +backend/onyx/server/manage/embedding/api.py +backend/onyx/server/manage/embedding/models.py +backend/onyx/server/manage/get_state.py +backend/onyx/server/manage/image_generation/api.py +backend/onyx/server/manage/image_generation/models.py +backend/onyx/server/manage/llm/api.py +backend/onyx/server/manage/llm/models.py +backend/onyx/server/manage/llm/utils.py +backend/onyx/server/manage/models.py +backend/onyx/server/manage/opensearch_migration/api.py +backend/onyx/server/manage/opensearch_migration/models.py +backend/onyx/server/manage/search_settings.py +backend/onyx/server/manage/slack_bot.py +backend/onyx/server/manage/users.py +backend/onyx/server/manage/voice/__init__.py +backend/onyx/server/manage/voice/api.py +backend/onyx/server/manage/voice/models.py +backend/onyx/server/manage/voice/user_api.py +backend/onyx/server/manage/voice/websocket_api.py +backend/onyx/server/manage/web_search/api.py +backend/onyx/server/manage/web_search/models.py +backend/onyx/server/metrics/__init__.py +backend/onyx/server/metrics/celery_task_metrics.py +backend/onyx/server/metrics/indexing_pipeline.py +backend/onyx/server/metrics/indexing_pipeline_setup.py +backend/onyx/server/metrics/indexing_task_metrics.py +backend/onyx/server/metrics/metrics_server.py +backend/onyx/server/metrics/opensearch_search.py +backend/onyx/server/metrics/per_tenant.py +backend/onyx/server/metrics/postgres_connection_pool.py +backend/onyx/server/metrics/prometheus_setup.py +backend/onyx/server/metrics/pruning_metrics.py +backend/onyx/server/metrics/slow_requests.py +backend/onyx/server/models.py +backend/onyx/server/onyx_api/ingestion.py +backend/onyx/server/openai_assistants_api/asssistants_api.py +backend/onyx/server/openai_assistants_api/full_openai_assistants_api.py +backend/onyx/server/openai_assistants_api/messages_api.py +backend/onyx/server/openai_assistants_api/runs_api.py +backend/onyx/server/openai_assistants_api/threads_api.py +backend/onyx/server/pat/api.py +backend/onyx/server/query_and_chat/chat_backend.py +backend/onyx/server/query_and_chat/chat_backend_v0.py +backend/onyx/server/query_and_chat/chat_utils.py +backend/onyx/server/query_and_chat/models.py +backend/onyx/server/query_and_chat/placement.py +backend/onyx/server/query_and_chat/query_backend.py +backend/onyx/server/query_and_chat/session_loading.py +backend/onyx/server/query_and_chat/streaming_models.py +backend/onyx/server/query_and_chat/streaming_utils.py +backend/onyx/server/query_and_chat/token_limit.py +backend/onyx/server/saml.py +backend/onyx/server/settings/api.py +backend/onyx/server/settings/models.py +backend/onyx/server/settings/store.py +backend/onyx/server/tenant_usage_limits.py +backend/onyx/server/token_rate_limits/api.py +backend/onyx/server/usage_limits.py +backend/onyx/server/utils.py +backend/onyx/server/utils_vector_db.py +backend/onyx/setup.py +backend/onyx/tools/adapter_v1_to_v2.py +backend/onyx/tools/base_tool.py +backend/onyx/tools/built_in_tools.py +backend/onyx/tools/built_in_tools_v2.py +backend/onyx/tools/constants.py +backend/onyx/tools/fake_tools/__init__.py +backend/onyx/tools/fake_tools/research_agent.py +backend/onyx/tools/force.py +backend/onyx/tools/interface.py +backend/onyx/tools/message.py +backend/onyx/tools/models.py +backend/onyx/tools/tool.py +backend/onyx/tools/tool_constructor.py +backend/onyx/tools/tool_implementations/custom/custom_tool.py +backend/onyx/tools/tool_implementations/custom/custom_tool_prompts.py +backend/onyx/tools/tool_implementations/custom/openapi_parsing.py +backend/onyx/tools/tool_implementations/custom/prompt.py +backend/onyx/tools/tool_implementations/file_reader/file_reader_tool.py +backend/onyx/tools/tool_implementations/images/image_generation_tool.py +backend/onyx/tools/tool_implementations/images/models.py +backend/onyx/tools/tool_implementations/images/prompt.py +backend/onyx/tools/tool_implementations/knowledge_graph/knowledge_graph_tool.py +backend/onyx/tools/tool_implementations/mcp/mcp_tool.py +backend/onyx/tools/tool_implementations/memory/__init__.py +backend/onyx/tools/tool_implementations/memory/memory_tool.py +backend/onyx/tools/tool_implementations/memory/models.py +backend/onyx/tools/tool_implementations/open_url/__init__.py +backend/onyx/tools/tool_implementations/open_url/firecrawl.py +backend/onyx/tools/tool_implementations/open_url/models.py +backend/onyx/tools/tool_implementations/open_url/onyx_web_crawler.py +backend/onyx/tools/tool_implementations/open_url/open_url_tool.py +backend/onyx/tools/tool_implementations/open_url/snippet_matcher.py +backend/onyx/tools/tool_implementations/open_url/url_normalization.py +backend/onyx/tools/tool_implementations/open_url/utils.py +backend/onyx/tools/tool_implementations/python/code_interpreter_client.py +backend/onyx/tools/tool_implementations/python/python_tool.py +backend/onyx/tools/tool_implementations/search/constants.py +backend/onyx/tools/tool_implementations/search/search_tool.py +backend/onyx/tools/tool_implementations/search/search_utils.py +backend/onyx/tools/tool_implementations/search_like_tool_utils.py +backend/onyx/tools/tool_implementations/utils.py +backend/onyx/tools/tool_implementations/web_search/clients/brave_client.py +backend/onyx/tools/tool_implementations/web_search/clients/exa_client.py +backend/onyx/tools/tool_implementations/web_search/clients/google_pse_client.py +backend/onyx/tools/tool_implementations/web_search/clients/searxng_client.py +backend/onyx/tools/tool_implementations/web_search/clients/serper_client.py +backend/onyx/tools/tool_implementations/web_search/models.py +backend/onyx/tools/tool_implementations/web_search/providers.py +backend/onyx/tools/tool_implementations/web_search/utils.py +backend/onyx/tools/tool_implementations/web_search/web_search_tool.py +backend/onyx/tools/tool_implementations_v2/code_interpreter_client.py +backend/onyx/tools/tool_implementations_v2/image_generation.py +backend/onyx/tools/tool_implementations_v2/internal_search.py +backend/onyx/tools/tool_implementations_v2/python.py +backend/onyx/tools/tool_implementations_v2/tool_accounting.py +backend/onyx/tools/tool_implementations_v2/tool_result_models.py +backend/onyx/tools/tool_implementations_v2/web.py +backend/onyx/tools/tool_runner.py +backend/onyx/tools/tool_selection.py +backend/onyx/tools/utils.py +backend/onyx/tracing/braintrust_tracing.py +backend/onyx/tracing/braintrust_tracing_processor.py +backend/onyx/tracing/framework/create.py +backend/onyx/tracing/framework/provider.py +backend/onyx/tracing/framework/span_data.py +backend/onyx/tracing/framework/traces.py +backend/onyx/tracing/langfuse_tracing.py +backend/onyx/tracing/langfuse_tracing_processor.py +backend/onyx/tracing/llm_utils.py +backend/onyx/tracing/masking.py +backend/onyx/tracing/openinference_tracing_processor.py +backend/onyx/tracing/setup.py +backend/onyx/utils/b64.py +backend/onyx/utils/batching.py +backend/onyx/utils/eea_utils.py +backend/onyx/utils/encryption.py +backend/onyx/utils/file_types.py +backend/onyx/utils/gpu_utils.py +backend/onyx/utils/jsonriver/__init__.py +backend/onyx/utils/jsonriver/parse.py +backend/onyx/utils/jsonriver/tokenize.py +backend/onyx/utils/logger.py +backend/onyx/utils/long_term_log.py +backend/onyx/utils/middleware.py +backend/onyx/utils/playwright.py +backend/onyx/utils/postgres_sanitization.py +backend/onyx/utils/pydantic_util.py +backend/onyx/utils/sensitive.py +backend/onyx/utils/sitemap.py +backend/onyx/utils/telemetry.py +backend/onyx/utils/tenant.py +backend/onyx/utils/text_processing.py +backend/onyx/utils/threadpool_concurrency.py +backend/onyx/utils/timing.py +backend/onyx/utils/url.py +backend/onyx/utils/variable_functionality.py +backend/onyx/utils/web_content.py +backend/onyx/voice/__init__.py +backend/onyx/voice/factory.py +backend/onyx/voice/interface.py +backend/onyx/voice/providers/__init__.py +backend/onyx/voice/providers/azure.py +backend/onyx/voice/providers/elevenlabs.py +backend/onyx/voice/providers/openai.py +backend/pyproject.toml +backend/pytest.ini +backend/requirements/README.md +backend/requirements/default.txt +backend/requirements/dev.txt +backend/requirements/ee.txt +backend/requirements/model_server.txt +backend/scripts/api_inference_sample.py +backend/scripts/celery_purge_queue.py +backend/scripts/chat_loadtest.py +backend/scripts/check_lazy_imports.py +backend/scripts/compile_requirements.py +backend/scripts/debugging/debug_usage_limits.py +backend/scripts/debugging/litellm/README +backend/scripts/debugging/litellm/call_litellm.py +backend/scripts/debugging/litellm/directly_hit_azure_api.py +backend/scripts/debugging/litellm/payload.json +backend/scripts/debugging/onyx_redis.py +backend/scripts/debugging/onyx_vespa.py +backend/scripts/debugging/opensearch/benchmark_retrieval.py +backend/scripts/debugging/opensearch/constants.py +backend/scripts/debugging/opensearch/embed_and_save.py +backend/scripts/debugging/opensearch/embedding_io.py +backend/scripts/debugging/opensearch/opensearch_debug.py +backend/scripts/debugging/opensearch/query_hierarchy_debug.py +backend/scripts/decrypt.py +backend/scripts/dev_run_background_jobs.py +backend/scripts/force_delete_connector_by_id.py +backend/scripts/onyx_openapi_schema.py +backend/scripts/orphan_doc_cleanup_script.py +backend/scripts/query_time_check/seed_dummy_docs.py +backend/scripts/query_time_check/test_query_times.py +backend/scripts/reencrypt_secrets.py +backend/scripts/restart_containers.sh +backend/scripts/run_industryrag_bench_questions.py +backend/scripts/setup_craft_templates.sh +backend/scripts/sources_selection_analysis.py +backend/scripts/supervisord_entrypoint.sh +backend/scripts/tenant_cleanup/QUICK_START_NO_BASTION.md +backend/scripts/tenant_cleanup/check_no_bastion_setup.py +backend/scripts/tenant_cleanup/cleanup_tenants.py +backend/scripts/tenant_cleanup/cleanup_utils.py +backend/scripts/tenant_cleanup/mark_connectors_for_deletion.py +backend/scripts/tenant_cleanup/no_bastion_analyze_tenants.py +backend/scripts/tenant_cleanup/no_bastion_cleanup_tenants.py +backend/scripts/tenant_cleanup/no_bastion_cleanup_utils.py +backend/scripts/tenant_cleanup/no_bastion_mark_connectors.py +backend/scripts/tenant_cleanup/on_pod_scripts/get_tenant_connectors.py +backend/scripts/tenant_cleanup/on_pod_scripts/get_tenant_index_name.py +backend/scripts/tenant_cleanup/on_pod_scripts/get_tenant_users.py +backend/scripts/transform_openapi_for_docs.py +backend/scripts/upload_files_as_connectors.py +backend/shared_configs/configs.py +backend/shared_configs/contextvars.py +backend/shared_configs/enums.py +backend/shared_configs/model_server_models.py +backend/supervisord.conf +backend/tests/README.md +backend/tests/conftest.py +backend/tests/daily/conftest.py +backend/tests/daily/connectors/airtable/test_airtable_basic.py +backend/tests/daily/connectors/bitbucket/test_bitbucket_checkpointed.py +backend/tests/daily/connectors/bitbucket/test_bitbucket_slim_connector.py +backend/tests/daily/connectors/blob/test_blob_connector.py +backend/tests/daily/connectors/coda/README.md +backend/tests/daily/connectors/coda/test_coda_connector.py +backend/tests/daily/connectors/confluence/test_confluence_basic.py +backend/tests/daily/connectors/confluence/test_confluence_permissions_basic.py +backend/tests/daily/connectors/conftest.py +backend/tests/daily/connectors/discord/test_discord_connector.py +backend/tests/daily/connectors/discord/test_discord_data.json +backend/tests/daily/connectors/file/test_file_connector.py +backend/tests/daily/connectors/fireflies/test_fireflies_connector.py +backend/tests/daily/connectors/gitbook/test_gitbook_connector.py +backend/tests/daily/connectors/github/test_github_basic.py +backend/tests/daily/connectors/gitlab/test_gitlab_basic.py +backend/tests/daily/connectors/gmail/test_gmail_connector.py +backend/tests/daily/connectors/gong/test_gong.py +backend/tests/daily/connectors/google_drive/consts_and_utils.py +backend/tests/daily/connectors/google_drive/test_admin_oauth.py +backend/tests/daily/connectors/google_drive/test_drive_perm_sync.py +backend/tests/daily/connectors/google_drive/test_link_visibility_filter.py +backend/tests/daily/connectors/google_drive/test_map_test_ids.py +backend/tests/daily/connectors/google_drive/test_sections.py +backend/tests/daily/connectors/google_drive/test_service_acct.py +backend/tests/daily/connectors/google_drive/test_user_1_oauth.py +backend/tests/daily/connectors/highspot/test_highspot_connector.py +backend/tests/daily/connectors/hubspot/test_hubspot_connector.py +backend/tests/daily/connectors/imap/models.py +backend/tests/daily/connectors/imap/test_imap_connector.py +backend/tests/daily/connectors/jira/test_jira_basic.py +backend/tests/daily/connectors/notion/test_notion_connector.py +backend/tests/daily/connectors/outline/test_outline_connector.py +backend/tests/daily/connectors/salesforce/test_salesforce_connector.py +backend/tests/daily/connectors/sharepoint/test_sharepoint_connector.py +backend/tests/daily/connectors/slab/test_slab_connector.py +backend/tests/daily/connectors/slack/test_slack_connector.py +backend/tests/daily/connectors/slack/test_slack_perm_sync.py +backend/tests/daily/connectors/teams/test_teams_connector.py +backend/tests/daily/connectors/utils.py +backend/tests/daily/connectors/web/test_web_connector.py +backend/tests/daily/connectors/zendesk/test_zendesk_connector.py +backend/tests/daily/embedding/test_embeddings.py +backend/tests/daily/llm/test_bedrock.py +backend/tests/external_dependency_unit/answer/conftest.py +backend/tests/external_dependency_unit/answer/stream_test_assertions.py +backend/tests/external_dependency_unit/answer/stream_test_builder.py +backend/tests/external_dependency_unit/answer/stream_test_utils.py +backend/tests/external_dependency_unit/answer/test_answer_without_openai.py +backend/tests/external_dependency_unit/answer/test_current_datetime_replacement.py +backend/tests/external_dependency_unit/answer/test_stream_chat_message.py +backend/tests/external_dependency_unit/answer/test_stream_chat_message_objects.py +backend/tests/external_dependency_unit/background/test_periodic_task_claim.py +backend/tests/external_dependency_unit/background/test_startup_recovery.py +backend/tests/external_dependency_unit/cache/conftest.py +backend/tests/external_dependency_unit/cache/test_cache_backend_parity.py +backend/tests/external_dependency_unit/cache/test_kv_store_cache_layer.py +backend/tests/external_dependency_unit/cache/test_postgres_cache_backend.py +backend/tests/external_dependency_unit/celery/test_docfetching_priority.py +backend/tests/external_dependency_unit/celery/test_docprocessing_priority.py +backend/tests/external_dependency_unit/celery/test_persona_file_sync.py +backend/tests/external_dependency_unit/celery/test_pruning_hierarchy_nodes.py +backend/tests/external_dependency_unit/celery/test_user_file_delete_queue.py +backend/tests/external_dependency_unit/celery/test_user_file_indexing_adapter.py +backend/tests/external_dependency_unit/celery/test_user_file_processing_queue.py +backend/tests/external_dependency_unit/chat/__init__.py +backend/tests/external_dependency_unit/chat/test_save_turn.py +backend/tests/external_dependency_unit/chat/test_simple_agent_packets.py +backend/tests/external_dependency_unit/chat/test_user_reminder_message_type.py +backend/tests/external_dependency_unit/conftest.py +backend/tests/external_dependency_unit/connectors/confluence/test_confluence_group_sync.py +backend/tests/external_dependency_unit/connectors/google_drive/test_google_drive_group_sync.py +backend/tests/external_dependency_unit/connectors/jira/conftest.py +backend/tests/external_dependency_unit/connectors/jira/test_jira_doc_sync.py +backend/tests/external_dependency_unit/connectors/jira/test_jira_group_sync.py +backend/tests/external_dependency_unit/craft/conftest.py +backend/tests/external_dependency_unit/craft/test_build_packet_storage.py +backend/tests/external_dependency_unit/craft/test_file_upload.py +backend/tests/external_dependency_unit/craft/test_kubernetes_sandbox.py +backend/tests/external_dependency_unit/craft/test_persistent_document_writer.py +backend/tests/external_dependency_unit/db/__init__.py +backend/tests/external_dependency_unit/db/conftest.py +backend/tests/external_dependency_unit/db/test_chat_session_eager_load.py +backend/tests/external_dependency_unit/db/test_credential_sensitive_value.py +backend/tests/external_dependency_unit/db/test_rotate_encryption_key.py +backend/tests/external_dependency_unit/db/test_tag_race_condition.py +backend/tests/external_dependency_unit/db/test_user_account_type.py +backend/tests/external_dependency_unit/discord_bot/conftest.py +backend/tests/external_dependency_unit/discord_bot/test_discord_events.py +backend/tests/external_dependency_unit/document_index/conftest.py +backend/tests/external_dependency_unit/document_index/test_document_index.py +backend/tests/external_dependency_unit/document_index/test_document_index_old.py +backend/tests/external_dependency_unit/file_store/test_file_store_non_mocked.py +backend/tests/external_dependency_unit/file_store/test_postgres_file_store_non_mocked.py +backend/tests/external_dependency_unit/full_setup.py +backend/tests/external_dependency_unit/hierarchy/__init__.py +backend/tests/external_dependency_unit/hierarchy/test_hierarchy_access_filter.py +backend/tests/external_dependency_unit/llm/test_llm_provider.py +backend/tests/external_dependency_unit/llm/test_llm_provider_api_base.py +backend/tests/external_dependency_unit/llm/test_llm_provider_auto_mode.py +backend/tests/external_dependency_unit/llm/test_llm_provider_called.py +backend/tests/external_dependency_unit/llm/test_llm_provider_default_model_protection.py +backend/tests/external_dependency_unit/llm/test_prompt_caching.py +backend/tests/external_dependency_unit/mock_content_provider.py +backend/tests/external_dependency_unit/mock_image_provider.py +backend/tests/external_dependency_unit/mock_llm.py +backend/tests/external_dependency_unit/mock_search_pipeline.py +backend/tests/external_dependency_unit/mock_search_provider.py +backend/tests/external_dependency_unit/opensearch/test_assistant_knowledge_filter.py +backend/tests/external_dependency_unit/opensearch/test_opensearch_client.py +backend/tests/external_dependency_unit/opensearch_migration/test_opensearch_migration_tasks.py +backend/tests/external_dependency_unit/permission_sync/test_doc_permission_sync_attempt.py +backend/tests/external_dependency_unit/permission_sync/test_external_group_permission_sync_attempt.py +backend/tests/external_dependency_unit/search_settings/test_search_settings.py +backend/tests/external_dependency_unit/slack_bot/__init__.py +backend/tests/external_dependency_unit/slack_bot/test_slack_bot_crud.py +backend/tests/external_dependency_unit/slack_bot/test_slack_bot_federated_search.py +backend/tests/external_dependency_unit/tools/test_image_generation_tool.py +backend/tests/external_dependency_unit/tools/test_mcp_passthrough_oauth.py +backend/tests/external_dependency_unit/tools/test_memory_tool_integration.py +backend/tests/external_dependency_unit/tools/test_oauth_config_crud.py +backend/tests/external_dependency_unit/tools/test_oauth_token_manager.py +backend/tests/external_dependency_unit/tools/test_oauth_tool_integration.py +backend/tests/external_dependency_unit/tools/test_python_tool.py +backend/tests/external_dependency_unit/tools/test_python_tool_server_enabled.py +backend/tests/external_dependency_unit/tracing/__init__.py +backend/tests/external_dependency_unit/tracing/test_llm_span_recording.py +backend/tests/integration/Dockerfile +backend/tests/integration/README.md +backend/tests/integration/common_utils/chat.py +backend/tests/integration/common_utils/config.py +backend/tests/integration/common_utils/document_acl.py +backend/tests/integration/common_utils/managers/api_key.py +backend/tests/integration/common_utils/managers/cc_pair.py +backend/tests/integration/common_utils/managers/chat.py +backend/tests/integration/common_utils/managers/connector.py +backend/tests/integration/common_utils/managers/credential.py +backend/tests/integration/common_utils/managers/discord_bot.py +backend/tests/integration/common_utils/managers/document.py +backend/tests/integration/common_utils/managers/document_search.py +backend/tests/integration/common_utils/managers/document_set.py +backend/tests/integration/common_utils/managers/file.py +backend/tests/integration/common_utils/managers/image_generation.py +backend/tests/integration/common_utils/managers/index_attempt.py +backend/tests/integration/common_utils/managers/llm_provider.py +backend/tests/integration/common_utils/managers/persona.py +backend/tests/integration/common_utils/managers/project.py +backend/tests/integration/common_utils/managers/query_history.py +backend/tests/integration/common_utils/managers/scim_client.py +backend/tests/integration/common_utils/managers/scim_token.py +backend/tests/integration/common_utils/managers/settings.py +backend/tests/integration/common_utils/managers/tenant.py +backend/tests/integration/common_utils/managers/tool.py +backend/tests/integration/common_utils/managers/user.py +backend/tests/integration/common_utils/managers/user_group.py +backend/tests/integration/common_utils/reset.py +backend/tests/integration/common_utils/test_document_utils.py +backend/tests/integration/common_utils/test_models.py +backend/tests/integration/conftest.py +backend/tests/integration/connector_job_tests/github/conftest.py +backend/tests/integration/connector_job_tests/github/test_github_permission_sync.py +backend/tests/integration/connector_job_tests/github/utils.py +backend/tests/integration/connector_job_tests/google/google_drive_api_utils.py +backend/tests/integration/connector_job_tests/google/test_google_drive_permission_sync.py +backend/tests/integration/connector_job_tests/jira/test_jira_permission_sync_full.py +backend/tests/integration/connector_job_tests/sharepoint/conftest.py +backend/tests/integration/connector_job_tests/sharepoint/test_sharepoint_permissions.py +backend/tests/integration/connector_job_tests/slack/conftest.py +backend/tests/integration/connector_job_tests/slack/slack_api_utils.py +backend/tests/integration/connector_job_tests/slack/test_permission_sync.py +backend/tests/integration/connector_job_tests/slack/test_prune.py +backend/tests/integration/mock_services/mcp_test_server/run_mcp_server_api_key.py +backend/tests/integration/mock_services/mcp_test_server/run_mcp_server_google_oauth.py +backend/tests/integration/mock_services/mcp_test_server/run_mcp_server_no_auth.py +backend/tests/integration/mock_services/mcp_test_server/run_mcp_server_oauth.py +backend/tests/integration/mock_services/mcp_test_server/run_mcp_server_per_user_key.py +backend/tests/integration/mock_services/mock_connector_server/Dockerfile +backend/tests/integration/multitenant_tests/discord_bot/test_discord_bot_multitenant.py +backend/tests/integration/multitenant_tests/invitation/test_user_invitation.py +backend/tests/integration/multitenant_tests/migrations/test_run_multitenant_migrations.py +backend/tests/integration/multitenant_tests/syncing/test_search_permissions.py +backend/tests/integration/multitenant_tests/tenants/test_tenant_creation.py +backend/tests/integration/multitenant_tests/tenants/test_tenant_provisioning_rollback.py +backend/tests/integration/multitenant_tests/test_get_schemas_needing_migration.py +backend/tests/integration/openai_assistants_api/conftest.py +backend/tests/integration/openai_assistants_api/test_assistants.py +backend/tests/integration/openai_assistants_api/test_messages.py +backend/tests/integration/openai_assistants_api/test_runs.py +backend/tests/integration/openai_assistants_api/test_threads.py +backend/tests/integration/tests/anonymous_user/test_anonymous_user.py +backend/tests/integration/tests/api_key/test_api_key.py +backend/tests/integration/tests/auth/test_saml_user_conversion.py +backend/tests/integration/tests/chat/test_chat_deletion.py +backend/tests/integration/tests/chat/test_chat_session_access.py +backend/tests/integration/tests/chat_retention/test_chat_retention.py +backend/tests/integration/tests/code_interpreter/conftest.py +backend/tests/integration/tests/code_interpreter/test_code_interpreter_api.py +backend/tests/integration/tests/connector/test_connector_creation.py +backend/tests/integration/tests/connector/test_connector_deletion.py +backend/tests/integration/tests/connector/test_last_indexed_time.py +backend/tests/integration/tests/dev_apis/test_knowledge_chat.py +backend/tests/integration/tests/dev_apis/test_simple_chat_api.py +backend/tests/integration/tests/discord_bot/test_discord_bot_api.py +backend/tests/integration/tests/discord_bot/test_discord_bot_db.py +backend/tests/integration/tests/document_set/test_syncing.py +backend/tests/integration/tests/image_generation/test_image_generation_config.py +backend/tests/integration/tests/image_generation/test_image_generation_tool_visibility.py +backend/tests/integration/tests/image_indexing/test_indexing_images.py +backend/tests/integration/tests/index_attempt/test_index_attempt_pagination.py +backend/tests/integration/tests/indexing/conftest.py +backend/tests/integration/tests/indexing/file_connector/test_file_connector_zip_metadata.py +backend/tests/integration/tests/indexing/test_checkpointing.py +backend/tests/integration/tests/indexing/test_initial_permission_sync.py +backend/tests/integration/tests/indexing/test_polling.py +backend/tests/integration/tests/indexing/test_repeated_error_state.py +backend/tests/integration/tests/ingestion/test_ingestion_api.py +backend/tests/integration/tests/kg/test_kg_api.py +backend/tests/integration/tests/kg/test_kg_processing.py +backend/tests/integration/tests/llm_auto_update/test_auto_llm_update.py +backend/tests/integration/tests/llm_provider/test_llm_provider.py +backend/tests/integration/tests/llm_provider/test_llm_provider_access_control.py +backend/tests/integration/tests/llm_provider/test_llm_provider_persona_access.py +backend/tests/integration/tests/llm_workflows/test_mock_llm_tool_calls.py +backend/tests/integration/tests/llm_workflows/test_nightly_provider_chat_workflow.py +backend/tests/integration/tests/llm_workflows/test_tool_policy_enforcement.py +backend/tests/integration/tests/mcp/test_mcp_client_no_auth_flow.py +backend/tests/integration/tests/mcp/test_mcp_server_auth.py +backend/tests/integration/tests/mcp/test_mcp_server_search.py +backend/tests/integration/tests/migrations/conftest.py +backend/tests/integration/tests/migrations/test_alembic_main.py +backend/tests/integration/tests/migrations/test_alembic_tenants.py +backend/tests/integration/tests/migrations/test_assistant_consolidation_migration.py +backend/tests/integration/tests/migrations/test_migrations.py +backend/tests/integration/tests/migrations/test_tool_seeding.py +backend/tests/integration/tests/no_vectordb/conftest.py +backend/tests/integration/tests/no_vectordb/test_no_vectordb_chat.py +backend/tests/integration/tests/no_vectordb/test_no_vectordb_endpoints.py +backend/tests/integration/tests/no_vectordb/test_no_vectordb_file_lifecycle.py +backend/tests/integration/tests/opensearch_migration/test_opensearch_migration_api.py +backend/tests/integration/tests/pat/test_pat_api.py +backend/tests/integration/tests/permissions/conftest.py +backend/tests/integration/tests/permissions/test_admin_access.py +backend/tests/integration/tests/permissions/test_auth_permission_propagation.py +backend/tests/integration/tests/permissions/test_basic_access.py +backend/tests/integration/tests/permissions/test_cc_pair_permissions.py +backend/tests/integration/tests/permissions/test_connector_permissions.py +backend/tests/integration/tests/permissions/test_credential_permissions.py +backend/tests/integration/tests/permissions/test_doc_set_permissions.py +backend/tests/integration/tests/permissions/test_file_connector_permissions.py +backend/tests/integration/tests/permissions/test_persona_permissions.py +backend/tests/integration/tests/permissions/test_user_file_permissions.py +backend/tests/integration/tests/permissions/test_user_role_permissions.py +backend/tests/integration/tests/permissions/test_whole_curator_flow.py +backend/tests/integration/tests/personalization/test_personalization_flow.py +backend/tests/integration/tests/personas/test_persona_categories.py +backend/tests/integration/tests/personas/test_persona_creation.py +backend/tests/integration/tests/personas/test_persona_file_context.py +backend/tests/integration/tests/personas/test_persona_label_updates.py +backend/tests/integration/tests/personas/test_persona_pagination.py +backend/tests/integration/tests/personas/test_unified_assistant.py +backend/tests/integration/tests/playwright/test_playwright.py +backend/tests/integration/tests/projects/test_projects.py +backend/tests/integration/tests/pruning/test_pruning.py +backend/tests/integration/tests/query_history/test_query_history.py +backend/tests/integration/tests/query_history/test_query_history_pagination.py +backend/tests/integration/tests/query_history/test_usage_reports.py +backend/tests/integration/tests/reporting/test_usage_export_api.py +backend/tests/integration/tests/scim/test_scim_groups.py +backend/tests/integration/tests/scim/test_scim_tokens.py +backend/tests/integration/tests/scim/test_scim_users.py +backend/tests/integration/tests/search_settings/test_search_settings.py +backend/tests/integration/tests/streaming_endpoints/test_chat_file_attachment.py +backend/tests/integration/tests/streaming_endpoints/test_chat_stream.py +backend/tests/integration/tests/streaming_endpoints/test_chat_v0_api.py +backend/tests/integration/tests/tags/test_tags.py +backend/tests/integration/tests/tools/test_force_tool_use.py +backend/tests/integration/tests/tools/test_image_generation_streaming.py +backend/tests/integration/tests/usergroup/test_add_users_to_group.py +backend/tests/integration/tests/usergroup/test_group_membership_updates_user_permissions.py +backend/tests/integration/tests/usergroup/test_group_permission_toggle.py +backend/tests/integration/tests/usergroup/test_new_group_gets_basic_permission.py +backend/tests/integration/tests/usergroup/test_user_group_deletion.py +backend/tests/integration/tests/usergroup/test_usergroup_syncing.py +backend/tests/integration/tests/users/test_default_group_assignment.py +backend/tests/integration/tests/users/test_password_signup_upgrade.py +backend/tests/integration/tests/users/test_reactivation_groups.py +backend/tests/integration/tests/users/test_seat_limit.py +backend/tests/integration/tests/users/test_slack_user_deactivation.py +backend/tests/integration/tests/users/test_user_pagination.py +backend/tests/integration/tests/web_search/test_web_search_api.py +backend/tests/regression/answer_quality/api_utils.py +backend/tests/regression/answer_quality/file_uploader.py +backend/tests/regression/answer_quality/launch_eval_env.py +backend/tests/regression/answer_quality/run_qa.py +backend/tests/regression/search_quality/README.md +backend/tests/regression/search_quality/run_search_eval.py +backend/tests/regression/search_quality/utils.py +backend/tests/unit/background/__init__.py +backend/tests/unit/background/celery/__init__.py +backend/tests/unit/background/celery/test_celery_utils.py +backend/tests/unit/build/test_rewrite_asset_paths.py +backend/tests/unit/ee/conftest.py +backend/tests/unit/ee/onyx/db/test_license.py +backend/tests/unit/ee/onyx/db/test_user_group_rename.py +backend/tests/unit/ee/onyx/external_permissions/salesforce/test_postprocessing.py +backend/tests/unit/ee/onyx/external_permissions/sharepoint/test_permission_utils.py +backend/tests/unit/ee/onyx/hooks/__init__.py +backend/tests/unit/ee/onyx/hooks/test_executor.py +backend/tests/unit/ee/onyx/server/__init__.py +backend/tests/unit/ee/onyx/server/billing/__init__.py +backend/tests/unit/ee/onyx/server/billing/conftest.py +backend/tests/unit/ee/onyx/server/billing/test_billing_api.py +backend/tests/unit/ee/onyx/server/billing/test_billing_service.py +backend/tests/unit/ee/onyx/server/billing/test_proxy.py +backend/tests/unit/ee/onyx/server/features/__init__.py +backend/tests/unit/ee/onyx/server/features/hooks/__init__.py +backend/tests/unit/ee/onyx/server/features/hooks/test_api.py +backend/tests/unit/ee/onyx/server/license/test_api.py +backend/tests/unit/ee/onyx/server/middleware/test_license_enforcement.py +backend/tests/unit/ee/onyx/server/settings/test_license_enforcement_settings.py +backend/tests/unit/ee/onyx/server/tenants/test_billing_api.py +backend/tests/unit/ee/onyx/server/tenants/test_product_gating.py +backend/tests/unit/ee/onyx/server/tenants/test_proxy.py +backend/tests/unit/ee/onyx/server/tenants/test_schema_management.py +backend/tests/unit/ee/onyx/utils/test_encryption.py +backend/tests/unit/ee/onyx/utils/test_license_utils.py +backend/tests/unit/federated_connector/slack/test_slack_federated_connnector.py +backend/tests/unit/federated_connector/test_reject_masked_credentials.py +backend/tests/unit/file_store/test_file_store.py +backend/tests/unit/file_store/test_postgres_file_store.py +backend/tests/unit/model_server/test_custom_models.py +backend/tests/unit/model_server/test_embedding.py +backend/tests/unit/onyx/__init__.py +backend/tests/unit/onyx/access/test_user_file_access.py +backend/tests/unit/onyx/agents/agent_framework/conftest.py +backend/tests/unit/onyx/agents/agent_framework/test_query.py +backend/tests/unit/onyx/agents/agent_sdk/test_message_format.py +backend/tests/unit/onyx/agents/agent_search/dr/sub_agents/web_search/test_providers.py +backend/tests/unit/onyx/auth/test_disposable_email_validator.py +backend/tests/unit/onyx/auth/test_is_same_origin.py +backend/tests/unit/onyx/auth/test_jwt_provisioning.py +backend/tests/unit/onyx/auth/test_oauth_refresher.py +backend/tests/unit/onyx/auth/test_oidc_pkce.py +backend/tests/unit/onyx/auth/test_permissions.py +backend/tests/unit/onyx/auth/test_single_tenant_jwt_strategy.py +backend/tests/unit/onyx/auth/test_user_create_schema.py +backend/tests/unit/onyx/auth/test_user_registration.py +backend/tests/unit/onyx/auth/test_verify_auth_setting.py +backend/tests/unit/onyx/auth/test_verify_email_domain.py +backend/tests/unit/onyx/auth/test_verify_email_invite.py +backend/tests/unit/onyx/background/celery/tasks/tenant_provisioning/__init__.py +backend/tests/unit/onyx/background/celery/tasks/tenant_provisioning/test_check_available_tenants.py +backend/tests/unit/onyx/background/celery/tasks/test_hierarchyfetching_queue.py +backend/tests/unit/onyx/background/celery/tasks/test_user_file_impl_redis_locking.py +backend/tests/unit/onyx/background/celery/tasks/test_user_file_processing_no_vectordb.py +backend/tests/unit/onyx/background/celery/tasks/test_user_file_project_sync_queue.py +backend/tests/unit/onyx/background/celery/test_celery_redis.py +backend/tests/unit/onyx/celery/llm_model_update/test_llm_model_update.py +backend/tests/unit/onyx/chat/conftest.py +backend/tests/unit/onyx/chat/stream_processing/test_citation_processing.py +backend/tests/unit/onyx/chat/stream_processing/test_citation_substitution.py +backend/tests/unit/onyx/chat/stream_processing/test_quotes_processing.py +backend/tests/unit/onyx/chat/test_answer.py +backend/tests/unit/onyx/chat/test_answer_prompt_builder.py +backend/tests/unit/onyx/chat/test_argument_delta_streaming.py +backend/tests/unit/onyx/chat/test_chat_utils.py +backend/tests/unit/onyx/chat/test_citation_processor.py +backend/tests/unit/onyx/chat/test_citation_utils.py +backend/tests/unit/onyx/chat/test_compression.py +backend/tests/unit/onyx/chat/test_context_files.py +backend/tests/unit/onyx/chat/test_emitter.py +backend/tests/unit/onyx/chat/test_llm_loop.py +backend/tests/unit/onyx/chat/test_llm_step.py +backend/tests/unit/onyx/chat/test_multi_model_streaming.py +backend/tests/unit/onyx/chat/test_multi_model_types.py +backend/tests/unit/onyx/chat/test_process_message.py +backend/tests/unit/onyx/chat/test_process_message_mock_llm.py +backend/tests/unit/onyx/chat/test_prune_and_merge.py +backend/tests/unit/onyx/chat/test_save_chat.py +backend/tests/unit/onyx/chat/test_skip_gen_ai.py +backend/tests/unit/onyx/chat/test_stop_signal_checker.py +backend/tests/unit/onyx/chat/tools/__init__.py +backend/tests/unit/onyx/chat/tools/utils.py +backend/tests/unit/onyx/chat/turn/__init__.py +backend/tests/unit/onyx/chat/turn/conftest.py +backend/tests/unit/onyx/chat/turn/context_handler/test_citation_context_handler.py +backend/tests/unit/onyx/chat/turn/context_handler/test_reminder_context_handler.py +backend/tests/unit/onyx/chat/turn/prompts/__init__.py +backend/tests/unit/onyx/chat/turn/prompts/test_custom_instruction.py +backend/tests/unit/onyx/chat/turn/test_fast_chat_turn_orch_and_stream.py +backend/tests/unit/onyx/chat/turn/utils.py +backend/tests/unit/onyx/connectors/airtable/test_airtable_index_all.py +backend/tests/unit/onyx/connectors/asana/test_asana_connector.py +backend/tests/unit/onyx/connectors/canvas/test_canvas_connector.py +backend/tests/unit/onyx/connectors/confluence/test_confluence_checkpointing.py +backend/tests/unit/onyx/connectors/confluence/test_onyx_confluence.py +backend/tests/unit/onyx/connectors/confluence/test_rate_limit_handler.py +backend/tests/unit/onyx/connectors/discord/test_discord_validation.py +backend/tests/unit/onyx/connectors/github/test_github_checkpointing.py +backend/tests/unit/onyx/connectors/gmail/test_connector.py +backend/tests/unit/onyx/connectors/google_utils/test_rate_limit_detection.py +backend/tests/unit/onyx/connectors/jira/conftest.py +backend/tests/unit/onyx/connectors/jira/test_jira_bulk_fetch.py +backend/tests/unit/onyx/connectors/jira/test_jira_checkpointing.py +backend/tests/unit/onyx/connectors/jira/test_jira_error_handling.py +backend/tests/unit/onyx/connectors/jira/test_jira_large_ticket_handling.py +backend/tests/unit/onyx/connectors/jira/test_jira_permission_sync.py +backend/tests/unit/onyx/connectors/mediawiki/test_wiki.py +backend/tests/unit/onyx/connectors/notion/test_notion_datasource.py +backend/tests/unit/onyx/connectors/notion/test_notion_people_and_tables.py +backend/tests/unit/onyx/connectors/salesforce/test_salesforce_sqlite.py +backend/tests/unit/onyx/connectors/salesforce/test_yield_doc_batches.py +backend/tests/unit/onyx/connectors/sharepoint/test_delta_checkpointing.py +backend/tests/unit/onyx/connectors/sharepoint/test_denylist.py +backend/tests/unit/onyx/connectors/sharepoint/test_drive_matching.py +backend/tests/unit/onyx/connectors/sharepoint/test_fetch_site_pages.py +backend/tests/unit/onyx/connectors/sharepoint/test_hierarchy_helpers.py +backend/tests/unit/onyx/connectors/sharepoint/test_rest_client_context_caching.py +backend/tests/unit/onyx/connectors/sharepoint/test_url_parsing.py +backend/tests/unit/onyx/connectors/slab/test_slab_validation.py +backend/tests/unit/onyx/connectors/slack/test_message_filtering.py +backend/tests/unit/onyx/connectors/teams/test_collect_teams.py +backend/tests/unit/onyx/connectors/test_connector_factory.py +backend/tests/unit/onyx/connectors/test_document_metadata_coercion.py +backend/tests/unit/onyx/connectors/test_microsoft_graph_env.py +backend/tests/unit/onyx/connectors/utils.py +backend/tests/unit/onyx/connectors/zendesk/test_zendesk_rate_limit.py +backend/tests/unit/onyx/context/search/federated/test_slack_thread_context.py +backend/tests/unit/onyx/db/__init__.py +backend/tests/unit/onyx/db/conftest.py +backend/tests/unit/onyx/db/test_assign_default_groups.py +backend/tests/unit/onyx/db/test_chat_message_cleanup.py +backend/tests/unit/onyx/db/test_chat_sessions.py +backend/tests/unit/onyx/db/test_dal.py +backend/tests/unit/onyx/db/test_delete_user.py +backend/tests/unit/onyx/db/test_is_limited_user.py +backend/tests/unit/onyx/db/test_llm_sync.py +backend/tests/unit/onyx/db/test_persona_display_priority.py +backend/tests/unit/onyx/db/test_projects_upload_task_expiry.py +backend/tests/unit/onyx/db/test_scim_dal.py +backend/tests/unit/onyx/db/test_tools.py +backend/tests/unit/onyx/db/test_usage.py +backend/tests/unit/onyx/db/test_voice.py +backend/tests/unit/onyx/document_index/opensearch/test_get_doc_chunk_id.py +backend/tests/unit/onyx/document_index/opensearch/test_opensearch_batch_flush.py +backend/tests/unit/onyx/document_index/test_disabled_document_index.py +backend/tests/unit/onyx/document_index/vespa/shared_utils/test_utils.py +backend/tests/unit/onyx/document_index/vespa/test_vespa_batch_flush.py +backend/tests/unit/onyx/error_handling/__init__.py +backend/tests/unit/onyx/error_handling/test_exceptions.py +backend/tests/unit/onyx/federated_connectors/test_federated_connector_factory.py +backend/tests/unit/onyx/federated_connectors/test_oauth_utils.py +backend/tests/unit/onyx/file_processing/__init__.py +backend/tests/unit/onyx/file_processing/fixtures/empty.pdf +backend/tests/unit/onyx/file_processing/fixtures/encrypted.pdf +backend/tests/unit/onyx/file_processing/fixtures/multipage.pdf +backend/tests/unit/onyx/file_processing/fixtures/owner_protected.pdf +backend/tests/unit/onyx/file_processing/fixtures/simple.pdf +backend/tests/unit/onyx/file_processing/fixtures/with_image.pdf +backend/tests/unit/onyx/file_processing/fixtures/with_metadata.pdf +backend/tests/unit/onyx/file_processing/test_image_summarization_errors.py +backend/tests/unit/onyx/file_processing/test_image_summarization_litellm_errors.py +backend/tests/unit/onyx/file_processing/test_pdf.py +backend/tests/unit/onyx/file_processing/test_pptx_to_text.py +backend/tests/unit/onyx/file_processing/test_xlsx_to_text.py +backend/tests/unit/onyx/file_store/test_delete_file.py +backend/tests/unit/onyx/hooks/__init__.py +backend/tests/unit/onyx/hooks/test_api_dependencies.py +backend/tests/unit/onyx/hooks/test_base_spec.py +backend/tests/unit/onyx/hooks/test_models.py +backend/tests/unit/onyx/hooks/test_query_processing_spec.py +backend/tests/unit/onyx/hooks/test_registry.py +backend/tests/unit/onyx/image_gen/test_provider_building.py +backend/tests/unit/onyx/indexing/conftest.py +backend/tests/unit/onyx/indexing/test_censoring.py +backend/tests/unit/onyx/indexing/test_chunker.py +backend/tests/unit/onyx/indexing/test_embed_chunks_in_batches.py +backend/tests/unit/onyx/indexing/test_indexing_pipeline.py +backend/tests/unit/onyx/indexing/test_personas_in_chunks.py +backend/tests/unit/onyx/llm/conftest.py +backend/tests/unit/onyx/llm/test_bedrock_token_limit.py +backend/tests/unit/onyx/llm/test_chat_llm.py +backend/tests/unit/onyx/llm/test_factory.py +backend/tests/unit/onyx/llm/test_litellm_monkey_patches.py +backend/tests/unit/onyx/llm/test_llm_provider_options.py +backend/tests/unit/onyx/llm/test_model_map.py +backend/tests/unit/onyx/llm/test_model_name_parser.py +backend/tests/unit/onyx/llm/test_multi_llm.py +backend/tests/unit/onyx/llm/test_reasoning_effort_mapping.py +backend/tests/unit/onyx/llm/test_request_context.py +backend/tests/unit/onyx/llm/test_true_openai_model.py +backend/tests/unit/onyx/llm/test_vision_model_selection_logging.py +backend/tests/unit/onyx/natural_language_processing/test_search_nlp_models.py +backend/tests/unit/onyx/onyxbot/__init__.py +backend/tests/unit/onyx/onyxbot/discord/conftest.py +backend/tests/unit/onyx/onyxbot/discord/test_api_client.py +backend/tests/unit/onyx/onyxbot/discord/test_cache_manager.py +backend/tests/unit/onyx/onyxbot/discord/test_context_builders.py +backend/tests/unit/onyx/onyxbot/discord/test_discord_utils.py +backend/tests/unit/onyx/onyxbot/discord/test_message_utils.py +backend/tests/unit/onyx/onyxbot/discord/test_should_respond.py +backend/tests/unit/onyx/onyxbot/test_handle_regular_answer.py +backend/tests/unit/onyx/onyxbot/test_slack_blocks.py +backend/tests/unit/onyx/onyxbot/test_slack_formatting.py +backend/tests/unit/onyx/onyxbot/test_slack_gating.py +backend/tests/unit/onyx/prompts/test_prompt_utils.py +backend/tests/unit/onyx/server/__init__.py +backend/tests/unit/onyx/server/features/__init__.py +backend/tests/unit/onyx/server/features/hierarchy/test_user_access_info.py +backend/tests/unit/onyx/server/features/hooks/__init__.py +backend/tests/unit/onyx/server/manage/embedding/test_embedding_api.py +backend/tests/unit/onyx/server/manage/llm/test_fetch_models_api.py +backend/tests/unit/onyx/server/manage/llm/test_llm_provider_utils.py +backend/tests/unit/onyx/server/manage/test_bulk_invite_limit.py +backend/tests/unit/onyx/server/manage/voice/test_voice_api_validation.py +backend/tests/unit/onyx/server/scim/__init__.py +backend/tests/unit/onyx/server/scim/conftest.py +backend/tests/unit/onyx/server/scim/test_admin.py +backend/tests/unit/onyx/server/scim/test_auth.py +backend/tests/unit/onyx/server/scim/test_entra.py +backend/tests/unit/onyx/server/scim/test_filtering.py +backend/tests/unit/onyx/server/scim/test_group_endpoints.py +backend/tests/unit/onyx/server/scim/test_patch.py +backend/tests/unit/onyx/server/scim/test_providers.py +backend/tests/unit/onyx/server/scim/test_user_endpoints.py +backend/tests/unit/onyx/server/test_full_user_snapshot.py +backend/tests/unit/onyx/server/test_pool_metrics.py +backend/tests/unit/onyx/server/test_projects_file_utils.py +backend/tests/unit/onyx/server/test_prometheus_instrumentation.py +backend/tests/unit/onyx/server/test_settings_store.py +backend/tests/unit/onyx/server/test_upload_files.py +backend/tests/unit/onyx/test_redis.py +backend/tests/unit/onyx/test_startup_validation.py +backend/tests/unit/onyx/tools/__init__.py +backend/tests/unit/onyx/tools/conftest.py +backend/tests/unit/onyx/tools/custom/test_custom_tools.py +backend/tests/unit/onyx/tools/test_adapter_v1_to_v2.py +backend/tests/unit/onyx/tools/test_construct_tools_no_vectordb.py +backend/tests/unit/onyx/tools/test_file_reader_tool.py +backend/tests/unit/onyx/tools/test_no_vectordb.py +backend/tests/unit/onyx/tools/test_python_tool_availability.py +backend/tests/unit/onyx/tools/test_search_utils.py +backend/tests/unit/onyx/tools/test_tool_implementations_v2_image_generation.py +backend/tests/unit/onyx/tools/test_tool_implementations_v2_internal_search.py +backend/tests/unit/onyx/tools/test_tool_implementations_v2_web.py +backend/tests/unit/onyx/tools/test_tool_runner.py +backend/tests/unit/onyx/tools/test_tool_runner_chat_files.py +backend/tests/unit/onyx/tools/test_tool_utils.py +backend/tests/unit/onyx/tools/tool_implementations/open_url/data/test_snippet_finding_data.json +backend/tests/unit/onyx/tools/tool_implementations/open_url/test_onyx_web_crawler.py +backend/tests/unit/onyx/tools/tool_implementations/open_url/test_snippet_matcher.py +backend/tests/unit/onyx/tools/tool_implementations/open_url/test_url_normalization.py +backend/tests/unit/onyx/tools/tool_implementations/python/__init__.py +backend/tests/unit/onyx/tools/tool_implementations/python/test_code_interpreter_client.py +backend/tests/unit/onyx/tools/tool_implementations/python/test_python_tool_upload_cache.py +backend/tests/unit/onyx/tools/tool_implementations/websearch/data/tartan.txt +backend/tests/unit/onyx/tools/tool_implementations/websearch/test_brave_client.py +backend/tests/unit/onyx/tools/tool_implementations/websearch/test_web_search_providers.py +backend/tests/unit/onyx/tools/tool_implementations/websearch/test_web_search_tool_run.py +backend/tests/unit/onyx/tools/tool_implementations/websearch/test_websearch_utils.py +backend/tests/unit/onyx/tracing/test_tracing_setup.py +backend/tests/unit/onyx/utils/test_gpu_utils.py +backend/tests/unit/onyx/utils/test_json_river.py +backend/tests/unit/onyx/utils/test_postgres_sanitization.py +backend/tests/unit/onyx/utils/test_sensitive.py +backend/tests/unit/onyx/utils/test_sensitive_typing.py +backend/tests/unit/onyx/utils/test_telemetry.py +backend/tests/unit/onyx/utils/test_threadpool_concurrency.py +backend/tests/unit/onyx/utils/test_url_ssrf.py +backend/tests/unit/onyx/utils/test_vespa_query.py +backend/tests/unit/onyx/utils/test_vespa_tasks.py +backend/tests/unit/onyx/voice/providers/test_azure_provider.py +backend/tests/unit/onyx/voice/providers/test_azure_ssml.py +backend/tests/unit/onyx/voice/providers/test_elevenlabs_provider.py +backend/tests/unit/onyx/voice/providers/test_openai_provider.py +backend/tests/unit/scripts/test_check_lazy_imports.py +backend/tests/unit/server/metrics/test_celery_task_metrics.py +backend/tests/unit/server/metrics/test_indexing_pipeline_collectors.py +backend/tests/unit/server/metrics/test_indexing_pipeline_setup.py +backend/tests/unit/server/metrics/test_indexing_task_metrics.py +backend/tests/unit/server/metrics/test_metrics_server.py +backend/tests/unit/server/metrics/test_opensearch_search_metrics.py +backend/tests/unit/server/metrics/test_pruning_metrics.py +backend/tests/unit/server/metrics/test_worker_health.py +backend/tests/unit/tools/__init__.py +backend/tests/unit/tools/test_memory_tool_packets.py +backend/uv.lock +cli/.gitignore +cli/Dockerfile +cli/README.md +cli/cmd/agents.go +cli/cmd/ask.go +cli/cmd/chat.go +cli/cmd/configure.go +cli/cmd/experiments.go +cli/cmd/install_skill.go +cli/cmd/root.go +cli/cmd/serve.go +cli/cmd/validate.go +cli/go.mod +cli/go.sum +cli/hatch_build.py +cli/internal/_version.py +cli/internal/api/client.go +cli/internal/api/errors.go +cli/internal/api/stream.go +cli/internal/config/config.go +cli/internal/config/config_test.go +cli/internal/config/experiments.go +cli/internal/embedded/SKILL.md +cli/internal/embedded/embed.go +cli/internal/exitcodes/codes.go +cli/internal/exitcodes/codes_test.go +cli/internal/fsutil/fsutil.go +cli/internal/fsutil/fsutil_test.go +cli/internal/models/events.go +cli/internal/models/models.go +cli/internal/onboarding/onboarding.go +cli/internal/overflow/writer.go +cli/internal/overflow/writer_test.go +cli/internal/parser/parser.go +cli/internal/parser/parser_test.go +cli/internal/starprompt/starprompt.go +cli/internal/tui/app.go +cli/internal/tui/commands.go +cli/internal/tui/experiments.go +cli/internal/tui/help.go +cli/internal/tui/input.go +cli/internal/tui/messages.go +cli/internal/tui/splash.go +cli/internal/tui/statusbar.go +cli/internal/tui/styles.go +cli/internal/tui/viewport.go +cli/internal/tui/viewport_test.go +cli/internal/util/browser.go +cli/internal/util/styles.go +cli/internal/version/version.go +cli/main.go +cli/pyproject.toml +contributor_ip_assignment/EE_Contributor_IP_Assignment_Agreement.md +contributor_ip_assignment/EE_Contributor_IP_Assignment_Agreement.pdf +ct.yaml +cubic.yaml +deployment/.gitignore +deployment/aws_ecs_fargate/cloudformation/onyx_cluster_template.yaml +deployment/aws_ecs_fargate/cloudformation/services/onyx_backend_api_server_service_template.yaml +deployment/aws_ecs_fargate/cloudformation/services/onyx_backend_background_server_service_template.yaml +deployment/data/nginx/app.conf.template +deployment/data/nginx/app.conf.template.no-letsencrypt +deployment/data/nginx/app.conf.template.prod +deployment/data/nginx/mcp.conf.inc.template +deployment/docker_compose/docker-compose.dev.yml +deployment/docker_compose/docker-compose.model-server-test.yml +deployment/docker_compose/docker-compose.multitenant-dev.yml +deployment/docker_compose/docker-compose.onyx-lite.yml +deployment/docker_compose/docker-compose.prod-cloud.yml +deployment/docker_compose/docker-compose.prod-no-letsencrypt.yml +deployment/docker_compose/docker-compose.prod.yml +deployment/docker_compose/docker-compose.search-testing.yml +deployment/docker_compose/docker-compose.yml +deployment/docker_compose/eea/.env.example +deployment/docker_compose/eea/docker-compose.override.yml +deployment/docker_compose/eea/docker-compose.yml +deployment/docker_compose/env.multilingual.template +deployment/docker_compose/env.prod.template +deployment/docker_compose/env.template +deployment/docker_compose/install.ps1 +deployment/docker_compose/install.sh +deployment/helm/README.md +deployment/helm/charts/onyx/.gitignore +deployment/helm/charts/onyx/Chart.lock +deployment/helm/charts/onyx/Chart.yaml +deployment/helm/charts/onyx/ci/ct-values.yaml +deployment/helm/charts/onyx/dashboards/indexing-pipeline.json +deployment/helm/charts/onyx/templates/_helpers.tpl +deployment/helm/charts/onyx/templates/api-deployment.yaml +deployment/helm/charts/onyx/templates/api-scaledobject.yaml +deployment/helm/charts/onyx/templates/api-service.yaml +deployment/helm/charts/onyx/templates/auth-secrets.yaml +deployment/helm/charts/onyx/templates/celery-beat-pvc.yaml +deployment/helm/charts/onyx/templates/celery-beat.yaml +deployment/helm/charts/onyx/templates/celery-worker-docfetching-hpa.yaml +deployment/helm/charts/onyx/templates/celery-worker-docfetching-metrics-service.yaml +deployment/helm/charts/onyx/templates/celery-worker-docfetching-scaledobject.yaml +deployment/helm/charts/onyx/templates/celery-worker-docfetching.yaml +deployment/helm/charts/onyx/templates/celery-worker-docprocessing-hpa.yaml +deployment/helm/charts/onyx/templates/celery-worker-docprocessing-metrics-service.yaml +deployment/helm/charts/onyx/templates/celery-worker-docprocessing-scaledobject.yaml +deployment/helm/charts/onyx/templates/celery-worker-docprocessing.yaml +deployment/helm/charts/onyx/templates/celery-worker-heavy-hpa.yaml +deployment/helm/charts/onyx/templates/celery-worker-heavy-metrics-service.yaml +deployment/helm/charts/onyx/templates/celery-worker-heavy-scaledobject.yaml +deployment/helm/charts/onyx/templates/celery-worker-heavy.yaml +deployment/helm/charts/onyx/templates/celery-worker-light-hpa.yaml +deployment/helm/charts/onyx/templates/celery-worker-light-scaledobject.yaml +deployment/helm/charts/onyx/templates/celery-worker-light.yaml +deployment/helm/charts/onyx/templates/celery-worker-monitoring-hpa.yaml +deployment/helm/charts/onyx/templates/celery-worker-monitoring-metrics-service.yaml +deployment/helm/charts/onyx/templates/celery-worker-monitoring-scaledobject.yaml +deployment/helm/charts/onyx/templates/celery-worker-monitoring.yaml +deployment/helm/charts/onyx/templates/celery-worker-primary-hpa.yaml +deployment/helm/charts/onyx/templates/celery-worker-primary-scaledobject.yaml +deployment/helm/charts/onyx/templates/celery-worker-primary.yaml +deployment/helm/charts/onyx/templates/celery-worker-servicemonitors.yaml +deployment/helm/charts/onyx/templates/celery-worker-user-file-processing-hpa.yaml +deployment/helm/charts/onyx/templates/celery-worker-user-file-processing-scaledobject.yaml +deployment/helm/charts/onyx/templates/celery-worker-user-file-processing.yaml +deployment/helm/charts/onyx/templates/celery-worker-user-files-indexing-hpa.yaml +deployment/helm/charts/onyx/templates/celery-worker-user-files-indexing-scaledobject.yaml +deployment/helm/charts/onyx/templates/celery-worker-user-files-indexing.yaml +deployment/helm/charts/onyx/templates/configmap.yaml +deployment/helm/charts/onyx/templates/discordbot.yaml +deployment/helm/charts/onyx/templates/grafana-dashboards.yaml +deployment/helm/charts/onyx/templates/indexing-model-deployment.yaml +deployment/helm/charts/onyx/templates/indexing-model-service.yaml +deployment/helm/charts/onyx/templates/inference-model-deployment.yaml +deployment/helm/charts/onyx/templates/inference-model-service.yaml +deployment/helm/charts/onyx/templates/ingress-api.yaml +deployment/helm/charts/onyx/templates/ingress-mcp.yaml +deployment/helm/charts/onyx/templates/ingress-webserver.yaml +deployment/helm/charts/onyx/templates/lets-encrypt.yaml +deployment/helm/charts/onyx/templates/mcp-server-deployment.yaml +deployment/helm/charts/onyx/templates/mcp-server-service.yaml +deployment/helm/charts/onyx/templates/network-policies.yaml +deployment/helm/charts/onyx/templates/nginx-conf.yaml +deployment/helm/charts/onyx/templates/nginx-ingress.yaml +deployment/helm/charts/onyx/templates/nginx-simple.yaml +deployment/helm/charts/onyx/templates/postgresql-additional-secrets.yaml +deployment/helm/charts/onyx/templates/postgresql-backup-cronjob.yaml +deployment/helm/charts/onyx/templates/postgresql-backup-pvc.yaml +deployment/helm/charts/onyx/templates/postgresql-init-configmap.yaml +deployment/helm/charts/onyx/templates/postgresql-restore-job.yaml +deployment/helm/charts/onyx/templates/postgresql-statefulset.yaml +deployment/helm/charts/onyx/templates/redis-deployment.yaml +deployment/helm/charts/onyx/templates/redis-pvc.yaml +deployment/helm/charts/onyx/templates/redis-service.yaml +deployment/helm/charts/onyx/templates/slackbot.yaml +deployment/helm/charts/onyx/templates/tooling-pginto-configmap.yaml +deployment/helm/charts/onyx/templates/vespa-backup-cronjob.yaml +deployment/helm/charts/onyx/templates/vespa-backup-pvc.yaml +deployment/helm/charts/onyx/templates/webserver-deployment.yaml +deployment/helm/charts/onyx/templates/webserver-scaledobject.yaml +deployment/helm/charts/onyx/templates/webserver-service.yaml +deployment/helm/charts/onyx/templates_disabled/ingress-api.yaml +deployment/helm/charts/onyx/templates_disabled/ingress-webserver.yaml +deployment/helm/charts/onyx/templates_disabled/nginx-conf.yaml +deployment/helm/charts/onyx/values-lite.yaml +deployment/helm/charts/onyx/values.yaml +deployment/terraform/modules/aws/README.md +deployment/terraform/modules/aws/eks/main.tf +deployment/terraform/modules/aws/eks/variables.tf +deployment/terraform/modules/aws/onyx/main.tf +deployment/terraform/modules/aws/onyx/outputs.tf +deployment/terraform/modules/aws/onyx/variables.tf +deployment/terraform/modules/aws/opensearch/main.tf +deployment/terraform/modules/aws/opensearch/outputs.tf +deployment/terraform/modules/aws/opensearch/variables.tf +deployment/terraform/modules/aws/postgres/main.tf +deployment/terraform/modules/aws/postgres/variables.tf +deployment/terraform/modules/aws/s3/main.tf +deployment/terraform/modules/aws/s3/variables.tf +deployment/terraform/modules/aws/vpc/main.tf +deployment/terraform/modules/aws/vpc/outputs.tf +deployment/terraform/modules/aws/waf/main.tf +deployment/terraform/modules/aws/waf/variables.tf +desktop/.gitignore +desktop/AGENTS.md +desktop/CLAUDE.md +desktop/README.md +desktop/package-lock.json +desktop/package.json +desktop/scripts/generate-icons.sh +desktop/src-tauri/Cargo.lock +desktop/src-tauri/Cargo.toml +desktop/src-tauri/build.rs +desktop/src-tauri/gen/schemas/acl-manifests.json +desktop/src-tauri/gen/schemas/capabilities.json +desktop/src-tauri/gen/schemas/desktop-schema.json +desktop/src-tauri/gen/schemas/macOS-schema.json +desktop/src-tauri/icons/128x128.png +desktop/src-tauri/icons/128x128@2x.png +desktop/src-tauri/icons/32x32.png +desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml +desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png +desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png +desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png +desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png +desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png +desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png +desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png +desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png +desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png +desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png +desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png +desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png +desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png +desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png +desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png +desktop/src-tauri/icons/android/values/ic_launcher_background.xml +desktop/src-tauri/icons/icon.icns +desktop/src-tauri/icons/icon.ico +desktop/src-tauri/icons/icon.svg +desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png +desktop/src-tauri/icons/ios/AppIcon-20x20@2x-1.png +desktop/src-tauri/icons/ios/AppIcon-20x20@2x.png +desktop/src-tauri/icons/ios/AppIcon-20x20@3x.png +desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png +desktop/src-tauri/icons/ios/AppIcon-29x29@2x-1.png +desktop/src-tauri/icons/ios/AppIcon-29x29@2x.png +desktop/src-tauri/icons/ios/AppIcon-29x29@3x.png +desktop/src-tauri/icons/ios/AppIcon-40x40@1x.png +desktop/src-tauri/icons/ios/AppIcon-40x40@2x-1.png +desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png +desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png +desktop/src-tauri/icons/ios/AppIcon-512@2x.png +desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png +desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png +desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png +desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png +desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png +desktop/src-tauri/icons/tray-icon.png +desktop/src-tauri/icons/tray-icon.svg +desktop/src-tauri/src/main.rs +desktop/src-tauri/tauri.conf.json +desktop/src/index.html +desktop/src/titlebar.js +docker-bake.hcl +docs/METRICS.md +examples/widget/package-lock.json +examples/widget/package.json +examples/widget/postcss.config.mjs +examples/widget/src/app/globals.css +examples/widget/tsconfig.json +extensions/chrome/LICENSE +extensions/chrome/README.md +extensions/chrome/manifest.json +extensions/chrome/public/icon128.png +extensions/chrome/public/icon16.png +extensions/chrome/public/icon32.png +extensions/chrome/public/icon48.png +extensions/chrome/public/logo.png +extensions/chrome/service_worker.js +extensions/chrome/src/.DS_Store +extensions/chrome/src/pages/onyx_home.html +extensions/chrome/src/pages/onyx_home.js +extensions/chrome/src/pages/options.html +extensions/chrome/src/pages/options.js +extensions/chrome/src/pages/panel.html +extensions/chrome/src/pages/panel.js +extensions/chrome/src/pages/popup.html +extensions/chrome/src/pages/popup.js +extensions/chrome/src/pages/welcome.html +extensions/chrome/src/pages/welcome.js +extensions/chrome/src/styles/selection-icon.css +extensions/chrome/src/styles/shared.css +extensions/chrome/src/utils/constants.js +extensions/chrome/src/utils/content.js +extensions/chrome/src/utils/error-modal.js +extensions/chrome/src/utils/selection-icon.js +extensions/chrome/src/utils/storage.js +plans/.gitignore +profiling/grafana/dashboards/onyx/opensearch-search-latency.json +pyproject.toml +tools/ods/.gitignore +tools/ods/README.md +tools/ods/cmd/backend.go +tools/ods/cmd/check_lazy_imports.go +tools/ods/cmd/cherry-pick.go +tools/ods/cmd/compose.go +tools/ods/cmd/db.go +tools/ods/cmd/db_drop.go +tools/ods/cmd/db_dump.go +tools/ods/cmd/db_migrate.go +tools/ods/cmd/db_restore.go +tools/ods/cmd/deploy.go +tools/ods/cmd/deploy_edge.go +tools/ods/cmd/desktop.go +tools/ods/cmd/logs.go +tools/ods/cmd/openapi.go +tools/ods/cmd/print_latest.go +tools/ods/cmd/pull.go +tools/ods/cmd/root.go +tools/ods/cmd/run-ci.go +tools/ods/cmd/screenshot_diff.go +tools/ods/cmd/trace.go +tools/ods/cmd/web.go +tools/ods/cmd/whois.go +tools/ods/go.mod +tools/ods/go.sum +tools/ods/hatch_build.py +tools/ods/internal/_version.py +tools/ods/internal/alembic/alembic.go +tools/ods/internal/config/config.go +tools/ods/internal/docker/docker.go +tools/ods/internal/git/git.go +tools/ods/internal/git/git_test.go +tools/ods/internal/imgdiff/compare.go +tools/ods/internal/imgdiff/compare_test.go +tools/ods/internal/imgdiff/report.go +tools/ods/internal/imgdiff/summary.go +tools/ods/internal/kube/kube.go +tools/ods/internal/lazyimports/lazyimports.go +tools/ods/internal/lazyimports/lazyimports_test.go +tools/ods/internal/openapi/openapi.go +tools/ods/internal/openapi/openapi_schema.py +tools/ods/internal/paths/paths.go +tools/ods/internal/postgres/postgres.go +tools/ods/internal/prompt/prompt.go +tools/ods/internal/s3/fetch.go +tools/ods/internal/s3/sync.go +tools/ods/internal/tui/picker.go +tools/ods/main.go +tools/ods/pyproject.toml +uv.lock +web/.dockerignore +web/.gitignore +web/.storybook/Introduction.mdx +web/.storybook/README.md +web/.storybook/main.ts +web/.storybook/mocks/next-image.tsx +web/.storybook/mocks/next-link.tsx +web/.storybook/mocks/next-navigation.tsx +web/.storybook/preview-head.html +web/.storybook/preview.ts +web/@types/images.d.ts +web/AGENTS.md +web/CLAUDE.md +web/Dockerfile +web/README.md +web/STANDARDS.md +web/jest.config.js +web/lib/opal/README.md +web/lib/opal/package.json +web/lib/opal/scripts/README.md +web/lib/opal/scripts/convert-svg.sh +web/lib/opal/scripts/icon-template.js +web/lib/opal/src/components/README.md +web/lib/opal/src/components/buttons/Button/Button.stories.tsx +web/lib/opal/src/components/buttons/button/README.md +web/lib/opal/src/components/buttons/button/components.tsx +web/lib/opal/src/components/buttons/chevron.css +web/lib/opal/src/components/buttons/chevron.tsx +web/lib/opal/src/components/buttons/filter-button/FilterButton.stories.tsx +web/lib/opal/src/components/buttons/filter-button/README.md +web/lib/opal/src/components/buttons/filter-button/components.tsx +web/lib/opal/src/components/buttons/icon-wrapper.tsx +web/lib/opal/src/components/buttons/line-item-button/README.md +web/lib/opal/src/components/buttons/line-item-button/components.tsx +web/lib/opal/src/components/buttons/open-button/OpenButton.stories.tsx +web/lib/opal/src/components/buttons/open-button/README.md +web/lib/opal/src/components/buttons/open-button/components.tsx +web/lib/opal/src/components/buttons/select-button/README.md +web/lib/opal/src/components/buttons/select-button/components.tsx +web/lib/opal/src/components/buttons/select-button/styles.css +web/lib/opal/src/components/buttons/sidebar-tab/README.md +web/lib/opal/src/components/buttons/sidebar-tab/SidebarTab.stories.tsx +web/lib/opal/src/components/buttons/sidebar-tab/components.tsx +web/lib/opal/src/components/cards/card/Card.stories.tsx +web/lib/opal/src/components/cards/card/README.md +web/lib/opal/src/components/cards/card/components.tsx +web/lib/opal/src/components/cards/card/styles.css +web/lib/opal/src/components/cards/empty-message-card/EmptyMessageCard.stories.tsx +web/lib/opal/src/components/cards/empty-message-card/README.md +web/lib/opal/src/components/cards/empty-message-card/components.tsx +web/lib/opal/src/components/cards/select-card/README.md +web/lib/opal/src/components/cards/select-card/SelectCard.stories.tsx +web/lib/opal/src/components/cards/select-card/components.tsx +web/lib/opal/src/components/cards/select-card/styles.css +web/lib/opal/src/components/index.ts +web/lib/opal/src/components/pagination/Pagination.stories.tsx +web/lib/opal/src/components/pagination/README.md +web/lib/opal/src/components/pagination/components.tsx +web/lib/opal/src/components/table/ActionsContainer.tsx +web/lib/opal/src/components/table/ColumnSortabilityPopover.tsx +web/lib/opal/src/components/table/ColumnVisibilityPopover.tsx +web/lib/opal/src/components/table/DragOverlayRow.tsx +web/lib/opal/src/components/table/Footer.tsx +web/lib/opal/src/components/table/QualifierContainer.tsx +web/lib/opal/src/components/table/README.md +web/lib/opal/src/components/table/Table.stories.tsx +web/lib/opal/src/components/table/TableBody.tsx +web/lib/opal/src/components/table/TableCell.tsx +web/lib/opal/src/components/table/TableElement.tsx +web/lib/opal/src/components/table/TableHead.tsx +web/lib/opal/src/components/table/TableHeader.tsx +web/lib/opal/src/components/table/TableQualifier.tsx +web/lib/opal/src/components/table/TableRow.tsx +web/lib/opal/src/components/table/TableSizeContext.tsx +web/lib/opal/src/components/table/columns.ts +web/lib/opal/src/components/table/components.tsx +web/lib/opal/src/components/table/hooks/useColumnWidths.ts +web/lib/opal/src/components/table/hooks/useDataTable.ts +web/lib/opal/src/components/table/hooks/useDraggableRows.ts +web/lib/opal/src/components/table/styles.css +web/lib/opal/src/components/table/types.ts +web/lib/opal/src/components/tag/README.md +web/lib/opal/src/components/tag/Tag.stories.tsx +web/lib/opal/src/components/tag/components.tsx +web/lib/opal/src/components/tag/styles.css +web/lib/opal/src/components/text/InlineMarkdown.tsx +web/lib/opal/src/components/text/README.md +web/lib/opal/src/components/text/Text.stories.tsx +web/lib/opal/src/components/text/components.tsx +web/lib/opal/src/components/tooltip.css +web/lib/opal/src/core/README.md +web/lib/opal/src/core/animations/Hoverable.stories.tsx +web/lib/opal/src/core/animations/README.md +web/lib/opal/src/core/animations/components.tsx +web/lib/opal/src/core/animations/styles.css +web/lib/opal/src/core/disabled/components.tsx +web/lib/opal/src/core/disabled/styles.css +web/lib/opal/src/core/index.ts +web/lib/opal/src/core/interactive/Interactive.stories.tsx +web/lib/opal/src/core/interactive/README.md +web/lib/opal/src/core/interactive/container/README.md +web/lib/opal/src/core/interactive/container/components.tsx +web/lib/opal/src/core/interactive/foldable/README.md +web/lib/opal/src/core/interactive/foldable/components.tsx +web/lib/opal/src/core/interactive/foldable/styles.css +web/lib/opal/src/core/interactive/shared.css +web/lib/opal/src/core/interactive/simple/components.tsx +web/lib/opal/src/core/interactive/stateful/README.md +web/lib/opal/src/core/interactive/stateful/components.tsx +web/lib/opal/src/core/interactive/stateful/styles.css +web/lib/opal/src/core/interactive/stateless/README.md +web/lib/opal/src/core/interactive/stateless/components.tsx +web/lib/opal/src/core/interactive/stateless/styles.css +web/lib/opal/src/core/interactive/utils.ts +web/lib/opal/src/icons/actions.tsx +web/lib/opal/src/icons/activity-small.tsx +web/lib/opal/src/icons/activity.tsx +web/lib/opal/src/icons/add-lines.tsx +web/lib/opal/src/icons/alert-circle.tsx +web/lib/opal/src/icons/alert-triangle.tsx +web/lib/opal/src/icons/arrow-down-dot.tsx +web/lib/opal/src/icons/arrow-exchange.tsx +web/lib/opal/src/icons/arrow-left-dot.tsx +web/lib/opal/src/icons/arrow-left.tsx +web/lib/opal/src/icons/arrow-right-circle.tsx +web/lib/opal/src/icons/arrow-right-dot.tsx +web/lib/opal/src/icons/arrow-right.tsx +web/lib/opal/src/icons/arrow-up-circle.tsx +web/lib/opal/src/icons/arrow-up-dot.tsx +web/lib/opal/src/icons/arrow-up-down.tsx +web/lib/opal/src/icons/arrow-up-right.tsx +web/lib/opal/src/icons/arrow-up.tsx +web/lib/opal/src/icons/arrow-wall-right.tsx +web/lib/opal/src/icons/audio-eq-small.tsx +web/lib/opal/src/icons/audio.tsx +web/lib/opal/src/icons/bar-chart-small.tsx +web/lib/opal/src/icons/bar-chart.tsx +web/lib/opal/src/icons/bell.tsx +web/lib/opal/src/icons/blocks.tsx +web/lib/opal/src/icons/book-open.tsx +web/lib/opal/src/icons/bookmark.tsx +web/lib/opal/src/icons/books-line-small.tsx +web/lib/opal/src/icons/books-stack-small.tsx +web/lib/opal/src/icons/bracket-curly.tsx +web/lib/opal/src/icons/branch.tsx +web/lib/opal/src/icons/bubble-text.tsx +web/lib/opal/src/icons/calendar.tsx +web/lib/opal/src/icons/check-circle.tsx +web/lib/opal/src/icons/check-small.tsx +web/lib/opal/src/icons/check-square.tsx +web/lib/opal/src/icons/check.tsx +web/lib/opal/src/icons/chevron-down-small.tsx +web/lib/opal/src/icons/chevron-down.tsx +web/lib/opal/src/icons/chevron-left.tsx +web/lib/opal/src/icons/chevron-right.tsx +web/lib/opal/src/icons/chevron-up-small.tsx +web/lib/opal/src/icons/chevron-up.tsx +web/lib/opal/src/icons/circle.tsx +web/lib/opal/src/icons/clipboard.tsx +web/lib/opal/src/icons/clock-hands-small.tsx +web/lib/opal/src/icons/clock.tsx +web/lib/opal/src/icons/cloud.tsx +web/lib/opal/src/icons/code.tsx +web/lib/opal/src/icons/column.tsx +web/lib/opal/src/icons/copy.tsx +web/lib/opal/src/icons/corner-right-up-dot.tsx +web/lib/opal/src/icons/cpu.tsx +web/lib/opal/src/icons/credit-card.tsx +web/lib/opal/src/icons/curate.tsx +web/lib/opal/src/icons/dashboard.tsx +web/lib/opal/src/icons/dev-kit.tsx +web/lib/opal/src/icons/discord.tsx +web/lib/opal/src/icons/download-cloud.tsx +web/lib/opal/src/icons/download.tsx +web/lib/opal/src/icons/edit-big.tsx +web/lib/opal/src/icons/edit.tsx +web/lib/opal/src/icons/empty.tsx +web/lib/opal/src/icons/expand.tsx +web/lib/opal/src/icons/external-link.tsx +web/lib/opal/src/icons/eye-closed.tsx +web/lib/opal/src/icons/eye-off.tsx +web/lib/opal/src/icons/eye.tsx +web/lib/opal/src/icons/file-braces.tsx +web/lib/opal/src/icons/file-broadcast.tsx +web/lib/opal/src/icons/file-chart-pie.tsx +web/lib/opal/src/icons/file-small.tsx +web/lib/opal/src/icons/file-text.tsx +web/lib/opal/src/icons/files.tsx +web/lib/opal/src/icons/filter-plus.tsx +web/lib/opal/src/icons/filter.tsx +web/lib/opal/src/icons/fold.tsx +web/lib/opal/src/icons/folder-in.tsx +web/lib/opal/src/icons/folder-open.tsx +web/lib/opal/src/icons/folder-partial-open.tsx +web/lib/opal/src/icons/folder-plus.tsx +web/lib/opal/src/icons/folder.tsx +web/lib/opal/src/icons/globe.tsx +web/lib/opal/src/icons/handle.tsx +web/lib/opal/src/icons/hard-drive.tsx +web/lib/opal/src/icons/hash-small.tsx +web/lib/opal/src/icons/hash.tsx +web/lib/opal/src/icons/headset-mic.tsx +web/lib/opal/src/icons/history.tsx +web/lib/opal/src/icons/hourglass.tsx +web/lib/opal/src/icons/icons.stories.tsx +web/lib/opal/src/icons/image-small.tsx +web/lib/opal/src/icons/image.tsx +web/lib/opal/src/icons/import-icon.tsx +web/lib/opal/src/icons/index.ts +web/lib/opal/src/icons/info-small.tsx +web/lib/opal/src/icons/info.tsx +web/lib/opal/src/icons/key.tsx +web/lib/opal/src/icons/keystroke.tsx +web/lib/opal/src/icons/lightbulb-simple.tsx +web/lib/opal/src/icons/line-chart-up.tsx +web/lib/opal/src/icons/link.tsx +web/lib/opal/src/icons/linked-dots.tsx +web/lib/opal/src/icons/loader.tsx +web/lib/opal/src/icons/lock.tsx +web/lib/opal/src/icons/log-out.tsx +web/lib/opal/src/icons/maximize-2.tsx +web/lib/opal/src/icons/mcp.tsx +web/lib/opal/src/icons/menu.tsx +web/lib/opal/src/icons/microphone-off.tsx +web/lib/opal/src/icons/microphone.tsx +web/lib/opal/src/icons/minus-circle.tsx +web/lib/opal/src/icons/minus.tsx +web/lib/opal/src/icons/moon.tsx +web/lib/opal/src/icons/more-horizontal.tsx +web/lib/opal/src/icons/music-small.tsx +web/lib/opal/src/icons/network-graph.tsx +web/lib/opal/src/icons/notification-bubble.tsx +web/lib/opal/src/icons/onyx-octagon.tsx +web/lib/opal/src/icons/organization.tsx +web/lib/opal/src/icons/paint-brush.tsx +web/lib/opal/src/icons/paperclip.tsx +web/lib/opal/src/icons/pause-circle.tsx +web/lib/opal/src/icons/pen-small.tsx +web/lib/opal/src/icons/pencil-ruler.tsx +web/lib/opal/src/icons/pie-chart.tsx +web/lib/opal/src/icons/pin.tsx +web/lib/opal/src/icons/pinned.tsx +web/lib/opal/src/icons/play-circle.tsx +web/lib/opal/src/icons/plug.tsx +web/lib/opal/src/icons/plus-circle.tsx +web/lib/opal/src/icons/plus.tsx +web/lib/opal/src/icons/progress-bars.tsx +web/lib/opal/src/icons/progress-circle.tsx +web/lib/opal/src/icons/question-mark-small.tsx +web/lib/opal/src/icons/quote-end.tsx +web/lib/opal/src/icons/quote-start.tsx +web/lib/opal/src/icons/refresh-cw.tsx +web/lib/opal/src/icons/revert.tsx +web/lib/opal/src/icons/search-menu.tsx +web/lib/opal/src/icons/search-small.tsx +web/lib/opal/src/icons/search.tsx +web/lib/opal/src/icons/server.tsx +web/lib/opal/src/icons/settings.tsx +web/lib/opal/src/icons/share-webhook.tsx +web/lib/opal/src/icons/share.tsx +web/lib/opal/src/icons/shield.tsx +web/lib/opal/src/icons/sidebar.tsx +web/lib/opal/src/icons/slack.tsx +web/lib/opal/src/icons/slash.tsx +web/lib/opal/src/icons/sliders-small.tsx +web/lib/opal/src/icons/sliders.tsx +web/lib/opal/src/icons/sort-order.tsx +web/lib/opal/src/icons/sort.tsx +web/lib/opal/src/icons/sparkle.tsx +web/lib/opal/src/icons/star-off.tsx +web/lib/opal/src/icons/star.tsx +web/lib/opal/src/icons/step1.tsx +web/lib/opal/src/icons/step2.tsx +web/lib/opal/src/icons/step3-end.tsx +web/lib/opal/src/icons/step3.tsx +web/lib/opal/src/icons/stop-circle.tsx +web/lib/opal/src/icons/stop.tsx +web/lib/opal/src/icons/sun.tsx +web/lib/opal/src/icons/tag.tsx +web/lib/opal/src/icons/terminal-small.tsx +web/lib/opal/src/icons/terminal.tsx +web/lib/opal/src/icons/text-lines-small.tsx +web/lib/opal/src/icons/text-lines.tsx +web/lib/opal/src/icons/thumbs-down.tsx +web/lib/opal/src/icons/thumbs-up.tsx +web/lib/opal/src/icons/trash.tsx +web/lib/opal/src/icons/two-line-small.tsx +web/lib/opal/src/icons/unplug.tsx +web/lib/opal/src/icons/upload-cloud.tsx +web/lib/opal/src/icons/upload-square.tsx +web/lib/opal/src/icons/user-check.tsx +web/lib/opal/src/icons/user-edit.tsx +web/lib/opal/src/icons/user-key.tsx +web/lib/opal/src/icons/user-manage.tsx +web/lib/opal/src/icons/user-minus.tsx +web/lib/opal/src/icons/user-plus.tsx +web/lib/opal/src/icons/user-shield.tsx +web/lib/opal/src/icons/user-speaker.tsx +web/lib/opal/src/icons/user-sync.tsx +web/lib/opal/src/icons/user-x.tsx +web/lib/opal/src/icons/user.tsx +web/lib/opal/src/icons/users.tsx +web/lib/opal/src/icons/volume-off.tsx +web/lib/opal/src/icons/volume.tsx +web/lib/opal/src/icons/wallet.tsx +web/lib/opal/src/icons/workflow.tsx +web/lib/opal/src/icons/x-circle.tsx +web/lib/opal/src/icons/x-octagon.tsx +web/lib/opal/src/icons/x.tsx +web/lib/opal/src/icons/zoom-in.tsx +web/lib/opal/src/icons/zoom-out.tsx +web/lib/opal/src/illustrations/broken-key.tsx +web/lib/opal/src/illustrations/connect.tsx +web/lib/opal/src/illustrations/connected.tsx +web/lib/opal/src/illustrations/disconnected.tsx +web/lib/opal/src/illustrations/empty.tsx +web/lib/opal/src/illustrations/end-of-line.tsx +web/lib/opal/src/illustrations/illustrations.stories.tsx +web/lib/opal/src/illustrations/index.ts +web/lib/opal/src/illustrations/limit-alert.tsx +web/lib/opal/src/illustrations/long-wait.tsx +web/lib/opal/src/illustrations/no-access.tsx +web/lib/opal/src/illustrations/no-result.tsx +web/lib/opal/src/illustrations/not-found.tsx +web/lib/opal/src/illustrations/overflow.tsx +web/lib/opal/src/illustrations/plug-broken.tsx +web/lib/opal/src/illustrations/timeout.tsx +web/lib/opal/src/illustrations/un-plugged.tsx +web/lib/opal/src/illustrations/usage-alert.tsx +web/lib/opal/src/index.ts +web/lib/opal/src/layouts/README.md +web/lib/opal/src/layouts/cards/CardHeaderLayout.stories.tsx +web/lib/opal/src/layouts/cards/README.md +web/lib/opal/src/layouts/cards/components.tsx +web/lib/opal/src/layouts/content-action/ContentAction.stories.tsx +web/lib/opal/src/layouts/content-action/README.md +web/lib/opal/src/layouts/content-action/components.tsx +web/lib/opal/src/layouts/content/Content.stories.tsx +web/lib/opal/src/layouts/content/ContentLg.tsx +web/lib/opal/src/layouts/content/ContentMd.tsx +web/lib/opal/src/layouts/content/ContentSm.tsx +web/lib/opal/src/layouts/content/ContentXl.tsx +web/lib/opal/src/layouts/content/README.md +web/lib/opal/src/layouts/content/components.tsx +web/lib/opal/src/layouts/content/styles.css +web/lib/opal/src/layouts/illustration-content/IllustrationContent.stories.tsx +web/lib/opal/src/layouts/illustration-content/README.md +web/lib/opal/src/layouts/illustration-content/components.tsx +web/lib/opal/src/layouts/index.ts +web/lib/opal/src/logos/anthropic.tsx +web/lib/opal/src/logos/aws.tsx +web/lib/opal/src/logos/azure.tsx +web/lib/opal/src/logos/bifrost.tsx +web/lib/opal/src/logos/claude.tsx +web/lib/opal/src/logos/deepseek.tsx +web/lib/opal/src/logos/discord.tsx +web/lib/opal/src/logos/gemini.tsx +web/lib/opal/src/logos/google.tsx +web/lib/opal/src/logos/index.ts +web/lib/opal/src/logos/litellm.tsx +web/lib/opal/src/logos/lm-studio.tsx +web/lib/opal/src/logos/logos.stories.tsx +web/lib/opal/src/logos/microsoft.tsx +web/lib/opal/src/logos/mistral.tsx +web/lib/opal/src/logos/ollama.tsx +web/lib/opal/src/logos/onyx-logo-typed.tsx +web/lib/opal/src/logos/onyx-logo.tsx +web/lib/opal/src/logos/onyx-typed.tsx +web/lib/opal/src/logos/openai.tsx +web/lib/opal/src/logos/openrouter.tsx +web/lib/opal/src/logos/qwen.tsx +web/lib/opal/src/logos/slack.tsx +web/lib/opal/src/shared.ts +web/lib/opal/src/types.ts +web/lib/opal/src/utils.ts +web/lib/opal/tsconfig.json +web/next.config.js +web/package-lock.json +web/package.json +web/playwright.config.ts +web/public/Box.png +web/public/Brave.svg +web/public/Coda.png +web/public/DrupalWiki.png +web/public/EEA_logo_compact_EN.svg +web/public/ElevenLabs.svg +web/public/ElevenLabsDark.svg +web/public/OneDrive.png +web/public/Outlook.png +web/public/SearXNG.svg +web/public/Servicenow.png +web/public/Trello.png +web/public/chat-backgrounds/clouds.jpg +web/public/chat-backgrounds/hills.jpg +web/public/chat-backgrounds/mountains.jpg +web/public/chat-backgrounds/night.jpg +web/public/chat-backgrounds/plant.jpg +web/public/chat-backgrounds/thumbnails/clouds.jpg +web/public/chat-backgrounds/thumbnails/hills.jpg +web/public/chat-backgrounds/thumbnails/mountains.jpg +web/public/chat-backgrounds/thumbnails/night.jpg +web/public/chat-backgrounds/thumbnails/plant.jpg +web/public/craft_demo_image_1.png +web/public/craft_demo_image_2.png +web/public/craft_suggested_image_1.png +web/public/craft_suggested_image_2.png +web/public/craft_suggested_image_3.png +web/public/craft_suggested_image_4.png +web/public/craft_suggested_image_5.png +web/public/eea_logo.png +web/public/fonts/KHTeka-Medium.otf +web/public/lm_studio.png +web/sentry.edge.config.ts +web/sentry.server.config.ts +web/src/app/admin/actions/ActionEditor.tsx +web/src/app/admin/actions/ActionTable.tsx +web/src/app/admin/actions/edit-mcp/page.tsx +web/src/app/admin/actions/edit/[toolId]/DeleteToolButton.tsx +web/src/app/admin/actions/edit/[toolId]/page.tsx +web/src/app/admin/actions/mcp/page.tsx +web/src/app/admin/actions/new/page.tsx +web/src/app/admin/actions/open-api/page.tsx +web/src/app/admin/actions/page.tsx +web/src/app/admin/add-connector/page.tsx +web/src/app/admin/agents/interfaces.ts +web/src/app/admin/agents/lib.ts +web/src/app/admin/agents/page.tsx +web/src/app/admin/api-key/OnyxApiKeyForm.tsx +web/src/app/admin/api-key/lib.ts +web/src/app/admin/api-key/page.tsx +web/src/app/admin/api-key/types.ts +web/src/app/admin/assistants/AssistantEditor.tsx +web/src/app/admin/assistants/CollapsibleSection.tsx +web/src/app/admin/assistants/PersonaTable.tsx +web/src/app/admin/assistants/StarterMessageList.tsx +web/src/app/admin/assistants/hooks.ts +web/src/app/admin/assistants/interfaces.ts +web/src/app/admin/assistants/lib.ts +web/src/app/admin/assistants/page.tsx +web/src/app/admin/billing/BillingDetailsView.tsx +web/src/app/admin/billing/CheckoutView.tsx +web/src/app/admin/billing/LicenseActivationCard.tsx +web/src/app/admin/billing/PlansView.tsx +web/src/app/admin/billing/billing.css +web/src/app/admin/billing/page.test.tsx +web/src/app/admin/billing/page.tsx +web/src/app/admin/bots/SlackBotCreationForm.tsx +web/src/app/admin/bots/SlackBotTable.tsx +web/src/app/admin/bots/SlackBotUpdateForm.tsx +web/src/app/admin/bots/SlackTokensForm.tsx +web/src/app/admin/bots/[bot-id]/SlackChannelConfigsTable.tsx +web/src/app/admin/bots/[bot-id]/channels/SlackChannelConfigCreationForm.tsx +web/src/app/admin/bots/[bot-id]/channels/SlackChannelConfigFormFields.tsx +web/src/app/admin/bots/[bot-id]/channels/[id]/page.tsx +web/src/app/admin/bots/[bot-id]/channels/new/page.tsx +web/src/app/admin/bots/[bot-id]/hooks.ts +web/src/app/admin/bots/[bot-id]/lib.ts +web/src/app/admin/bots/[bot-id]/page.tsx +web/src/app/admin/bots/new/page.tsx +web/src/app/admin/bots/page.tsx +web/src/app/admin/configuration/chat-preferences/page.tsx +web/src/app/admin/configuration/code-interpreter/page.tsx +web/src/app/admin/configuration/default-assistant/page.tsx +web/src/app/admin/configuration/document-processing/page.tsx +web/src/app/admin/configuration/image-generation/page.tsx +web/src/app/admin/configuration/llm/ConfiguredLLMProviderDisplay.tsx +web/src/app/admin/configuration/llm/CustomLLMProviderUpdateForm.test.tsx +web/src/app/admin/configuration/llm/CustomLLMProviderUpdateForm.tsx +web/src/app/admin/configuration/llm/LLMConfiguration.tsx +web/src/app/admin/configuration/llm/LLMProviderUpdateForm.tsx +web/src/app/admin/configuration/llm/ModelConfigurationField.tsx +web/src/app/admin/configuration/llm/ModelIcon.tsx +web/src/app/admin/configuration/llm/constants.ts +web/src/app/admin/configuration/llm/interfaces.ts +web/src/app/admin/configuration/llm/page.tsx +web/src/app/admin/configuration/llm/utils.ts +web/src/app/admin/configuration/search/UpgradingPage.tsx +web/src/app/admin/configuration/search/page.tsx +web/src/app/admin/configuration/voice/VoiceProviderSetupModal.tsx +web/src/app/admin/configuration/voice/page.tsx +web/src/app/admin/configuration/web-search/page.tsx +web/src/app/admin/connector/[ccPairId]/ConfigDisplay.tsx +web/src/app/admin/connector/[ccPairId]/IndexAttemptErrorsModal.tsx +web/src/app/admin/connector/[ccPairId]/IndexAttemptsTable.tsx +web/src/app/admin/connector/[ccPairId]/InlineFileManagement.tsx +web/src/app/admin/connector/[ccPairId]/ReIndexModal.tsx +web/src/app/admin/connector/[ccPairId]/ReIndexPopup.tsx +web/src/app/admin/connector/[ccPairId]/lib.ts +web/src/app/admin/connector/[ccPairId]/page.tsx +web/src/app/admin/connector/[ccPairId]/useStatusChange.tsx +web/src/app/admin/connectors/[connector]/AddConnectorPage.tsx +web/src/app/admin/connectors/[connector]/ConnectorWrapper.tsx +web/src/app/admin/connectors/[connector]/NavigationRow.tsx +web/src/app/admin/connectors/[connector]/auth/callback/route.ts +web/src/app/admin/connectors/[connector]/oauth/callback/page.tsx +web/src/app/admin/connectors/[connector]/oauth/finalize/page.tsx +web/src/app/admin/connectors/[connector]/pages/Advanced.tsx +web/src/app/admin/connectors/[connector]/pages/FieldRendering.tsx +web/src/app/admin/connectors/[connector]/pages/gdrive/Credential.tsx +web/src/app/admin/connectors/[connector]/pages/gdrive/GoogleDrivePage.tsx +web/src/app/admin/connectors/[connector]/pages/gmail/Credential.tsx +web/src/app/admin/connectors/[connector]/pages/gmail/GmailPage.tsx +web/src/app/admin/connectors/[connector]/pages/utils/files.ts +web/src/app/admin/connectors/[connector]/pages/utils/google_site.ts +web/src/app/admin/debug/page.tsx +web/src/app/admin/discord-bot/BotConfigCard.tsx +web/src/app/admin/discord-bot/DiscordGuildsTable.tsx +web/src/app/admin/discord-bot/[guild-id]/DiscordChannelsTable.tsx +web/src/app/admin/discord-bot/[guild-id]/page.tsx +web/src/app/admin/discord-bot/hooks.ts +web/src/app/admin/discord-bot/lib.ts +web/src/app/admin/discord-bot/page.tsx +web/src/app/admin/discord-bot/types.ts +web/src/app/admin/document-index-migration/page.tsx +web/src/app/admin/documents/ScoreEditor.tsx +web/src/app/admin/documents/explorer/DocumentExplorerPage.tsx +web/src/app/admin/documents/explorer/Explorer.tsx +web/src/app/admin/documents/explorer/page.tsx +web/src/app/admin/documents/feedback/DocumentFeedbackTable.tsx +web/src/app/admin/documents/feedback/page.tsx +web/src/app/admin/documents/sets/DocumentSetCreationForm.tsx +web/src/app/admin/documents/sets/[documentSetId]/page.tsx +web/src/app/admin/documents/sets/hooks.tsx +web/src/app/admin/documents/sets/new/page.tsx +web/src/app/admin/documents/sets/page.tsx +web/src/app/admin/eea_config/pages/[pageTitle]/page.tsx +web/src/app/admin/eea_config/pages/hooks.tsx +web/src/app/admin/eea_config/pages/lib.tsx +web/src/app/admin/eea_config/pages/new/page.tsx +web/src/app/admin/eea_config/pages/page.tsx +web/src/app/admin/embeddings/EmbeddingModelSelectionForm.tsx +web/src/app/admin/embeddings/RerankingFormPage.tsx +web/src/app/admin/embeddings/modals/AlreadyPickedModal.tsx +web/src/app/admin/embeddings/modals/ChangeCredentialsModal.tsx +web/src/app/admin/embeddings/modals/DeleteCredentialsModal.tsx +web/src/app/admin/embeddings/modals/InstantSwitchConfirmModal.tsx +web/src/app/admin/embeddings/modals/ModelSelectionModal.tsx +web/src/app/admin/embeddings/modals/ProviderCreationModal.tsx +web/src/app/admin/embeddings/modals/SelectModelModal.tsx +web/src/app/admin/embeddings/pages/AdvancedEmbeddingFormPage.tsx +web/src/app/admin/embeddings/pages/CloudEmbeddingPage.tsx +web/src/app/admin/embeddings/pages/EmbeddingFormPage.tsx +web/src/app/admin/embeddings/pages/OpenEmbeddingPage.tsx +web/src/app/admin/groups/[id]/page.tsx +web/src/app/admin/groups/create/page.tsx +web/src/app/admin/groups/page.tsx +web/src/app/admin/groups2/[id]/page.tsx +web/src/app/admin/groups2/create/page.tsx +web/src/app/admin/groups2/page.tsx +web/src/app/admin/hooks/page.tsx +web/src/app/admin/indexing/status/CCPairIndexingStatusTable.tsx +web/src/app/admin/indexing/status/FilterComponent.tsx +web/src/app/admin/indexing/status/SearchAndFilterControls.tsx +web/src/app/admin/indexing/status/page.tsx +web/src/app/admin/kg/KGEntityTypes.tsx +web/src/app/admin/kg/page.tsx +web/src/app/admin/kg/utils.ts +web/src/app/admin/oauth-configs/OAuthConfigForm.tsx +web/src/app/admin/scim/ScimModal.tsx +web/src/app/admin/scim/ScimSyncCard.tsx +web/src/app/admin/scim/interfaces.ts +web/src/app/admin/scim/page.tsx +web/src/app/admin/scim/svc.ts +web/src/app/admin/service-accounts/page.tsx +web/src/app/admin/settings/AnonymousUserPath.tsx +web/src/app/admin/settings/SettingsForm.tsx +web/src/app/admin/settings/hooks/useVisionProviders.ts +web/src/app/admin/settings/interfaces.ts +web/src/app/admin/settings/page.tsx +web/src/app/admin/token-rate-limits/CreateRateLimitModal.tsx +web/src/app/admin/token-rate-limits/TokenRateLimitTables.tsx +web/src/app/admin/token-rate-limits/page.tsx +web/src/app/admin/users/page.tsx +web/src/app/anonymous/[id]/AnonymousPage.tsx +web/src/app/api/[...path]/route.ts +web/src/app/api/chat/mcp/oauth/callback/route.ts +web/src/app/app/agents/create/page.tsx +web/src/app/app/agents/edit/[id]/page.tsx +web/src/app/app/agents/page.tsx +web/src/app/app/components/AgentDescription.tsx +web/src/app/app/components/AppPopup.tsx +web/src/app/app/components/WelcomeMessage.tsx +web/src/app/app/components/files/InputBarPreview.tsx +web/src/app/app/components/files/images/FullImageModal.tsx +web/src/app/app/components/files/images/InMessageImage.tsx +web/src/app/app/components/files/images/utils.ts +web/src/app/app/components/folders/FolderDropdown.tsx +web/src/app/app/components/folders/interfaces.ts +web/src/app/app/components/projects/ProjectChatSessionList.tsx +web/src/app/app/components/projects/ProjectContextPanel.tsx +web/src/app/app/components/tools/constants.ts +web/src/app/app/interfaces.ts +web/src/app/app/layout.tsx +web/src/app/app/message/BlinkingBar.tsx +web/src/app/app/message/CodeBlock.tsx +web/src/app/app/message/FileDisplay.tsx +web/src/app/app/message/HumanMessage.tsx +web/src/app/app/message/MemoizedTextComponents.tsx +web/src/app/app/message/MessageSwitcher.tsx +web/src/app/app/message/MultiModelPanel.tsx +web/src/app/app/message/MultiModelResponseView.tsx +web/src/app/app/message/Resubmit.tsx +web/src/app/app/message/copyingUtils.tsx +web/src/app/app/message/custom-code-styles.css +web/src/app/app/message/errorHelpers.tsx +web/src/app/app/message/interfaces.ts +web/src/app/app/message/messageComponents/AgentMessage.tsx +web/src/app/app/message/messageComponents/CustomToolAuthCard.tsx +web/src/app/app/message/messageComponents/MessageToolbar.tsx +web/src/app/app/message/messageComponents/TTSButton.tsx +web/src/app/app/message/messageComponents/hooks/useAuthErrors.ts +web/src/app/app/message/messageComponents/hooks/useMessageSwitching.ts +web/src/app/app/message/messageComponents/hooks/usePacketAnimationAndCollapse.ts +web/src/app/app/message/messageComponents/interfaces.ts +web/src/app/app/message/messageComponents/markdownUtils.tsx +web/src/app/app/message/messageComponents/renderMessageComponent.tsx +web/src/app/app/message/messageComponents/renderers/CustomToolRenderer.tsx +web/src/app/app/message/messageComponents/renderers/ImageToolRenderer.tsx +web/src/app/app/message/messageComponents/renderers/MessageTextRenderer.tsx +web/src/app/app/message/messageComponents/timeline/AgentTimeline.tsx +web/src/app/app/message/messageComponents/timeline/CollapsedStreamingContent.tsx +web/src/app/app/message/messageComponents/timeline/ExpandedTimelineContent.tsx +web/src/app/app/message/messageComponents/timeline/ParallelTimelineTabs.tsx +web/src/app/app/message/messageComponents/timeline/StepContainer.tsx +web/src/app/app/message/messageComponents/timeline/TimelineRendererComponent.tsx +web/src/app/app/message/messageComponents/timeline/TimelineStepComposer.tsx +web/src/app/app/message/messageComponents/timeline/headers/CompletedHeader.tsx +web/src/app/app/message/messageComponents/timeline/headers/ParallelStreamingHeader.tsx +web/src/app/app/message/messageComponents/timeline/headers/StoppedHeader.tsx +web/src/app/app/message/messageComponents/timeline/headers/StreamingHeader.tsx +web/src/app/app/message/messageComponents/timeline/hooks/__tests__/testHelpers.ts +web/src/app/app/message/messageComponents/timeline/hooks/packetProcessor.test.ts +web/src/app/app/message/messageComponents/timeline/hooks/packetProcessor.ts +web/src/app/app/message/messageComponents/timeline/hooks/usePacedTurnGroups.test.tsx +web/src/app/app/message/messageComponents/timeline/hooks/usePacedTurnGroups.ts +web/src/app/app/message/messageComponents/timeline/hooks/usePacketProcessor.test.tsx +web/src/app/app/message/messageComponents/timeline/hooks/usePacketProcessor.ts +web/src/app/app/message/messageComponents/timeline/hooks/useStreamingDuration.ts +web/src/app/app/message/messageComponents/timeline/hooks/useTimelineExpansion.ts +web/src/app/app/message/messageComponents/timeline/hooks/useTimelineHeader.ts +web/src/app/app/message/messageComponents/timeline/hooks/useTimelineMetrics.ts +web/src/app/app/message/messageComponents/timeline/hooks/useTimelineStepState.ts +web/src/app/app/message/messageComponents/timeline/hooks/useTimelineUIState.ts +web/src/app/app/message/messageComponents/timeline/packetHelpers.ts +web/src/app/app/message/messageComponents/timeline/primitives/TimelineHeaderRow.tsx +web/src/app/app/message/messageComponents/timeline/primitives/TimelineIconColumn.tsx +web/src/app/app/message/messageComponents/timeline/primitives/TimelineRoot.tsx +web/src/app/app/message/messageComponents/timeline/primitives/TimelineRow.tsx +web/src/app/app/message/messageComponents/timeline/primitives/TimelineStepContent.tsx +web/src/app/app/message/messageComponents/timeline/primitives/TimelineSurface.tsx +web/src/app/app/message/messageComponents/timeline/primitives/TimelineTopSpacer.tsx +web/src/app/app/message/messageComponents/timeline/primitives/tokens.ts +web/src/app/app/message/messageComponents/timeline/renderers/code/PythonToolRenderer.tsx +web/src/app/app/message/messageComponents/timeline/renderers/deepresearch/DeepResearchPlanRenderer.tsx +web/src/app/app/message/messageComponents/timeline/renderers/deepresearch/ResearchAgentRenderer.tsx +web/src/app/app/message/messageComponents/timeline/renderers/fetch/FetchToolRenderer.tsx +web/src/app/app/message/messageComponents/timeline/renderers/fetch/fetchStateUtils.ts +web/src/app/app/message/messageComponents/timeline/renderers/filereader/FileReaderToolRenderer.tsx +web/src/app/app/message/messageComponents/timeline/renderers/memory/MemoryToolRenderer.tsx +web/src/app/app/message/messageComponents/timeline/renderers/memory/memoryStateUtils.ts +web/src/app/app/message/messageComponents/timeline/renderers/reasoning/ReasoningRenderer.tsx +web/src/app/app/message/messageComponents/timeline/renderers/search/InternalSearchToolRenderer.tsx +web/src/app/app/message/messageComponents/timeline/renderers/search/SearchChipList.tsx +web/src/app/app/message/messageComponents/timeline/renderers/search/WebSearchToolRenderer.tsx +web/src/app/app/message/messageComponents/timeline/renderers/search/searchStateUtils.ts +web/src/app/app/message/messageComponents/timeline/renderers/sharedMarkdownComponents.tsx +web/src/app/app/message/messageComponents/timeline/transformers.ts +web/src/app/app/message/messageComponents/timing.ts +web/src/app/app/message/messageComponents/toolDisplayHelpers.tsx +web/src/app/app/page.tsx +web/src/app/app/projects/projectsService.ts +web/src/app/app/services/actionUtils.ts +web/src/app/app/services/fileUtils.ts +web/src/app/app/services/lib.tsx +web/src/app/app/services/messageTree.ts +web/src/app/app/services/packetUtils.test.ts +web/src/app/app/services/packetUtils.ts +web/src/app/app/services/searchParams.ts +web/src/app/app/services/streamingModels.ts +web/src/app/app/settings/accounts-access/page.tsx +web/src/app/app/settings/chat-preferences/page.tsx +web/src/app/app/settings/connectors/page.tsx +web/src/app/app/settings/general/page.tsx +web/src/app/app/settings/layout.tsx +web/src/app/app/settings/page.tsx +web/src/app/app/shared/[chatId]/SharedChatDisplay.tsx +web/src/app/app/shared/[chatId]/page.tsx +web/src/app/app/stores/useChatSessionStore.ts +web/src/app/assistants/AssistantSharedStatus.tsx +web/src/app/assistants/ToolsDisplay.tsx +web/src/app/assistants/edit/[id]/page.tsx +web/src/app/assistants/new/page.tsx +web/src/app/auth/create-account/page.tsx +web/src/app/auth/error/AuthErrorContent.tsx +web/src/app/auth/error/layout.tsx +web/src/app/auth/error/page.tsx +web/src/app/auth/forgot-password/page.tsx +web/src/app/auth/impersonate/page.tsx +web/src/app/auth/join/page.tsx +web/src/app/auth/libSS.ts +web/src/app/auth/login/EmailPasswordForm.test.tsx +web/src/app/auth/login/EmailPasswordForm.tsx +web/src/app/auth/login/LoginPage.tsx +web/src/app/auth/login/LoginText.tsx +web/src/app/auth/login/SignInButton.tsx +web/src/app/auth/login/page.tsx +web/src/app/auth/logout/route.ts +web/src/app/auth/oauth/callback/route.ts +web/src/app/auth/oidc/callback/route.ts +web/src/app/auth/reset-password/page.tsx +web/src/app/auth/saml/callback/route.ts +web/src/app/auth/signup/ReferralSourceSelector.tsx +web/src/app/auth/signup/page.tsx +web/src/app/auth/verify-email/Verify.tsx +web/src/app/auth/verify-email/page.tsx +web/src/app/auth/waiting-on-verification/RequestNewVerificationEmail.tsx +web/src/app/auth/waiting-on-verification/page.tsx +web/src/app/chat/agents/page.tsx +web/src/app/chat/chat_search/ChatSearchGroup.tsx +web/src/app/chat/chat_search/ChatSearchItem.tsx +web/src/app/chat/chat_search/ChatSearchModal.tsx +web/src/app/chat/chat_search/LoadingSpinner.tsx +web/src/app/chat/chat_search/NewChatButton.tsx +web/src/app/chat/chat_search/components/ChatSearchSkeleton.tsx +web/src/app/chat/chat_search/components/SearchInput.tsx +web/src/app/chat/chat_search/hooks/useChatSearch.ts +web/src/app/chat/chat_search/hooks/useIntersectionObserver.ts +web/src/app/chat/chat_search/interfaces.ts +web/src/app/chat/chat_search/utils.ts +web/src/app/chat/components/ChatPage.tsx +web/src/app/chat/components/ChatPopup.tsx +web/src/app/chat/components/MessagesDisplay.tsx +web/src/app/chat/components/SourceChip2.tsx +web/src/app/chat/components/WelcomeMessage.tsx +web/src/app/chat/components/documentSidebar/ChatDocumentDisplay.tsx +web/src/app/chat/components/documentSidebar/DocumentResults.tsx +web/src/app/chat/components/documentSidebar/DocumentSelector.tsx +web/src/app/chat/components/files/InputBarPreview.tsx +web/src/app/chat/components/files/images/FullImageModal.tsx +web/src/app/chat/components/files/images/InMessageImage.tsx +web/src/app/chat/components/files/images/InputBarPreviewImage.tsx +web/src/app/chat/components/files/images/utils.ts +web/src/app/chat/components/folders/FolderDropdown.tsx +web/src/app/chat/components/folders/interfaces.ts +web/src/app/chat/components/input/ChatInputBar.tsx +web/src/app/chat/components/input/ChatInputOption.tsx +web/src/app/chat/components/input/FileCard.tsx +web/src/app/chat/components/input/FilterDisplay.tsx +web/src/app/chat/components/input/FilterPills.tsx +web/src/app/chat/components/input/SimplifiedChatInputBar.tsx +web/src/app/chat/components/modal/FeedbackModal.tsx +web/src/app/chat/components/modal/ShareChatSessionModal.tsx +web/src/app/chat/components/modifiers/SelectedDocuments.tsx +web/src/app/chat/components/projects/ProjectChatSessionList.tsx +web/src/app/chat/components/projects/ProjectContextPanel.tsx +web/src/app/chat/components/projects/project_utils.ts +web/src/app/chat/components/tools/GeneratingImageDisplay.tsx +web/src/app/chat/components/tools/constants.ts +web/src/app/chat/hooks/useAssistantController.ts +web/src/app/chat/hooks/useAssistantPreferences.ts +web/src/app/chat/hooks/useChatController.ts +web/src/app/chat/hooks/useChatSessionController.ts +web/src/app/chat/hooks/useDeepResearchToggle.ts +web/src/app/chat/hooks/useFeedbackController.ts +web/src/app/chat/input-prompts/InputPrompts.test.tsx +web/src/app/chat/input-prompts/InputPrompts.tsx +web/src/app/chat/input-prompts/page.tsx +web/src/app/chat/interfaces.ts +web/src/app/chat/layout.tsx +web/src/app/chat/message/BlinkingDot.tsx +web/src/app/chat/message/CodeBlock.tsx +web/src/app/chat/message/HumanMessage.tsx +web/src/app/chat/message/MemoizedHumanMessage.tsx +web/src/app/chat/message/MemoizedTextComponents.tsx +web/src/app/chat/message/MessageSwitcher.tsx +web/src/app/chat/message/Resubmit.tsx +web/src/app/chat/message/codeUtils.test.ts +web/src/app/chat/message/codeUtils.ts +web/src/app/chat/message/copyingUtils.tsx +web/src/app/chat/message/custom-code-styles.css +web/src/app/chat/message/hooks.ts +web/src/app/chat/message/messageComponents/AIMessage.tsx +web/src/app/chat/message/messageComponents/CitedSourcesToggle.tsx +web/src/app/chat/message/messageComponents/MemoizedAIMessage.tsx +web/src/app/chat/message/messageComponents/MultiToolRenderer.test.tsx +web/src/app/chat/message/messageComponents/MultiToolRenderer.tsx +web/src/app/chat/message/messageComponents/constants.ts +web/src/app/chat/message/messageComponents/hooks/useMessageSwitching.ts +web/src/app/chat/message/messageComponents/hooks/useToolDisplayTiming.test.tsx +web/src/app/chat/message/messageComponents/hooks/useToolDisplayTiming.ts +web/src/app/chat/message/messageComponents/interfaces.ts +web/src/app/chat/message/messageComponents/markdownUtils.tsx +web/src/app/chat/message/messageComponents/renderMessageComponent.tsx +web/src/app/chat/message/messageComponents/renderers/CustomToolRenderer.tsx +web/src/app/chat/message/messageComponents/renderers/FetchToolRenderer.tsx +web/src/app/chat/message/messageComponents/renderers/ImageToolRenderer.tsx +web/src/app/chat/message/messageComponents/renderers/MessageTextRenderer.tsx +web/src/app/chat/message/messageComponents/renderers/PythonToolRenderer.tsx +web/src/app/chat/message/messageComponents/renderers/ReasoningRenderer.tsx +web/src/app/chat/message/messageComponents/renderers/SearchToolRenderer.tsx +web/src/app/chat/message/messageComponents/renderers/SearchToolRendererV2.tsx +web/src/app/chat/message/messageComponents/renderers/utils/timing.ts +web/src/app/chat/message/thinkingBox/ThinkingBox.css +web/src/app/chat/nrf/NRFPage.tsx +web/src/app/chat/nrf/interfaces.ts +web/src/app/chat/nrf/page.tsx +web/src/app/chat/page.tsx +web/src/app/chat/projects/ProjectsContext.tsx +web/src/app/chat/projects/projectsService.ts +web/src/app/chat/services/actionUtils.ts +web/src/app/chat/services/currentMessageFIFO.ts +web/src/app/chat/services/fileUtils.ts +web/src/app/chat/services/lib.tsx +web/src/app/chat/services/messageTree.ts +web/src/app/chat/services/packetUtils.ts +web/src/app/chat/services/searchParams.ts +web/src/app/chat/services/streamingModels.ts +web/src/app/chat/services/thinkingTokens.ts +web/src/app/chat/shared/[chatId]/SharedChatDisplay.tsx +web/src/app/chat/shared/[chatId]/page.tsx +web/src/app/chat/stores/useChatSessionStore.ts +web/src/app/components/nrf/SettingsPanel.tsx +web/src/app/components/nrf/ShortcutsDisplay.tsx +web/src/app/craft/README.md +web/src/app/craft/components/BigButton.tsx +web/src/app/craft/components/BuildLLMPopover.tsx +web/src/app/craft/components/BuildMessageList.tsx +web/src/app/craft/components/BuildWelcome.tsx +web/src/app/craft/components/ChatPanel.tsx +web/src/app/craft/components/ConnectDataBanner.tsx +web/src/app/craft/components/ConnectorBannersRow.tsx +web/src/app/craft/components/CraftingLoader.tsx +web/src/app/craft/components/DiffView.tsx +web/src/app/craft/components/FileBrowser.tsx +web/src/app/craft/components/FilePreviewModal.tsx +web/src/app/craft/components/InputBar.tsx +web/src/app/craft/components/IntroBackground.tsx +web/src/app/craft/components/IntroContent.tsx +web/src/app/craft/components/OutputPanel.tsx +web/src/app/craft/components/RawOutputBlock.tsx +web/src/app/craft/components/SandboxStatusIndicator.tsx +web/src/app/craft/components/ShareButton.tsx +web/src/app/craft/components/SideBar.tsx +web/src/app/craft/components/SuggestedPrompts.tsx +web/src/app/craft/components/SuggestionBubbles.tsx +web/src/app/craft/components/TextChunk.tsx +web/src/app/craft/components/ThinkingCard.tsx +web/src/app/craft/components/TodoListCard.tsx +web/src/app/craft/components/ToggleWarningModal.tsx +web/src/app/craft/components/ToolCallPill.tsx +web/src/app/craft/components/TypewriterText.tsx +web/src/app/craft/components/UpgradePlanModal.tsx +web/src/app/craft/components/UserMessage.tsx +web/src/app/craft/components/WorkingLine.tsx +web/src/app/craft/components/WorkingPill.tsx +web/src/app/craft/components/output-panel/ArtifactsTab.tsx +web/src/app/craft/components/output-panel/FilePreviewContent.tsx +web/src/app/craft/components/output-panel/FilesTab.tsx +web/src/app/craft/components/output-panel/ImagePreview.tsx +web/src/app/craft/components/output-panel/MarkdownFilePreview.tsx +web/src/app/craft/components/output-panel/PdfPreview.tsx +web/src/app/craft/components/output-panel/PptxPreview.tsx +web/src/app/craft/components/output-panel/PreviewTab.tsx +web/src/app/craft/components/output-panel/UrlBar.tsx +web/src/app/craft/constants.ts +web/src/app/craft/constants/exampleBuildPrompts.ts +web/src/app/craft/contexts/BuildContext.tsx +web/src/app/craft/contexts/UploadFilesContext.tsx +web/src/app/craft/hooks/useBuildConnectors.ts +web/src/app/craft/hooks/useBuildLlmSelection.ts +web/src/app/craft/hooks/useBuildSessionController.ts +web/src/app/craft/hooks/useBuildSessionStore.ts +web/src/app/craft/hooks/useBuildStreaming.ts +web/src/app/craft/hooks/usePreProvisionPolling.ts +web/src/app/craft/hooks/useUsageLimits.ts +web/src/app/craft/layout.tsx +web/src/app/craft/onboarding/BuildOnboardingProvider.tsx +web/src/app/craft/onboarding/components/BuildOnboardingModal.tsx +web/src/app/craft/onboarding/components/NoLlmProvidersModal.tsx +web/src/app/craft/onboarding/components/NotAllowedModal.tsx +web/src/app/craft/onboarding/components/OnboardingInfoPages.tsx +web/src/app/craft/onboarding/components/OnboardingLlmSetup.tsx +web/src/app/craft/onboarding/components/OnboardingUserInfo.tsx +web/src/app/craft/onboarding/constants.ts +web/src/app/craft/onboarding/hooks/useOnboardingModal.ts +web/src/app/craft/onboarding/types.ts +web/src/app/craft/page.tsx +web/src/app/craft/services/apiServices.ts +web/src/app/craft/services/searchParams.ts +web/src/app/craft/types/displayTypes.ts +web/src/app/craft/types/streamingTypes.ts +web/src/app/craft/types/user-library.ts +web/src/app/craft/utils/packetTypes.ts +web/src/app/craft/utils/parsePacket.ts +web/src/app/craft/utils/pathSanitizer.test.ts +web/src/app/craft/utils/pathSanitizer.ts +web/src/app/craft/utils/streamItemHelpers.ts +web/src/app/craft/v1/configure/components/ComingSoonConnectors.tsx +web/src/app/craft/v1/configure/components/ConfigureConnectorModal.tsx +web/src/app/craft/v1/configure/components/ConfigureOverlays.tsx +web/src/app/craft/v1/configure/components/ConnectorCard.tsx +web/src/app/craft/v1/configure/components/ConnectorConfigStep.tsx +web/src/app/craft/v1/configure/components/CreateCredentialInline.tsx +web/src/app/craft/v1/configure/components/CredentialStep.tsx +web/src/app/craft/v1/configure/components/DemoDataConfirmModal.tsx +web/src/app/craft/v1/configure/components/RequestConnectorModal.tsx +web/src/app/craft/v1/configure/components/UserLibraryModal.tsx +web/src/app/craft/v1/configure/page.tsx +web/src/app/craft/v1/configure/utils/createBuildConnector.ts +web/src/app/craft/v1/constants.ts +web/src/app/craft/v1/layout.tsx +web/src/app/craft/v1/page.tsx +web/src/app/css/attachment-button.css +web/src/app/css/button.css +web/src/app/css/card.css +web/src/app/css/code.css +web/src/app/css/color-swatch.css +web/src/app/css/colors.css +web/src/app/css/divider.css +web/src/app/css/general-layouts.css +web/src/app/css/inputs.css +web/src/app/css/knowledge-table.css +web/src/app/css/line-item.css +web/src/app/css/sizes.css +web/src/app/css/square-button.css +web/src/app/css/switch.css +web/src/app/css/z-index.css +web/src/app/ee/EEFeatureRedirect.tsx +web/src/app/ee/LICENSE +web/src/app/ee/admin/billing/BillingAlerts.tsx +web/src/app/ee/admin/billing/BillingInformationPage.tsx +web/src/app/ee/admin/billing/SubscriptionSummary.tsx +web/src/app/ee/admin/billing/page.tsx +web/src/app/ee/admin/groups/ConnectorEditor.tsx +web/src/app/ee/admin/groups/UserEditor.tsx +web/src/app/ee/admin/groups/UserGroupCreationForm.tsx +web/src/app/ee/admin/groups/UserGroupsTable.tsx +web/src/app/ee/admin/groups/[groupId]/AddConnectorForm.tsx +web/src/app/ee/admin/groups/[groupId]/AddMemberForm.tsx +web/src/app/ee/admin/groups/[groupId]/AddTokenRateLimitForm.tsx +web/src/app/ee/admin/groups/[groupId]/GroupDisplay.tsx +web/src/app/ee/admin/groups/[groupId]/hook.ts +web/src/app/ee/admin/groups/[groupId]/lib.ts +web/src/app/ee/admin/groups/[groupId]/page.tsx +web/src/app/ee/admin/groups/[id]/page.tsx +web/src/app/ee/admin/groups/create/page.tsx +web/src/app/ee/admin/groups/lib.ts +web/src/app/ee/admin/groups/page.tsx +web/src/app/ee/admin/groups/types.ts +web/src/app/ee/admin/performance/custom-analytics/CustomAnalyticsUpdateForm.tsx +web/src/app/ee/admin/performance/custom-analytics/page.tsx +web/src/app/ee/admin/performance/lib.ts +web/src/app/ee/admin/performance/query-history/KickoffCSVExport.tsx +web/src/app/ee/admin/performance/query-history/QueryHistoryTable.tsx +web/src/app/ee/admin/performance/query-history/[id]/page.tsx +web/src/app/ee/admin/performance/query-history/page.tsx +web/src/app/ee/admin/performance/usage/FeedbackChart.tsx +web/src/app/ee/admin/performance/usage/OnyxBotChart.tsx +web/src/app/ee/admin/performance/usage/PersonaMessagesChart.tsx +web/src/app/ee/admin/performance/usage/QueryPerformanceChart.tsx +web/src/app/ee/admin/performance/usage/UsageReports.tsx +web/src/app/ee/admin/performance/usage/page.tsx +web/src/app/ee/admin/standard-answer/StandardAnswerCreationForm.tsx +web/src/app/ee/admin/standard-answer/[id]/page.tsx +web/src/app/ee/admin/standard-answer/hooks.ts +web/src/app/ee/admin/standard-answer/new/page.tsx +web/src/app/ee/admin/standard-answer/page.tsx +web/src/app/ee/admin/theme/AppearanceThemeSettings.tsx +web/src/app/ee/admin/theme/Preview.tsx +web/src/app/ee/admin/theme/page.tsx +web/src/app/ee/admin/whitelabeling/ImageUpload.tsx +web/src/app/ee/admin/whitelabeling/WhitelabelingForm.tsx +web/src/app/ee/admin/whitelabeling/page.tsx +web/src/app/ee/agents/stats/[id]/AgentStats.tsx +web/src/app/ee/agents/stats/[id]/page.tsx +web/src/app/ee/assistants/stats/[id]/AssistantStats.tsx +web/src/app/ee/assistants/stats/[id]/page.tsx +web/src/app/ee/layout.tsx +web/src/app/federated/oauth/callback/page.tsx +web/src/app/globals.css +web/src/app/layout.tsx +web/src/app/mcp/oauth/callback/page.tsx +web/src/app/nrf/(main)/layout.tsx +web/src/app/nrf/(main)/page.tsx +web/src/app/nrf/NRFChrome.tsx +web/src/app/nrf/NRFPage.tsx +web/src/app/nrf/layout.tsx +web/src/app/nrf/side-panel/SidePanelHeader.tsx +web/src/app/nrf/side-panel/page.tsx +web/src/app/oauth-config/callback/page.tsx +web/src/app/page.tsx +web/src/app/pages/[pageTitle]/page.tsx +web/src/app/providers.tsx +web/src/ce.tsx +web/src/components/AdvancedOptionsToggle.tsx +web/src/components/BackButton.tsx +web/src/components/ConnectorMultiSelect.tsx +web/src/components/DeleteButton.tsx +web/src/components/Dropdown.tsx +web/src/components/EEA_Logo.tsx +web/src/components/EditableStringFieldDisplay.tsx +web/src/components/FederatedConnectorSelector.tsx +web/src/components/Field.tsx +web/src/components/FormErrorHelpers.tsx +web/src/components/GatedContentWrapper.tsx +web/src/components/GenericMultiSelect.tsx +web/src/components/Hoverable.tsx +web/src/components/IsPublicGroupSelector.tsx +web/src/components/Modal.tsx +web/src/components/NonSelectableConnectors.tsx +web/src/components/OnyxInitializingLoader.tsx +web/src/components/SourceTile.tsx +web/src/components/Status.tsx +web/src/components/admin/ClientLayout.tsx +web/src/components/admin/Layout.tsx +web/src/components/admin/Title.tsx +web/src/components/admin/actions/ToolList.tsx +web/src/components/admin/actions/forms.tsx +web/src/components/admin/actions/interfaces.tsx +web/src/components/admin/assistants/FormSections.tsx +web/src/components/admin/assistants/MemoizedToolCheckboxes.tsx +web/src/components/admin/assistants/ToolSelector.tsx +web/src/components/admin/connectors/AccessTypeGroupSelector.tsx +web/src/components/admin/connectors/ConnectorTitle.tsx +web/src/components/admin/connectors/CredentialForm.tsx +web/src/components/admin/connectors/Popup.tsx +web/src/components/admin/federated/FederatedConnectorForm.tsx +web/src/components/admin/users/BulkAdd.tsx +web/src/components/admin/users/InvitedUserTable.tsx +web/src/components/admin/users/PendingUsersTable.tsx +web/src/components/admin/users/ResetPasswordModal.tsx +web/src/components/admin/users/SignedUpUserTable.tsx +web/src/components/admin/users/buttons/DeactivateUserButton.tsx +web/src/components/admin/users/buttons/DeleteUserButton.tsx +web/src/components/admin/users/buttons/InviteUserButton.tsx +web/src/components/admin/users/buttons/LeaveOrganizationButton.tsx +web/src/components/admin/users/buttons/UserRoleDropdown.tsx +web/src/components/auth/AuthErrorDisplay.tsx +web/src/components/auth/AuthFlowContainer.tsx +web/src/components/chat/DynamicBottomSpacer.tsx +web/src/components/chat/FederatedOAuthModal.tsx +web/src/components/chat/MCPApiKeyModal.tsx +web/src/components/chat/MinimalMarkdown.test.tsx +web/src/components/chat/MinimalMarkdown.tsx +web/src/components/chat/ProviderContext.tsx +web/src/components/chat/ScrollContainerContext.tsx +web/src/components/chat/TextView.tsx +web/src/components/chat/UnconfiguredLlmProviderText.tsx +web/src/components/chat/hooks.ts +web/src/components/chat/sources/SourceCard.tsx +web/src/components/context/AppProvider.tsx +web/src/components/context/EmbeddingContext.tsx +web/src/components/context/FormContext.tsx +web/src/components/context/ModalContext.tsx +web/src/components/context/NRFPreferencesContext.tsx +web/src/components/credentials/CredentialFields.tsx +web/src/components/credentials/CredentialSection.tsx +web/src/components/credentials/actions/CreateCredential.tsx +web/src/components/credentials/actions/CreateStdOAuthCredential.tsx +web/src/components/credentials/actions/CredentialFieldsRenderer.tsx +web/src/components/credentials/actions/EditCredential.tsx +web/src/components/credentials/actions/ModifyCredential.tsx +web/src/components/dateRangeSelectors/AdminDateRangeSelector.tsx +web/src/components/dateRangeSelectors/SearchDateRangeSelector.tsx +web/src/components/dev/StatsOverlay.tsx +web/src/components/dev/StatsOverlayLoader.tsx +web/src/components/documentSet/DocumentSetSelectable.tsx +web/src/components/embedding/CustomEmbeddingModelForm.tsx +web/src/components/embedding/CustomModelForm.tsx +web/src/components/embedding/FailedReIndexAttempts.tsx +web/src/components/embedding/interfaces.tsx +web/src/components/errorPages/AccessRestrictedPage.tsx +web/src/components/errorPages/CloudErrorPage.tsx +web/src/components/errorPages/ErrorPage.tsx +web/src/components/extension/Shortcuts.tsx +web/src/components/filters/SourceSelector.tsx +web/src/components/filters/TimeRangeSelector.tsx +web/src/components/header/AnnouncementBanner.tsx +web/src/components/health/healthcheck.tsx +web/src/components/health/refreshUtils.ts +web/src/components/icons/icons.test.tsx +web/src/components/icons/icons.tsx +web/src/components/initialSetup/welcome/WelcomeModal.tsx +web/src/components/initialSetup/welcome/WelcomeModalWrapper.tsx +web/src/components/initialSetup/welcome/constants.ts +web/src/components/initialSetup/welcome/lib.ts +web/src/components/llm/ApiKeyForm.tsx +web/src/components/llm/ApiKeyModal.tsx +web/src/components/llm/LLMSelector.tsx +web/src/components/logo/Logo.tsx +web/src/components/modals/AddInstructionModal.tsx +web/src/components/modals/ConfirmEntityModal.tsx +web/src/components/modals/CreateProjectModal.tsx +web/src/components/modals/EditPropertyModal.tsx +web/src/components/modals/ExceptionTraceModal.tsx +web/src/components/modals/GenericConfirmModal.tsx +web/src/components/modals/MoveCustomAgentChatModal.tsx +web/src/components/modals/NewTeamModal.tsx +web/src/components/modals/NewTenantModal.tsx +web/src/components/modals/NoAgentModal.tsx +web/src/components/modals/NoAssistantModal.tsx +web/src/components/modals/ProviderModal.tsx +web/src/components/modals/UserFilesModal.tsx +web/src/components/oauth/OAuthCallbackPage.tsx +web/src/components/oauth/OAuthConfigSelector.tsx +web/src/components/popover/Popover.tsx +web/src/components/popover/styles.css +web/src/components/popup/Popup.tsx +web/src/components/popup/PopupFromQuery.tsx +web/src/components/search/DocumentDisplay.tsx +web/src/components/search/DocumentFeedbackBlock.tsx +web/src/components/search/filtering/HorizontalSourceSelector.tsx +web/src/components/search/filtering/TagFilter.tsx +web/src/components/search/results/Citation.tsx +web/src/components/settings/SettingsProvider.tsx +web/src/components/settings/lib.ts +web/src/components/settings/usePaidEnterpriseFeaturesEnabled.ts +web/src/components/sidebar/ChatSessionMorePopup.tsx +web/src/components/sidebar/types.ts +web/src/components/tools/CSVContent.tsx +web/src/components/tools/ExpandableContentWrapper.tsx +web/src/components/tools/parseCSV.test.ts +web/src/components/tooltip/CustomTooltip.tsx +web/src/components/ui/accordion.tsx +web/src/components/ui/avatar.tsx +web/src/components/ui/calendar.tsx +web/src/components/ui/datePicker.tsx +web/src/components/ui/fully_wrapped_tabs.tsx +web/src/components/ui/label.tsx +web/src/components/ui/popover.tsx +web/src/components/ui/tabs.tsx +web/src/components/ui/text.tsx +web/src/components/ui/tooltip.tsx +web/src/components/user/PATManagement.tsx +web/src/components/user/UserProvider.tsx +web/src/components/voice/Waveform.tsx +web/src/ee/LICENSE +web/src/ee/hooks/useHookExecutionLogs.ts +web/src/ee/hooks/useHookSpecs.ts +web/src/ee/hooks/useHooks.ts +web/src/ee/lib/search/svc.ts +web/src/ee/providers/QueryControllerProvider.tsx +web/src/ee/refresh-pages/admin/HooksPage/HookFormModal.tsx +web/src/ee/refresh-pages/admin/HooksPage/HookLogsModal.tsx +web/src/ee/refresh-pages/admin/HooksPage/HookStatusPopover.tsx +web/src/ee/refresh-pages/admin/HooksPage/index.tsx +web/src/ee/refresh-pages/admin/HooksPage/interfaces.ts +web/src/ee/refresh-pages/admin/HooksPage/svc.ts +web/src/ee/sections/SearchCard.tsx +web/src/ee/sections/SearchUI.tsx +web/src/hooks/__tests__/useShowOnboarding.test.tsx +web/src/hooks/appNavigation.ts +web/src/hooks/formHooks.ts +web/src/hooks/input-prompts.ts +web/src/hooks/useAdminPersonas.ts +web/src/hooks/useAdminUsers.ts +web/src/hooks/useAgentController.ts +web/src/hooks/useAgentPreferences.ts +web/src/hooks/useAgents.ts +web/src/hooks/useAppFocus.ts +web/src/hooks/useAuthTypeMetadata.ts +web/src/hooks/useAvailableTools.ts +web/src/hooks/useBillingInformation.ts +web/src/hooks/useBoundingBox.ts +web/src/hooks/useBrowserInfo.ts +web/src/hooks/useCCPairs.ts +web/src/hooks/useChatController.ts +web/src/hooks/useChatSessionController.ts +web/src/hooks/useChatSessions.ts +web/src/hooks/useClickOutside.ts +web/src/hooks/useCloudSubscription.ts +web/src/hooks/useCodeInterpreter.ts +web/src/hooks/useContainerCenter.ts +web/src/hooks/useContentSize.ts +web/src/hooks/useCurrentUser.ts +web/src/hooks/useDeepResearchToggle.ts +web/src/hooks/useDropdownPosition.ts +web/src/hooks/useFederatedOAuthStatus.ts +web/src/hooks/useFeedbackController.ts +web/src/hooks/useFilter.ts +web/src/hooks/useGroups.ts +web/src/hooks/useImageDropzone.ts +web/src/hooks/useIsDefaultAgent.ts +web/src/hooks/useIsMounted.ts +web/src/hooks/useLLMProviders.ts +web/src/hooks/useLicense.ts +web/src/hooks/useMcpServers.ts +web/src/hooks/useMcpServersForAgentEditor.ts +web/src/hooks/useMemoryManager.ts +web/src/hooks/useMultiModelChat.ts +web/src/hooks/useOnMount.ts +web/src/hooks/useOpenApiTools.ts +web/src/hooks/usePaginatedFetch.ts +web/src/hooks/usePromptShortcuts.ts +web/src/hooks/useScimToken.ts +web/src/hooks/useScreenSize.ts +web/src/hooks/useServerTools.ts +web/src/hooks/useSettings.test.ts +web/src/hooks/useSettings.ts +web/src/hooks/useShareableGroups.ts +web/src/hooks/useShareableUsers.ts +web/src/hooks/useShowOnboarding.ts +web/src/hooks/useTags.ts +web/src/hooks/useToast.ts +web/src/hooks/useTokenRefresh.ts +web/src/hooks/useUserCounts.ts +web/src/hooks/useUserPersonalization.ts +web/src/hooks/useUsers.ts +web/src/hooks/useVoicePlayback.ts +web/src/hooks/useVoiceProviders.ts +web/src/hooks/useVoiceRecorder.ts +web/src/hooks/useVoiceStatus.ts +web/src/hooks/useWebSocket.ts +web/src/icons/README.md +web/src/icons/actions.tsx +web/src/icons/activity.tsx +web/src/icons/add-lines.tsx +web/src/icons/alert-circle.tsx +web/src/icons/alert-triangle.tsx +web/src/icons/arrow-exchange.tsx +web/src/icons/arrow-left.tsx +web/src/icons/arrow-right-circle.tsx +web/src/icons/arrow-right.tsx +web/src/icons/arrow-up-right.tsx +web/src/icons/arrow-up.tsx +web/src/icons/arrow-wall-right.tsx +web/src/icons/aws.tsx +web/src/icons/bar-chart.tsx +web/src/icons/bell.tsx +web/src/icons/bubble-text.tsx +web/src/icons/calendar.tsx +web/src/icons/check-circle.tsx +web/src/icons/check-square.tsx +web/src/icons/check.tsx +web/src/icons/chevron-down-small.tsx +web/src/icons/chevron-down.tsx +web/src/icons/chevron-left.tsx +web/src/icons/chevron-right.tsx +web/src/icons/chevron-up-small.tsx +web/src/icons/chevron-up.tsx +web/src/icons/claude.tsx +web/src/icons/clock.tsx +web/src/icons/cloud.tsx +web/src/icons/code.tsx +web/src/icons/convert-svg.sh +web/src/icons/copy.tsx +web/src/icons/cpu.tsx +web/src/icons/dev-kit.tsx +web/src/icons/download-cloud.tsx +web/src/icons/edit-big.tsx +web/src/icons/edit.tsx +web/src/icons/external-link.tsx +web/src/icons/eye-closed.tsx +web/src/icons/eye.tsx +web/src/icons/file-text.tsx +web/src/icons/files.tsx +web/src/icons/filter.tsx +web/src/icons/fold.tsx +web/src/icons/folder-in.tsx +web/src/icons/folder-open.tsx +web/src/icons/folder-partial-open.tsx +web/src/icons/folder-plus.tsx +web/src/icons/folder.tsx +web/src/icons/globe.tsx +web/src/icons/hard-drive.tsx +web/src/icons/headset-mic.tsx +web/src/icons/hourglass.tsx +web/src/icons/image.tsx +web/src/icons/import.tsx +web/src/icons/index.tsx +web/src/icons/key.tsx +web/src/icons/lightbulb-simple.tsx +web/src/icons/line-chart-up.tsx +web/src/icons/link.tsx +web/src/icons/linked-dots.tsx +web/src/icons/loader.tsx +web/src/icons/lock.tsx +web/src/icons/log-out.tsx +web/src/icons/maximize-2.tsx +web/src/icons/menu.tsx +web/src/icons/minus-circle.tsx +web/src/icons/minus.tsx +web/src/icons/moon.tsx +web/src/icons/more-horizontal.tsx +web/src/icons/ollama.tsx +web/src/icons/onyx-logo.tsx +web/src/icons/onyx-octagon.tsx +web/src/icons/openai.tsx +web/src/icons/openrouter.tsx +web/src/icons/organization.tsx +web/src/icons/paperclip.tsx +web/src/icons/pause-circle.tsx +web/src/icons/pie-chart.tsx +web/src/icons/pin.tsx +web/src/icons/pinned.tsx +web/src/icons/play-circle.tsx +web/src/icons/plug.tsx +web/src/icons/plus-circle.tsx +web/src/icons/plus.tsx +web/src/icons/quote-end.tsx +web/src/icons/quote-start.tsx +web/src/icons/refresh-cw.tsx +web/src/icons/search-menu.tsx +web/src/icons/search.tsx +web/src/icons/server.tsx +web/src/icons/settings.tsx +web/src/icons/share.tsx +web/src/icons/shield.tsx +web/src/icons/sidebar.tsx +web/src/icons/slack.tsx +web/src/icons/slash.tsx +web/src/icons/sliders.tsx +web/src/icons/sparkle.tsx +web/src/icons/step1.tsx +web/src/icons/step2.tsx +web/src/icons/step3-end.tsx +web/src/icons/step3.tsx +web/src/icons/stop-circle.tsx +web/src/icons/stop.tsx +web/src/icons/sun.tsx +web/src/icons/thumbs-down.tsx +web/src/icons/thumbs-up.tsx +web/src/icons/trash.tsx +web/src/icons/unplug.tsx +web/src/icons/upload-cloud.tsx +web/src/icons/user.tsx +web/src/icons/users.tsx +web/src/icons/workflow.tsx +web/src/icons/x-circle.tsx +web/src/icons/x-octagon.tsx +web/src/icons/x.tsx +web/src/icons/zoom-in.tsx +web/src/icons/zoom-out.tsx +web/src/instrumentation-client.ts +web/src/interfaces/llm.ts +web/src/interfaces/onboarding.ts +web/src/interfaces/settings.ts +web/src/layouts/AppPageLayout.tsx +web/src/layouts/actions-layouts.tsx +web/src/layouts/app-layouts.tsx +web/src/layouts/expandable-card-layouts.tsx +web/src/layouts/general-layouts.tsx +web/src/layouts/input-layouts.tsx +web/src/layouts/settings-layouts.tsx +web/src/layouts/sidebar-layouts.tsx +web/src/layouts/table-layouts.tsx +web/src/lib/admin-routes.ts +web/src/lib/admin/voice/svc.ts +web/src/lib/agents.ts +web/src/lib/agentsSS.ts +web/src/lib/analytics.ts +web/src/lib/assistantIconUtils.tsx +web/src/lib/assistants/checkOwnership.ts +web/src/lib/assistants/fetchAssistantsSS.ts +web/src/lib/assistants/fetchPersonaEditorInfoSS.ts +web/src/lib/assistants/orderAssistants.ts +web/src/lib/assistants/shareAssistant.ts +web/src/lib/assistants/updateAssistantPreferences.ts +web/src/lib/assistants/utils.ts +web/src/lib/auth/requireAuth.ts +web/src/lib/billing/index.ts +web/src/lib/billing/interfaces.ts +web/src/lib/billing/svc.test.ts +web/src/lib/billing/svc.ts +web/src/lib/billing/utils.ts +web/src/lib/build/client.ts +web/src/lib/ccPair.ts +web/src/lib/chat/fetchAgentData.ts +web/src/lib/chat/fetchAssistantdata.ts +web/src/lib/chat/fetchBackendChatSessionSS.ts +web/src/lib/chat/fetchChatData.ts +web/src/lib/chat/svc.ts +web/src/lib/clipboard.test.ts +web/src/lib/clipboard.ts +web/src/lib/connectors/AutoSyncOptionFields.tsx +web/src/lib/connectors/connectors.tsx +web/src/lib/connectors/credentials.ts +web/src/lib/constants.ts +web/src/lib/constants/chatBackgrounds.ts +web/src/lib/credential.ts +web/src/lib/dateUtils.ts +web/src/lib/documentDeletion.ts +web/src/lib/download.ts +web/src/lib/eea/fetchEEASettings.ts +web/src/lib/error.ts +web/src/lib/extension/constants.ts +web/src/lib/extension/utils.ts +web/src/lib/fetcher.ts +web/src/lib/fileConnector.ts +web/src/lib/filters.ts +web/src/lib/generated/README.md +web/src/lib/googleConnector.ts +web/src/lib/headers/fetchHeaderDataSS.ts +web/src/lib/hierarchy/interfaces.ts +web/src/lib/hierarchy/svc.ts +web/src/lib/hooks.llmResolver.test.ts +web/src/lib/hooks.ts +web/src/lib/hooks/useCCPairs.ts +web/src/lib/hooks/useCaptcha.ts +web/src/lib/hooks/useDocumentSets.ts +web/src/lib/hooks/useFederatedOAuthStatus.ts +web/src/lib/hooks/useForcedTools.ts +web/src/lib/hooks/useLLMProviderOptions.ts +web/src/lib/hooks/useLLMProviders.test.ts +web/src/lib/hooks/useLLMProviders.ts +web/src/lib/hooks/useProjects.ts +web/src/lib/hooks/useToolOAuthStatus.ts +web/src/lib/hooks/useUserPersonalization.ts +web/src/lib/languages.test.ts +web/src/lib/languages.ts +web/src/lib/llm/fetchLLMs.ts +web/src/lib/llm/utils.ts +web/src/lib/llm/visionLLM.ts +web/src/lib/llmConfig/cache.ts +web/src/lib/llmConfig/constants.ts +web/src/lib/llmConfig/index.ts +web/src/lib/llmConfig/svc.ts +web/src/lib/llmConfig/utils.ts +web/src/lib/oauth/api.ts +web/src/lib/redirectSS.ts +web/src/lib/search/chatSessions.ts +web/src/lib/search/interfaces.ts +web/src/lib/search/streamingUtils.ts +web/src/lib/search/utils.ts +web/src/lib/sources.ts +web/src/lib/streamingTTS.ts +web/src/lib/swr-keys.ts +web/src/lib/time.ts +web/src/lib/tools/edit.ts +web/src/lib/tools/interfaces.ts +web/src/lib/tools/mcpService.ts +web/src/lib/tools/mcpUtils.tsx +web/src/lib/tools/openApiService.ts +web/src/lib/types.ts +web/src/lib/user.test.ts +web/src/lib/user.ts +web/src/lib/userSS.ts +web/src/lib/utils.test.ts +web/src/lib/utils.ts +web/src/lib/utilsSS.ts +web/src/providers/AppBackgroundProvider.tsx +web/src/providers/AppProvider.tsx +web/src/providers/CustomAnalyticsScript.tsx +web/src/providers/DynamicMetadata.tsx +web/src/providers/ProductGatingWrapper.tsx +web/src/providers/ProjectsContext.tsx +web/src/providers/QueryControllerProvider.tsx +web/src/providers/SWRConfigProvider.tsx +web/src/providers/SettingsProvider.tsx +web/src/providers/ToastProvider.tsx +web/src/providers/UserProvider.tsx +web/src/providers/VoiceModeProvider.tsx +web/src/providers/__tests__/ProjectsContext.test.tsx +web/src/proxy.ts +web/src/refresh-components/AgentCard.tsx +web/src/refresh-components/AgentIcon.tsx +web/src/refresh-components/Attachment.stories.tsx +web/src/refresh-components/Attachment.tsx +web/src/refresh-components/Calendar.stories.tsx +web/src/refresh-components/Calendar.tsx +web/src/refresh-components/CharacterCount.stories.tsx +web/src/refresh-components/CharacterCount.tsx +web/src/refresh-components/Chip.stories.tsx +web/src/refresh-components/Chip.tsx +web/src/refresh-components/Code.stories.tsx +web/src/refresh-components/Code.tsx +web/src/refresh-components/Collapsible.stories.tsx +web/src/refresh-components/Collapsible.tsx +web/src/refresh-components/ColorSwatch.stories.tsx +web/src/refresh-components/ColorSwatch.tsx +web/src/refresh-components/ConnectionProviderIcon.stories.tsx +web/src/refresh-components/ConnectionProviderIcon.tsx +web/src/refresh-components/CounterSeparator.tsx +web/src/refresh-components/Divider.stories.tsx +web/src/refresh-components/Divider.tsx +web/src/refresh-components/EmptyMessage.stories.tsx +web/src/refresh-components/EmptyMessage.tsx +web/src/refresh-components/EnabledCount.stories.tsx +web/src/refresh-components/EnabledCount.tsx +web/src/refresh-components/FadingEdgeContainer.stories.tsx +web/src/refresh-components/FadingEdgeContainer.tsx +web/src/refresh-components/FrostedDiv.stories.tsx +web/src/refresh-components/FrostedDiv.tsx +web/src/refresh-components/InlineExternalLink.stories.tsx +web/src/refresh-components/Logo.tsx +web/src/refresh-components/Modal.stories.tsx +web/src/refresh-components/Modal.tsx +web/src/refresh-components/OverflowDiv.stories.tsx +web/src/refresh-components/OverflowDiv.tsx +web/src/refresh-components/Popover.stories.tsx +web/src/refresh-components/Popover.tsx +web/src/refresh-components/PreviewImage.stories.tsx +web/src/refresh-components/PreviewImage.tsx +web/src/refresh-components/RawModal.tsx +web/src/refresh-components/ScrollIndicatorDiv.stories.tsx +web/src/refresh-components/ScrollIndicatorDiv.tsx +web/src/refresh-components/Separator.stories.tsx +web/src/refresh-components/Separator.tsx +web/src/refresh-components/ShadowDiv.stories.tsx +web/src/refresh-components/ShadowDiv.tsx +web/src/refresh-components/SimpleCollapsible.stories.tsx +web/src/refresh-components/SimpleCollapsible.tsx +web/src/refresh-components/SimplePopover.stories.tsx +web/src/refresh-components/SimplePopover.tsx +web/src/refresh-components/SimpleTabs.stories.tsx +web/src/refresh-components/SimpleTabs.tsx +web/src/refresh-components/SimpleTooltip.stories.tsx +web/src/refresh-components/SimpleTooltip.tsx +web/src/refresh-components/Spacer.stories.tsx +web/src/refresh-components/Spacer.tsx +web/src/refresh-components/Tabs.stories.tsx +web/src/refresh-components/Tabs.tsx +web/src/refresh-components/TextSeparator.stories.tsx +web/src/refresh-components/TextSeparator.tsx +web/src/refresh-components/avatars/AgentAvatar.tsx +web/src/refresh-components/avatars/CustomAgentAvatar.stories.tsx +web/src/refresh-components/avatars/CustomAgentAvatar.tsx +web/src/refresh-components/avatars/UserAvatar.tsx +web/src/refresh-components/buttons/AttachmentButton.stories.tsx +web/src/refresh-components/buttons/AttachmentButton.tsx +web/src/refresh-components/buttons/BackButton.stories.tsx +web/src/refresh-components/buttons/BackButton.tsx +web/src/refresh-components/buttons/Button.stories.tsx +web/src/refresh-components/buttons/Button.tsx +web/src/refresh-components/buttons/ButtonRenaming.stories.tsx +web/src/refresh-components/buttons/CopyIconButton.stories.tsx +web/src/refresh-components/buttons/CopyIconButton.tsx +web/src/refresh-components/buttons/CreateButton.stories.tsx +web/src/refresh-components/buttons/CreateButton.tsx +web/src/refresh-components/buttons/FilterButton.tsx +web/src/refresh-components/buttons/IconButton.stories.tsx +web/src/refresh-components/buttons/IconButton.tsx +web/src/refresh-components/buttons/LineItem.stories.tsx +web/src/refresh-components/buttons/LineItem.tsx +web/src/refresh-components/buttons/SelectButton.stories.tsx +web/src/refresh-components/buttons/SelectButton.tsx +web/src/refresh-components/buttons/SidebarTab.tsx +web/src/refresh-components/buttons/SquareButton.stories.tsx +web/src/refresh-components/buttons/SquareButton.tsx +web/src/refresh-components/buttons/Tag.stories.tsx +web/src/refresh-components/buttons/Tag.tsx +web/src/refresh-components/buttons/source-tag/SourceTag.tsx +web/src/refresh-components/buttons/source-tag/SourceTagDetailsCard.tsx +web/src/refresh-components/buttons/source-tag/index.ts +web/src/refresh-components/buttons/source-tag/sourceTagUtils.ts +web/src/refresh-components/cards/Card.stories.tsx +web/src/refresh-components/cards/Card.tsx +web/src/refresh-components/cards/index.ts +web/src/refresh-components/commandmenu/CommandMenu.stories.tsx +web/src/refresh-components/commandmenu/CommandMenu.test.tsx +web/src/refresh-components/commandmenu/CommandMenu.tsx +web/src/refresh-components/commandmenu/types.ts +web/src/refresh-components/contexts/AgentsContext.tsx +web/src/refresh-components/contexts/AppSidebarContext.tsx +web/src/refresh-components/contexts/ChatContext.tsx +web/src/refresh-components/form/CheckboxField.tsx +web/src/refresh-components/form/FieldContext.tsx +web/src/refresh-components/form/FormField.stories.tsx +web/src/refresh-components/form/FormField.tsx +web/src/refresh-components/form/FormikField.tsx +web/src/refresh-components/form/FormikFields.stories.tsx +web/src/refresh-components/form/InputDatePickerField.tsx +web/src/refresh-components/form/InputSelectField.tsx +web/src/refresh-components/form/InputTextAreaField.tsx +web/src/refresh-components/form/InputTypeInElementField.tsx +web/src/refresh-components/form/InputTypeInField.tsx +web/src/refresh-components/form/Label.stories.tsx +web/src/refresh-components/form/Label.tsx +web/src/refresh-components/form/LabeledCheckboxField.tsx +web/src/refresh-components/form/PasswordInputTypeInField.tsx +web/src/refresh-components/form/SwitchField.tsx +web/src/refresh-components/form/types.ts +web/src/refresh-components/formik-fields/CheckboxField.tsx +web/src/refresh-components/formik-fields/UnlabeledCheckboxField.tsx +web/src/refresh-components/formik-fields/UnlabeledSwitchField.tsx +web/src/refresh-components/headers/PageHeader.tsx +web/src/refresh-components/inputs/Checkbox.stories.tsx +web/src/refresh-components/inputs/Checkbox.tsx +web/src/refresh-components/inputs/FieldInput.tsx +web/src/refresh-components/inputs/InputAvatar.stories.tsx +web/src/refresh-components/inputs/InputAvatar.tsx +web/src/refresh-components/inputs/InputChipField.stories.tsx +web/src/refresh-components/inputs/InputChipField.tsx +web/src/refresh-components/inputs/InputComboBox/InputComboBox.stories.tsx +web/src/refresh-components/inputs/InputComboBox/InputComboBox.test.tsx +web/src/refresh-components/inputs/InputComboBox/InputComboBox.tsx +web/src/refresh-components/inputs/InputComboBox/components/ComboBoxDropdown.tsx +web/src/refresh-components/inputs/InputComboBox/components/OptionItem.tsx +web/src/refresh-components/inputs/InputComboBox/components/OptionsList.tsx +web/src/refresh-components/inputs/InputComboBox/hooks.ts +web/src/refresh-components/inputs/InputComboBox/types.ts +web/src/refresh-components/inputs/InputComboBox/utils/aria.ts +web/src/refresh-components/inputs/InputDatePicker.stories.tsx +web/src/refresh-components/inputs/InputDatePicker.tsx +web/src/refresh-components/inputs/InputFile.stories.tsx +web/src/refresh-components/inputs/InputFile.tsx +web/src/refresh-components/inputs/InputImage.stories.tsx +web/src/refresh-components/inputs/InputImage.tsx +web/src/refresh-components/inputs/InputKeyValue.stories.tsx +web/src/refresh-components/inputs/InputKeyValue.tsx +web/src/refresh-components/inputs/InputNumber.stories.tsx +web/src/refresh-components/inputs/InputNumber.tsx +web/src/refresh-components/inputs/InputSearch.stories.tsx +web/src/refresh-components/inputs/InputSearch.tsx +web/src/refresh-components/inputs/InputSelect.stories.tsx +web/src/refresh-components/inputs/InputSelect.tsx +web/src/refresh-components/inputs/InputTextArea.stories.tsx +web/src/refresh-components/inputs/InputTextArea.tsx +web/src/refresh-components/inputs/InputTypeIn.stories.tsx +web/src/refresh-components/inputs/InputTypeIn.tsx +web/src/refresh-components/inputs/ListFieldInput.stories.tsx +web/src/refresh-components/inputs/ListFieldInput.tsx +web/src/refresh-components/inputs/PasswordInputTypeIn.stories.tsx +web/src/refresh-components/inputs/PasswordInputTypeIn.test.ts +web/src/refresh-components/inputs/PasswordInputTypeIn.tsx +web/src/refresh-components/inputs/ProgressSteps.tsx +web/src/refresh-components/inputs/Switch.stories.tsx +web/src/refresh-components/inputs/Switch.tsx +web/src/refresh-components/inputs/styles.ts +web/src/refresh-components/layouts/ConfirmationModalLayout.stories.tsx +web/src/refresh-components/layouts/ConfirmationModalLayout.tsx +web/src/refresh-components/layouts/DefaultModalLayout.tsx +web/src/refresh-components/layouts/PageLayout.tsx +web/src/refresh-components/loaders/SimpleLoader.stories.tsx +web/src/refresh-components/loaders/SimpleLoader.tsx +web/src/refresh-components/messages/FieldMessage.stories.tsx +web/src/refresh-components/messages/FieldMessage.tsx +web/src/refresh-components/messages/InfoBlock.stories.tsx +web/src/refresh-components/messages/InfoBlock.tsx +web/src/refresh-components/messages/Message.stories.tsx +web/src/refresh-components/messages/Message.tsx +web/src/refresh-components/modals/MemoriesModal.tsx +web/src/refresh-components/onboarding/OnboardingFlow.tsx +web/src/refresh-components/onboarding/components/DynamicProviderFields.tsx +web/src/refresh-components/onboarding/components/LLMConnectionFieldsBasic.tsx +web/src/refresh-components/onboarding/components/LLMConnectionFieldsCustom.tsx +web/src/refresh-components/onboarding/components/LLMConnectionFieldsWithTabs.tsx +web/src/refresh-components/onboarding/components/LLMConnectionIcons.tsx +web/src/refresh-components/onboarding/components/LLMConnectionModal.tsx +web/src/refresh-components/onboarding/components/LLMFormikEffects.tsx +web/src/refresh-components/onboarding/components/LLMProvider.tsx +web/src/refresh-components/onboarding/components/NonAdminStep.tsx +web/src/refresh-components/onboarding/components/OnboardingHeader.tsx +web/src/refresh-components/onboarding/components/llmConnectionHelpers.ts +web/src/refresh-components/onboarding/components/llmValidationSchema.ts +web/src/refresh-components/onboarding/constants.tsx +web/src/refresh-components/onboarding/reducer.ts +web/src/refresh-components/onboarding/steps/FinalStep.tsx +web/src/refresh-components/onboarding/steps/LLMStep.tsx +web/src/refresh-components/onboarding/steps/NameStep.tsx +web/src/refresh-components/onboarding/types.ts +web/src/refresh-components/onboarding/useOnboardingState.ts +web/src/refresh-components/popovers/ActionsPopover/ActionLineItem.tsx +web/src/refresh-components/popovers/ActionsPopover/MCPLineItem.tsx +web/src/refresh-components/popovers/ActionsPopover/SwitchList.tsx +web/src/refresh-components/popovers/ActionsPopover/index.tsx +web/src/refresh-components/popovers/FilePickerPopover.tsx +web/src/refresh-components/popovers/LLMPopover.test.tsx +web/src/refresh-components/popovers/LLMPopover.tsx +web/src/refresh-components/popovers/ModelListContent.tsx +web/src/refresh-components/popovers/ModelSelector.tsx +web/src/refresh-components/popovers/interfaces.ts +web/src/refresh-components/popovers/llmUtils.ts +web/src/refresh-components/skeletons/ChatSessionSkeleton.stories.tsx +web/src/refresh-components/skeletons/SidebarTabSkeleton.stories.tsx +web/src/refresh-components/skeletons/SidebarTabSkeleton.tsx +web/src/refresh-components/tabs/tabs.tsx +web/src/refresh-components/texts/ExpandableTextDisplay.stories.tsx +web/src/refresh-components/texts/ExpandableTextDisplay.tsx +web/src/refresh-components/texts/Text.stories.tsx +web/src/refresh-components/texts/Text.tsx +web/src/refresh-components/texts/Truncated.stories.tsx +web/src/refresh-components/texts/Truncated.tsx +web/src/refresh-components/tiles/ButtonTile.stories.tsx +web/src/refresh-components/tiles/ButtonTile.tsx +web/src/refresh-components/tiles/FileTile.stories.tsx +web/src/refresh-components/tiles/FileTile.tsx +web/src/refresh-pages/AgentEditorPage.tsx +web/src/refresh-pages/AgentsNavigationPage.tsx +web/src/refresh-pages/AgentsPage.tsx +web/src/refresh-pages/AppPage.tsx +web/src/refresh-pages/SettingsPage.tsx +web/src/refresh-pages/admin/AgentsPage.tsx +web/src/refresh-pages/admin/AgentsPage/AgentRowActions.tsx +web/src/refresh-pages/admin/AgentsPage/AgentsTable.tsx +web/src/refresh-pages/admin/AgentsPage/interfaces.ts +web/src/refresh-pages/admin/AgentsPage/svc.ts +web/src/refresh-pages/admin/ChatPreferencesPage.tsx +web/src/refresh-pages/admin/CodeInterpreterPage/index.tsx +web/src/refresh-pages/admin/CodeInterpreterPage/svc.ts +web/src/refresh-pages/admin/GroupsPage/CreateGroupPage.tsx +web/src/refresh-pages/admin/GroupsPage/EditGroupPage.tsx +web/src/refresh-pages/admin/GroupsPage/GroupCard.tsx +web/src/refresh-pages/admin/GroupsPage/GroupsList.tsx +web/src/refresh-pages/admin/GroupsPage/SharedGroupResources/ResourceContent.tsx +web/src/refresh-pages/admin/GroupsPage/SharedGroupResources/ResourcePopover.tsx +web/src/refresh-pages/admin/GroupsPage/SharedGroupResources/index.tsx +web/src/refresh-pages/admin/GroupsPage/SharedGroupResources/interfaces.ts +web/src/refresh-pages/admin/GroupsPage/TokenLimitSection.tsx +web/src/refresh-pages/admin/GroupsPage/index.tsx +web/src/refresh-pages/admin/GroupsPage/interfaces.ts +web/src/refresh-pages/admin/GroupsPage/shared.tsx +web/src/refresh-pages/admin/GroupsPage/svc.ts +web/src/refresh-pages/admin/GroupsPage/useGroupMemberCandidates.ts +web/src/refresh-pages/admin/GroupsPage/utils.ts +web/src/refresh-pages/admin/ImageGenerationPage/ImageGenerationContent.tsx +web/src/refresh-pages/admin/ImageGenerationPage/constants.ts +web/src/refresh-pages/admin/ImageGenerationPage/forms/AzureImageGenForm.tsx +web/src/refresh-pages/admin/ImageGenerationPage/forms/ImageGenFormWrapper.tsx +web/src/refresh-pages/admin/ImageGenerationPage/forms/OpenAIImageGenForm.tsx +web/src/refresh-pages/admin/ImageGenerationPage/forms/VertexImageGenForm.tsx +web/src/refresh-pages/admin/ImageGenerationPage/forms/getImageGenForm.tsx +web/src/refresh-pages/admin/ImageGenerationPage/forms/index.ts +web/src/refresh-pages/admin/ImageGenerationPage/forms/types.ts +web/src/refresh-pages/admin/ImageGenerationPage/index.tsx +web/src/refresh-pages/admin/ImageGenerationPage/svc.ts +web/src/refresh-pages/admin/LLMConfigurationPage.tsx +web/src/refresh-pages/admin/ServiceAccountsPage/ApiKeyFormModal.tsx +web/src/refresh-pages/admin/ServiceAccountsPage/index.tsx +web/src/refresh-pages/admin/ServiceAccountsPage/interfaces.ts +web/src/refresh-pages/admin/ServiceAccountsPage/svc.ts +web/src/refresh-pages/admin/UsersPage/EditUserModal.tsx +web/src/refresh-pages/admin/UsersPage/GroupsCell.tsx +web/src/refresh-pages/admin/UsersPage/InviteUsersModal.tsx +web/src/refresh-pages/admin/UsersPage/UserActionModals.tsx +web/src/refresh-pages/admin/UsersPage/UserFilters.tsx +web/src/refresh-pages/admin/UsersPage/UserRoleCell.tsx +web/src/refresh-pages/admin/UsersPage/UserRowActions.tsx +web/src/refresh-pages/admin/UsersPage/UsersSummary.tsx +web/src/refresh-pages/admin/UsersPage/UsersTable.tsx +web/src/refresh-pages/admin/UsersPage/index.tsx +web/src/refresh-pages/admin/UsersPage/interfaces.ts +web/src/refresh-pages/admin/UsersPage/svc.ts +web/src/refresh-pages/admin/VoiceConfigurationPage.tsx +web/src/refresh-pages/admin/WebSearchPage/WebProviderModalReducer.ts +web/src/refresh-pages/admin/WebSearchPage/WebProviderSetupModal.tsx +web/src/refresh-pages/admin/WebSearchPage/connectProviderFlow.ts +web/src/refresh-pages/admin/WebSearchPage/contentProviderUtils.ts +web/src/refresh-pages/admin/WebSearchPage/index.tsx +web/src/refresh-pages/admin/WebSearchPage/interfaces.ts +web/src/refresh-pages/admin/WebSearchPage/searchProviderUtils.ts +web/src/refresh-pages/admin/WebSearchPage/svc.ts +web/src/sections/AppHealthBanner.tsx +web/src/sections/Suggestions.tsx +web/src/sections/actions/ActionCard.tsx +web/src/sections/actions/ActionCardContext.tsx +web/src/sections/actions/ActionCardHeader.tsx +web/src/sections/actions/Actions.tsx +web/src/sections/actions/MCPActionCard.tsx +web/src/sections/actions/MCPPageContent.tsx +web/src/sections/actions/OpenApiActionCard.tsx +web/src/sections/actions/OpenApiPageContent.tsx +web/src/sections/actions/PerUserAuthConfig.tsx +web/src/sections/actions/ToolItem.tsx +web/src/sections/actions/ToolsList.tsx +web/src/sections/actions/ToolsSection.tsx +web/src/sections/actions/modals/AddMCPServerModal.tsx +web/src/sections/actions/modals/AddOpenAPIActionModal.tsx +web/src/sections/actions/modals/DisconnectEntityModal.tsx +web/src/sections/actions/modals/MCPAuthenticationModal.tsx +web/src/sections/actions/modals/OpenAPIAuthenticationModal.tsx +web/src/sections/actions/skeleton/ActionCardSkeleton.tsx +web/src/sections/actions/skeleton/ToolItemSkeleton.tsx +web/src/sections/admin/AdminListHeader.tsx +web/src/sections/admin/ProviderCard.tsx +web/src/sections/cards/AgentCard.tsx +web/src/sections/cards/DocumentSetCard.tsx +web/src/sections/cards/FileCard.tsx +web/src/sections/cards/README.md +web/src/sections/chat/ChatScrollContainer.tsx +web/src/sections/chat/ChatUI.tsx +web/src/sections/document-sidebar/ChatDocumentDisplay.tsx +web/src/sections/document-sidebar/DocumentsSidebar.tsx +web/src/sections/input/AppInputBar.tsx +web/src/sections/input/MicrophoneButton.tsx +web/src/sections/input/SharedAppInputBar.tsx +web/src/sections/knowledge/AgentKnowledgePane.tsx +web/src/sections/knowledge/SourceHierarchyBrowser.tsx +web/src/sections/modals/AgentViewerModal.tsx +web/src/sections/modals/FeedbackModal.tsx +web/src/sections/modals/NewTenantModal.tsx +web/src/sections/modals/PreviewModal/ExceptionTraceModal.tsx +web/src/sections/modals/PreviewModal/FloatingFooter.tsx +web/src/sections/modals/PreviewModal/PreviewModal.tsx +web/src/sections/modals/PreviewModal/index.ts +web/src/sections/modals/PreviewModal/interfaces.ts +web/src/sections/modals/PreviewModal/variants/CodePreview.tsx +web/src/sections/modals/PreviewModal/variants/codeVariant.tsx +web/src/sections/modals/PreviewModal/variants/csvVariant.tsx +web/src/sections/modals/PreviewModal/variants/dataVariant.tsx +web/src/sections/modals/PreviewModal/variants/docxVariant.tsx +web/src/sections/modals/PreviewModal/variants/imageVariant.tsx +web/src/sections/modals/PreviewModal/variants/index.ts +web/src/sections/modals/PreviewModal/variants/markdownVariant.tsx +web/src/sections/modals/PreviewModal/variants/pdfVariant.tsx +web/src/sections/modals/PreviewModal/variants/shared.tsx +web/src/sections/modals/PreviewModal/variants/textVariant.tsx +web/src/sections/modals/PreviewModal/variants/unsupportedVariant.tsx +web/src/sections/modals/ShareAgentModal.test.tsx +web/src/sections/modals/ShareAgentModal.tsx +web/src/sections/modals/ShareChatSessionModal.tsx +web/src/sections/modals/llmConfig/AnthropicModal.tsx +web/src/sections/modals/llmConfig/AzureModal.tsx +web/src/sections/modals/llmConfig/BedrockModal.tsx +web/src/sections/modals/llmConfig/BifrostModal.tsx +web/src/sections/modals/llmConfig/CustomModal.test.tsx +web/src/sections/modals/llmConfig/CustomModal.tsx +web/src/sections/modals/llmConfig/LMStudioModal.tsx +web/src/sections/modals/llmConfig/LiteLLMProxyModal.tsx +web/src/sections/modals/llmConfig/OllamaModal.tsx +web/src/sections/modals/llmConfig/OpenAICompatibleModal.tsx +web/src/sections/modals/llmConfig/OpenAIModal.tsx +web/src/sections/modals/llmConfig/OpenRouterModal.tsx +web/src/sections/modals/llmConfig/VertexAIModal.tsx +web/src/sections/modals/llmConfig/shared.tsx +web/src/sections/modals/llmConfig/svc.ts +web/src/sections/modals/llmConfig/utils.ts +web/src/sections/onboarding/OnboardingFlow.tsx +web/src/sections/onboarding/__tests__/onboardingReducer.test.ts +web/src/sections/onboarding/components/LLMProviderCard.tsx +web/src/sections/onboarding/components/NonAdminStep.tsx +web/src/sections/onboarding/components/OnboardingHeader.tsx +web/src/sections/onboarding/constants.ts +web/src/sections/onboarding/reducer.ts +web/src/sections/onboarding/steps/FinalStep.tsx +web/src/sections/onboarding/steps/LLMStep.tsx +web/src/sections/onboarding/steps/NameStep.tsx +web/src/sections/settings/Memories.tsx +web/src/sections/sidebar/AccountPopover.tsx +web/src/sections/sidebar/AdminSidebar.tsx +web/src/sections/sidebar/AgentButton.tsx +web/src/sections/sidebar/AppSidebar.tsx +web/src/sections/sidebar/ChatButton.tsx +web/src/sections/sidebar/ChatSearchCommandMenu.tsx +web/src/sections/sidebar/CreateConnectorSidebar.tsx +web/src/sections/sidebar/NotificationsPopover.tsx +web/src/sections/sidebar/ProjectFolderButton.tsx +web/src/sections/sidebar/Settings/Settings.tsx +web/src/sections/sidebar/Settings/UserSettings.tsx +web/src/sections/sidebar/SidebarBody.tsx +web/src/sections/sidebar/SidebarSection.tsx +web/src/sections/sidebar/SidebarWrapper.tsx +web/src/sections/sidebar/StepSidebarWrapper.tsx +web/src/sections/sidebar/UpsertEmbeddingSidebar.tsx +web/src/sections/sidebar/chatSearchUtils.ts +web/src/sections/sidebar/constants.ts +web/src/sections/sidebar/sidebarUtils.ts +web/src/sections/sidebar/useChatSearchOptimistic.ts +web/src/sections/sidebar/utils.tsx +web/src/types.ts +web/tailwind-themes/tailwind.config.js +web/tailwind.config.js +web/tests/e2e/admin/admin_auth.setup.ts +web/tests/e2e/admin/admin_oauth_redirect_uri.spec.ts +web/tests/e2e/admin/admin_pages.spec.ts +web/tests/e2e/admin/code-interpreter/code_interpreter.spec.ts +web/tests/e2e/admin/default-agent.spec.ts +web/tests/e2e/admin/default-assistant.spec.ts +web/tests/e2e/admin/disable_default_agent.spec.ts +web/tests/e2e/admin/disable_default_assistant.spec.ts +web/tests/e2e/admin/discord-bot/admin-workflows.spec.ts +web/tests/e2e/admin/discord-bot/bot-config.spec.ts +web/tests/e2e/admin/discord-bot/channel-config.spec.ts +web/tests/e2e/admin/discord-bot/fixtures.ts +web/tests/e2e/admin/discord-bot/guilds-list.spec.ts +web/tests/e2e/admin/ee_feature_redirect.spec.ts +web/tests/e2e/admin/groups/GroupsAdminPage.ts +web/tests/e2e/admin/groups/fixtures.ts +web/tests/e2e/admin/groups/groups.spec.ts +web/tests/e2e/admin/image-generation/disconnect-provider.spec.ts +web/tests/e2e/admin/image-generation/image-generation-content.spec.ts +web/tests/e2e/admin/llm_provider_setup.spec.ts +web/tests/e2e/admin/oauth_config/test_tool_oauth.spec.ts +web/tests/e2e/admin/scim/fixtures.ts +web/tests/e2e/admin/scim/scim.spec.ts +web/tests/e2e/admin/theme/appearance_theme_settings.spec.ts +web/tests/e2e/admin/users/UsersAdminPage.ts +web/tests/e2e/admin/users/fixtures.ts +web/tests/e2e/admin/users/users.spec.ts +web/tests/e2e/admin/voice/disconnect-provider.spec.ts +web/tests/e2e/admin/web-search/disconnect-provider.spec.ts +web/tests/e2e/admin/web-search/svc.ts +web/tests/e2e/admin/web-search/web_content_providers.spec.ts +web/tests/e2e/admin/web-search/web_search_providers.spec.ts +web/tests/e2e/admin_auth.setup.ts +web/tests/e2e/admin_oauth_redirect_uri.spec.ts +web/tests/e2e/admin_pages.spec.ts +web/tests/e2e/agents/create_and_edit_agent.spec.ts +web/tests/e2e/agents/llm_provider_rbac.spec.ts +web/tests/e2e/agents/user_file_attachment.spec.ts +web/tests/e2e/assistants/create_and_edit_assistant.spec.ts +web/tests/e2e/assistants/llm_provider_rbac.spec.ts +web/tests/e2e/auth/email_verification.spec.ts +web/tests/e2e/auth/login.spec.ts +web/tests/e2e/auth/password_managements.spec.ts +web/tests/e2e/auth/pat_management.spec.ts +web/tests/e2e/auth/signup.spec.ts +web/tests/e2e/chat/actions_popover.spec.ts +web/tests/e2e/chat/chat-search-command-menu.spec.ts +web/tests/e2e/chat/chat_message_rendering.spec.ts +web/tests/e2e/chat/chat_session_not_found.spec.ts +web/tests/e2e/chat/current_agent.spec.ts +web/tests/e2e/chat/current_assistant.spec.ts +web/tests/e2e/chat/default_agent.spec.ts +web/tests/e2e/chat/default_app_mode.spec.ts +web/tests/e2e/chat/default_assistant.spec.ts +web/tests/e2e/chat/file_preview_modal.spec.ts +web/tests/e2e/chat/input_focus_retention.spec.ts +web/tests/e2e/chat/live_agent.spec.ts +web/tests/e2e/chat/live_assistant.spec.ts +web/tests/e2e/chat/llm_ordering.spec.ts +web/tests/e2e/chat/llm_runtime_selection.spec.ts +web/tests/e2e/chat/message_edit_regenerate.spec.ts +web/tests/e2e/chat/message_feedback.spec.ts +web/tests/e2e/chat/onboarding_flow.spec.ts +web/tests/e2e/chat/project_files_visual_regression.spec.ts +web/tests/e2e/chat/scroll_behavior.spec.ts +web/tests/e2e/chat/share_chat.spec.ts +web/tests/e2e/chat/welcome_page.spec.ts +web/tests/e2e/chromaticSnapshots.json +web/tests/e2e/connectors/federated_slack.spec.ts +web/tests/e2e/connectors/inlineFileManagement.spec.ts +web/tests/e2e/constants.js +web/tests/e2e/constants.ts +web/tests/e2e/fixtures/eeFeatures.ts +web/tests/e2e/fixtures/llmProvider.ts +web/tests/e2e/fixtures/three_images.docx +web/tests/e2e/global-setup.ts +web/tests/e2e/mcp/default-agent-mcp.spec.ts +web/tests/e2e/mcp/default-assistant-mcp.spec.ts +web/tests/e2e/mcp/mcp_oauth_flow.spec.ts +web/tests/e2e/onboarding/onboarding_flow.spec.ts +web/tests/e2e/settings/settings_pages.spec.ts +web/tests/e2e/utils/agentUtils.ts +web/tests/e2e/utils/assistantUtils.ts +web/tests/e2e/utils/auth.ts +web/tests/e2e/utils/chatActions.ts +web/tests/e2e/utils/chatStream.ts +web/tests/e2e/utils/mcpServer.ts +web/tests/e2e/utils/onyxApiClient.ts +web/tests/e2e/utils/theme.ts +web/tests/e2e/utils/tools.ts +web/tests/e2e/utils/visualRegression.ts +web/tests/setup/jest.setup.ts +web/tests/setup/llmProviderTestUtils.ts +web/tests/setup/mocks/README.md +web/tests/setup/mocks/components/UserProvider.tsx +web/tests/setup/multiToolTestHelpers.tsx +web/tests/setup/test-utils.tsx +web/tsconfig.json +web/tsconfig.types.json +web/types/assets.d.ts +web/types/favicon-fetch.d.ts +widget/.env.example +widget/.gitignore +widget/README.md +widget/index.html +widget/package-lock.json +widget/package.json +widget/public/logo.png +widget/src/assets/logo.ts +widget/src/config/config.ts +widget/src/index.ts +widget/src/services/api-service.ts +widget/src/services/stream-parser.ts +widget/src/styles/colors.ts +widget/src/styles/theme.ts +widget/src/styles/widget-styles.ts +widget/src/types/api-types.ts +widget/src/types/widget-types.ts +widget/src/utils/storage.ts +widget/src/widget.ts +widget/tsconfig.json +widget/vite.config.ts diff --git a/.agents/audit_logs/git_diff_stat.txt b/.agents/audit_logs/git_diff_stat.txt new file mode 100644 index 00000000000..5bccc63fb55 --- /dev/null +++ b/.agents/audit_logs/git_diff_stat.txt @@ -0,0 +1,4304 @@ + .claude/skills | 1 - + .cursor/mcp.json | 16 - + .cursor/skills/onyx-cli/SKILL.md | 1 - + .cursor/skills/playwright/SKILL.md | 248 - + .git-blame-ignore-revs | 9 - + .github/CODEOWNERS | 10 - + .github/actions/build-backend-image/action.yml | 73 - + .github/actions/build-integration-image/action.yml | 76 - + .../actions/build-model-server-image/action.yml | 68 - + .github/actions/prepare-build/action.yml | 42 + + .../run-nightly-provider-chat-test/action.yml | 130 - + .../action.yml | 51 +- + .github/actions/slack-notify/action.yml | 56 +- + .github/actions/slack-notify/user-mappings.json | 18 - + .github/dependabot.yml | 4 +- + .github/pull_request_template.md | 5 +- + .github/workflows/check-lazy-imports.yml | 32 + + .github/workflows/deployment.yml | 1260 +- + .github/workflows/docker-tag-beta.yml | 5 +- + .github/workflows/docker-tag-latest.yml | 5 +- + .github/workflows/helm-chart-releases.yml | 10 +- + .github/workflows/merge-group.yml | 31 - + .github/workflows/nightly-close-stale-issues.yml | 3 +- + .github/workflows/nightly-llm-provider-chat.yml | 52 - + .github/workflows/nightly-scan-licenses.yml | 149 + + .github/workflows/post-merge-beta-cherry-pick.yml | 298 - + .github/workflows/pr-database-tests.yml | 65 - + .github/workflows/pr-desktop-build.yml | 114 - + .../pr-external-dependency-unit-tests.yml | 77 +- + .github/workflows/pr-golang-tests.yml | 56 - + .github/workflows/pr-helm-chart-testing.yml | 450 +- + .github/workflows/pr-integration-tests.yml | 365 +- + .github/workflows/pr-jest-tests.yml | 19 +- + .github/workflows/pr-labeler.yml | 1 - + .github/workflows/pr-linear-check.yml | 1 - + .github/workflows/pr-mit-integration-tests.yml | 357 + + .github/workflows/pr-playwright-tests.yml | 529 +- + .github/workflows/pr-python-checks.yml | 76 +- + .github/workflows/pr-python-connector-tests.yml | 194 +- + .github/workflows/pr-python-model-tests.yml | 144 +- + .github/workflows/pr-python-tests.yml | 18 +- + .github/workflows/pr-quality-checks.yml | 35 +- + .github/workflows/preview.yml | 73 - + .github/workflows/release-cli.yml | 207 - + .github/workflows/release-devtools.yml | 39 - + .../reusable-nightly-llm-provider-chat.yml | 333 - + .github/workflows/sandbox-deployment.yml | 290 - + .github/workflows/storybook-deploy.yml | 71 - + .github/workflows/sync_foss.yml | 4 +- + .github/workflows/tag-nightly.yml | 4 +- + .github/workflows/zizmor.yml | 12 +- + .gitignore | 21 +- + .greptile/config.json | 64 - + .greptile/files.json | 57 - + .greptile/rules.md | 44 - + .pre-commit-config.yaml | 193 +- + .vscode/env.web_template.txt | 16 - + .vscode/env_template.txt | 73 +- + .vscode/launch.json | 718 -- + .vscode/launch.template.jsonc | 615 + + AGENTS.md | 361 - + AGENTS.md.template | 327 + + CLAUDE.md | 1 - + CLAUDE.md.template | 332 + + CONTRIBUTING.md | 430 +- + CONTRIBUTING_MACOS.md | 36 + + CONTRIBUTING_VSCODE.md | 32 + + Jenkinsfile | 128 + + LICENSE | 5 +- + README.md | 98 +- + backend/.dockerignore | 6 - + backend/.trivyignore | 4 + + backend/Dockerfile | 107 +- + backend/Dockerfile.model_server | 29 +- + backend/alembic/README.md | 8 +- + backend/alembic/env.py | 89 +- + backend/alembic/run_multitenant_migrations.py | 289 - + .../01f8e6d95a33_populate_flow_mapping_data.py | 112 - + .../versions/03d085c5c38d_backfill_account_type.py | 108 - + .../versions/07b98176f1de_code_interpreter_seed.py | 29 - + ...f35df_add_scim_username_to_scim_user_mapping.py | 28 - + .../114a638452db_add_default_app_mode_to_user.py | 33 - + .../versions/12635f6655b7_drive_canonical_ids.py | 11 +- + .../versions/175ea04c7087_add_user_preferences.py | 27 - + ...2524446_add_is_clarification_to_chat_message.py | 29 - + ...19c0ccb01687_migrate_to_contextual_rag_model.py | 71 - + ...0ca7853_remove_voice_provider_deleted_column.py | 35 - + ...1f60f60c3401_embedding_model_search_settings.py | 4 +- + .../2020d417ec84_single_onyx_craft_migration.py | 351 - + ...75e5f5_remove_feedback_foreignkey_constraint.py | 4 +- + .../25a5501dc766_group_permissions_phase1.py | 109 - + .../versions/2664261bfaab_add_cache_store_table.py | 37 - + .../27fb147a843f_add_timestamps_to_user_table.py | 43 - + ...a391f840e85_add_last_refreshed_at_mcp_server.py | 27 - + .../2b75d0a8ffcb_user_file_schema_cleanup.py | 3 +- + .../alembic/versions/2b90f3af54b8_usage_limits.py | 46 - + ...828bdf_add_unique_constraint_to_inputprompt_.py | 42 - + .../3a78dba1080a_user_file_legacy_data_cleanup.py | 3 +- + ...a4dab77_reset_userfile_document_id_migrated_.py | 3 +- + ...41fa44bef321_remove_default_prompt_shortcuts.py | 29 - + ...a38f1_fix_invalid_model_configurations_state.py | 2 +- + .../495cb26ce93e_create_knowlege_graph_tables.py | 4 +- + .../4a1e4b1c89d2_add_indexing_to_userfilestatus.py | 51 - + .../4cebcbc9b2ae_add_tab_index_to_tool_call.py | 27 - + .../versions/4d58345da04a_lowercase_user_emails.py | 5 +- + .../4ea2c93919c1_add_type_to_credentials.py | 5 - + .../versions/4f8a2b3c1d9e_add_open_url_tool.py | 104 - + .../503883791c39_add_effective_permissions.py | 104 - + ...8f6662_merge_default_assistants_into_unified.py | 476 +- + .../57122d037335_add_python_tool_on_default.py | 69 - + ...ca366b35_backend_driven_notification_details.py | 35 - + .../5e6f7a8b9c0d_update_default_persona_prompt.py | 55 - + ...d2504136_add_approx_chunk_count_in_vespa_to_.py | 32 - + ...6661d5b65_add_created_at_in_project_userfile.py | 44 - + ...0d8de_add_hook_and_hook_execution_log_tables.py | 103 - + .../699221885109_nullify_default_task_prompt.py | 75 - + .../6b3b4083c5aa_persona_cleanup_and_featured.py | 112 - + ...06234e012a_add_image_generation_config_table.py | 54 - + ...e2e5cf_make_processing_mode_default_all_caps.py | 43 - + .../73e9983e5091_add_search_query_table.py | 47 - + ...7_add_enterprise_fields_to_scim_user_mapping.py | 48 - + .../776b3bbe9092_remove_remaining_enums.py | 3 +- + ...6946a0_remove_reranking_from_search_settings.py | 58 - + .../7a70b7664e37_add_model_configuration_table.py | 2 +- + .../versions/7b9b952abdf6_update_entities.py | 6 +- + ...4e1b_add_display_name_to_model_configuration.py | 27 - + .../7cb492013621_code_interpreter_server_model.py | 31 - + .../7e490836d179_nullify_default_system_prompt.py | 80 - + ...b64d5a_add_mcp_server_and_connection_config_.py | 8 +- + .../8188861f4e92_csv_to_tabular_chat_file_type.py | 54 - + .../versions/81c22b1e2e78_hierarchy_nodes_v1.py | 349 - + .../8405ca81cc83_notifications_constraint.py | 49 - + ...732f8_add_demo_data_enabled_to_build_session.py | 32 - + .../87c52ec39f84_update_default_system_prompt.py | 55 - + .../8b5ce697290e_add_discord_bot_tables.py | 116 - + ...c2bcfc11_add_needs_persona_sync_to_user_file.py | 33 - + .../9087b548dd69_seed_default_image_gen_config.py | 136 - + .../90b409d06e50_add_chat_compression_fields.py | 36 - + backend/alembic/versions/90e3b9af7da4_tag_fix.py | 14 +- + ...e25c_add_voice_provider_and_user_voice_prefs.py | 117 - + ...fbb_add_chunk_error_and_vespa_count_columns_.py | 43 - + .../versions/977e834c1427_seed_default_groups.py | 139 - + ...a0296d7421e_add_is_auto_mode_to_llm_provider.py | 33 - + .../9b66d3156fc6_user_file_schema_additions.py | 2 - + .../versions/9c54986124c6_add_scim_tables.py | 124 - + ...106_add_processing_duration_seconds_to_chat_.py | 27 - + ...01bf2971c5d_update_default_tool_descriptions.py | 54 - + .../versions/a1b2c3d4e5f6_add_license_table.py | 49 - + ...a1b2c3d4e5f7_drop_agent_search_metrics_table.py | 47 - + .../a2b3c4d5e6f7_remove_fast_default_model_name.py | 27 - + .../a3b8d9e2f1c4_make_scim_external_id_nullable.py | 34 - + ...a7904cd0_remove_userfile_related_deprecated_.py | 39 - + ...e5_add_preferred_response_id_to_chat_message.py | 36 - + .../versions/a852cbe15577_new_chat_history.py | 425 - + .../b4b7e1028dfd_grant_basic_to_existing_groups.py | 84 - + .../versions/b51c6844d1df_seed_memory_tool.py | 81 - + ...5c4d7e8f9a1_add_hierarchy_node_cc_pair_table.py | 51 - + ...45b1_rename_persona_is_visible_to_is_listed_.py | 26 - + .../b7bcc991d722_assign_users_to_default_groups.py | 125 - + .../versions/b8c9d0e1f2a3_drop_milestone_table.py | 46 - + ...5af_persona_new_default_model_configuration_.py | 40 - + .../c0c937d5c9e5_llm_provider_deprecate_fields.py | 70 - + .../c1d2e3f4a5b6_add_deep_research_tool.py | 51 - + ...2e1b4a9d3_add_sharing_scope_to_build_session.py | 31 - + .../c9e2cd766c29_add_s3_file_store_table.py | 16 +- + ...cbc03e08d0f3_add_opensearch_migration_tables.py | 128 - + .../versions/d09fc20a3c66_seed_builtin_tools.py | 135 +- + ...7d7050a_sync_exa_api_key_to_content_provider.py | 64 - + .../versions/d25168c2beee_tool_name_consistency.py | 86 - + .../versions/d3fd499c829c_add_file_reader_tool.py | 102 - + .../versions/d56ffa94ca32_add_file_content.py | 35 - + ...dc6_add_cascade_delete_to_search_query_user_.py | 35 - + .../d8cdfee5df80_add_skipped_to_userfilestatus.py | 55 - + .../versions/e209dc5a8156_added_prune_frequency.py | 4 +- + .../versions/e7f8a9b0c1d2_create_anonymous_user.py | 179 - + ...8171_add_status_to_mcp_server_and_make_auth_.py | 115 - + .../versions/ed9e44312505_add_icon_name_field.py | 34 - + .../f220515df7b4_add_flow_mapping_table.py | 57 - + ...3e2f45d9_migrate_no_auth_data_to_placeholder.py | 281 - + .../fb80bdd256de_add_chat_background_to_user.py | 31 - + ...1109_add_opensearch_tenant_migration_columns.py | 69 - + backend/alembic_tenants/env.py | 51 +- + .../versions/3b9f09038764_add_read_only_kg_user.py | 88 +- + backend/chromium-linux.zip.part.aa | Bin 0 -> 104857600 bytes + backend/chromium-linux.zip.part.ab | Bin 0 -> 55313104 bytes + backend/docker-bake.hcl | 52 + + backend/ee/LICENSE | 10 +- + backend/ee/onyx/access/access.py | 74 +- + backend/ee/onyx/access/hierarchy_access.py | 11 - + backend/ee/onyx/auth/users.py | 15 +- + .../ee/onyx/background/celery/apps/background.py | 12 + + backend/ee/onyx/background/celery/apps/heavy.py | 15 +- + backend/ee/onyx/background/celery/apps/light.py | 11 +- + .../ee/onyx/background/celery/apps/monitoring.py | 9 +- + backend/ee/onyx/background/celery/apps/primary.py | 18 +- + .../onyx/background/celery/tasks/beat_schedule.py | 9 - + .../ee/onyx/background/celery/tasks/cloud/tasks.py | 22 +- + .../celery/tasks/doc_permission_syncing/tasks.py | 142 +- + .../celery/tasks/external_group_syncing/tasks.py | 38 +- + .../ee/onyx/background/celery/tasks/hooks/tasks.py | 35 - + .../background/celery/tasks/query_history/tasks.py | 2 +- + .../celery/tasks/tenant_provisioning/tasks.py | 114 +- + .../celery/tasks/ttl_management/tasks.py | 56 +- + .../celery/tasks/usage_reporting/tasks.py | 4 +- + .../onyx/background/celery/tasks/vespa/__init__.py | 0 + backend/ee/onyx/background/task_name_builders.py | 3 +- + backend/ee/onyx/configs/app_configs.py | 27 +- + .../ee/onyx/configs/license_enforcement_config.py | 75 - + backend/ee/onyx/db/analytics.py | 37 +- + backend/ee/onyx/db/connector_credential_pair.py | 3 +- + backend/ee/onyx/db/document_set.py | 4 +- + backend/ee/onyx/db/external_perm.py | 3 +- + backend/ee/onyx/db/hierarchy.py | 69 - + backend/ee/onyx/db/license.py | 338 - + backend/ee/onyx/db/persona.py | 52 +- + backend/ee/onyx/db/scim.py | 742 -- + backend/ee/onyx/db/search.py | 64 - + backend/ee/onyx/db/standard_answer.py | 3 +- + backend/ee/onyx/db/token_limit.py | 30 +- + backend/ee/onyx/db/usage_export.py | 13 +- + backend/ee/onyx/db/user_group.py | 248 +- + .../external_permissions/confluence/doc_sync.py | 6 +- + .../external_permissions/confluence/group_sync.py | 100 +- + .../external_permissions/confluence/page_access.py | 19 +- + .../confluence/space_access.py | 26 +- + .../onyx/external_permissions/github/doc_sync.py | 25 +- + .../onyx/external_permissions/github/group_sync.py | 9 +- + .../ee/onyx/external_permissions/github/utils.py | 15 +- + .../ee/onyx/external_permissions/gmail/doc_sync.py | 32 +- + .../external_permissions/google_drive/doc_sync.py | 182 +- + .../google_drive/folder_retrieval.py | 5 +- + .../google_drive/group_sync.py | 18 +- + .../external_permissions/google_drive/models.py | 5 - + .../google_drive/permission_retrieval.py | 5 +- + .../ee/onyx/external_permissions/jira/doc_sync.py | 13 +- + .../onyx/external_permissions/jira/group_sync.py | 151 - + .../onyx/external_permissions/jira/page_access.py | 154 +- + .../onyx/external_permissions/perm_sync_types.py | 4 +- + .../external_permissions/post_query_censoring.py | 15 +- + .../salesforce/postprocessing.py | 4 +- + .../onyx/external_permissions/salesforce/utils.py | 12 +- + .../external_permissions/sharepoint/doc_sync.py | 13 +- + .../external_permissions/sharepoint/group_sync.py | 28 +- + .../sharepoint/permission_utils.py | 228 +- + .../ee/onyx/external_permissions/slack/doc_sync.py | 33 +- + .../onyx/external_permissions/slack/group_sync.py | 7 +- + .../ee/onyx/external_permissions/sync_params.py | 15 +- + .../ee/onyx/external_permissions/teams/doc_sync.py | 13 +- + backend/ee/onyx/external_permissions/utils.py | 28 +- + backend/ee/onyx/feature_flags/posthog_provider.py | 3 - + backend/ee/onyx/hooks/__init__.py | 0 + backend/ee/onyx/hooks/executor.py | 385 - + backend/ee/onyx/main.py | 32 +- + backend/ee/onyx/prompts/__init__.py | 0 + backend/ee/onyx/prompts/query_expansion.py | 27 - + .../ee/onyx/prompts/search_flow_classification.py | 42 - + backend/ee/onyx/search/process_search_query.py | 289 - + backend/ee/onyx/secondary_llm_flows/__init__.py | 0 + .../ee/onyx/secondary_llm_flows/query_expansion.py | 92 - + .../search_flow_classification.py | 50 - + backend/ee/onyx/server/analytics/api.py | 19 +- + backend/ee/onyx/server/auth_check.py | 15 - + backend/ee/onyx/server/billing/__init__.py | 0 + backend/ee/onyx/server/billing/api.py | 386 - + backend/ee/onyx/server/billing/models.py | 77 - + backend/ee/onyx/server/billing/service.py | 274 - + backend/ee/onyx/server/enterprise_settings/api.py | 96 +- + .../ee/onyx/server/enterprise_settings/models.py | 11 - + backend/ee/onyx/server/evals/api.py | 2 +- + backend/ee/onyx/server/features/__init__.py | 0 + backend/ee/onyx/server/features/hooks/__init__.py | 0 + backend/ee/onyx/server/features/hooks/api.py | 450 - + backend/ee/onyx/server/license/api.py | 317 - + backend/ee/onyx/server/license/models.py | 92 - + backend/ee/onyx/server/manage/standard_answer.py | 17 +- + .../onyx/server/middleware/license_enforcement.py | 187 - + backend/ee/onyx/server/oauth/api.py | 5 +- + backend/ee/onyx/server/oauth/confluence_cloud.py | 26 +- + backend/ee/onyx/server/oauth/google_drive.py | 5 +- + backend/ee/onyx/server/oauth/slack.py | 5 +- + .../ee/onyx/server/query_and_chat/chat_backend.py | 234 + + backend/ee/onyx/server/query_and_chat/models.py | 219 +- + .../ee/onyx/server/query_and_chat/query_backend.py | 5 +- + .../onyx/server/query_and_chat/search_backend.py | 181 - + .../onyx/server/query_and_chat/streaming_models.py | 35 - + .../ee/onyx/server/query_and_chat/token_limit.py | 6 +- + backend/ee/onyx/server/query_history/api.py | 31 +- + .../ee/onyx/server/reporting/usage_export_api.py | 11 +- + .../server/reporting/usage_export_generation.py | 5 +- + backend/ee/onyx/server/scim/__init__.py | 0 + backend/ee/onyx/server/scim/api.py | 1120 -- + backend/ee/onyx/server/scim/auth.py | 109 - + backend/ee/onyx/server/scim/filtering.py | 96 - + backend/ee/onyx/server/scim/models.py | 377 - + backend/ee/onyx/server/scim/patch.py | 460 - + backend/ee/onyx/server/scim/providers/__init__.py | 0 + backend/ee/onyx/server/scim/providers/base.py | 215 - + backend/ee/onyx/server/scim/providers/entra.py | 36 - + backend/ee/onyx/server/scim/providers/okta.py | 26 - + backend/ee/onyx/server/scim/schema_definitions.py | 173 - + backend/ee/onyx/server/seeding.py | 57 +- + backend/ee/onyx/server/settings/__init__.py | 0 + backend/ee/onyx/server/settings/api.py | 134 - + backend/ee/onyx/server/tenant_usage_limits.py | 133 - + .../ee/onyx/server/tenants/anonymous_users_api.py | 9 +- + backend/ee/onyx/server/tenants/api.py | 2 - + backend/ee/onyx/server/tenants/billing.py | 67 +- + backend/ee/onyx/server/tenants/billing_api.py | 177 +- + backend/ee/onyx/server/tenants/models.py | 17 - + backend/ee/onyx/server/tenants/product_gating.py | 6 - + backend/ee/onyx/server/tenants/provisioning.py | 270 +- + backend/ee/onyx/server/tenants/proxy.py | 455 - + .../ee/onyx/server/tenants/schema_management.py | 39 +- + .../ee/onyx/server/tenants/team_membership_api.py | 9 +- + .../onyx/server/tenants/tenant_management_api.py | 7 +- + .../ee/onyx/server/tenants/user_invitations_api.py | 22 +- + backend/ee/onyx/server/tenants/user_mapping.py | 124 +- + backend/ee/onyx/server/token_rate_limits/api.py | 16 +- + backend/ee/onyx/server/usage_limits.py | 38 - + backend/ee/onyx/server/user_group/api.py | 183 +- + backend/ee/onyx/server/user_group/models.py | 40 +- + backend/ee/onyx/utils/encryption.py | 85 +- + backend/ee/onyx/utils/license.py | 139 - + backend/ee/onyx/utils/posthog_client.py | 61 +- + backend/ee/onyx/utils/telemetry.py | 19 +- + backend/ffmpeg-linux.zip | Bin 0 -> 2681339 bytes + backend/hello-vmlinux.bin | Bin 0 -> 21441304 bytes + backend/keys/license_public_key.pem | 14 - + backend/model_server/constants.py | 1 + + backend/model_server/custom_models.py | 562 + + backend/model_server/encoders.py | 72 +- + backend/model_server/legacy/README.md | 5 - + backend/model_server/legacy/__init__.py | 0 + backend/model_server/legacy/custom_models.py | 573 - + backend/model_server/legacy/onyx_torch_model.py | 154 - + backend/model_server/legacy/reranker.py | 80 - + backend/model_server/main.py | 20 +- + backend/model_server/onyx_torch_model.py | 154 + + backend/onyx/access/access.py | 88 +- + backend/onyx/access/hierarchy_access.py | 18 - + backend/onyx/access/models.py | 57 +- + .../onyx/agents/agent_framework/message_format.py | 73 + + backend/onyx/agents/agent_framework/models.py | 47 + + backend/onyx/agents/agent_framework/query.py | 365 + + backend/onyx/agents/agent_sdk/message_format.py | 167 + + backend/onyx/agents/agent_sdk/message_types.py | 125 + + backend/onyx/agents/agent_sdk/monkey_patches.py | 36 + + .../agents/agent_sdk/sync_agent_stream_adapter.py | 178 + + backend/onyx/agents/agent_search/core_state.py | 21 + + .../agent_search/dc_search_analysis/edges.py | 62 + + .../dc_search_analysis/graph_builder.py | 103 + + .../dc_search_analysis/nodes/a1_search_objects.py | 146 + + .../nodes/a2_research_object_source.py | 180 + + .../nodes/a3_structure_research_by_object.py | 48 + + .../nodes/a4_consolidate_object_research.py | 103 + + .../nodes/a5_consolidate_research.py | 127 + + .../agents/agent_search/dc_search_analysis/ops.py | 61 + + .../agent_search/dc_search_analysis/states.py | 72 + + .../agents/agent_search/deep_search/main/models.py | 36 + + .../agents/agent_search/dr/conditional_edges.py | 61 + + backend/onyx/agents/agent_search/dr/constants.py | 31 + + .../agents/agent_search/dr/dr_prompt_builder.py | 112 + + backend/onyx/agents/agent_search/dr/enums.py | 32 + + .../onyx/agents/agent_search/dr/graph_builder.py | 88 + + backend/onyx/agents/agent_search/dr/models.py | 131 + + .../agent_search/dr/nodes/dr_a0_clarification.py | 918 ++ + .../agent_search/dr/nodes/dr_a1_orchestrator.py | 624 + + .../agents/agent_search/dr/nodes/dr_a2_closer.py | 423 + + .../agents/agent_search/dr/nodes/dr_a3_logger.py | 248 + + .../agents/agent_search/dr/process_llm_stream.py | 132 + + backend/onyx/agents/agent_search/dr/states.py | 82 + + .../basic_search/dr_basic_search_1_branch.py | 47 + + .../basic_search/dr_basic_search_2_act.py | 286 + + .../basic_search/dr_basic_search_3_reduce.py | 77 + + .../basic_search/dr_basic_search_graph_builder.py | 50 + + .../dr_image_generation_conditional_edges.py | 30 + + .../custom_tool/dr_custom_tool_1_branch.py | 36 + + .../sub_agents/custom_tool/dr_custom_tool_2_act.py | 169 + + .../custom_tool/dr_custom_tool_3_reduce.py | 82 + + .../dr_custom_tool_conditional_edges.py | 28 + + .../custom_tool/dr_custom_tool_graph_builder.py | 50 + + .../dr_generic_internal_tool_1_branch.py | 36 + + .../dr_generic_internal_tool_2_act.py | 149 + + .../dr_generic_internal_tool_3_reduce.py | 82 + + .../dr_generic_internal_tool_conditional_edges.py | 28 + + .../dr_generic_internal_tool_graph_builder.py | 50 + + .../dr_image_generation_1_branch.py | 45 + + .../image_generation/dr_image_generation_2_act.py | 189 + + .../dr_image_generation_3_reduce.py | 71 + + .../dr_image_generation_conditional_edges.py | 29 + + .../dr_image_generation_graph_builder.py | 50 + + .../dr/sub_agents/image_generation/models.py | 13 + + .../sub_agents/kg_search/dr_kg_search_1_branch.py | 36 + + .../dr/sub_agents/kg_search/dr_kg_search_2_act.py | 97 + + .../sub_agents/kg_search/dr_kg_search_3_reduce.py | 121 + + .../kg_search/dr_kg_search_conditional_edges.py | 27 + + .../kg_search/dr_kg_search_graph_builder.py | 50 + + .../agents/agent_search/dr/sub_agents/states.py | 46 + + .../dr/sub_agents/web_search/clients/exa_client.py | 70 + + .../web_search/clients/firecrawl_client.py | 163 + + .../web_search/clients/google_pse_client.py | 138 + + .../web_search/clients/onyx_web_crawler_client.py | 94 + + .../sub_agents/web_search/clients/serper_client.py | 159 + + .../dr/sub_agents/web_search/dr_ws_1_branch.py | 47 + + .../dr/sub_agents/web_search/dr_ws_2_search.py | 137 + + .../dr/sub_agents/web_search/dr_ws_3_dedup_urls.py | 52 + + .../dr/sub_agents/web_search/dr_ws_4_fetch.py | 69 + + .../web_search/dr_ws_5_collect_raw_docs.py | 19 + + .../dr/sub_agents/web_search/dr_ws_6_summarize.py | 133 + + .../dr/sub_agents/web_search/dr_ws_7_reduce.py | 56 + + .../web_search/dr_ws_conditional_edges.py | 79 + + .../sub_agents/web_search/dr_ws_graph_builder.py | 84 + + .../dr/sub_agents/web_search/models.py | 47 + + .../dr/sub_agents/web_search/providers.py | 199 + + .../dr/sub_agents/web_search/states.py | 37 + + .../agent_search/dr/sub_agents/web_search/utils.py | 99 + + backend/onyx/agents/agent_search/dr/utils.py | 277 + + .../agent_search/kb_search/conditional_edges.py | 87 + + .../agents/agent_search/kb_search/graph_builder.py | 143 + + .../agents/agent_search/kb_search/graph_utils.py | 244 + + .../onyx/agents/agent_search/kb_search/models.py | 55 + + .../agent_search/kb_search/nodes/a1_extract_ert.py | 255 + + .../agent_search/kb_search/nodes/a2_analyze.py | 312 + + .../kb_search/nodes/a3_generate_simple_sql.py | 574 + + .../nodes/b1_construct_deep_search_filters.py | 185 + + .../nodes/b2p_process_individual_deep_search.py | 168 + + .../kb_search/nodes/b2s_filtered_search.py | 166 + + .../nodes/b3_consolidate_individual_deep_search.py | 54 + + .../kb_search/nodes/c1_process_kg_only_answers.py | 96 + + .../kb_search/nodes/d1_generate_answer.py | 213 + + .../kb_search/nodes/d2_logging_node.py | 60 + + backend/onyx/agents/agent_search/kb_search/ops.py | 65 + + .../onyx/agents/agent_search/kb_search/states.py | 191 + + .../agent_search/kb_search/step_definitions.py | 33 + + backend/onyx/agents/agent_search/models.py | 88 + + .../agents/agent_search/orchestration/states.py | 50 + + backend/onyx/agents/agent_search/run_graph.py | 99 + + .../shared_graph_utils/agent_prompt_ops.py | 176 + + .../shared_graph_utils/calculations.py | 205 + + .../agent_search/shared_graph_utils/constants.py | 24 + + .../agents/agent_search/shared_graph_utils/llm.py | 243 + + .../agent_search/shared_graph_utils/models.py | 166 + + .../agent_search/shared_graph_utils/operators.py | 38 + + .../agent_search/shared_graph_utils/utils.py | 419 + + backend/onyx/agents/agent_search/utils.py | 54 + + backend/onyx/auth/anonymous_user.py | 63 - + backend/onyx/auth/captcha.py | 106 - + backend/onyx/auth/disposable_email_validator.py | 193 - + backend/onyx/auth/email_utils.py | 56 +- + backend/onyx/auth/noauth_user.py | 64 + + backend/onyx/auth/oauth_refresher.py | 6 +- + backend/onyx/auth/oauth_token_manager.py | 80 +- + backend/onyx/auth/permissions.py | 125 - + backend/onyx/auth/schemas.py | 25 +- + backend/onyx/auth/users.py | 1134 +- + backend/onyx/background/README.md | 111 - + backend/onyx/background/celery/apps/app_base.py | 134 +- + backend/onyx/background/celery/apps/background.py | 137 + + backend/onyx/background/celery/apps/beat.py | 4 +- + backend/onyx/background/celery/apps/docfetching.py | 52 +- + .../onyx/background/celery/apps/docprocessing.py | 57 +- + backend/onyx/background/celery/apps/heavy.py | 44 +- + .../onyx/background/celery/apps/kg_processing.py | 109 + + backend/onyx/background/celery/apps/light.py | 32 +- + backend/onyx/background/celery/apps/monitoring.py | 45 +- + backend/onyx/background/celery/apps/primary.py | 37 +- + .../background/celery/apps/user_file_processing.py | 10 +- + backend/onyx/background/celery/celery_redis.py | 53 - + backend/onyx/background/celery/celery_utils.py | 189 +- + .../onyx/background/celery/configs/background.py | 23 + + .../background/celery/configs/kg_processing.py | 21 + + .../onyx/background/celery/tasks/beat_schedule.py | 161 +- + .../celery/tasks/connector_deletion/__init__.py | 0 + .../celery/tasks/connector_deletion/tasks.py | 19 +- + .../celery/tasks/docfetching/__init__.py | 0 + .../tasks/docfetching/task_creation_utils.py | 124 - + .../background/celery/tasks/docfetching/tasks.py | 23 +- + .../celery/tasks/docprocessing/__init__.py | 0 + .../background/celery/tasks/docprocessing/tasks.py | 246 +- + .../background/celery/tasks/docprocessing/utils.py | 157 +- + backend/onyx/background/celery/tasks/eea/tasks.py | 25 + + .../onyx/background/celery/tasks/evals/__init__.py | 0 + .../onyx/background/celery/tasks/evals/tasks.py | 111 +- + .../celery/tasks/hierarchyfetching/__init__.py | 0 + .../celery/tasks/hierarchyfetching/tasks.py | 412 - + .../celery/tasks/kg_processing/kg_indexing.py | 77 + + .../background/celery/tasks/kg_processing/tasks.py | 253 + + .../background/celery/tasks/kg_processing/utils.py | 78 + + .../celery/tasks/llm_model_update/__init__.py | 0 + .../celery/tasks/llm_model_update/tasks.py | 152 +- + .../background/celery/tasks/monitoring/__init__.py | 0 + .../background/celery/tasks/monitoring/tasks.py | 124 +- + .../celery/tasks/opensearch_migration/__init__.py | 0 + .../celery/tasks/opensearch_migration/constants.py | 57 - + .../celery/tasks/opensearch_migration/tasks.py | 341 - + .../tasks/opensearch_migration/transformer.py | 347 - + .../background/celery/tasks/periodic}/__init__.py | 0 + .../onyx/background/celery/tasks/periodic/tasks.py | 138 + + .../background/celery/tasks/pruning/__init__.py | 0 + .../onyx/background/celery/tasks/pruning/tasks.py | 236 +- + .../celery/tasks/shared/RetryDocumentIndex.py | 4 +- + .../background/celery/tasks/shared/__init__.py | 0 + .../onyx/background/celery/tasks/shared/tasks.py | 59 +- + .../celery/tasks/user_file_processing/__init__.py | 0 + .../celery/tasks/user_file_processing/tasks.py | 1165 +- + .../onyx/background/celery/tasks/vespa/__init__.py | 0 + .../background/celery/tasks/vespa/document_sync.py | 5 +- + .../onyx/background/celery/tasks/vespa/tasks.py | 63 +- + .../background/celery/versioned_apps/background.py | 10 + + .../celery/versioned_apps/kg_processing.py | 18 + + backend/onyx/background/indexing/job_client.py | 31 +- + .../onyx/background/indexing/run_docfetching.py | 892 +- + backend/onyx/background/periodic_poller.py | 306 - + backend/onyx/background/task_utils.py | 195 - + backend/onyx/cache/factory.py | 50 - + backend/onyx/cache/interface.py | 115 - + backend/onyx/cache/postgres_backend.py | 325 - + backend/onyx/cache/redis_backend.py | 92 - + backend/onyx/chat/COMPRESSION.md | 48 - + backend/onyx/chat/README.md | 251 - + backend/onyx/chat/answer.py | 177 + + backend/onyx/chat/chat_processing_checker.py | 52 - + backend/onyx/chat/chat_state.py | 214 - + backend/onyx/chat/chat_utils.py | 963 +- + backend/onyx/chat/citation_processor.py | 624 - + backend/onyx/chat/citation_utils.py | 221 - + backend/onyx/chat/compression.py | 448 - + backend/onyx/chat/emitter.py | 40 - + backend/onyx/chat/llm_loop.py | 1177 -- + backend/onyx/chat/llm_step.py | 1393 --- + backend/onyx/chat/memories.py | 22 + + backend/onyx/chat/models.py | 476 +- + .../packet_proccessing/process_streamed_packets.py | 27 + + backend/onyx/chat/packet_sniffing.py | 13 + + backend/onyx/chat/process_message.py | 2423 ++-- + .../chat/prompt_builder/answer_prompt_builder.py | 316 + + .../onyx/chat/prompt_builder/citations_prompt.py | 170 + + backend/onyx/chat/prompt_builder/quotes_prompt.py | 62 + + backend/onyx/chat/prompt_builder/schemas.py | 10 + + backend/onyx/chat/prompt_builder/utils.py | 47 + + backend/onyx/chat/prompt_utils.py | 291 - + backend/onyx/chat/prune_and_merge.py | 535 + + backend/onyx/chat/save_chat.py | 347 - + backend/onyx/chat/stop_signal_checker.py | 54 +- + .../stream_processing/answer_response_handler.py | 83 + + .../chat/stream_processing/citation_processing.py | 443 + + .../chat/stream_processing/quotes_processing.py | 315 + + backend/onyx/chat/stream_processing/utils.py | 31 + + backend/onyx/chat/tool_call_args_streaming.py | 77 - + .../chat/tool_handling/tool_response_handler.py | 222 + + backend/onyx/chat/turn/__init__.py | 1 + + .../chat/turn/context_handler}/__init__.py | 0 + backend/onyx/chat/turn/context_handler/citation.py | 124 + + backend/onyx/chat/turn/context_handler/reminder.py | 48 + + backend/onyx/chat/turn/fast_chat_turn.py | 517 + + backend/onyx/chat/turn/infra/__init__.py | 1 + + .../onyx/chat/turn/infra/chat_turn_event_stream.py | 57 + + backend/onyx/chat/turn/infra/emitter.py | 21 + + backend/onyx/chat/turn/models.py | 95 + + backend/onyx/chat/turn/prompts/__init__.py | 1 + + .../onyx/chat/turn/prompts/custom_instruction.py | 40 + + backend/onyx/chat/turn/save_turn.py | 180 + + backend/onyx/chat/user_files/parse_user_files.py | 137 + + backend/onyx/configs/app_configs.py | 455 +- + backend/onyx/configs/chat_configs.py | 74 +- + backend/onyx/configs/constants.py | 209 +- + backend/onyx/configs/embedding_configs.py | 4 +- + backend/onyx/configs/model_configs.py | 31 +- + backend/onyx/configs/onyxbot_configs.py | 10 + + backend/onyx/connectors/README.md | 2 +- + .../onyx/connectors/airtable/airtable_connector.py | 243 +- + backend/onyx/connectors/asana/asana_api.py | 37 +- + backend/onyx/connectors/asana/connector.py | 28 +- + backend/onyx/connectors/bitbucket/connector.py | 5 +- + backend/onyx/connectors/blob/connector.py | 18 +- + backend/onyx/connectors/bookstack/connector.py | 7 +- + backend/onyx/connectors/canvas/__init__.py | 0 + backend/onyx/connectors/canvas/access.py | 32 - + backend/onyx/connectors/canvas/client.py | 212 - + backend/onyx/connectors/canvas/connector.py | 458 - + backend/onyx/connectors/clickup/connector.py | 5 +- + backend/onyx/connectors/coda/__init__.py | 0 + backend/onyx/connectors/coda/connector.py | 710 -- + backend/onyx/connectors/confluence/access.py | 16 +- + backend/onyx/connectors/confluence/connector.py | 496 +- + .../onyx/connectors/confluence/onyx_confluence.py | 85 +- + backend/onyx/connectors/confluence/utils.py | 39 +- + backend/onyx/connectors/connector_runner.py | 124 +- + backend/onyx/connectors/credentials_provider.py | 6 +- + .../cross_connector_utils/miscellaneous_utils.py | 22 +- + .../cross_connector_utils/rate_limit_wrapper.py | 3 +- + backend/onyx/connectors/discord/connector.py | 55 +- + backend/onyx/connectors/discourse/connector.py | 3 +- + backend/onyx/connectors/document360/connector.py | 3 +- + backend/onyx/connectors/dropbox/connector.py | 13 +- + backend/onyx/connectors/drupal_wiki/__init__.py | 0 + backend/onyx/connectors/drupal_wiki/connector.py | 916 -- + backend/onyx/connectors/drupal_wiki/models.py | 75 - + backend/onyx/connectors/drupal_wiki/utils.py | 10 - + backend/onyx/connectors/egnyte/connector.py | 21 +- + backend/onyx/connectors/factory.py | 7 +- + backend/onyx/connectors/file/connector.py | 58 +- + backend/onyx/connectors/fireflies/connector.py | 14 +- + backend/onyx/connectors/freshdesk/connector.py | 7 +- + backend/onyx/connectors/gitbook/connector.py | 3 +- + backend/onyx/connectors/github/connector.py | 86 +- + backend/onyx/connectors/gitlab/connector.py | 10 +- + backend/onyx/connectors/gmail/connector.py | 38 +- + backend/onyx/connectors/gong/connector.py | 58 +- + backend/onyx/connectors/google_drive/connector.py | 670 +- + .../onyx/connectors/google_drive/doc_conversion.py | 214 +- + .../onyx/connectors/google_drive/file_retrieval.py | 149 +- + backend/onyx/connectors/google_drive/models.py | 53 - + backend/onyx/connectors/google_site/connector.py | 3 +- + .../onyx/connectors/google_utils/google_auth.py | 6 +- + backend/onyx/connectors/google_utils/google_kv.py | 11 +- + .../onyx/connectors/google_utils/google_utils.py | 24 +- + backend/onyx/connectors/google_utils/resources.py | 10 +- + .../connectors/google_utils/shared_constants.py | 2 +- + backend/onyx/connectors/guru/connector.py | 3 +- + backend/onyx/connectors/highspot/connector.py | 22 +- + backend/onyx/connectors/hubspot/connector.py | 38 +- + backend/onyx/connectors/imap/connector.py | 6 +- + backend/onyx/connectors/interfaces.py | 47 +- + backend/onyx/connectors/jira/access.py | 7 +- + backend/onyx/connectors/jira/connector.py | 410 +- + backend/onyx/connectors/linear/connector.py | 53 +- + backend/onyx/connectors/loopio/connector.py | 3 +- + backend/onyx/connectors/mediawiki/family.py | 4 +- + backend/onyx/connectors/mediawiki/wiki.py | 15 +- + backend/onyx/connectors/microsoft_graph_env.py | 95 - + .../onyx/connectors/mock_connector/connector.py | 9 +- + backend/onyx/connectors/models.py | 135 +- + backend/onyx/connectors/notion/connector.py | 576 +- + backend/onyx/connectors/outline/connector.py | 3 +- + backend/onyx/connectors/productboard/connector.py | 6 +- + backend/onyx/connectors/registry.py | 12 - + backend/onyx/connectors/salesforce/connector.py | 239 +- + .../onyx/connectors/salesforce/salesforce_calls.py | 10 +- + .../onyx/connectors/salesforce/sqlite_functions.py | 37 +- + backend/onyx/connectors/salesforce/utils.py | 22 - + backend/onyx/connectors/sharepoint/connector.py | 1930 +-- + .../onyx/connectors/sharepoint/connector_utils.py | 13 +- + backend/onyx/connectors/slab/connector.py | 30 +- + backend/onyx/connectors/slack/connector.py | 168 +- + .../onyx/connectors/slack/onyx_retry_handler.py | 8 +- + .../onyx/connectors/slack/onyx_slack_web_client.py | 4 +- + backend/onyx/connectors/teams/connector.py | 59 +- + backend/onyx/connectors/teams/utils.py | 11 +- + backend/onyx/connectors/testrail/connector.py | 7 +- + backend/onyx/connectors/web/connector.py | 512 +- + backend/onyx/connectors/xenforo/connector.py | 3 +- + backend/onyx/connectors/zendesk/connector.py | 7 +- + backend/onyx/connectors/zulip/connector.py | 10 +- + backend/onyx/context/search/enums.py | 27 +- + backend/onyx/context/search/federated/models.py | 12 - + .../onyx/context/search/federated/slack_search.py | 554 +- + .../context/search/federated/slack_search_utils.py | 160 +- + backend/onyx/context/search/models.py | 286 +- + backend/onyx/context/search/pipeline.py | 738 +- + .../search/postprocessing/postprocessing.py | 513 + + .../context/search/preprocessing/access_filters.py | 4 +- + .../context/search/preprocessing/preprocessing.py | 271 + + .../onyx/context/search/retrieval/search_runner.py | 441 +- + backend/onyx/context/search/search_settings.py | 30 + + backend/onyx/context/search/utils.py | 140 +- + backend/onyx/db/README.md | 36 - + backend/onyx/db/api_key.py | 48 - + backend/onyx/db/auth.py | 20 +- + backend/onyx/db/chat.py | 816 +- + backend/onyx/db/chunk.py | 2 +- + backend/onyx/db/code_interpreter.py | 21 - + backend/onyx/db/connector.py | 27 - + backend/onyx/db/connector_credential_pair.py | 181 +- + backend/onyx/db/credentials.py | 71 +- + backend/onyx/db/dal.py | 74 - + backend/onyx/db/discord_bot.py | 450 - + backend/onyx/db/document.py | 432 +- + backend/onyx/db/document_access.py | 122 - + backend/onyx/db/document_set.py | 58 +- + backend/onyx/db/engine/async_sql_engine.py | 11 +- + backend/onyx/db/engine/iam_auth.py | 12 +- + backend/onyx/db/engine/sql_engine.py | 32 +- + backend/onyx/db/engine/tenant_utils.py | 89 - + backend/onyx/db/enums.py | 215 - + backend/onyx/db/federated.py | 35 +- + backend/onyx/db/feedback.py | 18 +- + backend/onyx/db/file_content.py | 77 - + backend/onyx/db/file_record.py | 47 +- + backend/onyx/db/hierarchy.py | 773 -- + backend/onyx/db/hook.py | 235 - + backend/onyx/db/image_generation.py | 245 - + backend/onyx/db/index_attempt.py | 169 - + backend/onyx/db/input_prompt.py | 125 +- + backend/onyx/db/kg_temp_view.py | 442 +- + backend/onyx/db/llm.py | 802 +- + backend/onyx/db/mcp.py | 55 +- + backend/onyx/db/memory.py | 129 - + backend/onyx/db/milestone.py | 99 + + backend/onyx/db/models.py | 2183 +--- + backend/onyx/db/notification.py | 106 +- + backend/onyx/db/oauth_config.py | 10 +- + backend/onyx/db/opensearch_migration.py | 435 - + backend/onyx/db/pat.py | 71 +- + backend/onyx/db/permissions.py | 95 - + backend/onyx/db/persona.py | 730 +- + backend/onyx/db/projects.py | 113 +- + backend/onyx/db/pydantic_type.py | 16 +- + backend/onyx/db/release_notes.py | 93 - + backend/onyx/db/rotate_encryption_key.py | 158 - + backend/onyx/db/search_settings.py | 17 +- + backend/onyx/db/seeding/chat_history_seeding.py | 13 +- + backend/onyx/db/slack_bot.py | 6 +- + backend/onyx/db/slack_channel_config.py | 28 +- + backend/onyx/db/swap_index.py | 88 +- + backend/onyx/db/tag.py | 56 +- + backend/onyx/db/tools.py | 146 +- + backend/onyx/db/usage.py | 208 - + backend/onyx/db/user_file.py | 60 +- + backend/onyx/db/user_preferences.py | 133 +- + backend/onyx/db/users.py | 276 +- + backend/onyx/db/utils.py | 7 - + backend/onyx/db/voice.py | 237 - + backend/onyx/db/web_search.py | 31 +- + backend/onyx/deep_research/__init__.py | 0 + backend/onyx/deep_research/dr_loop.py | 770 -- + backend/onyx/deep_research/dr_mock_tools.py | 139 - + backend/onyx/deep_research/models.py | 22 - + backend/onyx/deep_research/utils.py | 216 - + backend/onyx/document_index/FILTER_SEMANTICS.md | 113 - + .../document_index/chunk_content_enrichment.py | 106 - + backend/onyx/document_index/disabled.py | 149 - + .../onyx/document_index/document_index_utils.py | 3 + + backend/onyx/document_index/factory.py | 168 +- + backend/onyx/document_index/interfaces.py | 51 +- + backend/onyx/document_index/interfaces_new.py | 480 - + backend/onyx/document_index/opensearch/README.md | 62 - + backend/onyx/document_index/opensearch/client.py | 1153 -- + .../document_index/opensearch/cluster_settings.py | 18 - + .../onyx/document_index/opensearch/constants.py | 103 - + .../opensearch/opensearch_document_index.py | 1128 -- + backend/onyx/document_index/opensearch/schema.py | 607 - + backend/onyx/document_index/opensearch/search.py | 1322 -- + .../document_index/opensearch/string_filtering.py | 48 - + .../app_config/schemas/danswer_chunk.sd.jinja | 7 - + .../vespa/app_config/services.xml.jinja | 2 +- + .../onyx/document_index/vespa/chunk_retrieval.py | 204 +- + backend/onyx/document_index/vespa/deletion.py | 8 - + backend/onyx/document_index/vespa/index.py | 725 +- + .../onyx/document_index/vespa/indexing_utils.py | 117 +- + .../document_index/vespa/shared_utils/utils.py | 31 +- + .../vespa/shared_utils/vespa_request_builders.py | 175 +- + .../document_index/vespa/vespa_document_index.py | 769 -- + backend/onyx/document_index/vespa_constants.py | 13 +- + backend/onyx/error_handling/__init__.py | 0 + backend/onyx/error_handling/error_codes.py | 110 - + backend/onyx/error_handling/exceptions.py | 91 - + backend/onyx/evals/README.md | 108 +- + backend/onyx/evals/eval.py | 409 +- + backend/onyx/evals/eval_cli.py | 81 +- + backend/onyx/evals/models.py | 106 +- + backend/onyx/evals/provider.py | 15 +- + backend/onyx/evals/providers/braintrust.py | 143 +- + backend/onyx/evals/providers/local.py | 231 - + backend/onyx/feature_flags/factory.py | 3 +- + backend/onyx/feature_flags/feature_flags_keys.py | 2 + + backend/onyx/feature_flags/interface.py | 10 +- + .../federated_connectors/federated_retrieval.py | 126 +- + backend/onyx/federated_connectors/interfaces.py | 4 +- + backend/onyx/federated_connectors/oauth_utils.py | 63 +- + .../slack/federated_connector.py | 8 +- + backend/onyx/federated_connectors/slack/models.py | 10 +- + backend/onyx/file_processing/extract_file_text.py | 293 +- + backend/onyx/file_processing/file_types.py | 93 - + backend/onyx/file_processing/file_validation.py | 55 + + backend/onyx/file_processing/html_utils.py | 4 +- + .../onyx/file_processing/image_summarization.py | 67 +- + .../onyx/file_processing/password_validation.py | 99 - + backend/onyx/file_processing/unstructured.py | 10 +- + backend/onyx/file_store/README.md | 2 +- + backend/onyx/file_store/document_batch_storage.py | 40 +- + backend/onyx/file_store/file_store.py | 92 +- + backend/onyx/file_store/models.py | 15 +- + backend/onyx/file_store/postgres_file_store.py | 330 - + backend/onyx/file_store/utils.py | 180 +- + backend/onyx/hooks/__init__.py | 0 + backend/onyx/hooks/api_dependencies.py | 17 - + backend/onyx/hooks/executor.py | 62 - + backend/onyx/hooks/models.py | 123 - + backend/onyx/hooks/points/__init__.py | 0 + backend/onyx/hooks/points/base.py | 74 - + backend/onyx/hooks/points/document_ingestion.py | 114 - + backend/onyx/hooks/points/query_processing.py | 73 - + backend/onyx/hooks/registry.py | 45 - + backend/onyx/image_gen/__init__.py | 0 + backend/onyx/image_gen/exceptions.py | 6 - + backend/onyx/image_gen/factory.py | 44 - + backend/onyx/image_gen/interfaces.py | 83 - + backend/onyx/image_gen/providers/azure_img_gen.py | 133 - + backend/onyx/image_gen/providers/openai_img_gen.py | 114 - + backend/onyx/image_gen/providers/vertex_img_gen.py | 220 - + .../indexing/adapters/document_indexing_adapter.py | 182 +- + .../adapters/user_file_indexing_adapter.py | 209 +- + backend/onyx/indexing/chunk_batch_store.py | 89 - + backend/onyx/indexing/chunker.py | 5 +- + backend/onyx/indexing/embedder.py | 10 +- + backend/onyx/indexing/indexing_pipeline.py | 1001 +- + backend/onyx/indexing/models.py | 56 +- + backend/onyx/indexing/vector_db_insertion.py | 38 +- + backend/onyx/key_value_store/interface.py | 14 - + backend/onyx/key_value_store/store.py | 64 +- + backend/onyx/kg/clustering/clustering.py | 12 +- + backend/onyx/kg/clustering/normalizations.py | 21 +- + .../onyx/kg/extractions/extraction_processing.py | 5 +- + backend/onyx/kg/resets/reset_vespa.py | 8 +- + .../onyx/kg/setup/kg_default_entity_definitions.py | 3 +- + backend/onyx/kg/utils/extraction_utils.py | 48 +- + backend/onyx/kg/utils/formatting_utils.py | 12 +- + backend/onyx/kg/utils/lock_utils.py | 12 - + backend/onyx/llm/chat_llm.py | 779 ++ + backend/onyx/llm/constants.py | 363 - + backend/onyx/llm/cost.py | 38 - + backend/onyx/llm/exceptions.py | 4 + + backend/onyx/llm/factory.py | 549 +- + backend/onyx/llm/interfaces.py | 192 +- + backend/onyx/llm/litellm_singleton/__init__.py | 3 +- + backend/onyx/llm/litellm_singleton/config.py | 53 - + .../onyx/llm/litellm_singleton/monkey_patches.py | 887 +- + backend/onyx/llm/llm_provider_options.py | 483 + + backend/onyx/llm/message_types.py | 70 + + backend/onyx/llm/model_metadata_enrichments.json | 4249 ------- + backend/onyx/llm/model_name_parser.py | 257 - + backend/onyx/llm/model_response.py | 33 +- + backend/onyx/llm/models.py | 217 +- + backend/onyx/llm/multi_llm.py | 871 -- + backend/onyx/llm/override_models.py | 19 - + backend/onyx/llm/prompt_cache/README.md | 172 - + backend/onyx/llm/prompt_cache/__init__.py | 34 - + backend/onyx/llm/prompt_cache/cache_manager.py | 223 - + backend/onyx/llm/prompt_cache/models.py | 20 - + backend/onyx/llm/prompt_cache/processor.py | 142 - + .../onyx/llm/prompt_cache/providers/__init__.py | 17 - + .../onyx/llm/prompt_cache/providers/anthropic.py | 95 - + backend/onyx/llm/prompt_cache/providers/base.py | 70 - + backend/onyx/llm/prompt_cache/providers/factory.py | 34 - + backend/onyx/llm/prompt_cache/providers/noop.py | 53 - + backend/onyx/llm/prompt_cache/providers/openai.py | 69 - + backend/onyx/llm/prompt_cache/providers/vertex.py | 125 - + backend/onyx/llm/prompt_cache/utils.py | 122 - + backend/onyx/llm/request_context.py | 23 - + backend/onyx/llm/utils.py | 643 +- + .../llm/well_known_providers/auto_update_models.py | 53 - + .../well_known_providers/auto_update_service.py | 149 - + backend/onyx/llm/well_known_providers/constants.py | 45 - + .../well_known_providers/llm_provider_options.py | 359 - + backend/onyx/llm/well_known_providers/models.py | 32 - + .../well_known_providers/recommended-models.json | 68 - + backend/onyx/main.py | 192 +- + backend/onyx/mcp_server/README.md | 8 +- + backend/onyx/mcp_server/auth.py | 4 +- + backend/onyx/mcp_server/tools/search.py | 159 +- + backend/onyx/mcp_server/utils.py | 22 +- + backend/onyx/mcp_server_main.py | 7 +- + .../english_stopwords.py | 225 - + .../search_nlp_models.py | 245 +- + backend/onyx/natural_language_processing/utils.py | 37 +- + .../onyxbot/discord/DISCORD_MULTITENANT_README.md | 287 - + backend/onyx/onyxbot/discord/api_client.py | 215 - + backend/onyx/onyxbot/discord/cache.py | 153 - + backend/onyx/onyxbot/discord/client.py | 232 - + backend/onyx/onyxbot/discord/constants.py | 19 - + backend/onyx/onyxbot/discord/exceptions.py | 37 - + backend/onyx/onyxbot/discord/handle_commands.py | 429 - + backend/onyx/onyxbot/discord/handle_message.py | 491 - + backend/onyx/onyxbot/discord/utils.py | 44 - + backend/onyx/onyxbot/slack/blocks.py | 92 +- + backend/onyx/onyxbot/slack/constants.py | 4 - + backend/onyx/onyxbot/slack/formatting.py | 258 +- + .../onyx/onyxbot/slack/handlers/handle_buttons.py | 54 +- + .../onyx/onyxbot/slack/handlers/handle_message.py | 72 +- + .../slack/handlers/handle_regular_answer.py | 292 +- + .../slack/handlers/handle_standard_answers.py | 12 +- + backend/onyx/onyxbot/slack/handlers/utils.py | 27 +- + backend/onyx/onyxbot/slack/listener.py | 163 +- + backend/onyx/onyxbot/slack/models.py | 9 +- + backend/onyx/onyxbot/slack/utils.py | 34 +- + backend/onyx/prompts/agent_search.py | 1073 ++ + backend/onyx/prompts/agentic_evaluation.py | 44 + + backend/onyx/prompts/agents/dc_prompts.py | 147 + + backend/onyx/prompts/answer_validation.py | 61 + + backend/onyx/prompts/basic_memory.py | 38 - + backend/onyx/prompts/chat_prompts.py | 413 +- + backend/onyx/prompts/chat_tools.py | 5 +- + backend/onyx/prompts/compression_prompts.py | 39 - + backend/onyx/prompts/constants.py | 26 +- + backend/onyx/prompts/contextual_retrieval.py | 27 - + backend/onyx/prompts/deep_research/__init__.py | 0 + .../onyx/prompts/deep_research/dr_tool_prompts.py | 44 - + .../prompts/deep_research/orchestration_layer.py | 209 - + .../onyx/prompts/deep_research/research_agent.py | 100 - + backend/onyx/prompts/direct_qa_prompts.py | 154 + + backend/onyx/prompts/dr_prompts.py | 1577 +++ + backend/onyx/prompts/federated_search.py | 40 +- + backend/onyx/prompts/filter_extration.py | 3 +- + backend/onyx/prompts/llm_chunk_filter.py | 33 + + backend/onyx/prompts/miscellaneous_prompts.py | 29 + + backend/onyx/prompts/prompt_utils.py | 234 +- + backend/onyx/prompts/query_validation.py | 58 + + backend/onyx/prompts/search_prompts.py | 196 - + backend/onyx/prompts/starter_messages.py | 52 + + backend/onyx/prompts/token_counts.py | 29 + + backend/onyx/prompts/tool_prompts.py | 82 - + backend/onyx/prompts/user_info.py | 36 - + backend/onyx/redis/redis_connector_delete.py | 5 +- + .../onyx/redis/redis_connector_doc_perm_sync.py | 37 +- + .../onyx/redis/redis_connector_ext_group_sync.py | 5 +- + backend/onyx/redis/redis_connector_prune.py | 7 +- + backend/onyx/redis/redis_connector_stop.py | 3 +- + backend/onyx/redis/redis_document_set.py | 7 +- + backend/onyx/redis/redis_hierarchy.py | 572 - + backend/onyx/redis/redis_pool.py | 110 +- + backend/onyx/redis/redis_usergroup.py | 7 +- + .../onyx/secondary_llm_flows/agentic_evaluation.py | 91 + + .../onyx/secondary_llm_flows/answer_validation.py | 61 + + .../secondary_llm_flows/chat_session_naming.py | 61 +- + backend/onyx/secondary_llm_flows/choose_search.py | 99 + + .../onyx/secondary_llm_flows/chunk_usefulness.py | 103 + + .../onyx/secondary_llm_flows/document_filter.py | 419 - + backend/onyx/secondary_llm_flows/memory_update.py | 191 - + .../onyx/secondary_llm_flows/query_expansion.py | 340 +- + backend/onyx/secondary_llm_flows/source_filter.py | 178 +- + .../starter_message_creation.py | 199 + + backend/onyx/secondary_llm_flows/time_filter.py | 237 +- + backend/onyx/seeding/input_prompts.yaml | 24 + + backend/onyx/seeding/load_yamls.py | 40 + + backend/onyx/seeding/prebuilt_personas.py | 322 + + backend/onyx/server/api_key/api.py | 15 +- + backend/onyx/server/api_key_usage.py | 56 - + backend/onyx/server/auth_check.py | 22 +- + backend/onyx/server/documents/cc_pair.py | 55 +- + backend/onyx/server/documents/connector.py | 828 +- + backend/onyx/server/documents/credential.py | 42 +- + backend/onyx/server/documents/document.py | 18 +- + backend/onyx/server/documents/models.py | 59 +- + backend/onyx/server/documents/standard_oauth.py | 9 +- + .../onyx/server/eea_config/eea_config_backend.py | 46 + + backend/onyx/server/eea_config/models.py | 4 + + backend/onyx/server/features/build/.gitignore | 2 - + .../onyx/server/features/build/AGENTS.template.md | 113 - + backend/onyx/server/features/build/__init__.py | 1 - + backend/onyx/server/features/build/api/api.py | 555 - + .../onyx/server/features/build/api/messages_api.py | 124 - + backend/onyx/server/features/build/api/models.py | 359 - + .../server/features/build/api/packet_logger.py | 696 -- + backend/onyx/server/features/build/api/packets.py | 68 - + .../onyx/server/features/build/api/rate_limit.py | 129 - + .../onyx/server/features/build/api/sessions_api.py | 883 -- + .../features/build/api/subscription_check.py | 52 - + .../build/api/templates/webapp_hmr_fixer.js | 135 - + .../build/api/templates/webapp_offline.html | 110 - + .../onyx/server/features/build/api/user_library.py | 769 -- + backend/onyx/server/features/build/configs.py | 161 - + backend/onyx/server/features/build/db/__init__.py | 1 - + .../onyx/server/features/build/db/build_session.py | 592 - + .../onyx/server/features/build/db/rate_limit.py | 96 - + backend/onyx/server/features/build/db/sandbox.py | 242 - + .../onyx/server/features/build/db/user_library.py | 181 - + .../build/indexing/persistent_document_writer.py | 543 - + backend/onyx/server/features/build/s3/s3_client.py | 9 - + .../onyx/server/features/build/sandbox/README.md | 375 - + .../onyx/server/features/build/sandbox/__init__.py | 44 - + backend/onyx/server/features/build/sandbox/base.py | 529 - + .../features/build/sandbox/kubernetes/__init__.py | 16 - + .../build/sandbox/kubernetes/docker/Dockerfile | 119 - + .../build/sandbox/kubernetes/docker/README.md | 124 - + .../build/sandbox/kubernetes/docker/demo_data.zip | Bin 2909161 -> 0 bytes + .../kubernetes/docker/generate_agents_md.py | 232 - + .../kubernetes/docker/initial-requirements.txt | 20 - + .../build/sandbox/kubernetes/docker/run-test.sh | 80 - + .../docker/skills/image-generation/SKILL.md | 99 - + .../skills/image-generation/scripts/generate.py | 230 - + .../sandbox/kubernetes/docker/skills/pptx/SKILL.md | 234 - + .../kubernetes/docker/skills/pptx/editing.md | 209 - + .../kubernetes/docker/skills/pptx/pptxgenjs.md | 420 - + .../docker/skills/pptx/scripts/__init__.py | 0 + .../docker/skills/pptx/scripts/add_slide.py | 219 - + .../kubernetes/docker/skills/pptx/scripts/clean.py | 294 - + .../skills/pptx/scripts/office/helpers/__init__.py | 0 + .../pptx/scripts/office/helpers/merge_runs.py | 193 - + .../scripts/office/helpers/simplify_redlines.py | 198 - + .../docker/skills/pptx/scripts/office/pack.py | 161 - + .../schemas/ISO-IEC29500-4_2016/dml-chart.xsd | 1499 --- + .../ISO-IEC29500-4_2016/dml-chartDrawing.xsd | 146 - + .../schemas/ISO-IEC29500-4_2016/dml-diagram.xsd | 1085 -- + .../ISO-IEC29500-4_2016/dml-lockedCanvas.xsd | 11 - + .../schemas/ISO-IEC29500-4_2016/dml-main.xsd | 3081 ----- + .../schemas/ISO-IEC29500-4_2016/dml-picture.xsd | 23 - + .../ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd | 185 - + .../dml-wordprocessingDrawing.xsd | 287 - + .../office/schemas/ISO-IEC29500-4_2016/pml.xsd | 1676 --- + .../shared-additionalCharacteristics.xsd | 28 - + .../ISO-IEC29500-4_2016/shared-bibliography.xsd | 144 - + .../shared-commonSimpleTypes.xsd | 174 - + .../shared-customXmlDataProperties.xsd | 25 - + .../shared-customXmlSchemaProperties.xsd | 18 - + .../shared-documentPropertiesCustom.xsd | 59 - + .../shared-documentPropertiesExtended.xsd | 56 - + .../shared-documentPropertiesVariantTypes.xsd | 195 - + .../schemas/ISO-IEC29500-4_2016/shared-math.xsd | 582 - + .../shared-relationshipReference.xsd | 25 - + .../office/schemas/ISO-IEC29500-4_2016/sml.xsd | 4439 ------- + .../schemas/ISO-IEC29500-4_2016/vml-main.xsd | 570 - + .../ISO-IEC29500-4_2016/vml-officeDrawing.xsd | 509 - + .../vml-presentationDrawing.xsd | 12 - + .../ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd | 108 - + .../vml-wordprocessingDrawing.xsd | 96 - + .../office/schemas/ISO-IEC29500-4_2016/wml.xsd | 3646 ------ + .../office/schemas/ISO-IEC29500-4_2016/xml.xsd | 116 - + .../ecma/fouth-edition/opc-contentTypes.xsd | 42 - + .../ecma/fouth-edition/opc-coreProperties.xsd | 50 - + .../schemas/ecma/fouth-edition/opc-digSig.xsd | 49 - + .../ecma/fouth-edition/opc-relationships.xsd | 33 - + .../skills/pptx/scripts/office/schemas/mce/mc.xsd | 75 - + .../scripts/office/schemas/microsoft/wml-2010.xsd | 560 - + .../scripts/office/schemas/microsoft/wml-2012.xsd | 67 - + .../scripts/office/schemas/microsoft/wml-2018.xsd | 14 - + .../office/schemas/microsoft/wml-cex-2018.xsd | 20 - + .../office/schemas/microsoft/wml-cid-2016.xsd | 13 - + .../schemas/microsoft/wml-sdtdatahash-2020.xsd | 4 - + .../office/schemas/microsoft/wml-symex-2015.xsd | 8 - + .../docker/skills/pptx/scripts/office/soffice.py | 181 - + .../docker/skills/pptx/scripts/office/unpack.py | 131 - + .../docker/skills/pptx/scripts/office/validate.py | 125 - + .../pptx/scripts/office/validators/__init__.py | 15 - + .../skills/pptx/scripts/office/validators/base.py | 855 -- + .../skills/pptx/scripts/office/validators/docx.py | 443 - + .../skills/pptx/scripts/office/validators/pptx.py | 273 - + .../pptx/scripts/office/validators/redlining.py | 246 - + .../docker/skills/pptx/scripts/preview.py | 114 - + .../docker/skills/pptx/scripts/thumbnail.py | 291 - + .../docker/templates/outputs/web/.gitignore | 41 - + .../docker/templates/outputs/web/AGENTS.md | 803 -- + .../outputs/web/app/android-chrome-192x192.png | Bin 38442 -> 0 bytes + .../outputs/web/app/android-chrome-512x512.png | Bin 106727 -> 0 bytes + .../templates/outputs/web/app/apple-touch-icon.png | Bin 34565 -> 0 bytes + .../templates/outputs/web/app/favicon-16x16.png | Bin 893 -> 0 bytes + .../templates/outputs/web/app/favicon-32x32.png | Bin 2802 -> 0 bytes + .../docker/templates/outputs/web/app/favicon.ico | Bin 15406 -> 0 bytes + .../docker/templates/outputs/web/app/favicon.zip | Bin 199918 -> 0 bytes + .../docker/templates/outputs/web/app/globals.css | 127 - + .../docker/templates/outputs/web/app/layout.tsx | 36 - + .../docker/templates/outputs/web/app/page.tsx | 135 - + .../templates/outputs/web/app/site.webmanifest | 1 - + .../docker/templates/outputs/web/components.json | 24 - + .../outputs/web/components/component-example.tsx | 490 - + .../templates/outputs/web/components/example.tsx | 55 - + .../outputs/web/components/ui/accordion.tsx | 87 - + .../outputs/web/components/ui/alert-dialog.tsx | 199 - + .../templates/outputs/web/components/ui/alert.tsx | 76 - + .../outputs/web/components/ui/aspect-ratio.tsx | 11 - + .../templates/outputs/web/components/ui/avatar.tsx | 112 - + .../templates/outputs/web/components/ui/badge.tsx | 49 - + .../outputs/web/components/ui/breadcrumb.tsx | 119 - + .../outputs/web/components/ui/button-group.tsx | 83 - + .../templates/outputs/web/components/ui/button.tsx | 67 - + .../outputs/web/components/ui/calendar.tsx | 223 - + .../templates/outputs/web/components/ui/card.tsx | 103 - + .../outputs/web/components/ui/carousel.tsx | 242 - + .../templates/outputs/web/components/ui/chart.tsx | 356 - + .../outputs/web/components/ui/checkbox.tsx | 32 - + .../outputs/web/components/ui/collapsible.tsx | 33 - + .../outputs/web/components/ui/combobox.tsx | 302 - + .../outputs/web/components/ui/command.tsx | 192 - + .../outputs/web/components/ui/context-menu.tsx | 259 - + .../templates/outputs/web/components/ui/dialog.tsx | 164 - + .../templates/outputs/web/components/ui/drawer.tsx | 131 - + .../outputs/web/components/ui/dropdown-menu.tsx | 265 - + .../templates/outputs/web/components/ui/empty.tsx | 101 - + .../templates/outputs/web/components/ui/field.tsx | 238 - + .../outputs/web/components/ui/hover-card.tsx | 44 - + .../outputs/web/components/ui/input-group.tsx | 156 - + .../templates/outputs/web/components/ui/input.tsx | 19 - + .../templates/outputs/web/components/ui/item.tsx | 196 - + .../templates/outputs/web/components/ui/kbd.tsx | 26 - + .../templates/outputs/web/components/ui/label.tsx | 24 - + .../outputs/web/components/ui/menubar.tsx | 276 - + .../outputs/web/components/ui/native-select.tsx | 56 - + .../outputs/web/components/ui/navigation-menu.tsx | 167 - + .../outputs/web/components/ui/pagination.tsx | 130 - + .../outputs/web/components/ui/popover.tsx | 89 - + .../outputs/web/components/ui/progress.tsx | 31 - + .../outputs/web/components/ui/radio-group.tsx | 45 - + .../outputs/web/components/ui/resizable.tsx | 53 - + .../outputs/web/components/ui/scroll-area.tsx | 55 - + .../templates/outputs/web/components/ui/select.tsx | 194 - + .../outputs/web/components/ui/separator.tsx | 28 - + .../templates/outputs/web/components/ui/sheet.tsx | 143 - + .../outputs/web/components/ui/sidebar.tsx | 702 -- + .../outputs/web/components/ui/skeleton.tsx | 13 - + .../templates/outputs/web/components/ui/slider.tsx | 59 - + .../templates/outputs/web/components/ui/sonner.tsx | 45 - + .../outputs/web/components/ui/spinner.tsx | 15 - + .../templates/outputs/web/components/ui/switch.tsx | 33 - + .../templates/outputs/web/components/ui/table.tsx | 116 - + .../templates/outputs/web/components/ui/tabs.tsx | 90 - + .../outputs/web/components/ui/textarea.tsx | 18 - + .../outputs/web/components/ui/toggle-group.tsx | 89 - + .../templates/outputs/web/components/ui/toggle.tsx | 46 - + .../outputs/web/components/ui/tooltip.tsx | 61 - + .../docker/templates/outputs/web/eslint.config.mjs | 18 - + .../templates/outputs/web/hooks/use-mobile.ts | 21 - + .../docker/templates/outputs/web/lib/utils.ts | 6 - + .../docker/templates/outputs/web/next.config.ts | 7 - + .../docker/templates/outputs/web/package-lock.json | 12009 ------------------ + .../docker/templates/outputs/web/package.json | 43 - + .../templates/outputs/web/postcss.config.mjs | 7 - + .../docker/templates/outputs/web/public/file.svg | 1 - + .../docker/templates/outputs/web/public/globe.svg | 1 - + .../docker/templates/outputs/web/public/next.svg | 1 - + .../docker/templates/outputs/web/public/vercel.svg | 1 - + .../docker/templates/outputs/web/public/window.svg | 1 - + .../docker/templates/outputs/web/tsconfig.json | 34 - + .../build/sandbox/kubernetes/docker/test-job.yaml | 39 - + .../build/sandbox/kubernetes/internal/__init__.py | 12 - + .../sandbox/kubernetes/internal/acp_exec_client.py | 771 -- + .../kubernetes/kubernetes_sandbox_manager.py | 2693 ---- + .../features/build/sandbox/local/__init__.py | 19 - + .../features/build/sandbox/local/agent_client.py | 848 -- + .../build/sandbox/local/local_sandbox_manager.py | 1394 --- + .../build/sandbox/local/process_manager.py | 255 - + .../build/sandbox/local/test_agent_client.py | 174 - + .../features/build/sandbox/local/test_manager.py | 612 - + .../features/build/sandbox/manager/__init__.py | 16 - + .../build/sandbox/manager/directory_manager.py | 527 - + .../build/sandbox/manager/snapshot_manager.py | 226 - + .../sandbox/manager/test_directory_manager.py | 680 - + .../onyx/server/features/build/sandbox/models.py | 70 - + .../features/build/sandbox/tasks/__init__.py | 0 + .../server/features/build/sandbox/tasks/tasks.py | 454 - + .../server/features/build/sandbox/util/__init__.py | 39 - + .../build/sandbox/util/agent_instructions.py | 507 - + .../build/sandbox/util/build_venv_template.py | 123 - + .../features/build/sandbox/util/opencode_config.py | 164 - + .../features/build/sandbox/util/persona_mapping.py | 190 - + .../onyx/server/features/build/session/__init__.py | 6 - + .../onyx/server/features/build/session/manager.py | 2260 ---- + .../onyx/server/features/build/session/prompts.py | 47 - + backend/onyx/server/features/build/utils.py | 329 - + .../onyx/server/features/default_assistant/api.py | 19 +- + .../server/features/default_assistant/models.py | 13 +- + backend/onyx/server/features/document_set/api.py | 55 +- + .../onyx/server/features/document_set/models.py | 3 +- + backend/onyx/server/features/hierarchy/api.py | 138 - + .../onyx/server/features/hierarchy/constants.py | 5 - + backend/onyx/server/features/hierarchy/models.py | 91 - + backend/onyx/server/features/hooks/__init__.py | 0 + backend/onyx/server/features/input_prompt/api.py | 42 +- + backend/onyx/server/features/mcp/api.py | 652 +- + backend/onyx/server/features/mcp/models.py | 34 +- + backend/onyx/server/features/notifications/api.py | 37 +- + backend/onyx/server/features/oauth_config/api.py | 41 +- + backend/onyx/server/features/password/api.py | 8 +- + backend/onyx/server/features/persona/api.py | 328 +- + backend/onyx/server/features/persona/constants.py | 4 - + backend/onyx/server/features/persona/models.py | 173 +- + backend/onyx/server/features/projects/api.py | 287 +- + backend/onyx/server/features/projects/models.py | 17 +- + .../features/projects/projects_file_utils.py | 211 +- + .../onyx/server/features/release_notes/__init__.py | 0 + .../server/features/release_notes/constants.py | 23 - + .../onyx/server/features/release_notes/models.py | 11 - + .../onyx/server/features/release_notes/utils.py | 239 - + backend/onyx/server/features/tool/api.py | 109 +- + backend/onyx/server/features/tool/models.py | 27 +- + .../onyx/server/features/tool/tool_visibility.py | 91 - + .../onyx/server/features/user_oauth_token/api.py | 28 +- + backend/onyx/server/features/web_search/api.py | 150 +- + backend/onyx/server/features/web_search/models.py | 8 +- + backend/onyx/server/federated/api.py | 73 +- + backend/onyx/server/gpts/api.py | 104 + + backend/onyx/server/kg/api.py | 35 +- + .../server/long_term_logs/long_term_logs_api.py | 106 + + backend/onyx/server/manage/administrative.py | 26 +- + .../server/manage/code_interpreter/__init__.py | 0 + backend/onyx/server/manage/code_interpreter/api.py | 49 - + .../onyx/server/manage/code_interpreter/models.py | 9 - + backend/onyx/server/manage/connectors_state.py | 158 + + backend/onyx/server/manage/discord_bot/api.py | 295 - + backend/onyx/server/manage/discord_bot/models.py | 71 - + backend/onyx/server/manage/discord_bot/utils.py | 46 - + backend/onyx/server/manage/embedding/api.py | 23 +- + backend/onyx/server/manage/embedding/models.py | 6 +- + backend/onyx/server/manage/get_state.py | 40 +- + backend/onyx/server/manage/image_generation/api.py | 536 - + .../onyx/server/manage/image_generation/models.py | 183 - + backend/onyx/server/manage/llm/api.py | 1442 +-- + backend/onyx/server/manage/llm/models.py | 297 +- + backend/onyx/server/manage/llm/utils.py | 416 - + backend/onyx/server/manage/models.py | 88 +- + .../onyx/server/manage/opensearch_migration/api.py | 66 - + .../server/manage/opensearch_migration/models.py | 21 - + backend/onyx/server/manage/search_settings.py | 150 +- + backend/onyx/server/manage/slack_bot.py | 39 +- + backend/onyx/server/manage/users.py | 624 +- + backend/onyx/server/manage/voice/__init__.py | 0 + backend/onyx/server/manage/voice/api.py | 323 - + backend/onyx/server/manage/voice/models.py | 95 - + backend/onyx/server/manage/voice/user_api.py | 252 - + backend/onyx/server/manage/voice/websocket_api.py | 857 -- + backend/onyx/server/manage/web_search/api.py | 196 +- + backend/onyx/server/manage/web_search/models.py | 25 +- + backend/onyx/server/metrics/__init__.py | 0 + backend/onyx/server/metrics/celery_task_metrics.py | 207 - + backend/onyx/server/metrics/indexing_pipeline.py | 593 - + .../onyx/server/metrics/indexing_pipeline_setup.py | 63 - + .../onyx/server/metrics/indexing_task_metrics.py | 253 - + backend/onyx/server/metrics/metrics_server.py | 90 - + backend/onyx/server/metrics/opensearch_search.py | 106 - + backend/onyx/server/metrics/per_tenant.py | 27 - + .../server/metrics/postgres_connection_pool.py | 251 - + backend/onyx/server/metrics/prometheus_setup.py | 75 - + backend/onyx/server/metrics/pruning_metrics.py | 72 - + backend/onyx/server/metrics/slow_requests.py | 31 - + backend/onyx/server/models.py | 26 +- + backend/onyx/server/onyx_api/ingestion.py | 76 +- + .../openai_assistants_api/asssistants_api.py | 253 + + .../full_openai_assistants_api.py | 19 + + .../server/openai_assistants_api/messages_api.py | 234 + + .../onyx/server/openai_assistants_api/runs_api.py | 344 + + .../server/openai_assistants_api/threads_api.py | 157 + + backend/onyx/server/pat/api.py | 9 +- + backend/onyx/server/query_and_chat/chat_backend.py | 704 +- + .../onyx/server/query_and_chat/chat_backend_v0.py | 348 + + backend/onyx/server/query_and_chat/chat_utils.py | 10 +- + backend/onyx/server/query_and_chat/models.py | 326 +- + backend/onyx/server/query_and_chat/placement.py | 26 - + .../onyx/server/query_and_chat/query_backend.py | 416 +- + .../onyx/server/query_and_chat/session_loading.py | 834 -- + .../onyx/server/query_and_chat/streaming_models.py | 449 +- + .../onyx/server/query_and_chat/streaming_utils.py | 746 ++ + backend/onyx/server/query_and_chat/token_limit.py | 4 +- + backend/onyx/server/saml.py | 12 +- + backend/onyx/server/settings/api.py | 84 +- + backend/onyx/server/settings/models.py | 58 +- + backend/onyx/server/settings/store.py | 64 +- + backend/onyx/server/tenant_usage_limits.py | 73 - + backend/onyx/server/token_rate_limits/api.py | 14 +- + backend/onyx/server/usage_limits.py | 270 - + backend/onyx/server/utils.py | 53 +- + backend/onyx/server/utils_vector_db.py | 15 - + backend/onyx/setup.py | 282 +- + backend/onyx/tools/adapter_v1_to_v2.py | 151 + + backend/onyx/tools/base_tool.py | 69 + + backend/onyx/tools/built_in_tools.py | 43 +- + backend/onyx/tools/built_in_tools_v2.py | 22 + + backend/onyx/tools/constants.py | 20 - + backend/onyx/tools/fake_tools/__init__.py | 0 + backend/onyx/tools/fake_tools/research_agent.py | 795 -- + backend/onyx/tools/force.py | 28 + + backend/onyx/tools/interface.py | 98 - + backend/onyx/tools/message.py | 46 + + backend/onyx/tools/models.py | 291 +- + backend/onyx/tools/tool.py | 137 + + backend/onyx/tools/tool_constructor.py | 429 +- + .../tool_implementations/custom/custom_tool.py | 299 +- + .../custom/custom_tool_prompts.py | 57 + + .../tool_implementations/custom/openapi_parsing.py | 3 +- + .../tools/tool_implementations/custom/prompt.py | 25 + + .../file_reader/file_reader_tool.py | 260 - + .../images/image_generation_tool.py | 536 +- + .../tools/tool_implementations/images/models.py | 20 - + .../tools/tool_implementations/images/prompt.py | 42 + + .../knowledge_graph/knowledge_graph_tool.py | 79 +- + .../tools/tool_implementations/mcp/mcp_tool.py | 301 +- + .../tools/tool_implementations/memory/__init__.py | 0 + .../tool_implementations/memory/memory_tool.py | 163 - + .../tools/tool_implementations/memory/models.py | 6 - + .../tool_implementations/open_url/__init__.py | 0 + .../tool_implementations/open_url/firecrawl.py | 165 - + .../tools/tool_implementations/open_url/models.py | 28 - + .../open_url/onyx_web_crawler.py | 174 - + .../tool_implementations/open_url/open_url_tool.py | 871 -- + .../open_url/snippet_matcher.py | 246 - + .../open_url/url_normalization.py | 93 - + .../tools/tool_implementations/open_url/utils.py | 17 - + .../python/code_interpreter_client.py | 284 - + .../tool_implementations/python/python_tool.py | 407 +- + .../tools/tool_implementations/search/constants.py | 29 - + .../tool_implementations/search/search_tool.py | 1288 +- + .../tool_implementations/search/search_utils.py | 482 +- + .../tool_implementations/search_like_tool_utils.py | 62 +- + backend/onyx/tools/tool_implementations/utils.py | 86 - + .../web_search/clients/brave_client.py | 257 - + .../web_search/clients/exa_client.py | 223 - + .../web_search/clients/google_pse_client.py | 157 - + .../web_search/clients/searxng_client.py | 137 - + .../web_search/clients/serper_client.py | 196 - + .../tool_implementations/web_search/models.py | 58 - + .../tool_implementations/web_search/providers.py | 205 - + .../tools/tool_implementations/web_search/utils.py | 207 - + .../web_search/web_search_tool.py | 351 +- + .../code_interpreter_client.py | 98 + + .../tool_implementations_v2/image_generation.py | 171 + + .../tool_implementations_v2/internal_search.py | 209 + + .../onyx/tools/tool_implementations_v2/python.py | 337 + + .../tool_implementations_v2/tool_accounting.py | 79 + + .../tool_implementations_v2/tool_result_models.py | 59 + + backend/onyx/tools/tool_implementations_v2/web.py | 291 + + backend/onyx/tools/tool_runner.py | 531 +- + backend/onyx/tools/tool_selection.py | 78 + + backend/onyx/tools/utils.py | 17 +- + backend/onyx/tracing/braintrust_tracing.py | 90 + + .../onyx/tracing/braintrust_tracing_processor.py | 104 +- + backend/onyx/tracing/framework/create.py | 35 - + backend/onyx/tracing/framework/provider.py | 5 +- + backend/onyx/tracing/framework/span_data.py | 8 - + backend/onyx/tracing/framework/traces.py | 1 + + backend/onyx/tracing/langfuse_tracing.py | 31 + + backend/onyx/tracing/langfuse_tracing_processor.py | 402 - + backend/onyx/tracing/llm_utils.py | 160 - + backend/onyx/tracing/masking.py | 71 - + .../tracing/openinference_tracing_processor.py | 450 + + backend/onyx/tracing/setup.py | 100 - + backend/onyx/utils/b64.py | 2 +- + backend/onyx/utils/batching.py | 8 +- + backend/onyx/utils/eea_utils.py | 338 + + backend/onyx/utils/encryption.py | 89 +- + backend/onyx/utils/file_types.py | 39 + + backend/onyx/utils/gpu_utils.py | 9 +- + backend/onyx/utils/jsonriver/__init__.py | 17 - + backend/onyx/utils/jsonriver/parse.py | 421 - + backend/onyx/utils/jsonriver/tokenize.py | 514 - + backend/onyx/utils/logger.py | 10 +- + backend/onyx/utils/long_term_log.py | 3 +- + backend/onyx/utils/middleware.py | 61 +- + backend/onyx/utils/playwright.py | 53 + + backend/onyx/utils/postgres_sanitization.py | 169 - + backend/onyx/utils/pydantic_util.py | 13 - + backend/onyx/utils/sensitive.py | 205 - + backend/onyx/utils/sitemap.py | 44 +- + backend/onyx/utils/telemetry.py | 82 +- + backend/onyx/utils/tenant.py | 15 - + backend/onyx/utils/text_processing.py | 188 +- + backend/onyx/utils/threadpool_concurrency.py | 211 +- + backend/onyx/utils/timing.py | 49 +- + backend/onyx/utils/url.py | 318 - + backend/onyx/utils/variable_functionality.py | 61 +- + backend/onyx/utils/web_content.py | 127 - + backend/onyx/voice/__init__.py | 0 + backend/onyx/voice/factory.py | 70 - + backend/onyx/voice/interface.py | 182 - + backend/onyx/voice/providers/__init__.py | 0 + backend/onyx/voice/providers/azure.py | 620 - + backend/onyx/voice/providers/elevenlabs.py | 870 -- + backend/onyx/voice/providers/openai.py | 633 - + backend/pyproject.toml | 39 + + backend/pytest.ini | 2 - + backend/requirements/README.md | 62 +- + backend/requirements/default.txt | 592 +- + backend/requirements/dev.txt | 417 +- + backend/requirements/ee.txt | 201 +- + backend/requirements/model_server.txt | 307 +- + backend/scripts/api_inference_sample.py | 2 +- + backend/scripts/celery_purge_queue.py | 2 +- + backend/scripts/chat_loadtest.py | 2 +- + backend/scripts/check_lazy_imports.py | 335 + + backend/scripts/compile_requirements.py | 109 + + backend/scripts/debugging/debug_usage_limits.py | 109 - + backend/scripts/debugging/litellm/README | 11 - + backend/scripts/debugging/litellm/call_litellm.py | 223 - + .../debugging/litellm/directly_hit_azure_api.py | 90 - + backend/scripts/debugging/litellm/payload.json | 109 - + backend/scripts/debugging/onyx_redis.py | 4 +- + backend/scripts/debugging/onyx_vespa.py | 940 ++ + .../debugging/opensearch/benchmark_retrieval.py | 170 - + backend/scripts/debugging/opensearch/constants.py | 1 - + .../scripts/debugging/opensearch/embed_and_save.py | 64 - + .../scripts/debugging/opensearch/embedding_io.py | 43 - + .../debugging/opensearch/opensearch_debug.py | 167 - + .../debugging/opensearch/query_hierarchy_debug.py | 134 - + backend/scripts/decrypt.py | 105 +- + backend/scripts/dev_run_background_jobs.py | 215 +- + backend/scripts/force_delete_connector_by_id.py | 23 +- + backend/scripts/onyx_openapi_schema.py | 129 +- + backend/scripts/orphan_doc_cleanup_script.py | 9 +- + .../scripts/query_time_check/seed_dummy_docs.py | 1 - + .../scripts/query_time_check/test_query_times.py | 264 +- + backend/scripts/reencrypt_secrets.py | 107 - + backend/scripts/restart_containers.sh | 73 +- + backend/scripts/run_industryrag_bench_questions.py | 641 - + backend/scripts/setup_craft_templates.sh | 67 - + backend/scripts/sources_selection_analysis.py | 5 +- + backend/scripts/supervisord_entrypoint.sh | 20 +- + .../tenant_cleanup/QUICK_START_NO_BASTION.md | 80 - + .../tenant_cleanup/check_no_bastion_setup.py | 284 - + backend/scripts/tenant_cleanup/cleanup_tenants.py | 35 +- + backend/scripts/tenant_cleanup/cleanup_utils.py | 25 +- + .../tenant_cleanup/mark_connectors_for_deletion.py | 3 +- + .../tenant_cleanup/no_bastion_analyze_tenants.py | 519 - + .../tenant_cleanup/no_bastion_cleanup_tenants.py | 889 -- + .../tenant_cleanup/no_bastion_cleanup_utils.py | 320 - + .../tenant_cleanup/no_bastion_mark_connectors.py | 508 - + .../on_pod_scripts/get_tenant_connectors.py | 6 +- + .../on_pod_scripts/get_tenant_index_name.py | 11 +- + .../on_pod_scripts/get_tenant_users.py | 6 +- + backend/scripts/transform_openapi_for_docs.py | 189 - + backend/scripts/upload_files_as_connectors.py | 291 - + backend/shared_configs/configs.py | 96 +- + backend/shared_configs/contextvars.py | 6 - + backend/shared_configs/enums.py | 3 - + backend/shared_configs/model_server_models.py | 22 + + backend/supervisord.conf | 78 +- + backend/tests/README.md | 86 - + backend/tests/conftest.py | 24 - + backend/tests/daily/conftest.py | 70 +- + .../connectors/airtable/test_airtable_basic.py | 161 +- + .../bitbucket/test_bitbucket_checkpointed.py | 6 +- + .../bitbucket/test_bitbucket_slim_connector.py | 11 +- + .../daily/connectors/blob/test_blob_connector.py | 44 +- + backend/tests/daily/connectors/coda/README.md | 221 - + .../daily/connectors/coda/test_coda_connector.py | 478 - + .../connectors/confluence/test_confluence_basic.py | 87 +- + .../test_confluence_permissions_basic.py | 79 +- + backend/tests/daily/connectors/conftest.py | 13 + + .../connectors/discord/test_discord_connector.py | 83 +- + .../connectors/discord/test_discord_data.json | 32 + + .../daily/connectors/file/test_file_connector.py | 10 +- + .../fireflies/test_fireflies_connector.py | 7 +- + .../connectors/gitbook/test_gitbook_connector.py | 4 - + .../daily/connectors/github/test_github_basic.py | 6 +- + .../daily/connectors/gitlab/test_gitlab_basic.py | 5 +- + .../daily/connectors/gmail/test_gmail_connector.py | 9 +- + backend/tests/daily/connectors/gong/test_gong.py | 9 +- + .../connectors/google_drive/consts_and_utils.py | 532 +- + .../connectors/google_drive/test_admin_oauth.py | 177 +- + .../google_drive/test_drive_perm_sync.py | 136 +- + .../google_drive/test_link_visibility_filter.py | 35 +- + .../connectors/google_drive/test_map_test_ids.py | 4 +- + .../daily/connectors/google_drive/test_sections.py | 7 +- + .../connectors/google_drive/test_service_acct.py | 256 +- + .../connectors/google_drive/test_user_1_oauth.py | 123 +- + .../connectors/highspot/test_highspot_connector.py | 22 +- + .../connectors/hubspot/test_hubspot_connector.py | 34 +- + backend/tests/daily/connectors/imap/models.py | 2 +- + .../daily/connectors/imap/test_imap_connector.py | 18 +- + .../tests/daily/connectors/jira/test_jira_basic.py | 21 +- + .../connectors/notion/test_notion_connector.py | 50 +- + .../connectors/outline/test_outline_connector.py | 9 +- + .../salesforce/test_salesforce_connector.py | 19 +- + .../sharepoint/test_sharepoint_connector.py | 236 +- + .../daily/connectors/slab/test_slab_connector.py | 17 +- + .../daily/connectors/slack/test_slack_connector.py | 51 +- + .../daily/connectors/slack/test_slack_perm_sync.py | 93 +- + .../daily/connectors/teams/test_teams_connector.py | 45 +- + backend/tests/daily/connectors/utils.py | 168 +- + .../daily/connectors/web/test_web_connector.py | 16 +- + .../connectors/zendesk/test_zendesk_connector.py | 19 +- + backend/tests/daily/embedding/test_embeddings.py | 24 +- + backend/tests/daily/llm/test_bedrock.py | 47 +- + .../external_dependency_unit/answer/conftest.py | 53 +- + .../answer/stream_test_assertions.py | 156 - + .../answer/stream_test_builder.py | 139 - + .../answer/stream_test_utils.py | 129 - + .../answer/test_answer_without_openai.py | 39 +- + .../answer/test_current_datetime_replacement.py | 49 +- + .../answer/test_stream_chat_message.py | 982 -- + .../answer/test_stream_chat_message_objects.py | 46 +- + .../background/test_periodic_task_claim.py | 257 - + .../background/test_startup_recovery.py | 358 - + .../external_dependency_unit/cache/conftest.py | 57 - + .../cache/test_cache_backend_parity.py | 100 - + .../cache/test_kv_store_cache_layer.py | 129 - + .../cache/test_postgres_cache_backend.py | 229 - + .../celery/test_docfetching_priority.py | 383 - + .../celery/test_docprocessing_priority.py | 294 - + .../celery/test_persona_file_sync.py | 516 - + .../celery/test_pruning_hierarchy_nodes.py | 881 -- + .../celery/test_user_file_delete_queue.py | 286 - + .../celery/test_user_file_indexing_adapter.py | 304 - + .../celery/test_user_file_processing_queue.py | 286 - + .../external_dependency_unit/chat}/__init__.py | 0 + .../chat/test_save_turn.py | 248 + + .../chat/test_simple_agent_packets.py | 348 + + .../chat/test_user_reminder_message_type.py | 338 - + backend/tests/external_dependency_unit/conftest.py | 23 +- + .../confluence/test_confluence_group_sync.py | 11 +- + .../google_drive/test_google_drive_group_sync.py | 67 +- + .../connectors/jira/conftest.py | 29 - + .../connectors/jira/test_jira_doc_sync.py | 231 - + .../connectors/jira/test_jira_group_sync.py | 148 - + .../external_dependency_unit/craft/conftest.py | 80 - + .../craft/test_build_packet_storage.py | 424 - + .../craft/test_file_upload.py | 475 - + .../craft/test_kubernetes_sandbox.py | 939 -- + .../craft/test_persistent_document_writer.py | 118 - + .../tests/external_dependency_unit/db/__init__.py | 0 + .../tests/external_dependency_unit/db/conftest.py | 83 - + .../db/test_chat_session_eager_load.py | 50 - + .../db/test_credential_sensitive_value.py | 90 - + .../db/test_rotate_encryption_key.py | 311 - + .../db/test_tag_race_condition.py | 289 - + .../db/test_user_account_type.py | 51 - + .../discord_bot/conftest.py | 162 - + .../discord_bot/test_discord_events.py | 630 - + .../document_index/conftest.py | 248 - + .../document_index/test_document_index.py | 227 - + .../document_index/test_document_index_old.py | 195 - + .../file_store/test_file_store_non_mocked.py | 69 +- + .../test_postgres_file_store_non_mocked.py | 491 - + .../tests/external_dependency_unit/full_setup.py | 30 +- + .../external_dependency_unit/hierarchy/__init__.py | 0 + .../hierarchy/test_hierarchy_access_filter.py | 156 - + .../llm/test_llm_provider.py | 592 - + .../llm/test_llm_provider_api_base.py | 757 -- + .../llm/test_llm_provider_auto_mode.py | 1325 -- + .../llm/test_llm_provider_called.py | 242 - + .../test_llm_provider_default_model_protection.py | 220 - + .../llm/test_prompt_caching.py | 766 -- + .../mock_content_provider.py | 59 - + .../mock_image_provider.py | 132 - + backend/tests/external_dependency_unit/mock_llm.py | 404 - + .../mock_search_pipeline.py | 231 - + .../mock_search_provider.py | 97 - + .../opensearch/test_assistant_knowledge_filter.py | 210 - + .../opensearch/test_opensearch_client.py | 1923 --- + .../test_opensearch_migration_tasks.py | 1136 -- + .../test_doc_permission_sync_attempt.py | 3 +- + .../test_external_group_permission_sync_attempt.py | 3 +- + .../search_settings/test_search_settings.py | 306 - + .../external_dependency_unit/slack_bot/__init__.py | 0 + .../slack_bot/test_slack_bot_crud.py | 85 - + .../slack_bot/test_slack_bot_federated_search.py | 180 +- + .../tools/test_image_generation_tool.py | 551 +- + .../tools/test_mcp_passthrough_oauth.py | 555 - + .../tools/test_memory_tool_integration.py | 244 - + .../tools/test_oauth_config_crud.py | 138 +- + .../tools/test_oauth_token_manager.py | 39 +- + .../tools/test_oauth_tool_integration.py | 124 +- + .../tools/test_python_tool.py | 2260 ++-- + .../tools/test_python_tool_server_enabled.py | 53 - + .../external_dependency_unit/tracing/__init__.py | 0 + .../tracing/test_llm_span_recording.py | 333 - + backend/tests/integration/Dockerfile | 5 +- + backend/tests/integration/README.md | 14 +- + backend/tests/integration/common_utils/chat.py | 4 +- + backend/tests/integration/common_utils/config.py | 2 +- + .../tests/integration/common_utils/document_acl.py | 143 - + .../integration/common_utils/managers/api_key.py | 26 +- + .../integration/common_utils/managers/cc_pair.py | 155 +- + .../integration/common_utils/managers/chat.py | 308 +- + .../integration/common_utils/managers/connector.py | 48 +- + .../common_utils/managers/credential.py | 44 +- + .../common_utils/managers/discord_bot.py | 310 - + .../integration/common_utils/managers/document.py | 77 +- + .../common_utils/managers/document_search.py | 47 +- + .../common_utils/managers/document_set.py | 37 +- + .../integration/common_utils/managers/file.py | 17 +- + .../common_utils/managers/image_generation.py | 232 - + .../common_utils/managers/index_attempt.py | 33 +- + .../common_utils/managers/llm_provider.py | 89 +- + .../integration/common_utils/managers/persona.py | 141 +- + .../integration/common_utils/managers/project.py | 39 +- + .../common_utils/managers/query_history.py | 69 +- + .../common_utils/managers/scim_client.py | 66 - + .../common_utils/managers/scim_token.py | 52 - + .../integration/common_utils/managers/settings.py | 19 +- + .../integration/common_utils/managers/tenant.py | 12 +- + .../integration/common_utils/managers/tool.py | 27 - + .../integration/common_utils/managers/user.py | 40 +- + .../common_utils/managers/user_group.py | 86 +- + backend/tests/integration/common_utils/reset.py | 34 +- + .../common_utils/test_document_utils.py | 4 +- + .../tests/integration/common_utils/test_models.py | 85 +- + backend/tests/integration/conftest.py | 40 +- + .../connector_job_tests/github/conftest.py | 153 - + .../github/test_github_permission_sync.py | 347 - + .../connector_job_tests/github/utils.py | 177 - + .../google/google_drive_api_utils.py | 9 +- + .../google/test_google_drive_permission_sync.py | 10 +- + .../jira/test_jira_permission_sync_full.py | 2 +- + .../connector_job_tests/sharepoint/conftest.py | 1 - + .../sharepoint/test_sharepoint_permissions.py | 105 +- + .../connector_job_tests/slack/conftest.py | 34 +- + .../connector_job_tests/slack/slack_api_utils.py | 4 + + .../slack/test_permission_sync.py | 131 +- + .../connector_job_tests/slack/test_prune.py | 8 +- + .../mcp_test_server/run_mcp_server_api_key.py | 13 +- + .../mcp_test_server/run_mcp_server_google_oauth.py | 249 - + .../mcp_test_server/run_mcp_server_no_auth.py | 14 +- + .../mcp_test_server/run_mcp_server_oauth.py | 21 +- + .../mcp_test_server/run_mcp_server_per_user_key.py | 20 +- + .../mock_services/mock_connector_server/Dockerfile | 4 +- + .../discord_bot/test_discord_bot_multitenant.py | 457 - + .../invitation/test_user_invitation.py | 18 +- + .../migrations/test_run_multitenant_migrations.py | 289 - + .../syncing/test_search_permissions.py | 6 +- + .../tenants/test_tenant_creation.py | 55 +- + .../tenants/test_tenant_provisioning_rollback.py | 106 - + .../test_get_schemas_needing_migration.py | 164 - + .../integration/openai_assistants_api/conftest.py | 23 + + .../openai_assistants_api/test_assistants.py | 151 + + .../openai_assistants_api/test_messages.py | 133 + + .../integration/openai_assistants_api/test_runs.py | 137 + + .../openai_assistants_api/test_threads.py | 131 + + .../tests/anonymous_user/test_anonymous_user.py | 101 +- + .../integration/tests/api_key/test_api_key.py | 188 +- + .../tests/auth/test_saml_user_conversion.py | 268 +- + .../integration/tests/chat/test_chat_deletion.py | 115 +- + .../tests/chat/test_chat_session_access.py | 185 - + .../tests/chat_retention/test_chat_retention.py | 87 +- + .../integration/tests/code_interpreter/conftest.py | 32 - + .../code_interpreter/test_code_interpreter_api.py | 97 - + .../tests/connector/test_connector_creation.py | 13 +- + .../tests/connector/test_connector_deletion.py | 80 +- + .../tests/connector/test_last_indexed_time.py | 237 - + .../tests/dev_apis/test_knowledge_chat.py | 195 + + .../tests/dev_apis/test_simple_chat_api.py | 250 + + .../tests/discord_bot/test_discord_bot_api.py | 452 - + .../tests/discord_bot/test_discord_bot_db.py | 670 - + .../integration/tests/document_set/test_syncing.py | 8 +- + .../test_image_generation_config.py | 491 - + .../test_image_generation_tool_visibility.py | 75 - + .../tests/image_indexing/test_indexing_images.py | 8 +- + .../index_attempt/test_index_attempt_pagination.py | 4 +- + .../tests/integration/tests/indexing/conftest.py | 4 +- + .../test_file_connector_zip_metadata.py | 14 +- + .../tests/indexing/test_checkpointing.py | 25 +- + .../tests/indexing/test_initial_permission_sync.py | 238 +- + .../integration/tests/indexing/test_polling.py | 2 +- + .../tests/indexing/test_repeated_error_state.py | 17 +- + .../tests/ingestion/test_ingestion_api.py | 61 - + backend/tests/integration/tests/kg/test_kg_api.py | 8 +- + .../integration/tests/kg/test_kg_processing.py | 343 + + .../tests/llm_auto_update/test_auto_llm_update.py | 261 - + .../tests/llm_provider/test_llm_provider.py | 1958 +-- + .../test_llm_provider_access_control.py | 252 +- + .../test_llm_provider_persona_access.py | 19 +- + .../llm_workflows/test_mock_llm_tool_calls.py | 126 - + .../test_nightly_provider_chat_workflow.py | 467 - + .../llm_workflows/test_tool_policy_enforcement.py | 183 - + .../tests/mcp/test_mcp_client_no_auth_flow.py | 20 +- + .../integration/tests/mcp/test_mcp_server_auth.py | 11 +- + .../tests/mcp/test_mcp_server_search.py | 14 +- + .../tests/integration/tests/migrations/conftest.py | 83 - + .../tests/migrations/test_alembic_main.py | 24 - + .../tests/migrations/test_alembic_tenants.py | 66 - + .../test_assistant_consolidation_migration.py | 488 +- + .../tests/migrations/test_migrations.py | 164 +- + .../tests/migrations/test_tool_seeding.py | 127 +- + .../integration/tests/no_vectordb/conftest.py | 52 - + .../tests/no_vectordb/test_no_vectordb_chat.py | 236 - + .../no_vectordb/test_no_vectordb_endpoints.py | 174 - + .../no_vectordb/test_no_vectordb_file_lifecycle.py | 160 - + .../test_opensearch_migration_api.py | 133 - + .../tests/integration/tests/pat/test_pat_api.py | 27 +- + .../integration/tests/permissions/conftest.py | 101 - + .../tests/permissions/test_admin_access.py | 148 - + .../test_auth_permission_propagation.py | 82 - + .../tests/permissions/test_basic_access.py | 152 - + .../tests/permissions/test_cc_pair_permissions.py | 31 +- + .../permissions/test_connector_permissions.py | 32 +- + .../permissions/test_credential_permissions.py | 25 +- + .../tests/permissions/test_doc_set_permissions.py | 5 +- + .../permissions/test_file_connector_permissions.py | 234 - + .../tests/permissions/test_persona_permissions.py | 2 +- + .../permissions/test_user_file_permissions.py | 39 +- + .../permissions/test_user_role_permissions.py | 2 +- + .../tests/permissions/test_whole_curator_flow.py | 4 +- + .../personalization/test_personalization_flow.py | 60 +- + .../tests/personas/test_persona_categories.py | 2 +- + .../tests/personas/test_persona_creation.py | 5 +- + .../tests/personas/test_persona_file_context.py | 314 - + .../tests/personas/test_persona_label_updates.py | 62 - + .../tests/personas/test_persona_pagination.py | 318 - + .../tests/personas/test_unified_assistant.py | 15 +- + .../tests/playwright/test_playwright.py | 21 + + .../integration/tests/projects/test_projects.py | 7 +- + .../integration/tests/pruning/test_pruning.py | 6 +- + .../tests/query_history/test_query_history.py | 26 +- + .../query_history/test_query_history_pagination.py | 4 +- + .../tests/query_history/test_usage_reports.py | 2 +- + .../tests/reporting/test_usage_export_api.py | 90 +- + .../integration/tests/scim/test_scim_groups.py | 694 -- + .../integration/tests/scim/test_scim_tokens.py | 164 - + .../integration/tests/scim/test_scim_users.py | 570 - + .../tests/search_settings/test_search_settings.py | 493 - + .../test_chat_file_attachment.py | 93 - + .../tests/streaming_endpoints/test_chat_stream.py | 103 +- + .../tests/streaming_endpoints/test_chat_v0_api.py | 480 + + backend/tests/integration/tests/tags/test_tags.py | 8 +- + .../integration/tests/tools/test_force_tool_use.py | 2 - + .../tests/tools/test_image_generation_streaming.py | 19 +- + .../tests/usergroup/test_add_users_to_group.py | 12 +- + ...st_group_membership_updates_user_permissions.py | 118 - + .../usergroup/test_group_permission_toggle.py | 156 - + .../test_new_group_gets_basic_permission.py | 30 - + .../tests/usergroup/test_user_group_deletion.py | 5 +- + .../tests/usergroup/test_usergroup_syncing.py | 5 +- + .../tests/users/test_default_group_assignment.py | 78 - + .../tests/users/test_password_signup_upgrade.py | 135 - + .../tests/users/test_reactivation_groups.py | 54 - + .../integration/tests/users/test_seat_limit.py | 161 - + .../tests/users/test_slack_user_deactivation.py | 123 - + .../tests/users/test_user_pagination.py | 4 +- + .../tests/web_search/test_web_search_api.py | 234 +- + .../tests/regression/answer_quality/api_utils.py | 53 +- + .../regression/answer_quality/file_uploader.py | 2 +- + .../regression/answer_quality/launch_eval_env.py | 3 +- + backend/tests/regression/answer_quality/run_qa.py | 198 + + backend/tests/regression/search_quality/README.md | 2 +- + .../regression/search_quality/run_search_eval.py | 84 +- + backend/tests/regression/search_quality/utils.py | 42 +- + backend/tests/unit/background/__init__.py | 0 + backend/tests/unit/background/celery/__init__.py | 0 + .../unit/background/celery/test_celery_utils.py | 149 - + .../tests/unit/build/test_rewrite_asset_paths.py | 248 - + backend/tests/unit/ee/conftest.py | 8 - + backend/tests/unit/ee/onyx/db/test_license.py | 216 - + .../unit/ee/onyx/db/test_user_group_rename.py | 53 - + .../salesforce/test_postprocessing.py | 1 + + .../sharepoint/test_permission_utils.py | 479 - + backend/tests/unit/ee/onyx/hooks/__init__.py | 0 + backend/tests/unit/ee/onyx/hooks/test_executor.py | 695 -- + backend/tests/unit/ee/onyx/server/__init__.py | 0 + .../tests/unit/ee/onyx/server/billing/__init__.py | 0 + .../tests/unit/ee/onyx/server/billing/conftest.py | 82 - + .../ee/onyx/server/billing/test_billing_api.py | 580 - + .../ee/onyx/server/billing/test_billing_service.py | 309 - + .../unit/ee/onyx/server/billing/test_proxy.py | 265 - + .../tests/unit/ee/onyx/server/features/__init__.py | 0 + .../unit/ee/onyx/server/features/hooks/__init__.py | 0 + .../unit/ee/onyx/server/features/hooks/test_api.py | 276 - + .../tests/unit/ee/onyx/server/license/test_api.py | 82 - + .../server/middleware/test_license_enforcement.py | 305 - + .../settings/test_license_enforcement_settings.py | 290 - + .../ee/onyx/server/tenants/test_billing_api.py | 157 - + .../ee/onyx/server/tenants/test_product_gating.py | 69 - + .../unit/ee/onyx/server/tenants/test_proxy.py | 606 - + .../onyx/server/tenants/test_schema_management.py | 91 - + .../tests/unit/ee/onyx/utils/test_encryption.py | 165 - + .../tests/unit/ee/onyx/utils/test_license_utils.py | 247 - + .../slack/test_slack_federated_connnector.py | 27 +- + .../test_reject_masked_credentials.py | 58 - + backend/tests/unit/file_store/test_file_store.py | 37 +- + .../unit/file_store/test_postgres_file_store.py | 373 - + .../tests/unit/model_server/test_custom_models.py | 145 + + backend/tests/unit/model_server/test_embedding.py | 22 +- + backend/tests/unit/onyx/__init__.py | 0 + .../unit/onyx/access/test_user_file_access.py | 163 - + .../unit/onyx/agents/agent_framework/conftest.py | 319 + + .../unit/onyx/agents/agent_framework/test_query.py | 628 + + .../onyx/agents/agent_sdk/test_message_format.py | 260 + + .../dr/sub_agents/web_search/test_providers.py | 17 + + .../onyx/auth/test_disposable_email_validator.py | 99 - + .../tests/unit/onyx/auth/test_is_same_origin.py | 120 - + .../tests/unit/onyx/auth/test_jwt_provisioning.py | 30 +- + .../tests/unit/onyx/auth/test_oauth_refresher.py | 8 +- + backend/tests/unit/onyx/auth/test_oidc_pkce.py | 400 - + backend/tests/unit/onyx/auth/test_permissions.py | 176 - + .../onyx/auth/test_single_tenant_jwt_strategy.py | 194 - + .../unit/onyx/auth/test_user_create_schema.py | 29 - + .../tests/unit/onyx/auth/test_user_registration.py | 550 - + .../unit/onyx/auth/test_verify_auth_setting.py | 54 - + .../unit/onyx/auth/test_verify_email_domain.py | 81 +- + .../unit/onyx/auth/test_verify_email_invite.py | 21 +- + .../celery/tasks/tenant_provisioning/__init__.py | 0 + .../test_check_available_tenants.py | 216 - + .../celery/tasks/test_hierarchyfetching_queue.py | 194 - + .../tasks/test_user_file_impl_redis_locking.py | 297 - + .../tasks/test_user_file_processing_no_vectordb.py | 427 - + .../tasks/test_user_file_project_sync_queue.py | 164 - + .../onyx/background/celery/test_celery_redis.py | 87 - + .../llm_model_update/test_llm_model_update.py | 92 + + backend/tests/unit/onyx/chat/conftest.py | 165 + + .../stream_processing/test_citation_processing.py | 567 + + .../test_citation_substitution.py | 131 + + .../stream_processing/test_quotes_processing.py | 227 + + backend/tests/unit/onyx/chat/test_answer.py | 420 + + .../unit/onyx/chat/test_answer_prompt_builder.py | 344 + + .../onyx/chat/test_argument_delta_streaming.py | 630 - + backend/tests/unit/onyx/chat/test_chat_utils.py | 172 - + .../unit/onyx/chat/test_citation_processor.py | 2422 ---- + .../tests/unit/onyx/chat/test_citation_utils.py | 485 - + backend/tests/unit/onyx/chat/test_compression.py | 489 - + backend/tests/unit/onyx/chat/test_context_files.py | 608 - + backend/tests/unit/onyx/chat/test_emitter.py | 173 - + backend/tests/unit/onyx/chat/test_llm_loop.py | 1314 -- + backend/tests/unit/onyx/chat/test_llm_step.py | 549 - + .../unit/onyx/chat/test_multi_model_streaming.py | 754 -- + .../tests/unit/onyx/chat/test_multi_model_types.py | 146 - + .../tests/unit/onyx/chat/test_process_message.py | 120 - + .../onyx/chat/test_process_message_mock_llm.py | 63 - + .../tests/unit/onyx/chat/test_prune_and_merge.py | 226 + + backend/tests/unit/onyx/chat/test_save_chat.py | 212 - + backend/tests/unit/onyx/chat/test_skip_gen_ai.py | 175 + + .../unit/onyx/chat/test_stop_signal_checker.py | 166 - + .../unit/onyx/chat/tools}/__init__.py | 0 + backend/tests/unit/onyx/chat/tools/utils.py | 32 + + backend/tests/unit/onyx/chat/turn/__init__.py | 1 + + backend/tests/unit/onyx/chat/turn/conftest.py | 106 + + .../test_citation_context_handler.py | 448 + + .../test_reminder_context_handler.py | 70 + + .../tests/unit/onyx/chat/turn/prompts/__init__.py | 1 + + .../chat/turn/prompts/test_custom_instruction.py | 44 + + .../turn/test_fast_chat_turn_orch_and_stream.py | 1074 ++ + backend/tests/unit/onyx/chat/turn/utils.py | 821 ++ + .../connectors/airtable/test_airtable_index_all.py | 624 - + .../onyx/connectors/asana/test_asana_connector.py | 50 - + .../connectors/canvas/test_canvas_connector.py | 876 -- + .../confluence/test_confluence_checkpointing.py | 52 +- + .../connectors/confluence/test_onyx_confluence.py | 16 +- + .../confluence/test_rate_limit_handler.py | 2 +- + .../connectors/discord/test_discord_validation.py | 45 - + .../connectors/github/test_github_checkpointing.py | 7 +- + .../unit/onyx/connectors/gmail/test_connector.py | 22 +- + .../google_utils/test_rate_limit_detection.py | 65 - + .../tests/unit/onyx/connectors/jira/conftest.py | 2 +- + .../onyx/connectors/jira/test_jira_bulk_fetch.py | 147 - + .../connectors/jira/test_jira_checkpointing.py | 79 +- + .../connectors/jira/test_jira_error_handling.py | 185 - + .../jira/test_jira_large_ticket_handling.py | 10 +- + .../connectors/jira/test_jira_permission_sync.py | 88 +- + .../unit/onyx/connectors/mediawiki/test_wiki.py | 8 +- + .../connectors/notion/test_notion_datasource.py | 321 - + .../notion/test_notion_people_and_tables.py | 318 - + .../salesforce/test_salesforce_sqlite.py | 1 + + .../salesforce/test_yield_doc_batches.py | 506 - + .../sharepoint/test_delta_checkpointing.py | 682 -- + .../onyx/connectors/sharepoint/test_denylist.py | 215 - + .../connectors/sharepoint/test_drive_matching.py | 524 - + .../connectors/sharepoint/test_fetch_site_pages.py | 325 - + .../sharepoint/test_hierarchy_helpers.py | 110 - + .../sharepoint/test_rest_client_context_caching.py | 136 - + .../onyx/connectors/sharepoint/test_url_parsing.py | 29 - + .../onyx/connectors/slab/test_slab_validation.py | 36 - + .../connectors/slack/test_message_filtering.py | 151 - + .../onyx/connectors/teams/test_collect_teams.py | 4 +- + .../unit/onyx/connectors/test_connector_factory.py | 8 +- + .../connectors/test_document_metadata_coercion.py | 95 - + .../onyx/connectors/test_microsoft_graph_env.py | 52 - + backend/tests/unit/onyx/connectors/utils.py | 4 +- + .../connectors/zendesk/test_zendesk_rate_limit.py | 10 +- + .../search/federated/test_slack_thread_context.py | 448 - + backend/tests/unit/onyx/db/__init__.py | 0 + backend/tests/unit/onyx/db/conftest.py | 31 - + .../unit/onyx/db/test_assign_default_groups.py | 176 - + .../unit/onyx/db/test_chat_message_cleanup.py | 100 - + backend/tests/unit/onyx/db/test_chat_sessions.py | 225 - + backend/tests/unit/onyx/db/test_dal.py | 110 - + backend/tests/unit/onyx/db/test_delete_user.py | 135 - + backend/tests/unit/onyx/db/test_is_limited_user.py | 43 - + backend/tests/unit/onyx/db/test_llm_sync.py | 166 - + .../unit/onyx/db/test_persona_display_priority.py | 57 - + .../onyx/db/test_projects_upload_task_expiry.py | 65 - + backend/tests/unit/onyx/db/test_scim_dal.py | 191 - + backend/tests/unit/onyx/db/test_tools.py | 27 - + backend/tests/unit/onyx/db/test_usage.py | 335 - + backend/tests/unit/onyx/db/test_voice.py | 507 - + .../opensearch/test_get_doc_chunk_id.py | 203 - + .../opensearch/test_opensearch_batch_flush.py | 223 - + .../document_index/test_disabled_document_index.py | 190 - + .../vespa/shared_utils/test_utils.py | 28 +- + .../document_index/vespa/test_vespa_batch_flush.py | 152 - + backend/tests/unit/onyx/error_handling/__init__.py | 0 + .../unit/onyx/error_handling/test_exceptions.py | 90 - + .../test_federated_connector_factory.py | 3 +- + .../onyx/federated_connectors/test_oauth_utils.py | 163 - + .../tests/unit/onyx/file_processing/__init__.py | 0 + .../unit/onyx/file_processing/fixtures/empty.pdf | 45 - + .../onyx/file_processing/fixtures/encrypted.pdf | Bin 1030 -> 0 bytes + .../onyx/file_processing/fixtures/multipage.pdf | 89 - + .../file_processing/fixtures/owner_protected.pdf | 76 - + .../unit/onyx/file_processing/fixtures/simple.pdf | 62 - + .../onyx/file_processing/fixtures/with_image.pdf | Bin 1160 -> 0 bytes + .../file_processing/fixtures/with_metadata.pdf | 64 - + .../test_image_summarization_errors.py | 89 - + .../test_image_summarization_litellm_errors.py | 141 - + .../tests/unit/onyx/file_processing/test_pdf.py | 136 - + .../unit/onyx/file_processing/test_pptx_to_text.py | 79 - + .../unit/onyx/file_processing/test_xlsx_to_text.py | 198 - + .../tests/unit/onyx/file_store/test_delete_file.py | 91 - + backend/tests/unit/onyx/hooks/__init__.py | 0 + .../tests/unit/onyx/hooks/test_api_dependencies.py | 23 - + backend/tests/unit/onyx/hooks/test_base_spec.py | 19 - + backend/tests/unit/onyx/hooks/test_models.py | 86 - + .../unit/onyx/hooks/test_query_processing_spec.py | 62 - + backend/tests/unit/onyx/hooks/test_registry.py | 47 - + .../unit/onyx/image_gen/test_provider_building.py | 333 - + backend/tests/unit/onyx/indexing/conftest.py | 2 +- + backend/tests/unit/onyx/indexing/test_censoring.py | 4 + + backend/tests/unit/onyx/indexing/test_chunker.py | 4 +- + .../onyx/indexing/test_embed_chunks_in_batches.py | 391 - + .../unit/onyx/indexing/test_indexing_pipeline.py | 302 +- + .../unit/onyx/indexing/test_personas_in_chunks.py | 197 - + backend/tests/unit/onyx/llm/conftest.py | 22 - + .../unit/onyx/llm/test_bedrock_token_limit.py | 123 - + backend/tests/unit/onyx/llm/test_chat_llm.py | 302 + + backend/tests/unit/onyx/llm/test_factory.py | 148 - + .../unit/onyx/llm/test_litellm_monkey_patches.py | 103 - + .../unit/onyx/llm/test_llm_provider_options.py | 102 - + backend/tests/unit/onyx/llm/test_model_map.py | 9 +- + .../tests/unit/onyx/llm/test_model_name_parser.py | 50 - + backend/tests/unit/onyx/llm/test_multi_llm.py | 1672 --- + .../unit/onyx/llm/test_reasoning_effort_mapping.py | 60 - + .../tests/unit/onyx/llm/test_request_context.py | 25 - + .../tests/unit/onyx/llm/test_true_openai_model.py | 103 +- + .../llm/test_vision_model_selection_logging.py | 130 - + .../test_search_nlp_models.py | 8 +- + .../hooks => tests/unit/onyx/onyxbot}/__init__.py | 0 + .../tests/unit/onyx/onyxbot/discord/conftest.py | 281 - + .../unit/onyx/onyxbot/discord/test_api_client.py | 441 - + .../onyx/onyxbot/discord/test_cache_manager.py | 520 - + .../onyx/onyxbot/discord/test_context_builders.py | 645 - + .../onyx/onyxbot/discord/test_discord_utils.py | 157 - + .../onyx/onyxbot/discord/test_message_utils.py | 316 - + .../onyx/onyxbot/discord/test_should_respond.py | 645 - + .../onyx/onyxbot/test_handle_regular_answer.py | 204 - + .../tests/unit/onyx/onyxbot/test_slack_blocks.py | 2 +- + .../unit/onyx/onyxbot/test_slack_formatting.py | 176 - + .../tests/unit/onyx/onyxbot/test_slack_gating.py | 420 - + .../tests/unit/onyx/prompts/test_prompt_utils.py | 15 - + backend/tests/unit/onyx/server/__init__.py | 0 + .../tests/unit/onyx/server/features/__init__.py | 0 + .../features/hierarchy/test_user_access_info.py | 43 - + .../unit/onyx/server/features/hooks/__init__.py | 0 + .../server/manage/embedding/test_embedding_api.py | 105 - + .../server/manage/llm/test_fetch_models_api.py | 1014 -- + .../server/manage/llm/test_llm_provider_utils.py | 252 - + .../onyx/server/manage/test_bulk_invite_limit.py | 115 - + .../manage/voice/test_voice_api_validation.py | 23 - + backend/tests/unit/onyx/server/scim/__init__.py | 0 + backend/tests/unit/onyx/server/scim/conftest.py | 170 - + backend/tests/unit/onyx/server/scim/test_admin.py | 132 - + backend/tests/unit/onyx/server/scim/test_auth.py | 103 - + backend/tests/unit/onyx/server/scim/test_entra.py | 983 -- + .../tests/unit/onyx/server/scim/test_filtering.py | 93 - + .../unit/onyx/server/scim/test_group_endpoints.py | 677 - + backend/tests/unit/onyx/server/scim/test_patch.py | 518 - + .../tests/unit/onyx/server/scim/test_providers.py | 215 - + .../unit/onyx/server/scim/test_user_endpoints.py | 743 -- + .../unit/onyx/server/test_full_user_snapshot.py | 56 - + .../tests/unit/onyx/server/test_pool_metrics.py | 300 - + .../unit/onyx/server/test_projects_file_utils.py | 473 - + .../onyx/server/test_prometheus_instrumentation.py | 234 - + .../tests/unit/onyx/server/test_settings_store.py | 170 - + .../tests/unit/onyx/server/test_upload_files.py | 109 - + backend/tests/unit/onyx/test_redis.py | 2 +- + backend/tests/unit/onyx/test_startup_validation.py | 52 - + backend/tests/unit/onyx/tools/__init__.py | 0 + backend/tests/unit/onyx/tools/conftest.py | 19 + + .../unit/onyx/tools/custom/test_custom_tools.py | 98 +- + .../tests/unit/onyx/tools/test_adapter_v1_to_v2.py | 692 ++ + .../onyx/tools/test_construct_tools_no_vectordb.py | 195 - + .../tests/unit/onyx/tools/test_file_reader_tool.py | 237 - + backend/tests/unit/onyx/tools/test_no_vectordb.py | 72 - + .../onyx/tools/test_python_tool_availability.py | 206 - + backend/tests/unit/onyx/tools/test_search_utils.py | 573 - + ...est_tool_implementations_v2_image_generation.py | 363 + + ...test_tool_implementations_v2_internal_search.py | 495 + + .../onyx/tools/test_tool_implementations_v2_web.py | 576 + + backend/tests/unit/onyx/tools/test_tool_runner.py | 373 - + .../unit/onyx/tools/test_tool_runner_chat_files.py | 191 - + backend/tests/unit/onyx/tools/test_tool_utils.py | 26 +- + .../open_url/data/test_snippet_finding_data.json | 931 -- + .../open_url/test_onyx_web_crawler.py | 353 - + .../open_url/test_snippet_matcher.py | 197 - + .../open_url/test_url_normalization.py | 290 - + .../tools/tool_implementations/python/__init__.py | 0 + .../python/test_code_interpreter_client.py | 173 - + .../python/test_python_tool_upload_cache.py | 208 - + .../tool_implementations/websearch/data/tartan.txt | 2217 ---- + .../websearch/test_brave_client.py | 206 - + .../websearch/test_web_search_providers.py | 122 - + .../websearch/test_web_search_tool_run.py | 164 - + .../websearch/test_websearch_utils.py | 209 - + .../tests/unit/onyx/tracing/test_tracing_setup.py | 124 +- + backend/tests/unit/onyx/utils/test_gpu_utils.py | 103 - + backend/tests/unit/onyx/utils/test_json_river.py | 394 - + .../unit/onyx/utils/test_postgres_sanitization.py | 230 - + backend/tests/unit/onyx/utils/test_sensitive.py | 242 - + .../tests/unit/onyx/utils/test_sensitive_typing.py | 78 - + backend/tests/unit/onyx/utils/test_telemetry.py | 102 - + .../unit/onyx/utils/test_threadpool_concurrency.py | 14 +- + backend/tests/unit/onyx/utils/test_url_ssrf.py | 327 - + backend/tests/unit/onyx/utils/test_vespa_query.py | 155 +- + backend/tests/unit/onyx/utils/test_vespa_tasks.py | 14 +- + .../onyx/voice/providers/test_azure_provider.py | 30 - + .../unit/onyx/voice/providers/test_azure_ssml.py | 194 - + .../voice/providers/test_elevenlabs_provider.py | 117 - + .../onyx/voice/providers/test_openai_provider.py | 97 - + .../tests/unit/scripts/test_check_lazy_imports.py | 669 + + .../server/metrics/test_celery_task_metrics.py | 153 - + .../metrics/test_indexing_pipeline_collectors.py | 348 - + .../server/metrics/test_indexing_pipeline_setup.py | 22 - + .../server/metrics/test_indexing_task_metrics.py | 335 - + .../unit/server/metrics/test_metrics_server.py | 69 - + .../metrics/test_opensearch_search_metrics.py | 123 - + .../unit/server/metrics/test_pruning_metrics.py | 128 - + .../unit/server/metrics/test_worker_health.py | 170 - + backend/tests/unit/tools/__init__.py | 0 + .../tests/unit/tools/test_memory_tool_packets.py | 211 - + backend/uv.lock | 3 - + cli/.gitignore | 4 - + cli/Dockerfile | 22 - + cli/README.md | 188 - + cli/cmd/agents.go | 71 - + cli/cmd/ask.go | 234 - + cli/cmd/chat.go | 53 - + cli/cmd/configure.go | 126 - + cli/cmd/experiments.go | 20 - + cli/cmd/install_skill.go | 176 - + cli/cmd/root.go | 113 - + cli/cmd/serve.go | 451 - + cli/cmd/validate.go | 74 - + cli/go.mod | 63 - + cli/go.sum | 140 - + cli/hatch_build.py | 42 - + cli/internal/_version.py | 11 - + cli/internal/api/client.go | 295 - + cli/internal/api/errors.go | 22 - + cli/internal/api/stream.go | 136 - + cli/internal/config/config.go | 137 - + cli/internal/config/config_test.go | 257 - + cli/internal/config/experiments.go | 46 - + cli/internal/embedded/SKILL.md | 187 - + cli/internal/embedded/embed.go | 7 - + cli/internal/exitcodes/codes.go | 33 - + cli/internal/exitcodes/codes_test.go | 40 - + cli/internal/fsutil/fsutil.go | 50 - + cli/internal/fsutil/fsutil_test.go | 116 - + cli/internal/models/events.go | 193 - + cli/internal/models/models.go | 112 - + cli/internal/onboarding/onboarding.go | 170 - + cli/internal/overflow/writer.go | 121 - + cli/internal/overflow/writer_test.go | 95 - + cli/internal/parser/parser.go | 248 - + cli/internal/parser/parser_test.go | 419 - + cli/internal/starprompt/starprompt.go | 83 - + cli/internal/tui/app.go | 639 - + cli/internal/tui/commands.go | 204 - + cli/internal/tui/experiments.go | 8 - + cli/internal/tui/help.go | 24 - + cli/internal/tui/input.go | 242 - + cli/internal/tui/messages.go | 36 - + cli/internal/tui/splash.go | 79 - + cli/internal/tui/statusbar.go | 60 - + cli/internal/tui/styles.go | 29 - + cli/internal/tui/viewport.go | 478 - + cli/internal/tui/viewport_test.go | 355 - + cli/internal/util/browser.go | 29 - + cli/internal/util/styles.go | 13 - + cli/internal/version/version.go | 58 - + cli/main.go | 29 - + cli/pyproject.toml | 39 - + .../EE_Contributor_IP_Assignment_Agreement.md | 96 - + .../EE_Contributor_IP_Assignment_Agreement.pdf | Bin 128485 -> 0 bytes + ct.yaml | 2 - + cubic.yaml | 93 - + deployment/.gitignore | 4 + + .../cloudformation/onyx_cluster_template.yaml | 4 +- + .../onyx_backend_api_server_service_template.yaml | 4 +- + ...backend_background_server_service_template.yaml | 4 +- + deployment/data/nginx/app.conf.template | 26 +- + .../data/nginx/app.conf.template.no-letsencrypt | 58 +- + deployment/data/nginx/app.conf.template.prod | 61 +- + deployment/data/nginx/mcp.conf.inc.template | 10 +- + deployment/docker_compose/docker-compose.dev.yml | 37 +- + .../docker-compose.model-server-test.yml | 39 + + .../docker-compose.multitenant-dev.yml | 208 +- + .../docker_compose/docker-compose.onyx-lite.yml | 98 - + .../docker_compose/docker-compose.prod-cloud.yml | 167 +- + .../docker-compose.prod-no-letsencrypt.yml | 181 +- + deployment/docker_compose/docker-compose.prod.yml | 185 +- + .../docker-compose.search-testing.yml | 37 +- + deployment/docker_compose/docker-compose.yml | 295 +- + deployment/docker_compose/eea/.env.example | 6 + + .../docker_compose/eea/docker-compose.override.yml | 45 + + deployment/docker_compose/eea/docker-compose.yml | 345 + + .../docker_compose/env.multilingual.template | 8 + + deployment/docker_compose/env.prod.template | 10 +- + deployment/docker_compose/env.template | 62 +- + deployment/docker_compose/install.ps1 | 1132 -- + deployment/docker_compose/install.sh | 954 +- + deployment/helm/README.md | 5 +- + deployment/helm/charts/onyx/.gitignore | 1 + + deployment/helm/charts/onyx/Chart.lock | 22 +- + deployment/helm/charts/onyx/Chart.yaml | 36 +- + deployment/helm/charts/onyx/ci/ct-values.yaml | 9 - + .../charts/onyx/dashboards/indexing-pipeline.json | 2037 --- + deployment/helm/charts/onyx/templates/_helpers.tpl | 63 - + .../helm/charts/onyx/templates/api-deployment.yaml | 43 +- + .../charts/onyx/templates/api-scaledobject.yaml | 6 +- + .../helm/charts/onyx/templates/api-service.yaml | 8 +- + .../helm/charts/onyx/templates/auth-secrets.yaml | 22 +- + .../charts/onyx/templates/celery-beat-pvc.yaml | 22 + + .../helm/charts/onyx/templates/celery-beat.yaml | 33 +- + .../templates/celery-worker-docfetching-hpa.yaml | 2 +- + .../celery-worker-docfetching-metrics-service.yaml | 26 - + .../celery-worker-docfetching-scaledobject.yaml | 8 +- + .../onyx/templates/celery-worker-docfetching.yaml | 20 +- + .../templates/celery-worker-docprocessing-hpa.yaml | 2 +- + ...elery-worker-docprocessing-metrics-service.yaml | 26 - + .../celery-worker-docprocessing-scaledobject.yaml | 8 +- + .../templates/celery-worker-docprocessing.yaml | 18 +- + .../onyx/templates/celery-worker-heavy-hpa.yaml | 2 +- + .../celery-worker-heavy-metrics-service.yaml | 26 - + .../celery-worker-heavy-scaledobject.yaml | 8 +- + .../charts/onyx/templates/celery-worker-heavy.yaml | 20 +- + .../onyx/templates/celery-worker-light-hpa.yaml | 2 +- + .../celery-worker-light-scaledobject.yaml | 8 +- + .../charts/onyx/templates/celery-worker-light.yaml | 16 +- + .../templates/celery-worker-monitoring-hpa.yaml | 2 +- + .../celery-worker-monitoring-metrics-service.yaml | 26 - + .../celery-worker-monitoring-scaledobject.yaml | 8 +- + .../onyx/templates/celery-worker-monitoring.yaml | 18 +- + .../onyx/templates/celery-worker-primary-hpa.yaml | 2 +- + .../celery-worker-primary-scaledobject.yaml | 8 +- + .../onyx/templates/celery-worker-primary.yaml | 14 +- + .../templates/celery-worker-servicemonitors.yaml | 77 - + .../celery-worker-user-file-processing-hpa.yaml | 2 +- + ...y-worker-user-file-processing-scaledobject.yaml | 8 +- + .../celery-worker-user-file-processing.yaml | 16 +- + .../celery-worker-user-files-indexing-hpa.yaml | 32 + + ...ry-worker-user-files-indexing-scaledobject.yaml | 37 + + .../celery-worker-user-files-indexing.yaml | 118 + + .../helm/charts/onyx/templates/configmap.yaml | 24 +- + .../helm/charts/onyx/templates/discordbot.yaml | 98 - + .../charts/onyx/templates/grafana-dashboards.yaml | 15 - + .../onyx/templates/indexing-model-deployment.yaml | 34 +- + .../onyx/templates/indexing-model-service.yaml | 10 +- + .../onyx/templates/inference-model-deployment.yaml | 32 +- + .../onyx/templates/inference-model-service.yaml | 8 +- + .../helm/charts/onyx/templates/ingress-api.yaml | 32 - + .../helm/charts/onyx/templates/ingress-mcp.yaml | 33 - + .../charts/onyx/templates/ingress-webserver.yaml | 31 - + .../helm/charts/onyx/templates/lets-encrypt.yaml | 20 - + .../onyx/templates/mcp-server-deployment.yaml | 111 - + .../charts/onyx/templates/mcp-server-service.yaml | 24 - + .../charts/onyx/templates/network-policies.yaml | 926 ++ + .../helm/charts/onyx/templates/nginx-conf.yaml | 115 - + .../helm/charts/onyx/templates/nginx-ingress.yaml | 43 + + .../helm/charts/onyx/templates/nginx-simple.yaml | 123 + + .../templates/postgresql-additional-secrets.yaml | 31 + + .../onyx/templates/postgresql-backup-cronjob.yaml | 85 + + .../onyx/templates/postgresql-backup-pvc.yaml | 24 + + .../onyx/templates/postgresql-init-configmap.yaml | 51 + + .../onyx/templates/postgresql-restore-job.yaml | 90 + + .../onyx/templates/postgresql-statefulset.yaml | 129 + + .../charts/onyx/templates/redis-deployment.yaml | 72 + + .../helm/charts/onyx/templates/redis-pvc.yaml | 1 + + .../helm/charts/onyx/templates/redis-service.yaml | 18 + + .../helm/charts/onyx/templates/slackbot.yaml | 10 +- + .../onyx/templates/tooling-pginto-configmap.yaml | 76 - + .../onyx/templates/vespa-backup-cronjob.yaml | 143 + + .../charts/onyx/templates/vespa-backup-pvc.yaml | 24 + + .../onyx/templates/webserver-deployment.yaml | 22 +- + .../onyx/templates/webserver-scaledobject.yaml | 6 +- + .../charts/onyx/templates/webserver-service.yaml | 6 +- + .../onyx/templates_disabled/ingress-api.yaml | 26 + + .../onyx/templates_disabled/ingress-webserver.yaml | 24 + + .../charts/onyx/templates_disabled/nginx-conf.yaml | 70 + + deployment/helm/charts/onyx/values-lite.yaml | 31 - + deployment/helm/charts/onyx/values.yaml | 1081 +- + deployment/terraform/modules/aws/README.md | 19 +- + deployment/terraform/modules/aws/eks/main.tf | 20 +- + deployment/terraform/modules/aws/eks/variables.tf | 44 +- + deployment/terraform/modules/aws/onyx/main.tf | 70 +- + deployment/terraform/modules/aws/onyx/outputs.tf | 15 - + deployment/terraform/modules/aws/onyx/variables.tf | 152 - + .../terraform/modules/aws/opensearch/main.tf | 229 - + .../terraform/modules/aws/opensearch/outputs.tf | 29 - + .../terraform/modules/aws/opensearch/variables.tf | 242 - + deployment/terraform/modules/aws/postgres/main.tf | 76 +- + .../terraform/modules/aws/postgres/variables.tf | 128 - + deployment/terraform/modules/aws/s3/main.tf | 17 +- + deployment/terraform/modules/aws/s3/variables.tf | 17 +- + deployment/terraform/modules/aws/vpc/main.tf | 19 - + deployment/terraform/modules/aws/vpc/outputs.tf | 5 - + deployment/terraform/modules/aws/waf/main.tf | 70 +- + deployment/terraform/modules/aws/waf/variables.tf | 12 - + desktop/.gitignore | 27 - + desktop/AGENTS.md | 1 - + desktop/CLAUDE.md | 1 - + desktop/README.md | 207 - + desktop/package-lock.json | 245 - + desktop/package.json | 18 - + desktop/scripts/generate-icons.sh | 52 - + desktop/src-tauri/Cargo.lock | 5028 -------- + desktop/src-tauri/Cargo.toml | 26 - + desktop/src-tauri/build.rs | 3 - + desktop/src-tauri/gen/schemas/acl-manifests.json | 1 - + desktop/src-tauri/gen/schemas/capabilities.json | 1 - + desktop/src-tauri/gen/schemas/desktop-schema.json | 2606 ---- + desktop/src-tauri/gen/schemas/macOS-schema.json | 2606 ---- + desktop/src-tauri/icons/128x128.png | Bin 2144 -> 0 bytes + desktop/src-tauri/icons/128x128@2x.png | Bin 4032 -> 0 bytes + desktop/src-tauri/icons/32x32.png | Bin 538 -> 0 bytes + .../android/mipmap-anydpi-v26/ic_launcher.xml | 5 - + .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 1423 -> 0 bytes + .../android/mipmap-hdpi/ic_launcher_foreground.png | Bin 2657 -> 0 bytes + .../android/mipmap-hdpi/ic_launcher_round.png | Bin 1566 -> 0 bytes + .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 1477 -> 0 bytes + .../android/mipmap-mdpi/ic_launcher_foreground.png | Bin 1725 -> 0 bytes + .../android/mipmap-mdpi/ic_launcher_round.png | Bin 1632 -> 0 bytes + .../icons/android/mipmap-xhdpi/ic_launcher.png | Bin 3376 -> 0 bytes + .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 3558 -> 0 bytes + .../android/mipmap-xhdpi/ic_launcher_round.png | Bin 3371 -> 0 bytes + .../icons/android/mipmap-xxhdpi/ic_launcher.png | Bin 5064 -> 0 bytes + .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 5098 -> 0 bytes + .../android/mipmap-xxhdpi/ic_launcher_round.png | Bin 5437 -> 0 bytes + .../icons/android/mipmap-xxxhdpi/ic_launcher.png | Bin 7086 -> 0 bytes + .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 6837 -> 0 bytes + .../android/mipmap-xxxhdpi/ic_launcher_round.png | Bin 7333 -> 0 bytes + .../android/values/ic_launcher_background.xml | 4 - + desktop/src-tauri/icons/icon.icns | Bin 49517 -> 0 bytes + desktop/src-tauri/icons/icon.ico | Bin 9954 -> 0 bytes + desktop/src-tauri/icons/icon.svg | 14 - + desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 293 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-20x20@2x-1.png | Bin 560 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 560 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 776 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 410 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-29x29@2x-1.png | Bin 791 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 791 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 1174 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 560 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-40x40@2x-1.png | Bin 1013 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 1013 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 1548 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-512@2x.png | Bin 17073 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 1548 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 2326 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 1063 -> 0 bytes + desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 1972 -> 0 bytes + .../src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png | Bin 2143 -> 0 bytes + desktop/src-tauri/icons/tray-icon.png | Bin 1246 -> 0 bytes + desktop/src-tauri/icons/tray-icon.svg | 11 - + desktop/src-tauri/src/main.rs | 1398 --- + desktop/src-tauri/tauri.conf.json | 69 - + desktop/src/index.html | 551 - + desktop/src/titlebar.js | 320 - + docker-bake.hcl | 92 - + docs/METRICS.md | 450 - + examples/widget/package-lock.json | 7022 ++++------- + examples/widget/package.json | 25 +- + examples/widget/postcss.config.mjs | 2 +- + examples/widget/src/app/globals.css | 4 +- + examples/widget/tsconfig.json | 25 +- + extensions/chrome/LICENSE | 21 - + extensions/chrome/README.md | 30 - + extensions/chrome/manifest.json | 70 - + extensions/chrome/public/icon128.png | Bin 4604 -> 0 bytes + extensions/chrome/public/icon16.png | Bin 235 -> 0 bytes + extensions/chrome/public/icon32.png | Bin 551 -> 0 bytes + extensions/chrome/public/icon48.png | Bin 1076 -> 0 bytes + extensions/chrome/public/logo.png | Bin 6723 -> 0 bytes + extensions/chrome/service_worker.js | 342 - + extensions/chrome/src/.DS_Store | Bin 6148 -> 0 bytes + extensions/chrome/src/pages/onyx_home.html | 76 - + extensions/chrome/src/pages/onyx_home.js | 246 - + extensions/chrome/src/pages/options.html | 515 - + extensions/chrome/src/pages/options.js | 142 - + extensions/chrome/src/pages/panel.html | 91 - + extensions/chrome/src/pages/panel.js | 162 - + extensions/chrome/src/pages/popup.html | 252 - + extensions/chrome/src/pages/popup.js | 58 - + extensions/chrome/src/pages/welcome.html | 618 - + extensions/chrome/src/pages/welcome.js | 192 - + extensions/chrome/src/styles/selection-icon.css | 42 - + extensions/chrome/src/styles/shared.css | 169 - + extensions/chrome/src/utils/constants.js | 49 - + extensions/chrome/src/utils/content.js | 34 - + extensions/chrome/src/utils/error-modal.js | 379 - + extensions/chrome/src/utils/selection-icon.js | 152 - + extensions/chrome/src/utils/storage.js | 24 - + plans/.gitignore | 1 + + .../dashboards/onyx/opensearch-search-latency.json | 349 - + pyproject.toml | 208 +- + tools/ods/.gitignore | 3 - + tools/ods/README.md | 526 - + tools/ods/cmd/backend.go | 289 - + tools/ods/cmd/check_lazy_imports.go | 68 - + tools/ods/cmd/cherry-pick.go | 637 - + tools/ods/cmd/compose.go | 280 - + tools/ods/cmd/db.go | 28 - + tools/ods/cmd/db_drop.go | 142 - + tools/ods/cmd/db_dump.go | 144 - + tools/ods/cmd/db_migrate.go | 212 - + tools/ods/cmd/db_restore.go | 219 - + tools/ods/cmd/deploy.go | 19 - + tools/ods/cmd/deploy_edge.go | 353 - + tools/ods/cmd/desktop.go | 144 - + tools/ods/cmd/logs.go | 69 - + tools/ods/cmd/openapi.go | 203 - + tools/ods/cmd/print_latest.go | 35 - + tools/ods/cmd/pull.go | 46 - + tools/ods/cmd/root.go | 66 - + tools/ods/cmd/run-ci.go | 314 - + tools/ods/cmd/screenshot_diff.go | 500 - + tools/ods/cmd/trace.go | 556 - + tools/ods/cmd/web.go | 144 - + tools/ods/cmd/whois.go | 159 - + tools/ods/go.mod | 21 - + tools/ods/go.sum | 68 - + tools/ods/hatch_build.py | 41 - + tools/ods/internal/_version.py | 11 - + tools/ods/internal/alembic/alembic.go | 258 - + tools/ods/internal/config/config.go | 56 - + tools/ods/internal/docker/docker.go | 162 - + tools/ods/internal/git/git.go | 343 - + tools/ods/internal/git/git_test.go | 184 - + tools/ods/internal/imgdiff/compare.go | 321 - + tools/ods/internal/imgdiff/compare_test.go | 309 - + tools/ods/internal/imgdiff/report.go | 345 - + tools/ods/internal/imgdiff/summary.go | 60 - + tools/ods/internal/kube/kube.go | 90 - + tools/ods/internal/lazyimports/lazyimports.go | 365 - + tools/ods/internal/lazyimports/lazyimports_test.go | 927 -- + tools/ods/internal/openapi/openapi.go | 149 - + tools/ods/internal/openapi/openapi_schema.py | 236 - + tools/ods/internal/paths/paths.go | 104 - + tools/ods/internal/postgres/postgres.go | 87 - + tools/ods/internal/prompt/prompt.go | 51 - + tools/ods/internal/s3/fetch.go | 144 - + tools/ods/internal/s3/sync.go | 49 - + tools/ods/internal/tui/picker.go | 419 - + tools/ods/main.go | 26 - + tools/ods/pyproject.toml | 44 - + uv.lock | 3987 ++---- + web/.dockerignore | 4 - + web/.gitignore | 8 +- + web/.storybook/Introduction.mdx | 115 - + web/.storybook/README.md | 80 - + web/.storybook/main.ts | 43 - + web/.storybook/mocks/next-image.tsx | 28 - + web/.storybook/mocks/next-link.tsx | 28 - + web/.storybook/mocks/next-navigation.tsx | 30 - + web/.storybook/preview-head.html | 11 - + web/.storybook/preview.ts | 27 - + web/@types/images.d.ts | 34 - + web/AGENTS.md | 612 - + web/CLAUDE.md | 1 - + web/Dockerfile | 35 +- + web/README.md | 86 +- + web/STANDARDS.md | 245 + + web/jest.config.js | 17 +- + web/lib/opal/README.md | 22 +- + web/lib/opal/package.json | 35 +- + web/lib/opal/scripts/README.md | 120 - + web/lib/opal/scripts/convert-svg.sh | 129 - + web/lib/opal/scripts/icon-template.js | 14 - + web/lib/opal/src/components/README.md | 34 - + .../components/buttons/Button/Button.stories.tsx | 171 - + .../opal/src/components/buttons/button/README.md | 58 - + .../src/components/buttons/button/components.tsx | 141 - + web/lib/opal/src/components/buttons/chevron.css | 8 - + web/lib/opal/src/components/buttons/chevron.tsx | 22 - + .../buttons/filter-button/FilterButton.stories.tsx | 107 - + .../src/components/buttons/filter-button/README.md | 70 - + .../buttons/filter-button/components.tsx | 121 - + .../opal/src/components/buttons/icon-wrapper.tsx | 36 - + .../components/buttons/line-item-button/README.md | 83 - + .../buttons/line-item-button/components.tsx | 119 - + .../buttons/open-button/OpenButton.stories.tsx | 85 - + .../src/components/buttons/open-button/README.md | 78 - + .../components/buttons/open-button/components.tsx | 193 - + .../src/components/buttons/select-button/README.md | 79 - + .../buttons/select-button/components.tsx | 150 - + .../components/buttons/select-button/styles.css | 5 - + .../src/components/buttons/sidebar-tab/README.md | 64 - + .../buttons/sidebar-tab/SidebarTab.stories.tsx | 94 - + .../components/buttons/sidebar-tab/components.tsx | 165 - + .../src/components/cards/card/Card.stories.tsx | 102 - + web/lib/opal/src/components/cards/card/README.md | 63 - + .../opal/src/components/cards/card/components.tsx | 101 - + web/lib/opal/src/components/cards/card/styles.css | 29 - + .../EmptyMessageCard.stories.tsx | 51 - + .../components/cards/empty-message-card/README.md | 30 - + .../cards/empty-message-card/components.tsx | 85 - + .../src/components/cards/select-card/README.md | 144 - + .../cards/select-card/SelectCard.stories.tsx | 237 - + .../components/cards/select-card/components.tsx | 97 - + .../src/components/cards/select-card/styles.css | 9 - + web/lib/opal/src/components/index.ts | 87 - + .../components/pagination/Pagination.stories.tsx | 239 - + web/lib/opal/src/components/pagination/README.md | 89 - + .../opal/src/components/pagination/components.tsx | 548 - + .../opal/src/components/table/ActionsContainer.tsx | 30 - + .../components/table/ColumnSortabilityPopover.tsx | 188 - + .../components/table/ColumnVisibilityPopover.tsx | 113 - + .../opal/src/components/table/DragOverlayRow.tsx | 95 - + web/lib/opal/src/components/table/Footer.tsx | 282 - + .../src/components/table/QualifierContainer.tsx | 31 - + web/lib/opal/src/components/table/README.md | 82 - + .../opal/src/components/table/Table.stories.tsx | 146 - + web/lib/opal/src/components/table/TableBody.tsx | 85 - + web/lib/opal/src/components/table/TableCell.tsx | 35 - + web/lib/opal/src/components/table/TableElement.tsx | 61 - + web/lib/opal/src/components/table/TableHead.tsx | 141 - + web/lib/opal/src/components/table/TableHeader.tsx | 13 - + .../opal/src/components/table/TableQualifier.tsx | 132 - + web/lib/opal/src/components/table/TableRow.tsx | 133 - + .../opal/src/components/table/TableSizeContext.tsx | 28 - + web/lib/opal/src/components/table/columns.ts | 265 - + web/lib/opal/src/components/table/components.tsx | 611 - + .../src/components/table/hooks/useColumnWidths.ts | 342 - + .../src/components/table/hooks/useDataTable.ts | 504 - + .../src/components/table/hooks/useDraggableRows.ts | 165 - + web/lib/opal/src/components/table/styles.css | 161 - + web/lib/opal/src/components/table/types.ts | 184 - + web/lib/opal/src/components/tag/README.md | 57 - + web/lib/opal/src/components/tag/Tag.stories.tsx | 47 - + web/lib/opal/src/components/tag/components.tsx | 68 - + web/lib/opal/src/components/tag/styles.css | 36 - + .../opal/src/components/text/InlineMarkdown.tsx | 83 - + web/lib/opal/src/components/text/README.md | 124 - + web/lib/opal/src/components/text/Text.stories.tsx | 257 - + web/lib/opal/src/components/text/components.tsx | 154 - + web/lib/opal/src/components/tooltip.css | 13 - + web/lib/opal/src/core/README.md | 12 - + .../opal/src/core/animations/Hoverable.stories.tsx | 162 - + web/lib/opal/src/core/animations/README.md | 41 - + web/lib/opal/src/core/animations/components.tsx | 190 - + web/lib/opal/src/core/animations/styles.css | 51 - + web/lib/opal/src/core/disabled/components.tsx | 66 - + web/lib/opal/src/core/disabled/styles.css | 30 - + web/lib/opal/src/core/index.ts | 51 - + .../src/core/interactive/Interactive.stories.tsx | 347 - + web/lib/opal/src/core/interactive/README.md | 137 - + .../opal/src/core/interactive/container/README.md | 25 - + .../src/core/interactive/container/components.tsx | 166 - + .../opal/src/core/interactive/foldable/README.md | 38 - + .../src/core/interactive/foldable/components.tsx | 51 - + .../opal/src/core/interactive/foldable/styles.css | 56 - + web/lib/opal/src/core/interactive/shared.css | 51 - + .../src/core/interactive/simple/components.tsx | 106 - + .../opal/src/core/interactive/stateful/README.md | 45 - + .../src/core/interactive/stateful/components.tsx | 173 - + .../opal/src/core/interactive/stateful/styles.css | 625 - + .../opal/src/core/interactive/stateless/README.md | 33 - + .../src/core/interactive/stateless/components.tsx | 157 - + .../opal/src/core/interactive/stateless/styles.css | 387 - + web/lib/opal/src/core/interactive/utils.ts | 28 - + web/lib/opal/src/icons/actions.tsx | 21 - + web/lib/opal/src/icons/activity-small.tsx | 20 - + web/lib/opal/src/icons/activity.tsx | 21 - + web/lib/opal/src/icons/add-lines.tsx | 21 - + web/lib/opal/src/icons/alert-circle.tsx | 36 - + web/lib/opal/src/icons/alert-triangle.tsx | 22 - + web/lib/opal/src/icons/arrow-down-dot.tsx | 20 - + web/lib/opal/src/icons/arrow-exchange.tsx | 22 - + web/lib/opal/src/icons/arrow-left-dot.tsx | 20 - + web/lib/opal/src/icons/arrow-left.tsx | 21 - + web/lib/opal/src/icons/arrow-right-circle.tsx | 21 - + web/lib/opal/src/icons/arrow-right-dot.tsx | 20 - + web/lib/opal/src/icons/arrow-right.tsx | 21 - + web/lib/opal/src/icons/arrow-up-circle.tsx | 21 - + web/lib/opal/src/icons/arrow-up-dot.tsx | 20 - + web/lib/opal/src/icons/arrow-up-down.tsx | 21 - + web/lib/opal/src/icons/arrow-up-right.tsx | 20 - + web/lib/opal/src/icons/arrow-up.tsx | 21 - + web/lib/opal/src/icons/arrow-wall-right.tsx | 22 - + web/lib/opal/src/icons/audio-eq-small.tsx | 20 - + web/lib/opal/src/icons/audio.tsx | 20 - + web/lib/opal/src/icons/bar-chart-small.tsx | 20 - + web/lib/opal/src/icons/bar-chart.tsx | 21 - + web/lib/opal/src/icons/bell.tsx | 21 - + web/lib/opal/src/icons/blocks.tsx | 20 - + web/lib/opal/src/icons/book-open.tsx | 21 - + web/lib/opal/src/icons/bookmark.tsx | 20 - + web/lib/opal/src/icons/books-line-small.tsx | 20 - + web/lib/opal/src/icons/books-stack-small.tsx | 20 - + web/lib/opal/src/icons/bracket-curly.tsx | 22 - + web/lib/opal/src/icons/branch.tsx | 21 - + web/lib/opal/src/icons/bubble-text.tsx | 21 - + web/lib/opal/src/icons/calendar.tsx | 22 - + web/lib/opal/src/icons/check-circle.tsx | 28 - + web/lib/opal/src/icons/check-small.tsx | 20 - + web/lib/opal/src/icons/check-square.tsx | 29 - + web/lib/opal/src/icons/check.tsx | 22 - + web/lib/opal/src/icons/chevron-down-small.tsx | 21 - + web/lib/opal/src/icons/chevron-down.tsx | 21 - + web/lib/opal/src/icons/chevron-left.tsx | 21 - + web/lib/opal/src/icons/chevron-right.tsx | 21 - + web/lib/opal/src/icons/chevron-up-small.tsx | 21 - + web/lib/opal/src/icons/chevron-up.tsx | 21 - + web/lib/opal/src/icons/circle.tsx | 16 - + web/lib/opal/src/icons/clipboard.tsx | 20 - + web/lib/opal/src/icons/clock-hands-small.tsx | 20 - + web/lib/opal/src/icons/clock.tsx | 28 - + web/lib/opal/src/icons/cloud.tsx | 28 - + web/lib/opal/src/icons/code.tsx | 21 - + web/lib/opal/src/icons/column.tsx | 22 - + web/lib/opal/src/icons/copy.tsx | 28 - + web/lib/opal/src/icons/corner-right-up-dot.tsx | 20 - + web/lib/opal/src/icons/cpu.tsx | 28 - + web/lib/opal/src/icons/credit-card.tsx | 20 - + web/lib/opal/src/icons/curate.tsx | 20 - + web/lib/opal/src/icons/dashboard.tsx | 21 - + web/lib/opal/src/icons/dev-kit.tsx | 21 - + web/lib/opal/src/icons/discord.tsx | 19 - + web/lib/opal/src/icons/download-cloud.tsx | 22 - + web/lib/opal/src/icons/download.tsx | 21 - + web/lib/opal/src/icons/edit-big.tsx | 20 - + web/lib/opal/src/icons/edit.tsx | 21 - + web/lib/opal/src/icons/empty.tsx | 20 - + web/lib/opal/src/icons/expand.tsx | 22 - + web/lib/opal/src/icons/external-link.tsx | 34 - + web/lib/opal/src/icons/eye-closed.tsx | 21 - + web/lib/opal/src/icons/eye-off.tsx | 20 - + web/lib/opal/src/icons/eye.tsx | 27 - + web/lib/opal/src/icons/file-braces.tsx | 39 - + web/lib/opal/src/icons/file-broadcast.tsx | 21 - + web/lib/opal/src/icons/file-chart-pie.tsx | 39 - + web/lib/opal/src/icons/file-small.tsx | 20 - + web/lib/opal/src/icons/file-text.tsx | 21 - + web/lib/opal/src/icons/files.tsx | 21 - + web/lib/opal/src/icons/filter-plus.tsx | 21 - + web/lib/opal/src/icons/filter.tsx | 21 - + web/lib/opal/src/icons/fold.tsx | 22 - + web/lib/opal/src/icons/folder-in.tsx | 21 - + web/lib/opal/src/icons/folder-open.tsx | 33 - + web/lib/opal/src/icons/folder-partial-open.tsx | 38 - + web/lib/opal/src/icons/folder-plus.tsx | 21 - + web/lib/opal/src/icons/folder.tsx | 21 - + web/lib/opal/src/icons/globe.tsx | 28 - + web/lib/opal/src/icons/handle.tsx | 20 - + web/lib/opal/src/icons/hard-drive.tsx | 21 - + web/lib/opal/src/icons/hash-small.tsx | 20 - + web/lib/opal/src/icons/hash.tsx | 21 - + web/lib/opal/src/icons/headset-mic.tsx | 21 - + web/lib/opal/src/icons/history.tsx | 21 - + web/lib/opal/src/icons/hourglass.tsx | 21 - + web/lib/opal/src/icons/icons.stories.tsx | 44 - + web/lib/opal/src/icons/image-small.tsx | 20 - + web/lib/opal/src/icons/image.tsx | 20 - + web/lib/opal/src/icons/import-icon.tsx | 22 - + web/lib/opal/src/icons/index.ts | 195 - + web/lib/opal/src/icons/info-small.tsx | 20 - + web/lib/opal/src/icons/info.tsx | 20 - + web/lib/opal/src/icons/key.tsx | 21 - + web/lib/opal/src/icons/keystroke.tsx | 21 - + web/lib/opal/src/icons/lightbulb-simple.tsx | 21 - + web/lib/opal/src/icons/line-chart-up.tsx | 21 - + web/lib/opal/src/icons/link.tsx | 23 - + web/lib/opal/src/icons/linked-dots.tsx | 21 - + web/lib/opal/src/icons/loader.tsx | 22 - + web/lib/opal/src/icons/lock.tsx | 21 - + web/lib/opal/src/icons/log-out.tsx | 33 - + web/lib/opal/src/icons/maximize-2.tsx | 20 - + web/lib/opal/src/icons/mcp.tsx | 22 - + web/lib/opal/src/icons/menu.tsx | 20 - + web/lib/opal/src/icons/microphone-off.tsx | 29 - + web/lib/opal/src/icons/microphone.tsx | 21 - + web/lib/opal/src/icons/minus-circle.tsx | 22 - + web/lib/opal/src/icons/minus.tsx | 18 - + web/lib/opal/src/icons/moon.tsx | 21 - + web/lib/opal/src/icons/more-horizontal.tsx | 33 - + web/lib/opal/src/icons/music-small.tsx | 20 - + web/lib/opal/src/icons/network-graph.tsx | 27 - + web/lib/opal/src/icons/notification-bubble.tsx | 19 - + web/lib/opal/src/icons/onyx-octagon.tsx | 28 - + web/lib/opal/src/icons/organization.tsx | 21 - + web/lib/opal/src/icons/paint-brush.tsx | 22 - + web/lib/opal/src/icons/paperclip.tsx | 21 - + web/lib/opal/src/icons/pause-circle.tsx | 22 - + web/lib/opal/src/icons/pen-small.tsx | 20 - + web/lib/opal/src/icons/pencil-ruler.tsx | 24 - + web/lib/opal/src/icons/pie-chart.tsx | 28 - + web/lib/opal/src/icons/pin.tsx | 21 - + web/lib/opal/src/icons/pinned.tsx | 22 - + web/lib/opal/src/icons/play-circle.tsx | 28 - + web/lib/opal/src/icons/plug.tsx | 21 - + web/lib/opal/src/icons/plus-circle.tsx | 28 - + web/lib/opal/src/icons/plus.tsx | 22 - + web/lib/opal/src/icons/progress-bars.tsx | 20 - + web/lib/opal/src/icons/progress-circle.tsx | 76 - + web/lib/opal/src/icons/question-mark-small.tsx | 20 - + web/lib/opal/src/icons/quote-end.tsx | 19 - + web/lib/opal/src/icons/quote-start.tsx | 19 - + web/lib/opal/src/icons/refresh-cw.tsx | 21 - + web/lib/opal/src/icons/revert.tsx | 21 - + web/lib/opal/src/icons/search-menu.tsx | 21 - + web/lib/opal/src/icons/search-small.tsx | 20 - + web/lib/opal/src/icons/search.tsx | 21 - + web/lib/opal/src/icons/server.tsx | 28 - + web/lib/opal/src/icons/settings.tsx | 34 - + web/lib/opal/src/icons/share-webhook.tsx | 21 - + web/lib/opal/src/icons/share.tsx | 21 - + web/lib/opal/src/icons/shield.tsx | 21 - + web/lib/opal/src/icons/sidebar.tsx | 21 - + web/lib/opal/src/icons/slack.tsx | 26 - + web/lib/opal/src/icons/slash.tsx | 29 - + web/lib/opal/src/icons/sliders-small.tsx | 20 - + web/lib/opal/src/icons/sliders.tsx | 28 - + web/lib/opal/src/icons/sort-order.tsx | 21 - + web/lib/opal/src/icons/sort.tsx | 27 - + web/lib/opal/src/icons/sparkle.tsx | 21 - + web/lib/opal/src/icons/star-off.tsx | 22 - + web/lib/opal/src/icons/star.tsx | 20 - + web/lib/opal/src/icons/step1.tsx | 32 - + web/lib/opal/src/icons/step2.tsx | 40 - + web/lib/opal/src/icons/step3-end.tsx | 48 - + web/lib/opal/src/icons/step3.tsx | 48 - + web/lib/opal/src/icons/stop-circle.tsx | 28 - + web/lib/opal/src/icons/stop.tsx | 22 - + web/lib/opal/src/icons/sun.tsx | 28 - + web/lib/opal/src/icons/tag.tsx | 20 - + web/lib/opal/src/icons/terminal-small.tsx | 20 - + web/lib/opal/src/icons/terminal.tsx | 22 - + web/lib/opal/src/icons/text-lines-small.tsx | 20 - + web/lib/opal/src/icons/text-lines.tsx | 20 - + web/lib/opal/src/icons/thumbs-down.tsx | 28 - + web/lib/opal/src/icons/thumbs-up.tsx | 28 - + web/lib/opal/src/icons/trash.tsx | 21 - + web/lib/opal/src/icons/two-line-small.tsx | 21 - + web/lib/opal/src/icons/unplug.tsx | 28 - + web/lib/opal/src/icons/upload-cloud.tsx | 22 - + web/lib/opal/src/icons/upload-square.tsx | 22 - + web/lib/opal/src/icons/user-check.tsx | 20 - + web/lib/opal/src/icons/user-edit.tsx | 20 - + web/lib/opal/src/icons/user-key.tsx | 20 - + web/lib/opal/src/icons/user-manage.tsx | 21 - + web/lib/opal/src/icons/user-minus.tsx | 20 - + web/lib/opal/src/icons/user-plus.tsx | 20 - + web/lib/opal/src/icons/user-shield.tsx | 20 - + web/lib/opal/src/icons/user-speaker.tsx | 20 - + web/lib/opal/src/icons/user-sync.tsx | 22 - + web/lib/opal/src/icons/user-x.tsx | 20 - + web/lib/opal/src/icons/user.tsx | 21 - + web/lib/opal/src/icons/users.tsx | 28 - + web/lib/opal/src/icons/volume-off.tsx | 26 - + web/lib/opal/src/icons/volume.tsx | 26 - + web/lib/opal/src/icons/wallet.tsx | 20 - + web/lib/opal/src/icons/workflow.tsx | 21 - + web/lib/opal/src/icons/x-circle.tsx | 22 - + web/lib/opal/src/icons/x-octagon.tsx | 22 - + web/lib/opal/src/icons/x.tsx | 17 - + web/lib/opal/src/icons/zoom-in.tsx | 22 - + web/lib/opal/src/icons/zoom-out.tsx | 22 - + web/lib/opal/src/illustrations/broken-key.tsx | 27 - + web/lib/opal/src/illustrations/connect.tsx | 35 - + web/lib/opal/src/illustrations/connected.tsx | 42 - + web/lib/opal/src/illustrations/disconnected.tsx | 42 - + web/lib/opal/src/illustrations/empty.tsx | 32 - + web/lib/opal/src/illustrations/end-of-line.tsx | 41 - + .../src/illustrations/illustrations.stories.tsx | 46 - + web/lib/opal/src/illustrations/index.ts | 16 - + web/lib/opal/src/illustrations/limit-alert.tsx | 57 - + web/lib/opal/src/illustrations/long-wait.tsx | 44 - + web/lib/opal/src/illustrations/no-access.tsx | 31 - + web/lib/opal/src/illustrations/no-result.tsx | 32 - + web/lib/opal/src/illustrations/not-found.tsx | 45 - + web/lib/opal/src/illustrations/overflow.tsx | 28 - + web/lib/opal/src/illustrations/plug-broken.tsx | 31 - + web/lib/opal/src/illustrations/timeout.tsx | 45 - + web/lib/opal/src/illustrations/un-plugged.tsx | 67 - + web/lib/opal/src/illustrations/usage-alert.tsx | 42 - + web/lib/opal/src/index.ts | 5 + + web/lib/opal/src/layouts/README.md | 105 - + .../src/layouts/cards/CardHeaderLayout.stories.tsx | 158 - + web/lib/opal/src/layouts/cards/README.md | 116 - + web/lib/opal/src/layouts/cards/components.tsx | 93 - + .../content-action/ContentAction.stories.tsx | 69 - + web/lib/opal/src/layouts/content-action/README.md | 99 - + .../opal/src/layouts/content-action/components.tsx | 78 - + .../opal/src/layouts/content/Content.stories.tsx | 204 - + web/lib/opal/src/layouts/content/ContentLg.tsx | 206 - + web/lib/opal/src/layouts/content/ContentMd.tsx | 297 - + web/lib/opal/src/layouts/content/ContentSm.tsx | 133 - + web/lib/opal/src/layouts/content/ContentXl.tsx | 264 - + web/lib/opal/src/layouts/content/README.md | 139 - + web/lib/opal/src/layouts/content/components.tsx | 205 - + web/lib/opal/src/layouts/content/styles.css | 387 - + .../IllustrationContent.stories.tsx | 42 - + .../src/layouts/illustration-content/README.md | 87 - + .../layouts/illustration-content/components.tsx | 89 - + web/lib/opal/src/layouts/index.ts | 22 - + web/lib/opal/src/logos/anthropic.tsx | 17 - + web/lib/opal/src/logos/aws.tsx | 32 - + web/lib/opal/src/logos/azure.tsx | 67 - + web/lib/opal/src/logos/bifrost.tsx | 22 - + web/lib/opal/src/logos/claude.tsx | 30 - + web/lib/opal/src/logos/deepseek.tsx | 17 - + web/lib/opal/src/logos/discord.tsx | 17 - + web/lib/opal/src/logos/gemini.tsx | 32 - + web/lib/opal/src/logos/google.tsx | 33 - + web/lib/opal/src/logos/index.ts | 21 - + web/lib/opal/src/logos/litellm.tsx | 32 - + web/lib/opal/src/logos/lm-studio.tsx | 141 - + web/lib/opal/src/logos/logos.stories.tsx | 44 - + web/lib/opal/src/logos/microsoft.tsx | 17 - + web/lib/opal/src/logos/mistral.tsx | 29 - + web/lib/opal/src/logos/ollama.tsx | 21 - + web/lib/opal/src/logos/onyx-logo-typed.tsx | 27 - + web/lib/opal/src/logos/onyx-logo.tsx | 28 - + web/lib/opal/src/logos/onyx-typed.tsx | 28 - + web/lib/opal/src/logos/openai.tsx | 30 - + web/lib/opal/src/logos/openrouter.tsx | 22 - + web/lib/opal/src/logos/qwen.tsx | 36 - + web/lib/opal/src/logos/slack.tsx | 29 - + web/lib/opal/src/shared.ts | 129 - + web/lib/opal/src/types.ts | 168 - + web/lib/opal/src/utils.ts | 19 - + web/lib/opal/tsconfig.json | 30 +- + web/next.config.js | 61 +- + web/package-lock.json | 12261 ++++++++++++------- + web/package.json | 60 +- + web/playwright.config.ts | 41 +- + web/public/Box.png | Bin 44627 -> 0 bytes + web/public/Brave.svg | 33 - + web/public/Coda.png | Bin 581 -> 0 bytes + web/public/DrupalWiki.png | Bin 490988 -> 0 bytes + web/public/EEA_logo_compact_EN.svg | 1 + + web/public/ElevenLabs.svg | 4 - + web/public/ElevenLabsDark.svg | 4 - + web/public/OneDrive.png | Bin 39836 -> 0 bytes + web/public/Outlook.png | Bin 303051 -> 0 bytes + web/public/SearXNG.svg | 56 - + web/public/Servicenow.png | Bin 8972 -> 0 bytes + web/public/Trello.png | Bin 3605 -> 0 bytes + web/public/chat-backgrounds/clouds.jpg | Bin 104541 -> 0 bytes + web/public/chat-backgrounds/hills.jpg | Bin 155180 -> 0 bytes + web/public/chat-backgrounds/mountains.jpg | Bin 85074 -> 0 bytes + web/public/chat-backgrounds/night.jpg | Bin 383377 -> 0 bytes + web/public/chat-backgrounds/plant.jpg | Bin 150530 -> 0 bytes + web/public/chat-backgrounds/thumbnails/clouds.jpg | Bin 4036 -> 0 bytes + web/public/chat-backgrounds/thumbnails/hills.jpg | Bin 5703 -> 0 bytes + .../chat-backgrounds/thumbnails/mountains.jpg | Bin 4730 -> 0 bytes + web/public/chat-backgrounds/thumbnails/night.jpg | Bin 7690 -> 0 bytes + web/public/chat-backgrounds/thumbnails/plant.jpg | Bin 7132 -> 0 bytes + web/public/craft_demo_image_1.png | Bin 165250 -> 0 bytes + web/public/craft_demo_image_2.png | Bin 905726 -> 0 bytes + web/public/craft_suggested_image_1.png | Bin 106236 -> 0 bytes + web/public/craft_suggested_image_2.png | Bin 86917 -> 0 bytes + web/public/craft_suggested_image_3.png | Bin 123557 -> 0 bytes + web/public/craft_suggested_image_4.png | Bin 69066 -> 0 bytes + web/public/craft_suggested_image_5.png | Bin 113333 -> 0 bytes + web/public/eea_logo.png | Bin 0 -> 82859 bytes + web/public/fonts/KHTeka-Medium.otf | Bin 95584 -> 0 bytes + web/public/lm_studio.png | Bin 12829 -> 0 bytes + web/sentry.edge.config.ts | 1 - + web/sentry.server.config.ts | 1 - + web/src/app/admin/actions/ActionEditor.tsx | 547 + + web/src/app/admin/actions/ActionTable.tsx | 220 + + web/src/app/admin/actions/edit-mcp/page.tsx | 577 +- + .../actions/edit/[toolId]/DeleteToolButton.tsx | 27 + + web/src/app/admin/actions/edit/[toolId]/page.tsx | 68 +- + web/src/app/admin/actions/mcp/page.tsx | 23 - + web/src/app/admin/actions/new/page.tsx | 28 +- + web/src/app/admin/actions/open-api/page.tsx | 23 - + web/src/app/admin/actions/page.tsx | 92 +- + web/src/app/admin/add-connector/page.tsx | 149 +- + web/src/app/admin/agents/interfaces.ts | 86 - + web/src/app/admin/agents/lib.ts | 249 - + web/src/app/admin/agents/page.tsx | 1 - + web/src/app/admin/api-key/OnyxApiKeyForm.tsx | 126 + + web/src/app/admin/api-key/lib.ts | 39 + + web/src/app/admin/api-key/page.tsx | 266 + + web/src/app/admin/api-key/types.ts | 15 + + web/src/app/admin/assistants/AssistantEditor.tsx | 1737 +++ + .../{agents => assistants}/CollapsibleSection.tsx | 0 + web/src/app/admin/assistants/PersonaTable.tsx | 321 + + .../app/admin/assistants/StarterMessageList.tsx | 111 + + web/src/app/admin/assistants/hooks.ts | 30 + + web/src/app/admin/assistants/interfaces.ts | 56 + + web/src/app/admin/assistants/lib.ts | 324 + + web/src/app/admin/assistants/page.tsx | 129 + + web/src/app/admin/billing/BillingDetailsView.tsx | 717 -- + web/src/app/admin/billing/CheckoutView.tsx | 271 - + .../app/admin/billing/LicenseActivationCard.tsx | 238 - + web/src/app/admin/billing/PlansView.tsx | 280 - + web/src/app/admin/billing/billing.css | 188 - + web/src/app/admin/billing/page.test.tsx | 387 - + web/src/app/admin/billing/page.tsx | 499 - + web/src/app/admin/bots/SlackBotCreationForm.tsx | 43 +- + web/src/app/admin/bots/SlackBotTable.tsx | 5 +- + web/src/app/admin/bots/SlackBotUpdateForm.tsx | 72 +- + web/src/app/admin/bots/SlackTokensForm.tsx | 28 +- + .../bots/[bot-id]/SlackChannelConfigsTable.tsx | 41 +- + .../channels/SlackChannelConfigCreationForm.tsx | 37 +- + .../channels/SlackChannelConfigFormFields.tsx | 189 +- + .../app/admin/bots/[bot-id]/channels/[id]/page.tsx | 203 +- + .../app/admin/bots/[bot-id]/channels/new/page.tsx | 147 +- + web/src/app/admin/bots/[bot-id]/hooks.ts | 33 +- + web/src/app/admin/bots/[bot-id]/lib.ts | 2 +- + web/src/app/admin/bots/[bot-id]/page.tsx | 67 +- + web/src/app/admin/bots/new/page.tsx | 13 +- + web/src/app/admin/bots/page.tsx | 38 +- + .../admin/configuration/chat-preferences/page.tsx | 7 - + .../admin/configuration/code-interpreter/page.tsx | 1 - + .../admin/configuration/default-assistant/page.tsx | 233 + + .../configuration/document-processing/page.tsx | 48 +- + .../admin/configuration/image-generation/page.tsx | 1 - + .../llm/ConfiguredLLMProviderDisplay.tsx | 206 + + .../llm/CustomLLMProviderUpdateForm.test.tsx | 479 + + .../llm/CustomLLMProviderUpdateForm.tsx | 509 + + .../admin/configuration/llm/LLMConfiguration.tsx | 195 + + .../configuration/llm/LLMProviderUpdateForm.tsx | 807 ++ + .../configuration/llm/ModelConfigurationField.tsx | 163 + + web/src/app/admin/configuration/llm/ModelIcon.tsx | 18 - + web/src/app/admin/configuration/llm/constants.ts | 9 + + web/src/app/admin/configuration/llm/interfaces.ts | 128 + + web/src/app/admin/configuration/llm/page.tsx | 19 +- + web/src/app/admin/configuration/llm/utils.ts | 260 + + .../admin/configuration/search/UpgradingPage.tsx | 147 +- + web/src/app/admin/configuration/search/page.tsx | 90 +- + .../voice/VoiceProviderSetupModal.tsx | 537 - + web/src/app/admin/configuration/voice/page.tsx | 1 - + .../app/admin/configuration/web-search/page.tsx | 1840 ++- + .../admin/connector/[ccPairId]/ConfigDisplay.tsx | 230 +- + .../[ccPairId]/IndexAttemptErrorsModal.tsx | 306 +- + .../connector/[ccPairId]/IndexAttemptsTable.tsx | 69 +- + .../connector/[ccPairId]/InlineFileManagement.tsx | 413 - + .../admin/connector/[ccPairId]/ReIndexModal.tsx | 133 +- + .../admin/connector/[ccPairId]/ReIndexPopup.tsx | 88 + + web/src/app/admin/connector/[ccPairId]/lib.ts | 4 +- + web/src/app/admin/connector/[ccPairId]/page.tsx | 182 +- + .../admin/connector/[ccPairId]/useStatusChange.tsx | 4 +- + .../connectors/[connector]/AddConnectorPage.tsx | 177 +- + .../connectors/[connector]/ConnectorWrapper.tsx | 46 +- + .../admin/connectors/[connector]/NavigationRow.tsx | 16 +- + .../connectors/[connector]/auth/callback/route.ts | 34 +- + .../connectors/[connector]/oauth/callback/page.tsx | 8 +- + .../connectors/[connector]/oauth/finalize/page.tsx | 9 +- + .../connectors/[connector]/pages/Advanced.tsx | 7 +- + .../[connector]/pages/FieldRendering.tsx | 183 +- + .../[connector]/pages/gdrive/Credential.tsx | 149 +- + .../[connector]/pages/gdrive/GoogleDrivePage.tsx | 11 +- + .../[connector]/pages/gmail/Credential.tsx | 188 +- + .../[connector]/pages/gmail/GmailPage.tsx | 30 +- + .../connectors/[connector]/pages/utils/files.ts | 42 +- + .../[connector]/pages/utils/google_site.ts | 57 +- + web/src/app/admin/debug/page.tsx | 42 +- + web/src/app/admin/discord-bot/BotConfigCard.tsx | 180 - + .../app/admin/discord-bot/DiscordGuildsTable.tsx | 159 - + .../[guild-id]/DiscordChannelsTable.tsx | 168 - + web/src/app/admin/discord-bot/[guild-id]/page.tsx | 415 - + web/src/app/admin/discord-bot/hooks.ts | 73 - + web/src/app/admin/discord-bot/lib.ts | 147 - + web/src/app/admin/discord-bot/page.tsx | 135 - + web/src/app/admin/discord-bot/types.ts | 46 - + .../app/admin/document-index-migration/page.tsx | 229 - + web/src/app/admin/documents/ScoreEditor.tsx | 19 +- + .../documents/explorer/DocumentExplorerPage.tsx | 35 - + web/src/app/admin/documents/explorer/Explorer.tsx | 18 +- + web/src/app/admin/documents/explorer/page.tsx | 29 +- + .../documents/feedback/DocumentFeedbackTable.tsx | 13 +- + web/src/app/admin/documents/feedback/page.tsx | 32 +- + .../documents/sets/DocumentSetCreationForm.tsx | 33 +- + .../admin/documents/sets/[documentSetId]/page.tsx | 73 +- + web/src/app/admin/documents/sets/hooks.tsx | 11 +- + web/src/app/admin/documents/sets/new/page.tsx | 51 +- + web/src/app/admin/documents/sets/page.tsx | 61 +- + .../admin/eea_config/pages/[pageTitle]/page.tsx | 3 + + web/src/app/admin/eea_config/pages/hooks.tsx | 14 + + .../src/app/admin/eea_config/pages/lib.tsx | 0 + web/src/app/admin/eea_config/pages/new/page.tsx | 125 + + web/src/app/admin/eea_config/pages/page.tsx | 226 + + .../embeddings/EmbeddingModelSelectionForm.tsx | 75 +- + web/src/app/admin/embeddings/RerankingFormPage.tsx | 267 +- + .../admin/embeddings/modals/AlreadyPickedModal.tsx | 42 +- + .../embeddings/modals/ChangeCredentialsModal.tsx | 294 +- + .../embeddings/modals/DeleteCredentialsModal.tsx | 63 +- + .../modals/InstantSwitchConfirmModal.tsx | 54 +- + .../embeddings/modals/ModelSelectionModal.tsx | 77 +- + .../embeddings/modals/ProviderCreationModal.tsx | 280 +- + .../admin/embeddings/modals/SelectModelModal.tsx | 56 +- + .../embeddings/pages/AdvancedEmbeddingFormPage.tsx | 74 +- + .../admin/embeddings/pages/CloudEmbeddingPage.tsx | 99 +- + .../admin/embeddings/pages/EmbeddingFormPage.tsx | 147 +- + .../admin/embeddings/pages/OpenEmbeddingPage.tsx | 48 +- + web/src/app/admin/groups/[id]/page.tsx | 13 - + web/src/app/admin/groups/create/page.tsx | 1 - + web/src/app/admin/groups/page.tsx | 1 - + web/src/app/admin/groups2/[id]/page.tsx | 17 - + web/src/app/admin/groups2/create/page.tsx | 1 - + web/src/app/admin/groups2/page.tsx | 1 - + web/src/app/admin/hooks/page.tsx | 1 - + .../indexing/status/CCPairIndexingStatusTable.tsx | 75 +- + .../app/admin/indexing/status/FilterComponent.tsx | 20 +- + .../indexing/status/SearchAndFilterControls.tsx | 2 +- + web/src/app/admin/indexing/status/page.tsx | 59 +- + web/src/app/admin/kg/KGEntityTypes.tsx | 31 +- + web/src/app/admin/kg/page.tsx | 104 +- + web/src/app/admin/kg/utils.ts | 5 +- + .../app/admin/oauth-configs/OAuthConfigForm.tsx | 259 + + web/src/app/admin/scim/ScimModal.tsx | 141 - + web/src/app/admin/scim/ScimSyncCard.tsx | 117 - + web/src/app/admin/scim/interfaces.ts | 17 - + web/src/app/admin/scim/page.tsx | 140 - + web/src/app/admin/scim/svc.ts | 7 - + web/src/app/admin/service-accounts/page.tsx | 1 - + web/src/app/admin/settings/AnonymousUserPath.tsx | 151 + + web/src/app/admin/settings/SettingsForm.tsx | 442 + + .../app/admin/settings/hooks/useVisionProviders.ts | 123 + + web/src/app/admin/settings/interfaces.ts | 92 + + web/src/app/admin/settings/page.tsx | 22 + + .../token-rate-limits/CreateRateLimitModal.tsx | 218 +- + .../token-rate-limits/TokenRateLimitTables.tsx | 27 +- + web/src/app/admin/token-rate-limits/page.tsx | 183 +- + web/src/app/admin/users/page.tsx | 382 +- + web/src/app/anonymous/[id]/AnonymousPage.tsx | 2 +- + web/src/app/api/[...path]/route.ts | 51 +- + web/src/app/api/chat/mcp/oauth/callback/route.ts | 2 +- + web/src/app/app/agents/create/page.tsx | 10 - + web/src/app/app/agents/edit/[id]/page.tsx | 45 - + web/src/app/app/agents/page.tsx | 10 - + web/src/app/app/components/AgentDescription.tsx | 23 - + web/src/app/app/components/AppPopup.tsx | 201 - + web/src/app/app/components/WelcomeMessage.tsx | 85 - + .../app/app/components/files/InputBarPreview.tsx | 135 - + .../app/components/files/images/FullImageModal.tsx | 45 - + .../app/components/files/images/InMessageImage.tsx | 118 - + web/src/app/app/components/files/images/utils.ts | 21 - + .../app/app/components/folders/FolderDropdown.tsx | 66 - + web/src/app/app/components/folders/interfaces.ts | 8 - + .../components/projects/ProjectChatSessionList.tsx | 152 - + .../components/projects/ProjectContextPanel.tsx | 346 - + web/src/app/app/components/tools/constants.ts | 29 - + web/src/app/app/interfaces.ts | 340 - + web/src/app/app/layout.tsx | 36 - + web/src/app/app/message/BlinkingBar.tsx | 12 - + web/src/app/app/message/CodeBlock.tsx | 148 - + web/src/app/app/message/FileDisplay.tsx | 108 - + web/src/app/app/message/HumanMessage.tsx | 285 - + web/src/app/app/message/MemoizedTextComponents.tsx | 238 - + web/src/app/app/message/MessageSwitcher.tsx | 64 - + web/src/app/app/message/MultiModelPanel.tsx | 171 - + web/src/app/app/message/MultiModelResponseView.tsx | 595 - + web/src/app/app/message/Resubmit.tsx | 85 - + web/src/app/app/message/copyingUtils.tsx | 94 - + web/src/app/app/message/custom-code-styles.css | 258 - + web/src/app/app/message/errorHelpers.tsx | 60 - + web/src/app/app/message/interfaces.ts | 23 - + .../app/message/messageComponents/AgentMessage.tsx | 358 - + .../messageComponents/CustomToolAuthCard.tsx | 66 - + .../message/messageComponents/MessageToolbar.tsx | 336 - + .../app/message/messageComponents/TTSButton.tsx | 90 - + .../messageComponents/hooks/useAuthErrors.ts | 53 - + .../messageComponents/hooks/useMessageSwitching.ts | 63 - + .../hooks/usePacketAnimationAndCollapse.ts | 126 - + .../app/message/messageComponents/interfaces.ts | 84 - + .../message/messageComponents/markdownUtils.tsx | 204 - + .../messageComponents/renderMessageComponent.tsx | 319 - + .../renderers/CustomToolRenderer.tsx | 311 - + .../renderers/ImageToolRenderer.tsx | 208 - + .../renderers/MessageTextRenderer.tsx | 322 - + .../messageComponents/timeline/AgentTimeline.tsx | 424 - + .../timeline/CollapsedStreamingContent.tsx | 61 - + .../timeline/ExpandedTimelineContent.tsx | 189 - + .../timeline/ParallelTimelineTabs.tsx | 181 - + .../messageComponents/timeline/StepContainer.tsx | 117 - + .../timeline/TimelineRendererComponent.tsx | 140 - + .../timeline/TimelineStepComposer.tsx | 76 - + .../timeline/headers/CompletedHeader.tsx | 204 - + .../timeline/headers/ParallelStreamingHeader.tsx | 81 - + .../timeline/headers/StoppedHeader.tsx | 53 - + .../timeline/headers/StreamingHeader.tsx | 87 - + .../timeline/hooks/__tests__/testHelpers.ts | 171 - + .../timeline/hooks/packetProcessor.test.ts | 1229 -- + .../timeline/hooks/packetProcessor.ts | 480 - + .../timeline/hooks/usePacedTurnGroups.test.tsx | 650 - + .../timeline/hooks/usePacedTurnGroups.ts | 376 - + .../timeline/hooks/usePacketProcessor.test.tsx | 554 - + .../timeline/hooks/usePacketProcessor.ts | 161 - + .../timeline/hooks/useStreamingDuration.ts | 64 - + .../timeline/hooks/useTimelineExpansion.ts | 54 - + .../timeline/hooks/useTimelineHeader.ts | 119 - + .../timeline/hooks/useTimelineMetrics.ts | 55 - + .../timeline/hooks/useTimelineStepState.ts | 60 - + .../timeline/hooks/useTimelineUIState.ts | 206 - + .../messageComponents/timeline/packetHelpers.ts | 139 - + .../timeline/primitives/TimelineHeaderRow.tsx | 23 - + .../timeline/primitives/TimelineIconColumn.tsx | 85 - + .../timeline/primitives/TimelineRoot.tsx | 25 - + .../timeline/primitives/TimelineRow.tsx | 62 - + .../timeline/primitives/TimelineStepContent.tsx | 100 - + .../timeline/primitives/TimelineSurface.tsx | 58 - + .../timeline/primitives/TimelineTopSpacer.tsx | 26 - + .../timeline/primitives/tokens.ts | 82 - + .../timeline/renderers/code/PythonToolRenderer.tsx | 234 - + .../deepresearch/DeepResearchPlanRenderer.tsx | 75 - + .../deepresearch/ResearchAgentRenderer.tsx | 376 - + .../timeline/renderers/fetch/FetchToolRenderer.tsx | 160 - + .../timeline/renderers/fetch/fetchStateUtils.ts | 48 - + .../filereader/FileReaderToolRenderer.tsx | 151 - + .../renderers/memory/MemoryToolRenderer.tsx | 165 - + .../timeline/renderers/memory/memoryStateUtils.ts | 53 - + .../renderers/reasoning/ReasoningRenderer.tsx | 205 - + .../search/InternalSearchToolRenderer.tsx | 248 - + .../timeline/renderers/search/SearchChipList.tsx | 128 - + .../renderers/search/WebSearchToolRenderer.tsx | 138 - + .../timeline/renderers/search/searchStateUtils.ts | 97 - + .../renderers/sharedMarkdownComponents.tsx | 62 - + .../messageComponents/timeline/transformers.ts | 109 - + .../app/app/message/messageComponents/timing.ts | 24 - + .../messageComponents/toolDisplayHelpers.tsx | 149 - + web/src/app/app/page.tsx | 14 - + web/src/app/app/projects/projectsService.ts | 353 - + web/src/app/app/services/actionUtils.ts | 65 - + web/src/app/app/services/fileUtils.ts | 19 - + web/src/app/app/services/lib.tsx | 498 - + web/src/app/app/services/messageTree.ts | 464 - + web/src/app/app/services/packetUtils.test.ts | 257 - + web/src/app/app/services/packetUtils.ts | 182 - + web/src/app/app/services/searchParams.ts | 38 - + web/src/app/app/services/streamingModels.ts | 488 - + web/src/app/app/settings/accounts-access/page.tsx | 34 - + web/src/app/app/settings/chat-preferences/page.tsx | 5 - + web/src/app/app/settings/connectors/page.tsx | 5 - + web/src/app/app/settings/general/page.tsx | 5 - + web/src/app/app/settings/layout.tsx | 77 - + web/src/app/app/settings/page.tsx | 5 - + .../app/app/shared/[chatId]/SharedChatDisplay.tsx | 161 - + web/src/app/app/shared/[chatId]/page.tsx | 70 - + web/src/app/app/stores/useChatSessionStore.ts | 646 - + web/src/app/assistants/AssistantSharedStatus.tsx | 76 + + web/src/app/assistants/ToolsDisplay.tsx | 102 + + web/src/app/assistants/edit/[id]/page.tsx | 32 + + web/src/app/assistants/new/page.tsx | 40 + + web/src/app/auth/create-account/page.tsx | 8 +- + web/src/app/auth/error/AuthErrorContent.tsx | 91 - + web/src/app/auth/error/layout.tsx | 5 + + web/src/app/auth/error/page.tsx | 60 +- + web/src/app/auth/forgot-password/page.tsx | 37 +- + web/src/app/auth/impersonate/page.tsx | 38 +- + web/src/app/auth/join/page.tsx | 18 +- + web/src/app/auth/libSS.ts | 22 - + web/src/app/auth/login/EmailPasswordForm.test.tsx | 22 +- + web/src/app/auth/login/EmailPasswordForm.tsx | 60 +- + web/src/app/auth/login/LoginPage.tsx | 38 +- + web/src/app/auth/login/LoginText.tsx | 11 +- + web/src/app/auth/login/SignInButton.tsx | 47 +- + web/src/app/auth/login/page.tsx | 47 +- + web/src/app/auth/logout/route.ts | 52 +- + web/src/app/auth/oauth/callback/route.ts | 9 +- + web/src/app/auth/oidc/callback/route.ts | 10 +- + web/src/app/auth/reset-password/page.tsx | 50 +- + web/src/app/auth/saml/callback/route.ts | 17 +- + web/src/app/auth/signup/ReferralSourceSelector.tsx | 6 +- + web/src/app/auth/signup/page.tsx | 31 +- + web/src/app/auth/verify-email/Verify.tsx | 88 +- + web/src/app/auth/verify-email/page.tsx | 4 +- + .../RequestNewVerificationEmail.tsx | 16 +- + web/src/app/auth/waiting-on-verification/page.tsx | 46 +- + web/src/app/chat/agents/page.tsx | 13 + + web/src/app/chat/chat_search/ChatSearchGroup.tsx | 31 + + web/src/app/chat/chat_search/ChatSearchItem.tsx | 31 + + web/src/app/chat/chat_search/ChatSearchModal.tsx | 134 + + web/src/app/chat/chat_search/LoadingSpinner.tsx | 25 + + web/src/app/chat/chat_search/NewChatButton.tsx | 21 + + .../chat_search/components/ChatSearchSkeleton.tsx | 25 + + .../chat/chat_search/components/SearchInput.tsx | 42 + + .../app/chat/chat_search/hooks/useChatSearch.ts | 255 + + .../chat_search/hooks/useIntersectionObserver.ts | 51 + + web/src/app/chat/chat_search/interfaces.ts | 33 + + web/src/app/chat/chat_search/utils.ts | 95 + + web/src/app/chat/components/ChatPage.tsx | 972 ++ + web/src/app/chat/components/ChatPopup.tsx | 96 + + web/src/app/chat/components/MessagesDisplay.tsx | 228 + + web/src/app/chat/components/SourceChip2.tsx | 56 + + web/src/app/chat/components/WelcomeMessage.tsx | 58 + + .../documentSidebar/ChatDocumentDisplay.tsx | 124 + + .../components/documentSidebar/DocumentResults.tsx | 251 + + .../documentSidebar/DocumentSelector.tsx | 62 + + .../app/chat/components/files/InputBarPreview.tsx | 124 + + .../components/files/images/FullImageModal.tsx | 45 + + .../components/files/images/InMessageImage.tsx | 107 + + .../files/images/InputBarPreviewImage.tsx | 0 + web/src/app/chat/components/files/images/utils.ts | 3 + + .../app/chat/components/folders/FolderDropdown.tsx | 66 + + web/src/app/chat/components/folders/interfaces.ts | 8 + + web/src/app/chat/components/input/ChatInputBar.tsx | 639 + + .../app/chat/components/input/ChatInputOption.tsx | 81 + + web/src/app/chat/components/input/FileCard.tsx | 225 + + .../app/chat/components/input/FilterDisplay.tsx | 109 + + web/src/app/chat/components/input/FilterPills.tsx | 39 + + .../components/input/SimplifiedChatInputBar.tsx | 247 + + .../app/chat/components/modal/FeedbackModal.tsx | 131 + + .../components/modal/ShareChatSessionModal.tsx | 253 + + .../components/modifiers/SelectedDocuments.tsx | 0 + .../components/projects/ProjectChatSessionList.tsx | 145 + + .../components/projects/ProjectContextPanel.tsx | 347 + + .../components/projects/project_utils.ts | 0 + .../components/tools/GeneratingImageDisplay.tsx | 0 + web/src/app/chat/components/tools/constants.ts | 28 + + web/src/app/chat/hooks/useAssistantController.ts | 116 + + web/src/app/chat/hooks/useAssistantPreferences.ts | 57 + + web/src/app/chat/hooks/useChatController.ts | 1068 ++ + web/src/app/chat/hooks/useChatSessionController.ts | 388 + + web/src/app/chat/hooks/useDeepResearchToggle.ts | 52 + + web/src/app/chat/hooks/useFeedbackController.ts | 95 + + .../app/chat/input-prompts/InputPrompts.test.tsx | 394 + + web/src/app/chat/input-prompts/InputPrompts.tsx | 331 + + web/src/app/chat/input-prompts/page.tsx | 16 + + web/src/app/chat/interfaces.ts | 285 + + web/src/app/chat/layout.tsx | 67 + + web/src/app/chat/message/BlinkingDot.tsx | 11 + + web/src/app/chat/message/CodeBlock.tsx | 132 + + web/src/app/chat/message/HumanMessage.tsx | 359 + + web/src/app/chat/message/MemoizedHumanMessage.tsx | 90 + + .../app/chat/message/MemoizedTextComponents.tsx | 221 + + web/src/app/chat/message/MessageSwitcher.tsx | 66 + + web/src/app/chat/message/Resubmit.tsx | 49 + + .../app/{app => chat}/message/codeUtils.test.ts | 0 + web/src/app/{app => chat}/message/codeUtils.ts | 0 + web/src/app/chat/message/copyingUtils.tsx | 64 + + web/src/app/chat/message/custom-code-styles.css | 188 + + web/src/app/{app => chat}/message/hooks.ts | 0 + .../chat/message/messageComponents/AIMessage.tsx | 596 + + .../messageComponents/CitedSourcesToggle.tsx | 117 + + .../messageComponents/MemoizedAIMessage.tsx | 150 + + .../messageComponents/MultiToolRenderer.test.tsx | 393 + + .../messageComponents/MultiToolRenderer.tsx | 404 + + .../message/messageComponents/constants.ts | 0 + .../messageComponents/hooks/useMessageSwitching.ts | 58 + + .../hooks/useToolDisplayTiming.test.tsx | 277 + + .../hooks/useToolDisplayTiming.ts | 149 + + .../chat/message/messageComponents/interfaces.ts | 50 + + .../message/messageComponents/markdownUtils.tsx | 173 + + .../messageComponents/renderMessageComponent.tsx | 127 + + .../renderers/CustomToolRenderer.tsx | 131 + + .../renderers/FetchToolRenderer.tsx | 211 + + .../renderers/ImageToolRenderer.tsx | 183 + + .../renderers/MessageTextRenderer.tsx | 128 + + .../renderers/PythonToolRenderer.tsx | 234 + + .../renderers/ReasoningRenderer.tsx | 112 + + .../renderers/SearchToolRenderer.tsx | 330 + + .../renderers/SearchToolRendererV2.tsx | 305 + + .../messageComponents/renderers/utils/timing.ts | 0 + .../message/thinkingBox/ThinkingBox.css | 0 + web/src/app/chat/nrf/NRFPage.tsx | 349 + + web/src/app/chat/nrf/interfaces.ts | 5 + + web/src/app/chat/nrf/page.tsx | 22 + + web/src/app/chat/page.tsx | 18 + + web/src/app/chat/projects/ProjectsContext.tsx | 818 ++ + web/src/app/chat/projects/projectsService.ts | 348 + + web/src/app/chat/services/actionUtils.ts | 54 + + .../{app => chat}/services/currentMessageFIFO.ts | 0 + web/src/app/chat/services/fileUtils.ts | 18 + + web/src/app/chat/services/lib.tsx | 787 ++ + web/src/app/chat/services/messageTree.ts | 465 + + web/src/app/chat/services/packetUtils.ts | 122 + + web/src/app/chat/services/searchParams.ts | 38 + + web/src/app/chat/services/streamingModels.ts | 243 + + .../app/{app => chat}/services/thinkingTokens.ts | 0 + .../app/chat/shared/[chatId]/SharedChatDisplay.tsx | 133 + + web/src/app/chat/shared/[chatId]/page.tsx | 50 + + web/src/app/chat/stores/useChatSessionStore.ts | 749 ++ + web/src/app/components/nrf/SettingsPanel.tsx | 308 +- + web/src/app/components/nrf/ShortcutsDisplay.tsx | 46 + + web/src/app/craft/README.md | 195 - + web/src/app/craft/components/BigButton.tsx | 108 - + web/src/app/craft/components/BuildLLMPopover.tsx | 453 - + web/src/app/craft/components/BuildMessageList.tsx | 231 - + web/src/app/craft/components/BuildWelcome.tsx | 64 - + web/src/app/craft/components/ChatPanel.tsx | 494 - + web/src/app/craft/components/ConnectDataBanner.tsx | 123 - + .../app/craft/components/ConnectorBannersRow.tsx | 173 - + web/src/app/craft/components/CraftingLoader.tsx | 134 - + web/src/app/craft/components/DiffView.tsx | 263 - + web/src/app/craft/components/FileBrowser.tsx | 322 - + web/src/app/craft/components/FilePreviewModal.tsx | 107 - + web/src/app/craft/components/InputBar.tsx | 423 - + web/src/app/craft/components/IntroBackground.tsx | 419 - + web/src/app/craft/components/IntroContent.tsx | 97 - + web/src/app/craft/components/OutputPanel.tsx | 677 - + web/src/app/craft/components/RawOutputBlock.tsx | 149 - + .../craft/components/SandboxStatusIndicator.tsx | 152 - + web/src/app/craft/components/ShareButton.tsx | 185 - + web/src/app/craft/components/SideBar.tsx | 501 - + web/src/app/craft/components/SuggestedPrompts.tsx | 97 - + web/src/app/craft/components/SuggestionBubbles.tsx | 75 - + web/src/app/craft/components/TextChunk.tsx | 22 - + web/src/app/craft/components/ThinkingCard.tsx | 95 - + web/src/app/craft/components/TodoListCard.tsx | 160 - + .../app/craft/components/ToggleWarningModal.tsx | 84 - + web/src/app/craft/components/ToolCallPill.tsx | 223 - + web/src/app/craft/components/TypewriterText.tsx | 141 - + web/src/app/craft/components/UpgradePlanModal.tsx | 74 - + web/src/app/craft/components/UserMessage.tsx | 19 - + web/src/app/craft/components/WorkingLine.tsx | 210 - + web/src/app/craft/components/WorkingPill.tsx | 92 - + .../craft/components/output-panel/ArtifactsTab.tsx | 295 - + .../components/output-panel/FilePreviewContent.tsx | 316 - + .../app/craft/components/output-panel/FilesTab.tsx | 595 - + .../craft/components/output-panel/ImagePreview.tsx | 78 - + .../output-panel/MarkdownFilePreview.tsx | 37 - + .../craft/components/output-panel/PdfPreview.tsx | 117 - + .../craft/components/output-panel/PptxPreview.tsx | 191 - + .../craft/components/output-panel/PreviewTab.tsx | 58 - + .../app/craft/components/output-panel/UrlBar.tsx | 179 - + web/src/app/craft/constants.ts | 9 - + web/src/app/craft/constants/exampleBuildPrompts.ts | 201 - + web/src/app/craft/contexts/BuildContext.tsx | 51 - + web/src/app/craft/contexts/UploadFilesContext.tsx | 872 -- + web/src/app/craft/hooks/useBuildConnectors.ts | 54 - + web/src/app/craft/hooks/useBuildLlmSelection.ts | 66 - + .../app/craft/hooks/useBuildSessionController.ts | 329 - + web/src/app/craft/hooks/useBuildSessionStore.ts | 2220 ---- + web/src/app/craft/hooks/useBuildStreaming.ts | 455 - + web/src/app/craft/hooks/usePreProvisionPolling.ts | 89 - + web/src/app/craft/hooks/useUsageLimits.ts | 72 - + web/src/app/craft/layout.tsx | 35 - + .../craft/onboarding/BuildOnboardingProvider.tsx | 77 - + .../onboarding/components/BuildOnboardingModal.tsx | 590 - + .../onboarding/components/NoLlmProvidersModal.tsx | 106 - + .../onboarding/components/NotAllowedModal.tsx | 102 - + .../onboarding/components/OnboardingInfoPages.tsx | 85 - + .../onboarding/components/OnboardingLlmSetup.tsx | 328 - + .../onboarding/components/OnboardingUserInfo.tsx | 192 - + web/src/app/craft/onboarding/constants.ts | 387 - + .../craft/onboarding/hooks/useOnboardingModal.ts | 176 - + web/src/app/craft/onboarding/types.ts | 61 - + web/src/app/craft/page.tsx | 25 - + web/src/app/craft/services/apiServices.ts | 850 -- + web/src/app/craft/services/searchParams.ts | 12 - + web/src/app/craft/types/displayTypes.ts | 84 - + web/src/app/craft/types/streamingTypes.ts | 528 - + web/src/app/craft/types/user-library.ts | 26 - + web/src/app/craft/utils/packetTypes.ts | 144 - + web/src/app/craft/utils/parsePacket.ts | 535 - + web/src/app/craft/utils/pathSanitizer.test.ts | 159 - + web/src/app/craft/utils/pathSanitizer.ts | 69 - + web/src/app/craft/utils/streamItemHelpers.ts | 28 - + .../configure/components/ComingSoonConnectors.tsx | 181 - + .../components/ConfigureConnectorModal.tsx | 204 - + .../v1/configure/components/ConfigureOverlays.tsx | 60 - + .../v1/configure/components/ConnectorCard.tsx | 169 - + .../configure/components/ConnectorConfigStep.tsx | 148 - + .../components/CreateCredentialInline.tsx | 173 - + .../v1/configure/components/CredentialStep.tsx | 307 - + .../configure/components/DemoDataConfirmModal.tsx | 76 - + .../configure/components/RequestConnectorModal.tsx | 223 - + .../v1/configure/components/UserLibraryModal.tsx | 575 - + web/src/app/craft/v1/configure/page.tsx | 658 - + .../v1/configure/utils/createBuildConnector.ts | 99 - + web/src/app/craft/v1/constants.ts | 30 - + web/src/app/craft/v1/layout.tsx | 29 - + web/src/app/craft/v1/page.tsx | 38 - + web/src/app/css/attachment-button.css | 102 - + web/src/app/css/button.css | 399 - + web/src/app/css/card.css | 23 - + web/src/app/css/code.css | 24 - + web/src/app/css/color-swatch.css | 25 - + web/src/app/css/colors.css | 249 +- + web/src/app/css/divider.css | 11 - + web/src/app/css/general-layouts.css | 58 - + web/src/app/css/inputs.css | 31 - + web/src/app/css/knowledge-table.css | 147 - + web/src/app/css/line-item.css | 185 +- + web/src/app/css/sizes.css | 10 - + web/src/app/css/square-button.css | 38 - + web/src/app/css/switch.css | 49 - + web/src/app/css/z-index.css | 51 - + web/src/app/ee/EEFeatureRedirect.tsx | 18 - + web/src/app/ee/LICENSE | 10 +- + web/src/app/ee/admin/billing/BillingAlerts.tsx | 7 +- + .../ee/admin/billing/BillingInformationPage.tsx | 58 +- + .../app/ee/admin/billing/SubscriptionSummary.tsx | 18 +- + web/src/app/ee/admin/billing/page.tsx | 17 +- + web/src/app/ee/admin/groups/ConnectorEditor.tsx | 31 + + web/src/app/ee/admin/groups/UserEditor.tsx | 95 + + .../app/ee/admin/groups/UserGroupCreationForm.tsx | 144 + + web/src/app/ee/admin/groups/UserGroupsTable.tsx | 183 + + .../ee/admin/groups/[groupId]/AddConnectorForm.tsx | 89 + + .../ee/admin/groups/[groupId]/AddMemberForm.tsx | 69 + + .../groups/[groupId]/AddTokenRateLimitForm.tsx | 60 + + .../app/ee/admin/groups/[groupId]/GroupDisplay.tsx | 496 + + web/src/app/ee/admin/groups/[groupId]/hook.ts | 12 + + web/src/app/ee/admin/groups/[groupId]/lib.ts | 29 + + web/src/app/ee/admin/groups/[groupId]/page.tsx | 77 + + web/src/app/ee/admin/groups/[id]/page.tsx | 13 - + web/src/app/ee/admin/groups/create/page.tsx | 1 - + web/src/app/ee/admin/groups/lib.ts | 17 + + web/src/app/ee/admin/groups/page.tsx | 97 +- + web/src/app/ee/admin/groups/types.ts | 15 + + .../custom-analytics/CustomAnalyticsUpdateForm.tsx | 44 +- + .../ee/admin/performance/custom-analytics/page.tsx | 32 +- + web/src/app/ee/admin/performance/lib.ts | 2 +- + .../performance/query-history/KickoffCSVExport.tsx | 55 +- + .../query-history/QueryHistoryTable.tsx | 221 +- + .../admin/performance/query-history/[id]/page.tsx | 37 +- + .../ee/admin/performance/query-history/page.tsx | 18 +- + .../ee/admin/performance/usage/FeedbackChart.tsx | 4 +- + .../ee/admin/performance/usage/OnyxBotChart.tsx | 4 +- + .../performance/usage/PersonaMessagesChart.tsx | 18 +- + .../performance/usage/QueryPerformanceChart.tsx | 4 +- + .../ee/admin/performance/usage/UsageReports.tsx | 98 +- + web/src/app/ee/admin/performance/usage/page.tsx | 59 +- + .../standard-answer/StandardAnswerCreationForm.tsx | 19 +- + web/src/app/ee/admin/standard-answer/[id]/page.tsx | 47 +- + web/src/app/ee/admin/standard-answer/hooks.ts | 15 +- + web/src/app/ee/admin/standard-answer/new/page.tsx | 27 +- + web/src/app/ee/admin/standard-answer/page.tsx | 102 +- + .../app/ee/admin/theme/AppearanceThemeSettings.tsx | 586 - + web/src/app/ee/admin/theme/Preview.tsx | 284 - + web/src/app/ee/admin/theme/page.tsx | 259 - + web/src/app/ee/admin/whitelabeling/ImageUpload.tsx | 86 + + .../ee/admin/whitelabeling/WhitelabelingForm.tsx | 350 + + web/src/app/ee/admin/whitelabeling/page.tsx | 16 + + web/src/app/ee/agents/stats/[id]/AgentStats.tsx | 190 - + web/src/app/ee/agents/stats/[id]/page.tsx | 38 - + .../ee/assistants/stats/[id]/AssistantStats.tsx | 192 + + web/src/app/ee/assistants/stats/[id]/page.tsx | 74 + + web/src/app/ee/layout.tsx | 33 +- + web/src/app/federated/oauth/callback/page.tsx | 2 +- + web/src/app/globals.css | 169 +- + web/src/app/layout.tsx | 167 +- + web/src/app/mcp/oauth/callback/page.tsx | 2 +- + web/src/app/nrf/(main)/layout.tsx | 26 - + web/src/app/nrf/(main)/page.tsx | 31 - + web/src/app/nrf/NRFChrome.tsx | 149 - + web/src/app/nrf/NRFPage.tsx | 676 - + web/src/app/nrf/layout.tsx | 20 - + web/src/app/nrf/side-panel/SidePanelHeader.tsx | 40 - + web/src/app/nrf/side-panel/page.tsx | 24 - + web/src/app/oauth-config/callback/page.tsx | 2 +- + web/src/app/page.tsx | 2 +- + web/src/app/pages/[pageTitle]/page.tsx | 70 + + web/src/app/providers.tsx | 12 +- + web/src/ce.tsx | 39 - + web/src/components/AdvancedOptionsToggle.tsx | 4 +- + web/src/components/BackButton.tsx | 35 + + web/src/components/ConnectorMultiSelect.tsx | 74 +- + web/src/components/DeleteButton.tsx | 11 +- + web/src/components/Dropdown.tsx | 378 +- + web/src/components/EEA_Logo.tsx | 125 + + web/src/components/EditableStringFieldDisplay.tsx | 10 +- + web/src/components/FederatedConnectorSelector.tsx | 282 +- + web/src/components/Field.tsx | 117 +- + web/src/components/FormErrorHelpers.tsx | 7 +- + web/src/components/GatedContentWrapper.tsx | 32 - + web/src/components/GenericMultiSelect.tsx | 82 +- + web/src/components/Hoverable.tsx | 45 + + web/src/components/IsPublicGroupSelector.tsx | 2 +- + web/src/components/Modal.tsx | 130 + + web/src/components/NonSelectableConnectors.tsx | 19 +- + web/src/components/OnyxInitializingLoader.tsx | 13 +- + web/src/components/SourceTile.tsx | 21 +- + web/src/components/Status.tsx | 9 - + web/src/components/admin/ClientLayout.tsx | 88 +- + web/src/components/admin/Layout.tsx | 62 +- + web/src/components/admin/Title.tsx | 40 +- + web/src/components/admin/actions/ToolList.tsx | 538 + + web/src/components/admin/actions/forms.tsx | 319 + + web/src/components/admin/actions/interfaces.tsx | 61 + + .../components/admin/assistants/FormSections.tsx | 227 + + .../admin/assistants/MemoizedToolCheckboxes.tsx | 76 + + .../components/admin/assistants/ToolSelector.tsx | 261 + + .../admin/connectors/AccessTypeGroupSelector.tsx | 16 +- + .../components/admin/connectors/ConnectorTitle.tsx | 5 +- + .../components/admin/connectors/CredentialForm.tsx | 19 +- + web/src/components/admin/connectors/Popup.tsx | 108 + + .../admin/federated/FederatedConnectorForm.tsx | 192 +- + web/src/components/admin/users/BulkAdd.tsx | 27 +- + .../components/admin/users/InvitedUserTable.tsx | 12 +- + .../components/admin/users/PendingUsersTable.tsx | 32 +- + .../components/admin/users/ResetPasswordModal.tsx | 125 +- + .../components/admin/users/SignedUpUserTable.tsx | 85 +- + .../admin/users/buttons/DeactivateUserButton.tsx | 16 +- + .../admin/users/buttons/DeleteUserButton.tsx | 15 +- + .../admin/users/buttons/InviteUserButton.tsx | 35 +- + .../users/buttons/LeaveOrganizationButton.tsx | 16 +- + .../admin/users/buttons/UserRoleDropdown.tsx | 2 +- + web/src/components/auth/AuthErrorDisplay.tsx | 15 +- + web/src/components/auth/AuthFlowContainer.tsx | 8 +- + web/src/components/chat/DynamicBottomSpacer.tsx | 313 - + web/src/components/chat/FederatedOAuthModal.tsx | 171 +- + web/src/components/chat/MCPApiKeyModal.tsx | 236 +- + web/src/components/chat/MinimalMarkdown.test.tsx | 32 - + web/src/components/chat/MinimalMarkdown.tsx | 70 +- + web/src/components/chat/ProviderContext.tsx | 61 +- + web/src/components/chat/ScrollContainerContext.tsx | 60 - + web/src/components/chat/TextView.tsx | 283 + + .../chat/UnconfiguredLlmProviderText.tsx | 28 + + web/src/components/chat/hooks.ts | 94 + + web/src/components/chat/sources/SourceCard.tsx | 226 + + web/src/components/context/AppProvider.tsx | 53 + + web/src/components/context/EmbeddingContext.tsx | 5 +- + web/src/components/context/FormContext.tsx | 5 +- + web/src/components/context/ModalContext.tsx | 23 +- + .../components/context/NRFPreferencesContext.tsx | 65 +- + .../components/credentials/CredentialFields.tsx | 180 + + .../components/credentials/CredentialSection.tsx | 170 +- + .../credentials/actions/CreateCredential.tsx | 32 +- + .../actions/CreateStdOAuthCredential.tsx | 2 +- + .../actions/CredentialFieldsRenderer.tsx | 27 +- + .../credentials/actions/EditCredential.tsx | 24 +- + .../credentials/actions/ModifyCredential.tsx | 141 +- + .../dateRangeSelectors/AdminDateRangeSelector.tsx | 30 +- + .../dateRangeSelectors/SearchDateRangeSelector.tsx | 14 +- + web/src/components/dev/StatsOverlay.tsx | 71 - + web/src/components/dev/StatsOverlayLoader.tsx | 11 - + .../documentSet/DocumentSetSelectable.tsx | 79 + + .../embedding/CustomEmbeddingModelForm.tsx | 16 +- + web/src/components/embedding/CustomModelForm.tsx | 6 +- + .../components/embedding/FailedReIndexAttempts.tsx | 120 +- + web/src/components/embedding/interfaces.tsx | 9 +- + .../components/errorPages/AccessRestrictedPage.tsx | 223 +- + web/src/components/errorPages/CloudErrorPage.tsx | 8 +- + web/src/components/errorPages/ErrorPage.tsx | 15 +- + web/src/components/extension/Shortcuts.tsx | 256 + + web/src/components/filters/SourceSelector.tsx | 222 +- + web/src/components/filters/TimeRangeSelector.tsx | 1 - + web/src/components/header/AnnouncementBanner.tsx | 10 +- + web/src/components/health/healthcheck.tsx | 226 + + web/src/components/health/refreshUtils.ts | 64 + + web/src/components/icons/icons.test.tsx | 17 +- + web/src/components/icons/icons.tsx | 2514 +++- + .../initialSetup/welcome/WelcomeModal.tsx | 92 + + .../initialSetup/welcome/WelcomeModalWrapper.tsx | 31 + + .../components/initialSetup/welcome/constants.ts | 1 + + web/src/components/initialSetup/welcome/lib.ts | 56 + + web/src/components/llm/ApiKeyForm.tsx | 84 + + web/src/components/llm/ApiKeyModal.tsx | 65 + + web/src/components/llm/LLMSelector.tsx | 163 +- + web/src/components/logo/Logo.tsx | 60 + + web/src/components/modals/AddInstructionModal.tsx | 51 +- + web/src/components/modals/ConfirmEntityModal.tsx | 21 +- + web/src/components/modals/CreateProjectModal.tsx | 87 +- + web/src/components/modals/EditPropertyModal.tsx | 116 +- + web/src/components/modals/ExceptionTraceModal.tsx | 49 + + web/src/components/modals/GenericConfirmModal.tsx | 57 +- + .../components/modals/MoveCustomAgentChatModal.tsx | 11 +- + web/src/components/modals/NewTeamModal.tsx | 53 +- + web/src/components/modals/NewTenantModal.tsx | 225 + + web/src/components/modals/NoAgentModal.tsx | 40 - + web/src/components/modals/NoAssistantModal.tsx | 38 + + web/src/components/modals/ProviderModal.tsx | 43 +- + web/src/components/modals/UserFilesModal.tsx | 139 +- + web/src/components/oauth/OAuthCallbackPage.tsx | 35 +- + web/src/components/oauth/OAuthConfigSelector.tsx | 152 + + web/src/components/popover/Popover.tsx | 82 + + web/src/components/popover/styles.css | 10 + + web/src/components/popup/Popup.tsx | 151 + + web/src/components/popup/PopupFromQuery.tsx | 32 + + web/src/components/search/DocumentDisplay.tsx | 16 +- + .../components/search/DocumentFeedbackBlock.tsx | 18 +- + .../search/filtering/HorizontalSourceSelector.tsx | 229 + + web/src/components/search/filtering/TagFilter.tsx | 95 + + web/src/components/search/results/Citation.tsx | 14 +- + web/src/components/settings/SettingsProvider.tsx | 42 + + web/src/components/settings/lib.ts | 11 +- + .../settings/usePaidEnterpriseFeaturesEnabled.ts | 25 +- + .../components/sidebar/ChatSessionMorePopup.tsx | 52 +- + web/src/components/sidebar/types.ts | 2 +- + web/src/components/tools/CSVContent.tsx | 228 +- + .../components/tools/ExpandableContentWrapper.tsx | 121 +- + web/src/components/tools/parseCSV.test.ts | 84 - + web/src/components/tooltip/CustomTooltip.tsx | 44 +- + web/src/components/ui/accordion.tsx | 2 +- + web/src/components/ui/avatar.tsx | 22 + + web/src/components/ui/calendar.tsx | 58 + + web/src/components/ui/datePicker.tsx | 110 + + web/src/components/ui/fully_wrapped_tabs.tsx | 94 + + web/src/components/ui/label.tsx | 26 + + web/src/components/ui/popover.tsx | 112 + + web/src/components/ui/tabs.tsx | 60 + + web/src/components/ui/text.tsx | 11 + + web/src/components/ui/tooltip.tsx | 63 +- + web/src/components/user/PATManagement.tsx | 303 + + web/src/components/user/UserProvider.tsx | 402 + + web/src/components/voice/Waveform.tsx | 206 - + web/src/ee/LICENSE | 36 - + web/src/ee/hooks/useHookExecutionLogs.ts | 42 - + web/src/ee/hooks/useHookSpecs.ts | 16 - + web/src/ee/hooks/useHooks.ts | 16 - + web/src/ee/lib/search/svc.ts | 96 - + web/src/ee/providers/QueryControllerProvider.tsx | 316 - + .../admin/HooksPage/HookFormModal.tsx | 460 - + .../admin/HooksPage/HookLogsModal.tsx | 195 - + .../admin/HooksPage/HookStatusPopover.tsx | 379 - + web/src/ee/refresh-pages/admin/HooksPage/index.tsx | 662 - + .../ee/refresh-pages/admin/HooksPage/interfaces.ts | 73 - + web/src/ee/refresh-pages/admin/HooksPage/svc.ts | 119 - + web/src/ee/sections/SearchCard.tsx | 112 - + web/src/ee/sections/SearchUI.tsx | 404 - + web/src/hooks/__tests__/useShowOnboarding.test.tsx | 279 - + web/src/hooks/appNavigation.ts | 19 +- + web/src/hooks/formHooks.ts | 123 - + web/src/hooks/input-prompts.ts | 46 + + web/src/hooks/useAdminPersonas.ts | 66 - + web/src/hooks/useAdminUsers.ts | 122 - + web/src/hooks/useAgentController.ts | 107 - + web/src/hooks/useAgentPreferences.ts | 75 - + web/src/hooks/useAgents.ts | 200 - + web/src/hooks/useAppFocus.ts | 86 +- + web/src/hooks/useAuthTypeMetadata.ts | 73 - + web/src/hooks/useAvailableTools.ts | 43 - + web/src/hooks/useBillingInformation.ts | 35 - + web/src/hooks/useBoundingBox.ts | 2 - + web/src/hooks/useBrowserInfo.ts | 64 - + web/src/hooks/useCCPairs.ts | 82 - + web/src/hooks/useChatController.ts | 1427 --- + web/src/hooks/useChatSessionController.ts | 403 - + web/src/hooks/useChatSessions.ts | 310 - + web/src/hooks/useClickOutside.ts | 2 - + web/src/hooks/useCloudSubscription.ts | 25 - + web/src/hooks/useCodeInterpreter.ts | 44 - + web/src/hooks/useContainerCenter.ts | 77 - + web/src/hooks/useContentSize.ts | 148 - + web/src/hooks/useCurrentUser.ts | 44 - + web/src/hooks/useDeepResearchToggle.ts | 54 - + web/src/hooks/useDropdownPosition.ts | 282 + + web/src/hooks/useFederatedOAuthStatus.ts | 100 - + web/src/hooks/useFeedbackController.ts | 101 - + web/src/hooks/useFilter.ts | 69 - + web/src/hooks/useGroups.ts | 78 - + web/src/hooks/useImageDropzone.ts | 69 - + web/src/hooks/useIsDefaultAgent.ts | 62 - + web/src/hooks/useIsMounted.ts | 40 + + web/src/hooks/useLLMProviders.ts | 216 - + web/src/hooks/useLicense.ts | 39 - + web/src/hooks/useMcpServers.ts | 42 - + web/src/hooks/useMcpServersForAgentEditor.ts | 28 - + web/src/hooks/useMemoryManager.ts | 184 - + web/src/hooks/useMultiModelChat.ts | 220 - + web/src/hooks/useOnMount.ts | 42 - + web/src/hooks/useOpenApiTools.ts | 39 - + web/src/hooks/usePaginatedFetch.ts | 5 +- + web/src/hooks/usePromptShortcuts.ts | 31 - + web/src/hooks/useScimToken.ts | 15 - + web/src/hooks/useScreenSize.ts | 18 +- + web/src/hooks/useServerTools.ts | 110 - + web/src/hooks/useSettings.test.ts | 238 - + web/src/hooks/useSettings.ts | 106 - + web/src/hooks/useShareableGroups.ts | 56 - + web/src/hooks/useShareableUsers.ts | 25 - + web/src/hooks/useShowOnboarding.ts | 351 - + web/src/hooks/useTags.ts | 37 - + web/src/hooks/useToast.ts | 207 - + web/src/hooks/useTokenRefresh.ts | 9 +- + web/src/hooks/useUserCounts.ts | 54 - + web/src/hooks/useUserPersonalization.ts | 229 - + web/src/hooks/useUsers.ts | 52 - + web/src/hooks/useVoicePlayback.ts | 107 - + web/src/hooks/useVoiceProviders.ts | 35 - + web/src/hooks/useVoiceRecorder.ts | 556 - + web/src/hooks/useVoiceStatus.ts | 27 - + web/src/hooks/useWebSocket.ts | 150 - + web/src/icons/README.md | 25 + + web/src/icons/actions.tsx | 18 + + web/src/icons/activity.tsx | 18 + + web/src/icons/add-lines.tsx | 18 + + web/src/icons/alert-circle.tsx | 34 + + web/src/icons/alert-triangle.tsx | 20 + + web/src/icons/arrow-exchange.tsx | 20 + + web/src/icons/arrow-left.tsx | 18 + + web/src/icons/arrow-right-circle.tsx | 18 + + web/src/icons/arrow-right.tsx | 18 + + web/src/icons/arrow-up-right.tsx | 17 + + web/src/icons/arrow-up.tsx | 18 + + web/src/icons/arrow-wall-right.tsx | 20 + + web/src/icons/aws.tsx | 31 + + web/src/icons/bar-chart.tsx | 18 + + web/src/icons/bell.tsx | 18 + + web/src/icons/bubble-text.tsx | 18 + + web/src/icons/calendar.tsx | 20 + + web/src/icons/check-circle.tsx | 25 + + web/src/icons/check-square.tsx | 26 + + web/src/icons/check.tsx | 20 + + web/src/icons/chevron-down-small.tsx | 18 + + web/src/icons/chevron-down.tsx | 18 + + web/src/icons/chevron-left.tsx | 18 + + web/src/icons/chevron-right.tsx | 18 + + web/src/icons/chevron-up-small.tsx | 18 + + web/src/icons/chevron-up.tsx | 18 + + web/src/icons/claude.tsx | 28 + + web/src/icons/clock.tsx | 25 + + web/src/icons/cloud.tsx | 25 + + web/src/icons/code.tsx | 18 + + web/src/icons/convert-svg.sh | 38 + + web/src/icons/copy.tsx | 25 + + web/src/icons/cpu.tsx | 25 + + web/src/icons/dev-kit.tsx | 18 + + web/src/icons/download-cloud.tsx | 33 + + web/src/icons/edit-big.tsx | 17 + + web/src/icons/edit.tsx | 18 + + web/src/icons/external-link.tsx | 32 + + web/src/icons/eye-closed.tsx | 18 + + web/src/icons/eye.tsx | 24 + + web/src/icons/file-text.tsx | 18 + + web/src/icons/files.tsx | 18 + + web/src/icons/filter.tsx | 18 + + web/src/icons/fold.tsx | 20 + + web/src/icons/folder-in.tsx | 18 + + web/src/icons/folder-open.tsx | 32 + + web/src/icons/folder-partial-open.tsx | 37 + + web/src/icons/folder-plus.tsx | 18 + + web/src/icons/folder.tsx | 18 + + web/src/icons/globe.tsx | 25 + + web/src/icons/hard-drive.tsx | 18 + + web/src/icons/headset-mic.tsx | 18 + + web/src/icons/hourglass.tsx | 18 + + web/src/icons/image.tsx | 17 + + web/src/icons/import.tsx | 20 + + web/src/icons/index.tsx | 9 + + web/src/icons/key.tsx | 19 + + web/src/icons/lightbulb-simple.tsx | 18 + + web/src/icons/line-chart-up.tsx | 18 + + web/src/icons/link.tsx | 21 + + web/src/icons/linked-dots.tsx | 18 + + web/src/icons/loader.tsx | 20 + + web/src/icons/lock.tsx | 18 + + web/src/icons/log-out.tsx | 30 + + web/src/icons/maximize-2.tsx | 20 + + web/src/icons/menu.tsx | 17 + + web/src/icons/minus-circle.tsx | 20 + + web/src/icons/minus.tsx | 15 + + web/src/icons/moon.tsx | 18 + + web/src/icons/more-horizontal.tsx | 30 + + web/src/icons/ollama.tsx | 21 + + web/src/icons/onyx-logo.tsx | 26 + + web/src/icons/onyx-octagon.tsx | 25 + + web/src/icons/openai.tsx | 29 + + web/src/icons/openrouter.tsx | 25 + + web/src/icons/organization.tsx | 17 + + web/src/icons/paperclip.tsx | 18 + + web/src/icons/pause-circle.tsx | 20 + + web/src/icons/pie-chart.tsx | 25 + + web/src/icons/pin.tsx | 18 + + web/src/icons/pinned.tsx | 20 + + web/src/icons/play-circle.tsx | 26 + + web/src/icons/plug.tsx | 18 + + web/src/icons/plus-circle.tsx | 25 + + web/src/icons/plus.tsx | 20 + + web/src/icons/quote-end.tsx | 16 + + web/src/icons/quote-start.tsx | 16 + + web/src/icons/refresh-cw.tsx | 18 + + web/src/icons/search-menu.tsx | 18 + + web/src/icons/search.tsx | 18 + + web/src/icons/server.tsx | 25 + + web/src/icons/settings.tsx | 31 + + web/src/icons/share.tsx | 18 + + web/src/icons/shield.tsx | 18 + + web/src/icons/sidebar.tsx | 18 + + web/src/icons/slack.tsx | 67 + + web/src/icons/slash.tsx | 26 + + web/src/icons/sliders.tsx | 25 + + web/src/icons/sparkle.tsx | 18 + + web/src/icons/step1.tsx | 30 + + web/src/icons/step2.tsx | 38 + + web/src/icons/step3-end.tsx | 46 + + web/src/icons/step3.tsx | 46 + + web/src/icons/stop-circle.tsx | 26 + + web/src/icons/stop.tsx | 19 + + web/src/icons/sun.tsx | 25 + + web/src/icons/thumbs-down.tsx | 25 + + web/src/icons/thumbs-up.tsx | 25 + + web/src/icons/trash.tsx | 18 + + web/src/icons/unplug.tsx | 25 + + web/src/icons/upload-cloud.tsx | 20 + + web/src/icons/user.tsx | 18 + + web/src/icons/users.tsx | 25 + + web/src/icons/workflow.tsx | 18 + + web/src/icons/x-circle.tsx | 20 + + web/src/icons/x-octagon.tsx | 20 + + web/src/icons/x.tsx | 13 + + web/src/icons/zoom-in.tsx | 20 + + web/src/icons/zoom-out.tsx | 20 + + web/src/instrumentation-client.ts | 1 - + web/src/interfaces/llm.ts | 214 - + web/src/interfaces/onboarding.ts | 65 - + web/src/interfaces/settings.ts | 153 - + web/src/layouts/AppPageLayout.tsx | 320 + + web/src/layouts/actions-layouts.tsx | 261 - + web/src/layouts/app-layouts.tsx | 654 - + web/src/layouts/expandable-card-layouts.tsx | 291 - + web/src/layouts/general-layouts.tsx | 285 - + web/src/layouts/input-layouts.tsx | 256 - + web/src/layouts/settings-layouts.tsx | 315 - + web/src/layouts/sidebar-layouts.tsx | 322 - + web/src/layouts/table-layouts.tsx | 158 - + web/src/lib/admin-routes.ts | 271 - + web/src/lib/admin/voice/svc.ts | 64 - + web/src/lib/agents.ts | 226 - + web/src/lib/agentsSS.ts | 13 - + web/src/lib/analytics.ts | 70 - + web/src/lib/assistantIconUtils.tsx | 199 + + web/src/lib/assistants/checkOwnership.ts | 25 + + web/src/lib/assistants/fetchAssistantsSS.ts | 12 + + web/src/lib/assistants/fetchPersonaEditorInfoSS.ts | 123 + + .../src/lib/assistants/orderAssistants.ts | 0 + web/src/lib/assistants/shareAssistant.ts | 59 + + .../lib/assistants/updateAssistantPreferences.ts | 95 + + web/src/lib/assistants/utils.ts | 136 + + web/src/lib/auth/requireAuth.ts | 14 +- + web/src/lib/billing/index.ts | 13 - + web/src/lib/billing/interfaces.ts | 189 +- + web/src/lib/billing/svc.test.ts | 239 - + web/src/lib/billing/svc.ts | 134 - + web/src/lib/billing/utils.ts | 53 + + web/src/lib/build/client.ts | 365 - + web/src/lib/ccPair.ts | 26 +- + web/src/lib/chat/fetchAgentData.ts | 20 - + web/src/lib/chat/fetchAssistantdata.ts | 20 + + web/src/lib/chat/fetchBackendChatSessionSS.ts | 2 +- + web/src/lib/chat/fetchChatData.ts | 231 + + web/src/lib/chat/svc.ts | 23 - + web/src/lib/clipboard.test.ts | 89 - + web/src/lib/clipboard.ts | 52 - + web/src/lib/connectors/AutoSyncOptionFields.tsx | 1 - + web/src/lib/connectors/connectors.tsx | 302 +- + web/src/lib/connectors/credentials.ts | 19 - + web/src/lib/constants.ts | 93 +- + web/src/lib/constants/chatBackgrounds.ts | 59 - + web/src/lib/credential.ts | 10 +- + web/src/lib/dateUtils.ts | 68 - + web/src/lib/documentDeletion.ts | 19 +- + web/src/lib/download.ts | 34 - + web/src/lib/eea/fetchEEASettings.ts | 18 + + web/src/lib/error.ts | 10 - + web/src/lib/extension/constants.ts | 3 - + web/src/lib/extension/utils.ts | 63 +- + web/src/lib/fetcher.ts | 23 - + web/src/lib/fileConnector.ts | 49 - + web/src/lib/filters.ts | 2 +- + web/src/lib/generated/README.md | 2 +- + web/src/lib/googleConnector.ts | 5 +- + web/src/lib/headers/fetchHeaderDataSS.ts | 4 +- + web/src/lib/hierarchy/interfaces.ts | 78 - + web/src/lib/hierarchy/svc.ts | 61 - + web/src/lib/hooks.llmResolver.test.ts | 185 - + web/src/lib/hooks.ts | 862 +- + web/src/lib/hooks/useCCPairs.ts | 17 + + web/src/lib/hooks/useCaptcha.ts | 121 - + web/src/lib/hooks/useDocumentSets.ts | 23 - + web/src/lib/hooks/useFederatedOAuthStatus.ts | 27 + + web/src/lib/hooks/useForcedTools.ts | 34 - + web/src/lib/hooks/useLLMProviderOptions.ts | 21 - + web/src/lib/hooks/useLLMProviders.test.ts | 82 - + web/src/lib/hooks/useLLMProviders.ts | 30 + + web/src/lib/hooks/useProjects.ts | 23 - + web/src/lib/hooks/useToolOAuthStatus.ts | 60 +- + web/src/lib/hooks/useUserPersonalization.ts | 128 + + web/src/lib/languages.test.ts | 102 - + web/src/lib/languages.ts | 134 - + web/src/lib/llm/fetchLLMs.ts | 14 + + web/src/lib/llm/utils.ts | 146 + + web/src/lib/llm/visionLLM.ts | 37 + + web/src/lib/llmConfig/cache.ts | 18 - + web/src/lib/llmConfig/constants.ts | 11 - + web/src/lib/llmConfig/index.ts | 251 - + web/src/lib/llmConfig/svc.ts | 597 - + web/src/lib/llmConfig/utils.ts | 158 - + web/src/lib/oauth/api.ts | 15 +- + web/src/lib/redirectSS.ts | 18 +- + web/src/lib/search/chatSessions.ts | 12 + + web/src/lib/search/interfaces.ts | 148 +- + web/src/lib/search/streamingUtils.ts | 80 +- + web/src/lib/search/utils.ts | 13 +- + web/src/lib/sources.ts | 158 +- + web/src/lib/streamingTTS.ts | 615 - + web/src/lib/swr-keys.ts | 187 - + web/src/lib/time.ts | 44 +- + web/src/lib/tools/edit.ts | 248 + + web/src/lib/tools/interfaces.ts | 130 +- + web/src/lib/tools/mcpService.ts | 213 - + web/src/lib/tools/mcpUtils.tsx | 40 - + web/src/lib/tools/openApiService.ts | 171 - + web/src/lib/types.ts | 66 +- + web/src/lib/user.test.ts | 55 - + web/src/lib/user.ts | 135 +- + web/src/lib/userSS.ts | 82 +- + web/src/lib/utils.test.ts | 43 - + web/src/lib/utils.ts | 200 +- + web/src/lib/utilsSS.ts | 13 +- + web/src/providers/AppBackgroundProvider.tsx | 60 - + web/src/providers/AppProvider.tsx | 56 - + web/src/providers/CustomAnalyticsScript.tsx | 21 - + web/src/providers/DynamicMetadata.tsx | 28 - + web/src/providers/ProductGatingWrapper.tsx | 25 - + web/src/providers/ProjectsContext.tsx | 837 -- + web/src/providers/QueryControllerProvider.tsx | 57 - + web/src/providers/SWRConfigProvider.tsx | 16 - + web/src/providers/SettingsProvider.tsx | 137 - + web/src/providers/ToastProvider.tsx | 107 - + web/src/providers/UserProvider.tsx | 540 - + web/src/providers/VoiceModeProvider.tsx | 1057 -- + .../providers/__tests__/ProjectsContext.test.tsx | 167 - + web/src/proxy.ts | 53 +- + web/src/refresh-components/AgentCard.tsx | 151 + + web/src/refresh-components/AgentIcon.tsx | 133 + + web/src/refresh-components/Attachment.stories.tsx | 42 - + web/src/refresh-components/Attachment.tsx | 17 +- + web/src/refresh-components/Calendar.stories.tsx | 64 - + web/src/refresh-components/Calendar.tsx | 184 - + .../refresh-components/CharacterCount.stories.tsx | 42 - + web/src/refresh-components/CharacterCount.tsx | 13 - + web/src/refresh-components/Chip.stories.tsx | 40 - + web/src/refresh-components/Chip.tsx | 69 - + web/src/refresh-components/Code.stories.tsx | 43 - + web/src/refresh-components/Code.tsx | 26 - + web/src/refresh-components/Collapsible.stories.tsx | 99 - + web/src/refresh-components/Collapsible.tsx | 105 - + web/src/refresh-components/ColorSwatch.stories.tsx | 35 - + web/src/refresh-components/ColorSwatch.tsx | 30 - + .../ConnectionProviderIcon.stories.tsx | 33 - + .../refresh-components/ConnectionProviderIcon.tsx | 25 - + web/src/refresh-components/CounterSeparator.tsx | 27 + + web/src/refresh-components/Divider.stories.tsx | 90 - + web/src/refresh-components/Divider.tsx | 263 - + .../refresh-components/EmptyMessage.stories.tsx | 42 - + web/src/refresh-components/EmptyMessage.tsx | 64 - + .../refresh-components/EnabledCount.stories.tsx | 53 - + web/src/refresh-components/EnabledCount.tsx | 28 - + .../FadingEdgeContainer.stories.tsx | 45 - + web/src/refresh-components/FadingEdgeContainer.tsx | 64 - + web/src/refresh-components/FrostedDiv.stories.tsx | 61 - + web/src/refresh-components/FrostedDiv.tsx | 86 - + .../InlineExternalLink.stories.tsx | 45 - + web/src/refresh-components/Logo.tsx | 145 +- + web/src/refresh-components/Modal.stories.tsx | 179 - + web/src/refresh-components/Modal.tsx | 664 +- + web/src/refresh-components/OverflowDiv.stories.tsx | 43 - + web/src/refresh-components/OverflowDiv.tsx | 72 +- + web/src/refresh-components/Popover.stories.tsx | 88 - + web/src/refresh-components/Popover.tsx | 256 - + .../refresh-components/PreviewImage.stories.tsx | 37 - + web/src/refresh-components/PreviewImage.tsx | 21 - + web/src/refresh-components/RawModal.tsx | 63 + + .../ScrollIndicatorDiv.stories.tsx | 53 - + web/src/refresh-components/ScrollIndicatorDiv.tsx | 83 +- + web/src/refresh-components/Separator.stories.tsx | 53 - + web/src/refresh-components/Separator.tsx | 83 +- + web/src/refresh-components/ShadowDiv.stories.tsx | 55 - + web/src/refresh-components/ShadowDiv.tsx | 146 - + .../SimpleCollapsible.stories.tsx | 58 - + web/src/refresh-components/SimpleCollapsible.tsx | 255 - + .../refresh-components/SimplePopover.stories.tsx | 44 - + web/src/refresh-components/SimplePopover.tsx | 14 +- + web/src/refresh-components/SimpleTabs.stories.tsx | 72 - + web/src/refresh-components/SimpleTabs.tsx | 146 - + .../refresh-components/SimpleTooltip.stories.tsx | 49 - + web/src/refresh-components/SimpleTooltip.tsx | 68 +- + web/src/refresh-components/Spacer.stories.tsx | 54 - + web/src/refresh-components/Spacer.tsx | 26 - + web/src/refresh-components/Tabs.stories.tsx | 151 - + web/src/refresh-components/Tabs.tsx | 729 -- + .../refresh-components/TextSeparator.stories.tsx | 39 - + web/src/refresh-components/TextSeparator.tsx | 34 - + web/src/refresh-components/avatars/AgentAvatar.tsx | 55 - + .../avatars/CustomAgentAvatar.stories.tsx | 91 - + .../avatars/CustomAgentAvatar.tsx | 155 - + web/src/refresh-components/avatars/UserAvatar.tsx | 53 - + .../buttons/AttachmentButton.stories.tsx | 112 - + .../buttons/AttachmentButton.tsx | 180 +- + .../buttons/BackButton.stories.tsx | 29 - + web/src/refresh-components/buttons/BackButton.tsx | 36 - + .../refresh-components/buttons/Button.stories.tsx | 76 - + web/src/refresh-components/buttons/Button.tsx | 499 +- + .../buttons/ButtonRenaming.stories.tsx | 52 - + .../buttons/CopyIconButton.stories.tsx | 32 - + .../refresh-components/buttons/CopyIconButton.tsx | 57 +- + .../buttons/CreateButton.stories.tsx | 51 - + .../refresh-components/buttons/CreateButton.tsx | 21 +- + .../refresh-components/buttons/FilterButton.tsx | 118 + + .../buttons/IconButton.stories.tsx | 57 - + web/src/refresh-components/buttons/IconButton.tsx | 89 +- + .../buttons/LineItem.stories.tsx | 129 - + web/src/refresh-components/buttons/LineItem.tsx | 274 +- + .../buttons/SelectButton.stories.tsx | 135 - + .../refresh-components/buttons/SelectButton.tsx | 49 +- + web/src/refresh-components/buttons/SidebarTab.tsx | 127 + + .../buttons/SquareButton.stories.tsx | 52 - + .../refresh-components/buttons/SquareButton.tsx | 30 - + web/src/refresh-components/buttons/Tag.stories.tsx | 93 - + web/src/refresh-components/buttons/Tag.tsx | 110 +- + .../buttons/source-tag/SourceTag.tsx | 573 - + .../buttons/source-tag/SourceTagDetailsCard.tsx | 184 - + .../refresh-components/buttons/source-tag/index.ts | 6 - + .../buttons/source-tag/sourceTagUtils.ts | 99 - + web/src/refresh-components/cards/Card.stories.tsx | 141 - + web/src/refresh-components/cards/Card.tsx | 99 - + web/src/refresh-components/cards/index.ts | 2 - + .../commandmenu/CommandMenu.stories.tsx | 154 - + .../commandmenu/CommandMenu.test.tsx | 602 - + .../refresh-components/commandmenu/CommandMenu.tsx | 802 -- + web/src/refresh-components/commandmenu/types.ts | 151 - + .../refresh-components/contexts/AgentsContext.tsx | 204 + + .../contexts/AppSidebarContext.tsx | 87 + + .../refresh-components/contexts/ChatContext.tsx | 139 + + web/src/refresh-components/form/CheckboxField.tsx | 22 - + web/src/refresh-components/form/FieldContext.tsx | 2 - + .../refresh-components/form/FormField.stories.tsx | 89 - + web/src/refresh-components/form/FormField.tsx | 20 +- + web/src/refresh-components/form/FormikField.tsx | 2 - + .../form/FormikFields.stories.tsx | 224 - + .../form/InputDatePickerField.tsx | 31 - + .../refresh-components/form/InputSelectField.tsx | 35 - + .../refresh-components/form/InputTextAreaField.tsx | 45 - + .../form/InputTypeInElementField.tsx | 62 - + .../refresh-components/form/InputTypeInField.tsx | 47 - + web/src/refresh-components/form/Label.stories.tsx | 34 - + web/src/refresh-components/form/Label.tsx | 58 - + .../form/LabeledCheckboxField.tsx | 94 - + .../form/PasswordInputTypeInField.tsx | 37 - + web/src/refresh-components/form/SwitchField.tsx | 28 - + web/src/refresh-components/form/types.ts | 3 +- + .../formik-fields/CheckboxField.tsx | 91 + + .../formik-fields/UnlabeledCheckboxField.tsx | 28 + + .../formik-fields/UnlabeledSwitchField.tsx | 27 + + web/src/refresh-components/headers/PageHeader.tsx | 84 + + .../refresh-components/inputs/Checkbox.stories.tsx | 46 - + web/src/refresh-components/inputs/Checkbox.tsx | 6 +- + web/src/refresh-components/inputs/FieldInput.tsx | 41 + + .../inputs/InputAvatar.stories.tsx | 61 - + web/src/refresh-components/inputs/InputAvatar.tsx | 24 - + .../inputs/InputChipField.stories.tsx | 110 - + .../refresh-components/inputs/InputChipField.tsx | 160 - + .../inputs/InputComboBox/InputComboBox.stories.tsx | 144 - + .../inputs/InputComboBox/InputComboBox.test.tsx | 512 - + .../inputs/InputComboBox/InputComboBox.tsx | 141 +- + .../InputComboBox/components/ComboBoxDropdown.tsx | 55 +- + .../inputs/InputComboBox/components/OptionItem.tsx | 35 +- + .../InputComboBox/components/OptionsList.tsx | 135 +- + .../inputs/InputComboBox/hooks.ts | 24 +- + .../inputs/InputComboBox/types.ts | 9 - + .../inputs/InputComboBox/utils/aria.ts | 10 +- + .../inputs/InputDatePicker.stories.tsx | 59 - + .../refresh-components/inputs/InputDatePicker.tsx | 129 - + .../inputs/InputFile.stories.tsx | 75 - + web/src/refresh-components/inputs/InputFile.tsx | 36 +- + .../inputs/InputImage.stories.tsx | 85 - + web/src/refresh-components/inputs/InputImage.tsx | 278 - + .../inputs/InputKeyValue.stories.tsx | 122 - + .../refresh-components/inputs/InputKeyValue.tsx | 390 +- + .../inputs/InputNumber.stories.tsx | 46 - + web/src/refresh-components/inputs/InputNumber.tsx | 197 - + .../inputs/InputSearch.stories.tsx | 61 - + web/src/refresh-components/inputs/InputSearch.tsx | 70 - + .../inputs/InputSelect.stories.tsx | 128 - + web/src/refresh-components/inputs/InputSelect.tsx | 356 +- + .../inputs/InputTextArea.stories.tsx | 71 - + .../refresh-components/inputs/InputTextArea.tsx | 105 +- + .../inputs/InputTypeIn.stories.tsx | 71 - + web/src/refresh-components/inputs/InputTypeIn.tsx | 60 +- + .../inputs/ListFieldInput.stories.tsx | 77 - + .../refresh-components/inputs/ListFieldInput.tsx | 8 +- + .../inputs/PasswordInputTypeIn.stories.tsx | 87 - + .../inputs/PasswordInputTypeIn.test.ts | 53 - + .../inputs/PasswordInputTypeIn.tsx | 332 +- + .../refresh-components/inputs/ProgressSteps.tsx | 69 + + .../refresh-components/inputs/Switch.stories.tsx | 35 - + web/src/refresh-components/inputs/Switch.tsx | 42 +- + web/src/refresh-components/inputs/styles.ts | 54 +- + .../layouts/ConfirmationModalLayout.stories.tsx | 114 - + .../layouts/ConfirmationModalLayout.tsx | 61 +- + .../layouts/DefaultModalLayout.tsx | 84 + + web/src/refresh-components/layouts/PageLayout.tsx | 19 + + .../loaders/SimpleLoader.stories.tsx | 27 - + .../refresh-components/loaders/SimpleLoader.tsx | 9 +- + .../messages/FieldMessage.stories.tsx | 93 - + .../refresh-components/messages/FieldMessage.tsx | 19 +- + .../messages/InfoBlock.stories.tsx | 45 - + web/src/refresh-components/messages/InfoBlock.tsx | 49 - + .../messages/Message.stories.tsx | 136 - + web/src/refresh-components/messages/Message.tsx | 378 - + .../refresh-components/modals/MemoriesModal.tsx | 339 - + .../onboarding/OnboardingFlow.tsx | 67 + + .../components/DynamicProviderFields.tsx | 273 + + .../components/LLMConnectionFieldsBasic.tsx | 425 + + .../components/LLMConnectionFieldsCustom.tsx | 330 + + .../components/LLMConnectionFieldsWithTabs.tsx | 89 + + .../onboarding/components/LLMConnectionIcons.tsx | 24 + + .../onboarding/components/LLMConnectionModal.tsx | 391 + + .../onboarding/components/LLMFormikEffects.tsx | 153 + + .../onboarding/components/LLMProvider.tsx | 158 + + .../onboarding/components/NonAdminStep.tsx | 59 + + .../onboarding/components/OnboardingHeader.tsx | 74 + + .../onboarding/components/llmConnectionHelpers.ts | 176 + + .../onboarding/components/llmValidationSchema.ts | 135 + + .../refresh-components/onboarding/constants.tsx | 312 + + web/src/refresh-components/onboarding/reducer.ts | 88 + + .../onboarding/steps/FinalStep.tsx | 65 + + .../onboarding/steps/LLMStep.tsx | 233 + + .../onboarding/steps/NameStep.tsx | 110 + + web/src/refresh-components/onboarding/types.ts | 65 + + .../onboarding/useOnboardingState.ts | 238 + + .../popovers/ActionsPopover/ActionLineItem.tsx | 242 +- + .../popovers/ActionsPopover/MCPLineItem.tsx | 61 +- + .../popovers/ActionsPopover/SwitchList.tsx | 29 +- + .../popovers/ActionsPopover/index.tsx | 609 +- + .../popovers/FilePickerPopover.tsx | 66 +- + .../popovers/LLMPopover.test.tsx | 114 - + web/src/refresh-components/popovers/LLMPopover.tsx | 269 +- + .../popovers/ModelListContent.tsx | 200 - + .../refresh-components/popovers/ModelSelector.tsx | 231 - + web/src/refresh-components/popovers/interfaces.ts | 24 - + web/src/refresh-components/popovers/llmUtils.ts | 56 - + .../skeletons/ChatSessionSkeleton.stories.tsx | 26 - + .../skeletons/SidebarTabSkeleton.stories.tsx | 39 - + .../skeletons/SidebarTabSkeleton.tsx | 22 - + web/src/refresh-components/tabs/tabs.tsx | 60 + + .../texts/ExpandableTextDisplay.stories.tsx | 89 - + .../texts/ExpandableTextDisplay.tsx | 387 - + web/src/refresh-components/texts/Text.stories.tsx | 59 - + web/src/refresh-components/texts/Text.tsx | 26 +- + .../refresh-components/texts/Truncated.stories.tsx | 76 - + web/src/refresh-components/texts/Truncated.tsx | 27 +- + .../tiles/ButtonTile.stories.tsx | 99 - + web/src/refresh-components/tiles/ButtonTile.tsx | 77 - + .../refresh-components/tiles/FileTile.stories.tsx | 112 - + web/src/refresh-components/tiles/FileTile.tsx | 172 - + web/src/refresh-pages/AgentEditorPage.tsx | 1623 --- + web/src/refresh-pages/AgentsNavigationPage.tsx | 670 - + web/src/refresh-pages/AgentsPage.tsx | 657 + + web/src/refresh-pages/AppPage.tsx | 1055 -- + web/src/refresh-pages/SettingsPage.tsx | 1702 --- + web/src/refresh-pages/admin/AgentsPage.tsx | 32 - + .../admin/AgentsPage/AgentRowActions.tsx | 374 - + .../refresh-pages/admin/AgentsPage/AgentsTable.tsx | 210 - + .../refresh-pages/admin/AgentsPage/interfaces.ts | 17 - + web/src/refresh-pages/admin/AgentsPage/svc.ts | 69 - + .../refresh-pages/admin/ChatPreferencesPage.tsx | 1091 -- + .../admin/CodeInterpreterPage/index.tsx | 216 - + .../refresh-pages/admin/CodeInterpreterPage/svc.ts | 15 - + .../admin/GroupsPage/CreateGroupPage.tsx | 174 - + .../admin/GroupsPage/EditGroupPage.tsx | 500 - + .../refresh-pages/admin/GroupsPage/GroupCard.tsx | 79 - + .../refresh-pages/admin/GroupsPage/GroupsList.tsx | 54 - + .../SharedGroupResources/ResourceContent.tsx | 62 - + .../SharedGroupResources/ResourcePopover.tsx | 106 - + .../GroupsPage/SharedGroupResources/index.tsx | 408 - + .../GroupsPage/SharedGroupResources/interfaces.ts | 19 - + .../admin/GroupsPage/TokenLimitSection.tsx | 148 - + web/src/refresh-pages/admin/GroupsPage/index.tsx | 84 - + .../refresh-pages/admin/GroupsPage/interfaces.ts | 22 - + web/src/refresh-pages/admin/GroupsPage/shared.tsx | 107 - + web/src/refresh-pages/admin/GroupsPage/svc.ts | 292 - + .../admin/GroupsPage/useGroupMemberCandidates.ts | 147 - + web/src/refresh-pages/admin/GroupsPage/utils.ts | 55 - + .../ImageGenerationPage/ImageGenerationContent.tsx | 462 - + .../admin/ImageGenerationPage/constants.ts | 94 - + .../forms/AzureImageGenForm.tsx | 254 - + .../forms/ImageGenFormWrapper.tsx | 308 - + .../forms/OpenAIImageGenForm.tsx | 155 - + .../forms/VertexImageGenForm.tsx | 190 - + .../ImageGenerationPage/forms/getImageGenForm.tsx | 28 - + .../admin/ImageGenerationPage/forms/index.ts | 5 - + .../admin/ImageGenerationPage/forms/types.ts | 73 - + .../admin/ImageGenerationPage/index.tsx | 23 - + .../refresh-pages/admin/ImageGenerationPage/svc.ts | 275 - + .../refresh-pages/admin/LLMConfigurationPage.tsx | 451 - + .../admin/ServiceAccountsPage/ApiKeyFormModal.tsx | 175 - + .../admin/ServiceAccountsPage/index.tsx | 462 - + .../admin/ServiceAccountsPage/interfaces.ts | 17 - + .../refresh-pages/admin/ServiceAccountsPage/svc.ts | 38 - + .../admin/UsersPage/EditUserModal.tsx | 350 - + .../refresh-pages/admin/UsersPage/GroupsCell.tsx | 197 - + .../admin/UsersPage/InviteUsersModal.tsx | 192 - + .../admin/UsersPage/UserActionModals.tsx | 334 - + .../refresh-pages/admin/UsersPage/UserFilters.tsx | 306 - + .../refresh-pages/admin/UsersPage/UserRoleCell.tsx | 119 - + .../admin/UsersPage/UserRowActions.tsx | 270 - + .../refresh-pages/admin/UsersPage/UsersSummary.tsx | 178 - + .../refresh-pages/admin/UsersPage/UsersTable.tsx | 258 - + web/src/refresh-pages/admin/UsersPage/index.tsx | 108 - + .../refresh-pages/admin/UsersPage/interfaces.ts | 36 - + web/src/refresh-pages/admin/UsersPage/svc.ts | 159 - + .../refresh-pages/admin/VoiceConfigurationPage.tsx | 667 - + .../admin/WebSearchPage/WebProviderModalReducer.ts | 111 - + .../admin/WebSearchPage/WebProviderSetupModal.tsx | 265 - + .../admin/WebSearchPage/connectProviderFlow.ts | 166 - + .../admin/WebSearchPage/contentProviderUtils.ts | 204 - + .../refresh-pages/admin/WebSearchPage/index.tsx | 1422 --- + .../admin/WebSearchPage/interfaces.ts | 27 - + .../admin/WebSearchPage/searchProviderUtils.ts | 257 - + web/src/refresh-pages/admin/WebSearchPage/svc.ts | 160 - + web/src/sections/AppHealthBanner.tsx | 231 - + web/src/sections/Suggestions.tsx | 41 +- + web/src/sections/actions/ActionCard.tsx | 158 - + web/src/sections/actions/ActionCardContext.tsx | 33 - + web/src/sections/actions/ActionCardHeader.tsx | 146 - + web/src/sections/actions/Actions.tsx | 185 - + web/src/sections/actions/MCPActionCard.tsx | 364 - + web/src/sections/actions/MCPPageContent.tsx | 577 - + web/src/sections/actions/OpenApiActionCard.tsx | 225 - + web/src/sections/actions/OpenApiPageContent.tsx | 437 - + web/src/sections/actions/PerUserAuthConfig.tsx | 194 - + web/src/sections/actions/ToolItem.tsx | 262 - + web/src/sections/actions/ToolsList.tsx | 141 - + web/src/sections/actions/ToolsSection.tsx | 56 - + .../sections/actions/modals/AddMCPServerModal.tsx | 267 - + .../actions/modals/AddOpenAPIActionModal.tsx | 531 - + .../actions/modals/DisconnectEntityModal.tsx | 98 - + .../actions/modals/MCPAuthenticationModal.tsx | 658 - + .../actions/modals/OpenAPIAuthenticationModal.tsx | 688 -- + .../actions/skeleton/ActionCardSkeleton.tsx | 58 - + .../sections/actions/skeleton/ToolItemSkeleton.tsx | 51 - + web/src/sections/admin/AdminListHeader.tsx | 98 - + web/src/sections/admin/ProviderCard.tsx | 172 - + web/src/sections/cards/AgentCard.tsx | 237 - + web/src/sections/cards/DocumentSetCard.tsx | 70 - + web/src/sections/cards/FileCard.tsx | 213 - + web/src/sections/cards/README.md | 16 - + web/src/sections/chat/ChatScrollContainer.tsx | 396 - + web/src/sections/chat/ChatUI.tsx | 364 - + .../document-sidebar/ChatDocumentDisplay.tsx | 109 - + .../sections/document-sidebar/DocumentsSidebar.tsx | 235 - + web/src/sections/input/AppInputBar.tsx | 877 -- + web/src/sections/input/MicrophoneButton.tsx | 341 - + web/src/sections/input/SharedAppInputBar.tsx | 55 - + web/src/sections/knowledge/AgentKnowledgePane.tsx | 1169 -- + .../sections/knowledge/SourceHierarchyBrowser.tsx | 946 -- + web/src/sections/modals/AgentViewerModal.tsx | 434 - + web/src/sections/modals/FeedbackModal.tsx | 116 - + web/src/sections/modals/NewTenantModal.tsx | 177 - + .../modals/PreviewModal/ExceptionTraceModal.tsx | 39 - + .../modals/PreviewModal/FloatingFooter.tsx | 39 - + .../sections/modals/PreviewModal/PreviewModal.tsx | 202 - + web/src/sections/modals/PreviewModal/index.ts | 1 - + web/src/sections/modals/PreviewModal/interfaces.ts | 32 - + .../modals/PreviewModal/variants/CodePreview.tsx | 37 - + .../modals/PreviewModal/variants/codeVariant.tsx | 41 - + .../modals/PreviewModal/variants/csvVariant.tsx | 110 - + .../modals/PreviewModal/variants/dataVariant.tsx | 56 - + .../modals/PreviewModal/variants/docxVariant.tsx | 175 - + .../modals/PreviewModal/variants/imageVariant.tsx | 46 - + .../sections/modals/PreviewModal/variants/index.ts | 32 - + .../PreviewModal/variants/markdownVariant.tsx | 40 - + .../modals/PreviewModal/variants/pdfVariant.tsx | 27 - + .../modals/PreviewModal/variants/shared.tsx | 65 - + .../modals/PreviewModal/variants/textVariant.tsx | 55 - + .../PreviewModal/variants/unsupportedVariant.tsx | 29 - + web/src/sections/modals/ShareAgentModal.test.tsx | 83 - + web/src/sections/modals/ShareAgentModal.tsx | 452 - + web/src/sections/modals/ShareChatSessionModal.tsx | 251 - + .../sections/modals/llmConfig/AnthropicModal.tsx | 99 - + web/src/sections/modals/llmConfig/AzureModal.tsx | 203 - + web/src/sections/modals/llmConfig/BedrockModal.tsx | 356 - + web/src/sections/modals/llmConfig/BifrostModal.tsx | 161 - + .../sections/modals/llmConfig/CustomModal.test.tsx | 574 - + web/src/sections/modals/llmConfig/CustomModal.tsx | 449 - + .../sections/modals/llmConfig/LMStudioModal.tsx | 184 - + .../modals/llmConfig/LiteLLMProxyModal.tsx | 162 - + web/src/sections/modals/llmConfig/OllamaModal.tsx | 252 - + .../modals/llmConfig/OpenAICompatibleModal.tsx | 162 - + web/src/sections/modals/llmConfig/OpenAIModal.tsx | 99 - + .../sections/modals/llmConfig/OpenRouterModal.tsx | 162 - + .../sections/modals/llmConfig/VertexAIModal.tsx | 166 - + web/src/sections/modals/llmConfig/shared.tsx | 767 -- + web/src/sections/modals/llmConfig/svc.ts | 244 - + web/src/sections/modals/llmConfig/utils.ts | 130 - + web/src/sections/onboarding/OnboardingFlow.tsx | 88 - + .../onboarding/__tests__/onboardingReducer.test.ts | 244 - + .../onboarding/components/LLMProviderCard.tsx | 126 - + .../onboarding/components/NonAdminStep.tsx | 166 - + .../onboarding/components/OnboardingHeader.tsx | 84 - + web/src/sections/onboarding/constants.ts | 78 - + web/src/sections/onboarding/reducer.ts | 88 - + web/src/sections/onboarding/steps/FinalStep.tsx | 56 - + web/src/sections/onboarding/steps/LLMStep.tsx | 267 - + web/src/sections/onboarding/steps/NameStep.tsx | 116 - + web/src/sections/settings/Memories.tsx | 79 - + web/src/sections/sidebar/AccountPopover.tsx | 231 - + web/src/sections/sidebar/AdminSidebar.tsx | 649 +- + web/src/sections/sidebar/AgentButton.tsx | 72 +- + web/src/sections/sidebar/AppSidebar.tsx | 643 +- + web/src/sections/sidebar/ChatButton.tsx | 851 +- + web/src/sections/sidebar/ChatSearchCommandMenu.tsx | 377 - + .../sections/sidebar/CreateConnectorSidebar.tsx | 6 +- + web/src/sections/sidebar/NotificationsPopover.tsx | 159 - + web/src/sections/sidebar/ProjectFolderButton.tsx | 79 +- + web/src/sections/sidebar/Settings/Settings.tsx | 249 + + web/src/sections/sidebar/Settings/UserSettings.tsx | 893 ++ + web/src/sections/sidebar/SidebarBody.tsx | 20 +- + web/src/sections/sidebar/SidebarSection.tsx | 36 +- + web/src/sections/sidebar/SidebarWrapper.tsx | 73 +- + web/src/sections/sidebar/StepSidebarWrapper.tsx | 12 +- + .../sections/sidebar/UpsertEmbeddingSidebar.tsx | 7 +- + web/src/sections/sidebar/chatSearchUtils.ts | 83 - + web/src/sections/sidebar/constants.ts | 4 - + web/src/sections/sidebar/sidebarUtils.ts | 34 +- + .../sections/sidebar/useChatSearchOptimistic.ts | 231 - + web/src/sections/sidebar/utils.tsx | 50 + + web/src/types.ts | 29 - + web/tailwind-themes/tailwind.config.js | 88 +- + web/tailwind.config.js | 26 +- + web/tests/e2e/admin/admin_auth.setup.ts | 9 - + .../e2e/admin/admin_oauth_redirect_uri.spec.ts | 29 - + web/tests/e2e/admin/admin_pages.spec.ts | 72 - + .../code-interpreter/code_interpreter.spec.ts | 268 - + web/tests/e2e/admin/default-agent.spec.ts | 697 -- + web/tests/e2e/admin/default-assistant.spec.ts | 842 ++ + web/tests/e2e/admin/disable_default_agent.spec.ts | 255 - + .../e2e/admin/disable_default_assistant.spec.ts | 239 + + .../e2e/admin/discord-bot/admin-workflows.spec.ts | 105 - + web/tests/e2e/admin/discord-bot/bot-config.spec.ts | 147 - + .../e2e/admin/discord-bot/channel-config.spec.ts | 293 - + web/tests/e2e/admin/discord-bot/fixtures.ts | 322 - + .../e2e/admin/discord-bot/guilds-list.spec.ts | 315 - + web/tests/e2e/admin/ee_feature_redirect.spec.ts | 20 - + web/tests/e2e/admin/groups/GroupsAdminPage.ts | 252 - + web/tests/e2e/admin/groups/fixtures.ts | 37 - + web/tests/e2e/admin/groups/groups.spec.ts | 290 - + .../image-generation/disconnect-provider.spec.ts | 249 - + .../image-generation-content.spec.ts | 153 - + web/tests/e2e/admin/llm_provider_setup.spec.ts | 539 - + .../e2e/admin/oauth_config/test_tool_oauth.spec.ts | 248 +- + web/tests/e2e/admin/scim/fixtures.ts | 114 - + web/tests/e2e/admin/scim/scim.spec.ts | 81 - + .../admin/theme/appearance_theme_settings.spec.ts | 211 - + web/tests/e2e/admin/users/UsersAdminPage.ts | 324 - + web/tests/e2e/admin/users/fixtures.ts | 37 - + web/tests/e2e/admin/users/users.spec.ts | 620 - + .../e2e/admin/voice/disconnect-provider.spec.ts | 317 - + .../admin/web-search/disconnect-provider.spec.ts | 328 - + web/tests/e2e/admin/web-search/svc.ts | 100 - + .../admin/web-search/web_content_providers.spec.ts | 148 - + .../admin/web-search/web_search_providers.spec.ts | 451 - + web/tests/e2e/admin_auth.setup.ts | 9 + + web/tests/e2e/admin_oauth_redirect_uri.spec.ts | 33 + + web/tests/e2e/admin_pages.spec.ts | 54 + + web/tests/e2e/agents/create_and_edit_agent.spec.ts | 390 - + web/tests/e2e/agents/llm_provider_rbac.spec.ts | 153 - + web/tests/e2e/agents/user_file_attachment.spec.ts | 404 - + .../assistants/create_and_edit_assistant.spec.ts | 318 + + web/tests/e2e/assistants/llm_provider_rbac.spec.ts | 153 + + web/tests/e2e/auth/email_verification.spec.ts | 25 - + web/tests/e2e/auth/login.spec.ts | 90 - + web/tests/e2e/auth/password_managements.spec.ts | 25 +- + web/tests/e2e/auth/pat_management.spec.ts | 150 +- + web/tests/e2e/auth/signup.spec.ts | 169 - + web/tests/e2e/chat/actions_popover.spec.ts | 303 - + .../e2e/chat/chat-search-command-menu.spec.ts | 335 - + web/tests/e2e/chat/chat_message_rendering.spec.ts | 852 -- + web/tests/e2e/chat/chat_session_not_found.spec.ts | 54 - + web/tests/e2e/chat/current_agent.spec.ts | 97 - + web/tests/e2e/chat/current_assistant.spec.ts | 97 + + web/tests/e2e/chat/default_agent.spec.ts | 607 - + web/tests/e2e/chat/default_app_mode.spec.ts | 31 - + web/tests/e2e/chat/default_assistant.spec.ts | 503 + + web/tests/e2e/chat/file_preview_modal.spec.ts | 331 - + web/tests/e2e/chat/input_focus_retention.spec.ts | 47 - + web/tests/e2e/chat/live_agent.spec.ts | 57 - + web/tests/e2e/chat/live_assistant.spec.ts | 52 + + web/tests/e2e/chat/llm_ordering.spec.ts | 117 +- + web/tests/e2e/chat/llm_runtime_selection.spec.ts | 527 - + web/tests/e2e/chat/message_edit_regenerate.spec.ts | 127 +- + web/tests/e2e/chat/message_feedback.spec.ts | 130 - + web/tests/e2e/chat/onboarding_flow.spec.ts | 224 + + .../chat/project_files_visual_regression.spec.ts | 183 - + web/tests/e2e/chat/scroll_behavior.spec.ts | 284 - + web/tests/e2e/chat/share_chat.spec.ts | 245 - + web/tests/e2e/chat/welcome_page.spec.ts | 99 - + web/tests/e2e/chromaticSnapshots.json | 95 + + web/tests/e2e/connectors/federated_slack.spec.ts | 10 +- + .../e2e/connectors/inlineFileManagement.spec.ts | 171 - + web/tests/e2e/constants.js | 14 + + web/tests/e2e/constants.ts | 28 - + web/tests/e2e/fixtures/eeFeatures.ts | 43 - + web/tests/e2e/fixtures/llmProvider.ts | 52 - + web/tests/e2e/fixtures/three_images.docx | Bin 48578 -> 0 bytes + web/tests/e2e/global-setup.ts | 271 +- + web/tests/e2e/mcp/default-agent-mcp.spec.ts | 828 -- + web/tests/e2e/mcp/default-assistant-mcp.spec.ts | 588 + + web/tests/e2e/mcp/mcp_oauth_flow.spec.ts | 1479 +-- + web/tests/e2e/onboarding/onboarding_flow.spec.ts | 313 - + web/tests/e2e/settings/settings_pages.spec.ts | 56 - + web/tests/e2e/utils/agentUtils.ts | 112 - + web/tests/e2e/utils/assistantUtils.ts | 107 + + web/tests/e2e/utils/auth.ts | 272 +- + web/tests/e2e/utils/chatActions.ts | 125 +- + web/tests/e2e/utils/chatStream.ts | 132 - + web/tests/e2e/utils/mcpServer.ts | 58 - + web/tests/e2e/utils/onyxApiClient.ts | 764 +- + web/tests/e2e/utils/theme.ts | 18 - + web/tests/e2e/utils/tools.ts | 49 +- + web/tests/e2e/utils/visualRegression.ts | 383 - + web/tests/setup/jest.setup.ts | 45 +- + web/tests/setup/llmProviderTestUtils.ts | 14 - + web/tests/setup/mocks/README.md | 35 +- + web/tests/setup/mocks/components/UserProvider.tsx | 8 +- + web/tests/setup/multiToolTestHelpers.tsx | 100 + + web/tests/setup/test-utils.tsx | 4 +- + web/tsconfig.json | 21 +- + web/tsconfig.types.json | 20 - + web/types/assets.d.ts | 29 - + web/types/favicon-fetch.d.ts | 5 - + widget/.env.example | 6 - + widget/.gitignore | 2 - + widget/README.md | 393 - + widget/index.html | 276 - + widget/package-lock.json | 1336 -- + widget/package.json | 31 - + widget/public/logo.png | Bin 6723 -> 0 bytes + widget/src/assets/logo.ts | 3 - + widget/src/config/config.ts | 29 - + widget/src/index.ts | 19 - + widget/src/services/api-service.ts | 216 - + widget/src/services/stream-parser.ts | 244 - + widget/src/styles/colors.ts | 38 - + widget/src/styles/theme.ts | 92 - + widget/src/styles/widget-styles.ts | 636 - + widget/src/types/api-types.ts | 184 - + widget/src/types/widget-types.ts | 43 - + widget/src/utils/storage.ts | 87 - + widget/src/widget.ts | 747 -- + widget/tsconfig.json | 39 - + widget/vite.config.ts | 47 - + 4303 files changed, 158625 insertions(+), 512985 deletions(-) diff --git a/.agents/audit_logs/git_log.txt b/.agents/audit_logs/git_log.txt new file mode 100644 index 00000000000..fde776759f0 --- /dev/null +++ b/.agents/audit_logs/git_log.txt @@ -0,0 +1,215 @@ +84ec36f2327c07abe467504059b026d88938c84d|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-03-09|Prevent large batches for langfuse +79c4c6b0238caee3f14e97c7e57e0b492d3cc946|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-03-05|added tini in the image +8d3f8e1af384380d41e0a94892130b1f5340cab3|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-03-04|fixed metadata in langfuse traces when deep research is used +ad4a611a8df859c1d10176cb5da716d77be7415c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-03-04|typo +8ef9f768b1f584fbb121485a46f03e37a7ad0a65|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-02-25|fixed conflicts, updated lock file +6e88951b0bd4180960ebab7bcb273384a35b1862|Silviu|silviupanaite@users.noreply.github.com|2026-02-24|patch for wait for complete +b303e0423d6be439952ec4bbe481b02825c5df8d|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-02-20|quickfix for changing password +cf277efc4cec37d4a42025fa1baee43e63d55130|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-02-05|applied security patches +43f53ec13b0a2d90ef8be75460d7e31edf4894c5|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-02-04|fixed metadata in langfuse and feedback functionality +0f5e4443f1b3087de554541738e524b3b7a81179|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-02-02|updated for newer langfuse library +7ba9c9fe91cb0ece87df681a6a95ab186d01aab0|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2026-01-29|change name from GPT Lab to AI Hub +2fe36b8d74568bfa27a3e50b1455c8974bb40c35|Silviu|silviupanaite@users.noreply.github.com|2025-12-29|fix docfetching race condition and update helm config +60d0911c98fa63c48bbe987f199e85e9bcb082ef|Silviu|silviupanaite@users.noreply.github.com|2025-12-17|fix vespa backup image +0e548f24d1be79ea86a7fcef95232e4dd25cc1ba|Silviu|silviupanaite@users.noreply.github.com|2025-12-17|update backup jobs +1c4f91288f662ef595846d8b7564e70b8baff2b1|Silviu|silviupanaite@users.noreply.github.com|2025-12-17|update network policies +85d185c34e21c15dc5a188757ca59b5d99322ebf|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-12-12|security patch +a1ef1ec478ab5fb7fce74d9c911ceefceb72591c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-12-12|security patch +3f274b65395c9dac5eef11655c4e9fadf1db0bd7|Silviu|silviupanaite@users.noreply.github.com|2025-12-11|cache updates and helm configs +9ed1d2bb4ee4d712c1cf3024b03d82c23bb687b7|Silviu|silviupanaite@users.noreply.github.com|2025-12-11|fix merge issues +02d84bd2253de21412cdcdb89e892c7676869dda|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-12-08|fix for CVE-2025-55182 +ef922c13742ba2dc07c736b3c6f72938421ee4a6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-12-05|FIX for CVE-2025-55182 +05e9a42cb218c7ff3668abb84a3b39e367ff0ae1|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-12-05|FIX for CVE-2025-55182 +e74cb042de261dd873f93807bedae9136d932d24|Miu Razvan|miu.razvan28@gmail.com|2025-11-27|add fallback value to timeout +d7b63965890b65a7bae4b24528c8ec5d252ab505|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-26|fixed conflict +3c968b2fd444f3decb7f4506d31d35f3fb55a554|Silviu|silviupanaite@users.noreply.github.com|2025-11-25|update chart for eea deployment. +7de59d7a7858fcfb3448dbc46f152ff7797ae01a|Miu Razvan|miu.razvan28@gmail.com|2025-11-25|add comments +ea245c9b1cd8c3682de58519b45099f198ad7097|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-25|fixed connectors healthcheck +9150a8c1018aefa84e387282a32189a07b382889|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-24|fixed nginx volume +67ab9b71c03ecd4c0f5b948ec8dd7f2816e0a0ad|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-24|fixes in docker-compose.yml +96a33e3b6b5576393635b713b9ba39fdcbb308f4|Miu Razvan|miu.razvan28@gmail.com|2025-11-24|feat(citation): avoid catastrophic backtracking +6ad00f66a5e3ec1a2099b033757ce5fb033ef568|Miu Razvan|miu.razvan28@gmail.com|2025-11-24|feat(search_tool): Add full content to search tool packets +0a945d46eb270b14bec26cab472465a4a5e5fc91|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|small fix +95f44e1a81b71d482e2501e47153bdc207fdd0e6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|docker-compose +6ba660c310b61697da7acd4c47fc8eba4ee54d7d|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|replaced onyx logo +8753631336ec9505069ed87fb700add3437a1a14|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|added customizable pages to user popover +c26ce64b7be07b6fe21e0b0af5d3c7dd128e1a78|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|fix admin for custom pages +995cc5a1b90b17ab54e7e600e8323e2daaf1fe31|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|fixed sort on connectors +76b5cc276cba681a82d06d7861c6a842c1b9d1bc|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|fixed logo on auth pages +c1ba5b42766c7549f4f9e3c010193db3ff78263c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|fixed login form +d95ee7f484e8aae01a5ad44c8b652a94ce2ab213|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|fixed signup form +9b1b67b6ec42cb9ef119b94553f220cd80bff92a|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-19|wip sync +72beee3e1f4782d79d1d3c5e94c53f213d8c42d0|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-18|fixed entrypoint +a48c5275dc7659244effdf8bfe6f289e699e2e3f|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-18|added .env.example +b89157b4801078fbf6a8c092b51bb1fee4c5fb6d|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-11-18|added docker-compose for local development +7794a8977abdb24d660e75fc29b2b7e4cde63ef2|Justin Tahara|105671973+justin-tahara@users.noreply.github.com|2025-11-10|fix(embedding): Fix Deletion of Same Name (#6149) +802420427d91a557994496ba95fd645f3a2f4080|Justin Tahara|105671973+justin-tahara@users.noreply.github.com|2025-11-10|fix(gpt-5): Catch all (#6162) +e143c9558e3e129e9c7ee2fd0881eef6e757bda9|Chris Weaver|chris@onyx.app|2025-11-10|fix: improve /llm/provider performance (#6158) +1f7b8446fcfaf2e4bd92146e1c2b3a62fad0b18a|Chris Weaver|chris@onyx.app|2025-11-10|fix: infinite render on embedding model page (#6144) +aa2ba3bc97cf97b20d001c356b12bda28bd23331|Miu Razvan|miu.razvan28@gmail.com|2025-10-24|feat(pdf): use pdf metadata title as semantic identifier +0a31435fcfb4a6d8a53c8c5db376b39d6267e619|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-10-22|Fix for connectors healthcheck +e66600bfcdd9becdf35269f11d6f201ddb696f1f|Miu Razvan|miu.razvan28@gmail.com|2025-10-21|clean up +435d1c49ca15dd39e8e2301b512bafced5bc77ef|Miu Razvan|miu.razvan28@gmail.com|2025-10-21|fix(chat): prevent streaming hang by bounding possible-citation regex scan +f9980b665a4342fb5bc9ce1782c4ac908cce24ac|Miu Razvan|miu.razvan28@gmail.com|2025-10-21|fix(web): stabilize sitemap filtering + config handling +c9368712cc8135a2f03dfa506d82450ce32f3146|Miu Razvan|miu.razvan28@gmail.com|2025-10-20|clean up +e5fc621dca68d279c553dc084bbb7ac0ced8213c|Miu Razvan|miu.razvan28@gmail.com|2025-10-20|clean up +9234cb26c4c59622032061bd4df0d3558e59dc3b|Miu Razvan|miu.razvan28@gmail.com|2025-10-17|feat(web-connector): optimize sitemap indexing with timestamp-based filtering +e7a3561b3044ef01395ebb7d04e24d6683c72586|Miu Razvan|miu.razvan28@gmail.com|2025-10-17|fix: Adapt read_protected_sitemap to return the lastmod value +6e5a12050dc37e8a92fb8333404a81c87c1bac53|Miu Razvan|miu.razvan28@gmail.com|2025-10-16|feat: Utilize lastmod from sitemap.xml in web connector +6e0ded026566aede0ae1b7fabe1749ce67b19f02|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-10-16|don't throw an exception when a github user has no name or email address +b3d194f5e956572a1d1ad08b3799a28ffe1d1693|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-10-14|added timeout, so requests.head don't get stalled +81f1893bb135166a31e94aca92fa8a6728d3417c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-26|fix the names of indexed pdf files +325a63ec1ff5f978d7580e46e4c9d0f4e5b1e4d6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-25|Replace special brackets used for citations +79d4a2a2fe8d57b368f20a0d50782a976ad240b1|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-24|allow indexing of text files +fb35ada65c610490e88ffa75769c0ba4fc22363a|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-03|custom fix for chatting with 'my documents' +1ec557347015005fbc6cf17c47d7a340f038bc93|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-02|added option to reindex a user file (only for admin users) +a7319ffec7fdaf6a1452f2112976bd7f98a7f7e1|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-09-02|add the assistant to metadata +1c72086495080f129aed190515513910076008dc|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-27|better use of compressed sitemaps +cee184dbe972e713d8ce870371471d38b9c98ef4|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-26|set the resource limits from an env +84fed4077207835ff1255474b1e09d9052b15e87|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-26|increase resource-limits for vespa +8475eeed8e63dd3eedef8f100540842c708b656e|Miu Razvan|miu.razvan28@gmail.com|2025-08-19|Add timeout option +dcd639b6b5935f9e9089a7573966c2a84dbf1470|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-19|remove special characters in filenames +5dc48af545e064335cb66ca2cd41ba9e3c6fb7b5|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-13|small fix on headless chrome flags +cb65faf1dba57c78ff136891b7d90b8445b8dc65|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-13|fix +3a47e3b2402d00a106b24b9e15ada051e59bd1f3|Evan Lohn|evan@danswer.ai|2025-08-11|fix: max tokens param (#5174) +cfe8cdb136f08f229ed68d16d922e01d80c4b668|Wenxi|wenxi@onyx.app|2025-08-07|fix: sanitize slack payload before logging (#5167) +773acc818a2aca3654f51ead605266f57265eb78|Wenxi Onyx|wenxi@onyx.app|2025-08-06|mask llm api key from logs +1f1fa5e8696fb63ba15737f38d17bab1b9ad1be0|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-11|Fixed indexing of protected pdf files +77d87a0159a9ce12e85e266b018de1113f00d530|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-08-11|fixed sync +b6df06e451bcf446eeb5ce3bdb3830ffb853c9fe|Wenxi|wenxi@onyx.app|2025-08-08|add gpt 5 display names (#5175) +037d0cae006f30dd5a80ebfbd19b82d8c80430c5|Wenxi|wenxi@onyx.app|2025-08-07|feat: support gpt5 models (#5169) +83e7982cad61b0f579f297624a8c6903e832aab4|Miu Razvan|miu.razvan28@gmail.com|2025-07-30|clean up +2f89c171b3cd3778c90c9ebd26649c850ad7b811|Miu Razvan|miu.razvan28@gmail.com|2025-07-30|Remove unnecessary resources requests +71785057ebfc33b7d04b1825ab8a7aca4f593350|Miu Razvan|miu.razvan28@gmail.com|2025-07-24|move remove_by_selector in an utility function +236810bfcfb63afa3b9e1ed309134ff462137af0|Miu Razvan|miu.razvan28@gmail.com|2025-07-24|Improve logic for remove_by_selector +53052cda924d2d44fddcdb278ea2c0e8e2e87850|Miu Razvan|miu.razvan28@gmail.com|2025-07-24|Implement remove_by_selector to exclude elements when scraping +89effced23ed7cd610e8780cef780ced9210d195|Tiberiu Ichim|tiberiu.ichim@gmail.com|2025-07-11|Refs #289898; fix celery beat process identification +c0885914e4fe8cfdc8be11070b46bd0cde09f329|Tiberiu Ichim|tiberiu.ichim@gmail.com|2025-07-10|Refs #289847; Compatibility with later version +4636cacaa85b958f82144a715f5dd9b7ba6cffdf|Tiberiu Ichim|tiberiu.ichim@gmail.com|2025-07-10|Fix connector state crash +fc5f0a86c4859a73a90cb74d72040e8d7ee62feb|Tiberiu Ichim|tiberiu.ichim@gmail.com|2025-07-09|Add code deleted by mistake +a328c0c6b7e24bcacfd41ec35c66574ac24fb000|Tiberiu Ichim|tiberiu.ichim@gmail.com|2025-07-08|Don't return a string when there's no exception +459a24218a5237cea0e32f92fdea35c81a8ab017|Tiberiu Ichim|tiberiu.ichim@gmail.com|2025-07-08|Disable some tasks +f7dfd4df9f064912c3c0dc5935c8a27fd300c122|Tiberiu Ichim|tiberiu.ichim@gmail.com|2025-07-07|Add override for tasks +7ff8122c9d791b37e014d366e3c5b1f846429866|Tiberiu Ichim|tiberiu.ichim@gmail.com|2025-07-04|Fix login issue in connector +8ba655dae970d97d45e34c79a6a46cbdf7ef81d2|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-07-02|added back missing configuration pages +c75079136bef26dd9bb3c2059e4001be27d471d4|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-07-01|added option to crawl unpublished documents +534f2b042bfcaafaa4963ef7da54637161c68fc8|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-30|in case we use api_keys, we should pass the keys name as metadata to litellm +22cd00f1502da8a06250b2c60862005cefd64453|valentinab25|30239069+valentinab25@users.noreply.github.com|2025-06-20|chore: [JENKINS] run all 3 builds at the same time +5ddb4cac6660f26c24cdb83ca1a23cc13ae9c4b8|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-20|don't try to download chromium-linux.zip +8d3a0887fdf358b6a87010e76b90092283822927|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-19|added missing file +99cbf16b109fda256d80cfd3fde140f76d6e6522|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-19|temporary fix, avoid downloading ffmpeg-linux +189ead001990b500c0f5c47ac03ecbec216bd9f5|valentinab25|30239069+valentinab25@users.noreply.github.com|2025-06-18|chore: [JENKINS] start with backend +c1aaf6b6fa1f7922c74220c3e8b558d4a0eb7c6e|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-18|small fixes +8e807ebfc9cf2264fb8c1d5c02ddf5fecaacc039|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-06-18|small fix +71712df3202bb6a31d20756cbcaf972b8bfac09e|Evan Lohn|evan@danswer.ai|2025-05-30|jira daylight savings handling (#4797) +a2fd123e0a04961bbfa6ffe2f52146dd28a341e1|valentinab25|30239069+valentinab25@users.noreply.github.com|2025-06-02|use 3 different tag variables +770f3fac6994e719b1471d77d89a09cd192764c6|valentinab25|30239069+valentinab25@users.noreply.github.com|2025-05-30|add argument to docker build +1041727a6c4db419073ca959a6eab3f391a1fe1b|valentinab25|30239069+valentinab25@users.noreply.github.com|2025-05-30|remove unused code +76c54fd5917ccca5746ca9ab556ae8e89c197011|valentinab25|30239069+valentinab25@users.noreply.github.com|2025-05-30|fix cd command +80f5887a71d1acc77f48882bd87ded9f6832e0c5|valentinab25|30239069+valentinab25@users.noreply.github.com|2025-05-30|run on commit to eea +99abef5738b60cc028da46fc58bb0aeabe7fb092|valentinab25|30239069+valentinab25@users.noreply.github.com|2025-05-30|fix \ +e8331a66701c972a89be338434b5e447fe2aee8a|valentinab25|30239069+valentinab25@users.noreply.github.com|2025-05-29|add build on branch eea +5c9a44b0ee10c8b10603061630cf7fbc918e3022|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-05-28|updated jenkinsfile +090985cc3001ae1da46951b7fc044c340c2ad79d|valentinab25|30239069+valentinab25@users.noreply.github.com|2025-05-28|Create Jenkinsfile +1189a64c3a1e0c5c0ade50bb991368fcfccc0f43|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-05-12|added guardrails to onyx +7f1fa5c208889b51f7632508e383cc57bd54c664|Chris Weaver|25087905+Weves@users.noreply.github.com|2025-05-06|Non default schema fix (#4667) +84643bc0b30fbdc3658f50dbd97928749a1e15b2|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-05-06|updated llm metadata +a9d2b7aae0a8352443c9a566c1fff7a4e1961973|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-17|don't load 3rd party resources +62a493590f4539246c706cadbee2855595b714f6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-17|added privacy statement in user dropdown menu +dfd19cfe127a69c2d4d231f4a0ec0a64393b1200|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-17|pages created in onyx admin should not be restricted +e4d44dd07772a5ddbc2448d414fbc6971c3bda9c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-09|Refs remove debug code +da7a4be39116a709e9fab4713dee141961f752f6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-09|Updated onyx emails +6c010f82fc8725021fae54fed64b1302e3343ad7|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-09|added missing dependency +15d51857fd2db8d4b035a6d7e6d377511c425f6b|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-08|sync feedback with langfuse +bdc09551a69f177cc253efe78b877410ba6e17a1|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-04-02|configure the metadata so we have nice traces in langfuse +14679af511f97267969f8f6828c9d7460053e16d|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-03-27|updated pdf indexing +46f68844119cef7e126fce5b5a5e34426c43611b|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-03-27|fixed pdf indexing +616d35a192965a46a0a269e8e063aa622354cb21|Weves|chrisweaver101@gmail.com|2025-03-14|Fix basic auth for non-ee +0888bc69d54ef93068f00def6312d60dced61609|rkuo-danswer|rkuo@danswer.ai|2025-03-06|Fix model server build (#4217) +f2aed2d64f70c991fd39fb8063f302e82df293cb|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-14|customization for eea +199a9944bfecdb9d5a985b6bee63dc8612f0d103|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-10|changed the way how we stop playwright if there was an exception; related to: https://github.com/microsoft/playwright-python/issues/2238 +fa04e34375eb5ef6b5260f321327fd43c3be265c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-07|added timeout for playwright +cd9ffb0e8d3d38c5b326b83f699648444f759bcd|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-06|updated playwright, how to scrape pages +529f3e5e7e503fb942b4c7c7fe7ceb667177d380|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-06|get the sitemap even if the ssl certificate is expired +0a4e36354b8a6ce1edaa7a1e7ec116422396f900|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-06|Don't pause the failed connectors +f8696402278b00d4cd26c7e8eae3346af0c44524|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-06|updated connectors healthcheck +ab5e4cd25d4dc33da0edcfd568ce85602c5e070f|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2025-02-06|if no urls found in sitemap, fallback to ultimate sitemap parser +a52ea18ca0e82a69c48da201a020f51420290da3|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-12-31|connectors healthcheck should only fail if there are 2 consecutive failed indexing attempts for a connector +1916b6b277e08420a21bdccf7b90104b333839ad|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-12-27|temporary fix for default prompt_id +4d63cb69911d89ad99aa6317f06ddce239caf065|Richard Kuo (Danswer)|rkuo@onyx.app|2024-12-17|try backporting workflows - may not work +7de3534212ec3873d14440c68c24415bcf32bd10|Richard Kuo|rkuo@rkuo.com|2024-12-11|cherry pick handleRequest fix +c77790fb47b4be7a23a6653aa559b85dc237771d|Chris Weaver|25087905+Weves@users.noreply.github.com|2024-12-08|Fix Confluence perm sync for cloud users (#3374) +a5759506637cb1d7d64a11d2d9319046a11e25ca|Chris Weaver|25087905+Weves@users.noreply.github.com|2024-12-04|Improve chat page performance (#3347) +419e08875fdcaf0626dbc5e738437aa538e5724c|Chris Weaver|25087905+Weves@users.noreply.github.com|2024-11-29|Fix assistant prompt zero-ing (#3293) +d9a06aab331189be881511e6a09768971763b91d|Chris Weaver|25087905+Weves@users.noreply.github.com|2024-12-02|Update openai version in model server (#3306) +d15865daa462e868d4b8101f69ae2be9f611809a|hagen-danswer|hagen@danswer.ai|2024-11-28|increased the pagination limit for confluence spaces (#3288) +33eadbc0a2bb4b391077857737f312fd602e8dbc|Richard Kuo|rkuo@rkuo.com|2024-11-27|backport alembic revision +aa05c711f5815a622fbab9bdcc023ccb4a0d94da|Richard Kuo|rkuo@rkuo.com|2024-11-27|Revert "backport alembic revision" +5460a9340ae6f93964b7eaf6fbc9d3aa7792b748|Richard Kuo|rkuo@rkuo.com|2024-11-27|backport alembic revision +e59acb207715dbc56c14093f2086e2ff7123f174|Richard Kuo|rkuo@rkuo.com|2024-11-27|remove unused import +b874171e4ca2ca03958837641edc21dd058d80e5|rkuo-danswer|rkuo@danswer.ai|2024-11-27|use indexing flag in db for manually triggering indexing (#3264) +91a31c631d7cb922d54d2a5d55c2e242e8c559dd|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-25|fallback if we can't figure out the encoding from the model name +c7001732f5d15094e5f68ea3d0e2dfb69a0f7b70|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-25|added What's new page +322d7cdc90484546048276e103c931676678a428|hagen-danswer|hagen@danswer.ai|2024-11-20|brought the timeout changes too +67d943da119a33515909307e1d49634ef88c4abf|hagen-danswer|hagen@danswer.ai|2024-11-20|added logging and bugfixing to conf (#3167) +ae8bb7426306af977330400dadcfaa011a174d0c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-20|ignore the errors that caused by a restart +35581db8ffc5c4c6072c872519bef19a3f593533|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-19|added healthcheck for connectors +cc3c0800f0af40b1ae890169c14dcb41c31d31e0|Richard Kuo (Danswer)|rkuo@danswer.ai|2024-11-18|no idea how those files got into the merge +e860f15b640ac8f97ae783f99c28f76a3003a291|Richard Kuo (Danswer)|rkuo@danswer.ai|2024-11-18|hotfix merge +9e391495c2fd879dcff1984dcd4876dfcd2d4d53|Richard Kuo|rkuo@rkuo.com|2024-11-16|fix unused stuff for hotfix +e26d5430fac6a1f3dac486a769ccdedeabaae7e7|Richard Kuo|rkuo@rkuo.com|2024-11-16|merge overlapping connector hotfix +fd2428d97f31c7c742d376f100cf235692be3365|rkuo-danswer|rkuo@danswer.ai|2024-11-13|Merge pull request #3131 from danswer-ai/bugfix/session_text +cfc46812c81a115a6a862c1d1743ded7a3a52813|rkuo-danswer|rkuo@danswer.ai|2024-11-13|scale indexing sql pool based on concurrency (#3130) +4e4c18401ed41ca97718b9127574d440a94cc720|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-12|fix typo on history sidebar +6e37321786e6c4639d9fdf65adb70dca5d2bf776|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-11-12|small fix on auth page +d0e018a3faa10dc0137c0cad3c28263d8b296865|rkuo-danswer|rkuo@danswer.ai|2024-10-29|init sqlalchemy in child process (#2987) +ee5e085c8197d0a3f335c256748c648cac8fbf09|hagen-danswer|hagen@danswer.ai|2024-10-29|fixed label filter (#2978) +f0adc03de309c9549272043b33ac2bdcf2c1f510|Richard Kuo|rkuo@rkuo.com|2024-10-28|backport structured json fix +c07a10440bf462c943b26dd462b0d981a179c9dd|Richard Kuo (Danswer)|rkuo@danswer.ai|2024-10-28|add missing scard operation +ca4b230f67ea9fb3cc92b1da2eaf12060439ec5b|pablodanswer|pablo@danswer.ai|2024-10-28|add srem and sadd to tenant wrapper (#2973) +4479bdceab4d1740ad6f4e9853f9881c6d43b106|Yuhong Sun|yuhongsun96@gmail.com|2024-10-27|Backport Test 7 (#2971) +e23a37e3f19e34532a4ccbced76e8c33c6351cfe|Yuhong Sun|yuhongsun96@gmail.com|2024-10-27|Backport Test 5 (#2969) +eadd87363d84478f518c112a6fb713335a8485e9|Yuhong Sun|yuhongsun96@gmail.com|2024-10-27|Backport Test 4 (#2968) +91d9414ada169e41a5027cc5044e98eeb02a795e|Yuhong Sun|yuhongsun96@gmail.com|2024-10-27|Backport Test (#2958) +39a485b777f6e31afd87329e9f34f02880074863|Yuhong Sun|yuhongsun96@gmail.com|2024-10-27|Backport Test (#2957) +35e4ba7f99ba80db84eba6d628fd563274b850c3|Yuhong Sun|yuhongsun96@gmail.com|2024-10-27|Harmless Backport Test (#2950) +302d28f1e819707dbf697c02d347919d0117eaf0|Yuhong Sun|yuhongsun96@gmail.com|2024-10-26|Backport Test Final (#2942) +7e8e89359d281c01c960362a09b8892b04f75268|Yuhong Sun|yuhongsun96@gmail.com|2024-10-26|Backport Test (#2940) +e9ae89b4bc84139a54960bdb4ead6f0912660732|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-09-16|fixed upgrade step +5876ed728a1149aab24768048f0b875a38b6dbb4|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-09-02|remove unnecessary retry +4e28bf09cb2e79e5bbfbe61a933ec8890af7d582|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-08-28|updated special case when forcing MAX TOKENS for Meta-Llama-3.1 +199b3430307889b7a0631554c3059b8a9443566c|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-07-31|added missing file +b658f5c54c1db4d98d89ab79cfc54ec33b17e082|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-07-18|updated to libgnutls30=3.7.9-2+deb12u3 +93efe2affceaf1f0c363eaaf456e077837717148|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-07-18|fixed typo +51c0dc62d77925f10834a541d2a1cf4b2e959dac|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-07-18|workaround for connector deletion +dc3ddeb9739d4879326dedc664047becf177fa11|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-06-19|workaround for not reachable indexing_model_server using tenacity +810429cd15b60f575d26f1e92f03bfd02b4080bb|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-06-19|updated dockerfile for backend +49c4b53cc1730820ca1a4548f0386c3ea815681a|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-06-10|updated disclaimer modal +921689a11e693a490a92b07afc73ddc768bafc53|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-06-10|updated the way the disclaimer is displayed +c1835a4af7fe78af7ba042a102e81b1a5dbb4af4|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-30|changed the way the eea custom settings are fetched in the web app +acdead91861d10925019091bac83665c33c69a8b|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-29|Try to find the sitemap for a given site +3dd2c77b75fd6de667d697462c2294624846bc95|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-23|small fix for pages admin +c363708e2afc9722246cab67a20c20ead6f0a36a|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-23|updated logo and title +836e3c3dfcc5de77a04c050099bb5da82cbdeacd|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-22|added configuration options for footer, and the possibility to create pages +cb86eba994763c50ba03175522dee74909d95354|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-08|use a state for checking if userGroups is loading +d2ec8d52800fd0baa572bd65ec91108706477b5f|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-05-08|Only try to get the userGroups if EE is enabled +ad369a6db583c5f4cef212c39256605470732037|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-24|added new options for date filter +23688f512e32623751052bac99640f930726ed41|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-24|alphabetically sort knowledge sets +1409f2ce44a32649c648344061f55c7217013498|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-24|updated how the models are shown for assistants +206c9c4237b215baf5616b752aa2e3daac6529ac|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-24|show the actual default model for personas +babac3daddd420818c9b848c2e518a3a7b281913|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-10|pessimistic disconnect handling +c61780c483fa3a3f0e14e1fe1f34b9f543ee5790|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|updated style +83e33d7efcbece93790c37138f4130c6eb6a0832|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|added tooltips for personas +9c6a5741f1c90859692cd0399e1cf303cf8d9607|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|added new option in admin +eb460341d53126d53cc75db1640f38b19e0c9943|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|updated disclaimer modal +4b42a026497b00f17626c116d5383b1fbb213a55|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|updated header, footer, login, signup +d19b3cc8ca88c1c91d2db42295f2d1bb6866f7ec|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|added admin page for disclaimer configuration +f49349d372928339d9ad1186f7c665b3baf6c626|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-04-05|added backend for new configuration option for disclaimer +715e1f3722ec07ea7472b92fe8096b28c5691c69|Matthieu Boret|matthieu.boret@fr.clara.net|2024-03-28|Update sharepoint connector behavior +2824a873e1dac7c3b540cf2a9f49af6d89526b3e|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-26|show modal when user logs in +65fbca40ae9983b8d5a6b3c3d064907856aa98cc|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-26|added disclaimer as modal, when user logs in +732d6658ab799a7d9d3f6c133bf8b8aa53c5ddfc|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-20|layout fixes +d2c33446a0a248923916bbd2e85ce4593e555da6|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-14|layout fix for search page +bcdaf71c5b2dcb973414f30cb7598405ed726680|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-13|customizations for logo, header, footer, login & signup page +16da6cf9b302a846cc4aa4421ac2638fe5a90313|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-12|fixed condition +dccd98884ef69a34dd4bb9fbff0cfcae2caea0db|Zoltan Szabo|zoltan.szabo@eaudeweb.ro|2024-03-12|don't try to authenticate in case SMTP_USER & SMTP_PASS are not set \ No newline at end of file diff --git a/.agents/skills/customization-audit/SKILL.md b/.agents/skills/customization-audit/SKILL.md new file mode 100644 index 00000000000..d0dac54513e --- /dev/null +++ b/.agents/skills/customization-audit/SKILL.md @@ -0,0 +1,22 @@ +--- +name: customization-audit +description: Generates a mapping of fork customizations with explicit re-implementation instructions. +--- + +# Customization Audit Workflow +1. **Tag Parsing**: Extract `{upstream_tag}` from `{current_tag}`. +2. **Data Extraction**: Capture full `git log` and `git diff` into `.agents/audit_logs/`. +3. **Intent & Logic Analysis**: + - For every major change, **Claude 4.6 Sonnet** must write a "Functional Spec." + - **Spec format**: + - *Goal*: What does this change achieve? + - *Logic*: What is the specific algorithm or condition? + - *Dependencies*: Which other custom or upstream files does this rely on? + - **Crucial Feature Check**: Specifically verify the presence and logic of the "Customize Layout" admin panel section, ensuring both its source code and the admin menu item are fully documented. +4. **Output Generation**: + - Create `customization_map.md`. + - **Section IV: Re-implementation Guide**: Write a step-by-step technical instruction for *re-creating* the feature if the original files are missing or heavily refactored in the new upstream. + +# Technical Guardrails +- Identify and flag "Sticky Logic": Code that must remain identical regardless of upstream changes (e.g., proprietary encryption or specific API keys). +- Track author names for each spec to allow the agent to say "This was [Author]'s logic for X." \ No newline at end of file diff --git a/.agents/skills/smart-sync/SKILL.md b/.agents/skills/smart-sync/SKILL.md new file mode 100644 index 00000000000..5a6a1b0a4a7 --- /dev/null +++ b/.agents/skills/smart-sync/SKILL.md @@ -0,0 +1,110 @@ +--- +name: smart-sync +description: Automates git merging from upstream, preserving custom fork logic and resolving refactors. +--- + +# Smart Sync Skill + +## Context +We maintain a fork with specific customizations. Upstream merges often conflict due to simple refactors or logic changes. + +## Instructions +When the user asks to "sync with upstream" or "run smart-sync": +1. **Analyze Delta**: Identify our unique customizations vs. the upstream source. +2. **Execute Merge**: Run `git fetch upstream` and `git merge upstream/main`. +3. **Resolve Conflicts**: + - **Simple conflicts**: Auto-resolve if it's just formatting or trivial logic. + - **Refactors**: If code moved to another file, find the new location and re-apply our changes there. + - **Logic Changes**: If upstream changed the core logic, attempt to wrap our customization around the new logic. +4. **Safety Rail**: If a conflict changes the fundamental architectural intent, STOP and ask the user for a "Logic Review." +5. **Verify**: After merging, run `npm test` (or your specific test command) to ensure the build isn't broken. + +## Advanced Conflict Resolution +When a file is moved or a component is refactored: +1. **Trace Symbol Movement**: If a component (e.g., `MyButton`) is missing in the original file, use `grep` or the IDE's symbol search to find its new location in the `upstream` tag. +2. **Import Re-mapping**: After moving our custom code to a new upstream file, automatically run a "Lint & Fix" pass to update relative import paths. +3. **Ghost Conflict Detection**: Even if Git says "No Conflict," check if an upstream file we depend on was renamed. If so, update our local references to match. +4. **TSX Specifics**: For React/Next.js files, prioritize keeping our "Props" definitions even if the component body was refactored by upstream. + +## Feature-Specific Rules: Langfuse & LiteLLM +We have a critical customization that adds metadata to all `litellm` calls for Langfuse tracing. + +1. **Identify Call Sites**: Search for all instances of `completion(`, `litellm.completion(`, or `get_llm_callback`. +2. **Inject Metadata**: Ensure every call includes a `metadata` parameter with the following keys if they are missing: + - `generation_name`: Should match the feature calling it (e.g., "deep_research" or "standard_query"). + - `trace_id` / `tags`: Ensure our Langfuse environment tags are preserved. +3. **Deep Research Special Case**: In the "Deep Research" module (likely under `danswer/tools/search` or similar), ensure the recursive/agentic calls pass through the `metadata` dictionary to all child spans. +4. **Validation**: If a merge removes a `metadata` argument from a LiteLLM call, flag this as a "Logic Violation" and re-apply our implementation from commits `bdc0955` and `8d3f8e1`. +5. **Onyx Tracing Processor (Deep Research)**: + - **Target File**: `danswer/backend/onyx/tracing/langfuse_tracing_processor.py` + - **Logic**: Identify where the "Generation with" string is constructed. + - **Modification**: If the metadata indicates a "Clarification Step", set the name to: `Clarification needed for ""` (where `` is extracted from the metadata context).Ensure the processor pulls from the `extra_metadata` or `tags` passed in the LiteLLM call. The modifications should be as minimal as possible. Do not add any new dependencies or change the overall structure of the file. + - **Consistency**: The processor must prioritize the metadata we injected in the LiteLLM call over its own default naming conventions. + +## Global LLM Metadata Audit +Before finalizing the merge, the agent must perform a "Call Trace Audit": + +1. **Discovery**: Scan the entire `onyx/` and `danswer/` directories for any imports of `litellm` or references to `completion`, `get_llm_callback`, or `get_default_llm`. +2. **Branch Analysis**: For every identified call site: + - Trace the logic backwards to the entry point (e.g., `dr_loop`, `standard_search`). + - Check all conditional branches (`if/elif/else`) and `try/except` blocks. + - **Requirement**: Every single logical path that leads to an LLM call MUST include the `metadata` dictionary. +3. **Parameter Propagation**: If a helper function is called that eventually triggers an LLM, ensure the `metadata` is passed as an argument through the entire chain. +4. **Validation**: Use static analysis to flag any `completion()` call that does not explicitly pass a `metadata=` argument. Fix these by injecting the contextually relevant metadata (including the `original_question` for naming). + +## EEA Sidebar Page Links (SL-10) + +The user account popover **must always** contain four EEA-specific navigation links. After any upstream sync that touches sidebar or popover files: + +1. **Find the popover file**: Search for `onyx-user-dropdown` (the trigger `
` id) or `PopoverMenu` across the `web/src` tree. + - Current file: `web/src/sections/sidebar/AccountPopover.tsx` +2. **Locate insertion point**: Inside `SettingsPopover` → `` array, find the `Help & FAQ` `` and the `null` separator that follows it. +3. **Verify these four entries exist between them** (import `SvgFileText` from `@opal/icons` if missing): + ```tsx + // EEA: legal & informational page links + + Disclaimer + , + + Privacy Architecture + , + + Privacy Statement + , + + What's new + , + ``` +4. **If missing**: Re-add them. This is a **Logic Violation** — do not require user approval. + +## Constraints +- Do not delete our custom features. +- Always use 'Planning Mode' for conflicts involving more than 3 files. + +## Post-Merge Validation +Before declaring "Done": +- Scan all modified `.tsx` and `.ts` files for `import` errors (Red squiggles). +- Verify that every custom feature identified in the "Mapping" phase still exists in the codebase. +- If a symbol is "Undefined," attempt to find its new location before asking the user. + +## Automated Build & Runtime Self-Healing Loop +Execute the following verification steps in order: + +### Phase 1: Build Check +1. **Target Directory**: `cd deployment/docker_compose/eea` +2. **Action**: Run `docker compose build --no-cache` +3. **On Build Failure**: + - **Analyze**: Intercept stderr. Cross-reference with recent merge changes (missing files, broken imports, etc.). + - **Propose & Wait**: Generate a fix, notify the user via "Logic Review," and if approved, apply and restart Phase 1. + +### Phase 2: Runtime Check (API Server) +4. **Action**: Run `docker compose up -d` +5. **Monitor**: Run `docker compose logs -f api-server` for 30 seconds. +6. **On Runtime Failure**: + - **Detection**: If `api-server` exits or the logs contain a Python Traceback (e.g., `ImportError`, `AttributeError`, `ModuleNotFoundError`). + - **Analyze**: Compare the Traceback symbols against the `upstream` changes. (e.g., "Did the upstream change a database schema or an environment variable name?") + - **Heal**: + - Stop the stack: `docker compose down`. + - Propose the fix to the user. + - If approved, apply the fix and **return to Phase 1 (Step 2)** to ensure the fix doesn't break the build. +7. **On Success**: Once logs show "Application startup complete" or no errors for 30s, notify user: "Build & Runtime Successful. Sync Complete." \ No newline at end of file diff --git a/.agents/skills/sync-and-fix/SKILL.md b/.agents/skills/sync-and-fix/SKILL.md new file mode 100644 index 00000000000..7c80f9f75c9 --- /dev/null +++ b/.agents/skills/sync-and-fix/SKILL.md @@ -0,0 +1,31 @@ +--- +name: sync-and-fix +description: Merges a target upstream tag, resolves conflicts using the customization_map, and stabilizes the Docker stack. +--- + +# Sync & Fix Workflow +When this skill is invoked with a `{target_upstream_tag}`: + +1. **The Merge**: + - `git fetch upstream` + - Attempt `git merge {target_upstream_tag}`. + - If conflicts occur, refer to `customization_map.md` to determine which version (ours vs. upstream) preserves the "Intent." + +2. **The Refactor Check**: + - For every "Intent" in the map, verify the logic still exists in the code. + - If files were moved/renamed in the upstream, use the "Re-implementation Guide" from the map to restore the feature. + - **Missing UI Elements**: Pay special attention to the "Customize Layout" admin panel feature. If its source code is in place but missing from the UI, ensure its corresponding menu item is restored and properly wired into the updated admin sidebar/navigation. + - **Langfuse EEA Tracing**: Ensure `eea_set_turn_output` receives the `assistant_message` object, that `chat_session_id` in metadata combines `{session_id}:{assistant_message.id}`, and that `backend/onyx/tracing/langfuse_tracing_processor.py` continues to extract and propagate `user_id` from the span metadata. + +3. **The Docker Fix-Loop**: + - Run `docker compose build`. + - **On Failure**: Feed the build logs back to the agent. Fix the code/dependencies and retry. + - Run `docker compose up -d`. + - **On Failure**: Check container logs for runtime errors (Python imports, React build errors). Fix and retry. + +4. **Tagging**: + - Once the stack is healthy and tests pass, create a new fork tag: `{target_upstream_tag}-eea.{new_version}`. + +# Technical Guardrails +- Always prioritize the `customization_map.md` specs over raw git conflict markers. +- Never delete a "New File" (flagged in the audit) even if it's not used in the new upstream version. \ No newline at end of file diff --git a/.agents/team.yaml.example b/.agents/team.yaml.example new file mode 100644 index 00000000000..b49a187f1c4 --- /dev/null +++ b/.agents/team.yaml.example @@ -0,0 +1,7 @@ +developers: + - name: "Your Name" + email: "your.email@eea.europa.eu" + github: "your_user" + - name: "Colleague Name" + email: "colleague.email@eea.europa.eu" + github: "colleague_user" \ No newline at end of file diff --git a/.cursor/skills/onyx-cli/SKILL.md b/.cursor/skills/onyx-cli/SKILL.md new file mode 120000 index 00000000000..ae1af2ea54d --- /dev/null +++ b/.cursor/skills/onyx-cli/SKILL.md @@ -0,0 +1 @@ +../../../cli/internal/embedded/SKILL.md \ No newline at end of file diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 26d11955385..391c2e33297 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -6,3 +6,4 @@ 3134e5f840c12c8f32613ce520101a047c89dcc2 # refactor(whitespace): rm temporary react fragments (#7161) ed3f72bc75f3e3a9ae9e4d8cd38278f9c97e78b4 # refactor(whitespace): rm react fragment #7190 +7b927e79c25f4ddfd18a067f489e122acd2c89de # chore(format): format files where `ruff` and `black` agree (#9339) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6af2d449f2b..390530c34f9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,3 +8,6 @@ # Agent context files /CLAUDE.md @Weves /AGENTS.md @Weves + +# Beta cherry-pick workflow owners +/.github/workflows/post-merge-beta-cherry-pick.yml @justin-tahara @jmelahman diff --git a/.github/actions/slack-notify/action.yml b/.github/actions/slack-notify/action.yml index e782f8446e2..aae10fe5e70 100644 --- a/.github/actions/slack-notify/action.yml +++ b/.github/actions/slack-notify/action.yml @@ -1,11 +1,17 @@ -name: "Slack Notify on Failure" -description: "Sends a Slack notification when a workflow fails" +name: "Slack Notify" +description: "Sends a Slack notification for workflow events" inputs: webhook-url: description: "Slack webhook URL (can also use SLACK_WEBHOOK_URL env var)" required: false + details: + description: "Additional message body content" + required: false failed-jobs: - description: "List of failed job names (newline-separated)" + description: "Deprecated alias for details" + required: false + mention: + description: "GitHub username to resolve to a Slack @-mention. Replaces {mention} in details." required: false title: description: "Title for the notification" @@ -21,7 +27,9 @@ runs: shell: bash env: SLACK_WEBHOOK_URL: ${{ inputs.webhook-url }} + DETAILS: ${{ inputs.details }} FAILED_JOBS: ${{ inputs.failed-jobs }} + MENTION_USER: ${{ inputs.mention }} TITLE: ${{ inputs.title }} REF_NAME: ${{ inputs.ref-name }} REPO: ${{ github.repository }} @@ -44,6 +52,39 @@ runs: REF_NAME="$GITHUB_REF_NAME" fi + if [ -z "$DETAILS" ]; then + DETAILS="$FAILED_JOBS" + fi + + # Resolve {mention} placeholder if a GitHub username was provided. + # Looks up the username in user-mappings.json (co-located with this action) + # and replaces {mention} with <@SLACK_ID> for a Slack @-mention. + # Falls back to the plain GitHub username if not found in the mapping. + if [ -n "$MENTION_USER" ]; then + MAPPINGS_FILE="${GITHUB_ACTION_PATH}/user-mappings.json" + slack_id="$(jq -r --arg gh "$MENTION_USER" 'to_entries[] | select(.value | ascii_downcase == ($gh | ascii_downcase)) | .key' "$MAPPINGS_FILE" 2>/dev/null | head -1)" + + if [ -n "$slack_id" ]; then + mention_text="<@${slack_id}>" + else + mention_text="${MENTION_USER}" + fi + + DETAILS="${DETAILS//\{mention\}/$mention_text}" + TITLE="${TITLE//\{mention\}/}" + else + DETAILS="${DETAILS//\{mention\}/}" + TITLE="${TITLE//\{mention\}/}" + fi + + normalize_multiline() { + printf '%s' "$1" | awk 'BEGIN { ORS=""; first=1 } { if (!first) printf "\\n"; printf "%s", $0; first=0 }' + } + + DETAILS="$(normalize_multiline "$DETAILS")" + REF_NAME="$(normalize_multiline "$REF_NAME")" + TITLE="$(normalize_multiline "$TITLE")" + # Escape JSON special characters escape_json() { local input="$1" @@ -59,12 +100,12 @@ runs: } REF_NAME_ESC=$(escape_json "$REF_NAME") - FAILED_JOBS_ESC=$(escape_json "$FAILED_JOBS") + DETAILS_ESC=$(escape_json "$DETAILS") WORKFLOW_URL_ESC=$(escape_json "$WORKFLOW_URL") TITLE_ESC=$(escape_json "$TITLE") # Build JSON payload piece by piece - # Note: FAILED_JOBS_ESC already contains \n sequences that should remain as \n in JSON + # Note: DETAILS_ESC already contains \n sequences that should remain as \n in JSON PAYLOAD="{" PAYLOAD="${PAYLOAD}\"text\":\"${TITLE_ESC}\"," PAYLOAD="${PAYLOAD}\"blocks\":[{" @@ -79,10 +120,10 @@ runs: PAYLOAD="${PAYLOAD}{\"type\":\"mrkdwn\",\"text\":\"*Run ID:*\\n#${RUN_NUMBER}\"}" PAYLOAD="${PAYLOAD}]" PAYLOAD="${PAYLOAD}}" - if [ -n "$FAILED_JOBS" ]; then + if [ -n "$DETAILS" ]; then PAYLOAD="${PAYLOAD},{" PAYLOAD="${PAYLOAD}\"type\":\"section\"," - PAYLOAD="${PAYLOAD}\"text\":{\"type\":\"mrkdwn\",\"text\":\"*Failed Jobs:*\\n${FAILED_JOBS_ESC}\"}" + PAYLOAD="${PAYLOAD}\"text\":{\"type\":\"mrkdwn\",\"text\":\"${DETAILS_ESC}\"}" PAYLOAD="${PAYLOAD}}" fi PAYLOAD="${PAYLOAD},{" @@ -99,4 +140,3 @@ runs: curl -X POST -H 'Content-type: application/json' \ --data "$PAYLOAD" \ "$SLACK_WEBHOOK_URL" - diff --git a/.github/actions/slack-notify/user-mappings.json b/.github/actions/slack-notify/user-mappings.json new file mode 100644 index 00000000000..5aa395cf614 --- /dev/null +++ b/.github/actions/slack-notify/user-mappings.json @@ -0,0 +1,18 @@ +{ + "U05SAGZPEA1": "yuhongsun96", + "U05SAH6UGUD": "Weves", + "U07PWEQB7A5": "evan-onyx", + "U07V1SM68KF": "joachim-danswer", + "U08JZ9N3QNN": "raunakab", + "U08L24NCLJE": "Subash-Mohan", + "U090B9M07B2": "wenxi-onyx", + "U094RASDP0Q": "duo-onyx", + "U096L8ZQ85B": "justin-tahara", + "U09AHV8UBQX": "jessicasingh7", + "U09KAL5T3C2": "nmgarza5", + "U09KPGVQ70R": "acaprau", + "U09QR8KTSJH": "rohoswagger", + "U09RB4NTXA4": "jmelahman", + "U0A6K9VCY6A": "Danelegend", + "U0AGC4KH71A": "Bo-Onyx" +} diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml index 01c135d527f..bedbb502d75 100644 --- a/.github/workflows/deployment.yml +++ b/.github/workflows/deployment.yml @@ -13,7 +13,7 @@ permissions: id-token: write # zizmor: ignore[excessive-permissions] env: - EDGE_TAG: ${{ startsWith(github.ref_name, 'nightly-latest') }} + EDGE_TAG: ${{ startsWith(github.ref_name, 'nightly-latest') || github.ref_name == 'edge' }} jobs: # Determine which components to build based on the tag @@ -29,20 +29,32 @@ jobs: build-backend-craft: ${{ steps.check.outputs.build-backend-craft }} build-model-server: ${{ steps.check.outputs.build-model-server }} is-cloud-tag: ${{ steps.check.outputs.is-cloud-tag }} - is-stable: ${{ steps.check.outputs.is-stable }} is-beta: ${{ steps.check.outputs.is-beta }} - is-stable-standalone: ${{ steps.check.outputs.is-stable-standalone }} is-beta-standalone: ${{ steps.check.outputs.is-beta-standalone }} - is-craft-latest: ${{ steps.check.outputs.is-craft-latest }} + is-latest: ${{ steps.check.outputs.is-latest }} is-test-run: ${{ steps.check.outputs.is-test-run }} sanitized-tag: ${{ steps.check.outputs.sanitized-tag }} short-sha: ${{ steps.check.outputs.short-sha }} steps: + - name: Checkout (for git tags) + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 + with: + persist-credentials: false + fetch-depth: 0 + fetch-tags: true + + - name: Setup uv + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # ratchet:astral-sh/setup-uv@v7 + with: + version: "0.9.9" + enable-cache: false + - name: Check which components to build and version info id: check env: EVENT_NAME: ${{ github.event_name }} run: | + set -eo pipefail TAG="${GITHUB_REF_NAME}" # Sanitize tag name by replacing slashes with hyphens (for Docker tag compatibility) SANITIZED_TAG=$(echo "$TAG" | tr '/' '-') @@ -54,9 +66,8 @@ jobs: IS_VERSION_TAG=false IS_STABLE=false IS_BETA=false - IS_STABLE_STANDALONE=false IS_BETA_STANDALONE=false - IS_CRAFT_LATEST=false + IS_LATEST=false IS_PROD_TAG=false IS_TEST_RUN=false BUILD_DESKTOP=false @@ -67,9 +78,6 @@ jobs: BUILD_MODEL_SERVER=true # Determine tag type based on pattern matching (do regex checks once) - if [[ "$TAG" == craft-* ]]; then - IS_CRAFT_LATEST=true - fi if [[ "$TAG" == *cloud* ]]; then IS_CLOUD=true fi @@ -97,20 +105,28 @@ jobs: fi fi - # Craft-latest builds backend with Craft enabled - if [[ "$IS_CRAFT_LATEST" == "true" ]]; then - BUILD_BACKEND_CRAFT=true - BUILD_BACKEND=false - fi - # Standalone version checks (for backend/model-server - version excluding cloud tags) - if [[ "$IS_STABLE" == "true" ]] && [[ "$IS_CLOUD" != "true" ]]; then - IS_STABLE_STANDALONE=true - fi if [[ "$IS_BETA" == "true" ]] && [[ "$IS_CLOUD" != "true" ]]; then IS_BETA_STANDALONE=true fi + # Determine if this tag should get the "latest" Docker tag. + # Only the highest semver stable tag (vX.Y.Z exactly) gets "latest". + if [[ "$IS_STABLE" == "true" ]]; then + HIGHEST_STABLE=$(uv run --no-sync --with onyx-devtools ods latest-stable-tag) || { + echo "::error::Failed to determine highest stable tag via 'ods latest-stable-tag'" + exit 1 + } + if [[ "$TAG" == "$HIGHEST_STABLE" ]]; then + IS_LATEST=true + fi + fi + + # Build craft-latest backend alongside the regular latest. + if [[ "$IS_LATEST" == "true" ]]; then + BUILD_BACKEND_CRAFT=true + fi + # Determine if this is a production tag # Production tags are: version tags (v1.2.3*) or nightly tags if [[ "$IS_VERSION_TAG" == "true" ]] || [[ "$IS_NIGHTLY" == "true" ]]; then @@ -129,11 +145,9 @@ jobs: echo "build-backend-craft=$BUILD_BACKEND_CRAFT" echo "build-model-server=$BUILD_MODEL_SERVER" echo "is-cloud-tag=$IS_CLOUD" - echo "is-stable=$IS_STABLE" echo "is-beta=$IS_BETA" - echo "is-stable-standalone=$IS_STABLE_STANDALONE" echo "is-beta-standalone=$IS_BETA_STANDALONE" - echo "is-craft-latest=$IS_CRAFT_LATEST" + echo "is-latest=$IS_LATEST" echo "is-test-run=$IS_TEST_RUN" echo "sanitized-tag=$SANITIZED_TAG" echo "short-sha=$SHORT_SHA" @@ -142,7 +156,7 @@ jobs: check-version-tag: runs-on: ubuntu-slim timeout-minutes: 10 - if: ${{ !startsWith(github.ref_name, 'nightly-latest') && github.event_name != 'workflow_dispatch' }} + if: ${{ !startsWith(github.ref_name, 'nightly-latest') && github.ref_name != 'edge' && github.event_name != 'workflow_dispatch' }} steps: - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 @@ -151,7 +165,7 @@ jobs: fetch-depth: 0 - name: Setup uv - uses: astral-sh/setup-uv@61cb8a9741eeb8a550a1b8544337180c0fc8476b # ratchet:astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # ratchet:astral-sh/setup-uv@v7 with: version: "0.9.9" # NOTE: This isn't caching much and zizmor suggests this could be poisoned, so disable. @@ -182,9 +196,53 @@ jobs: title: "🚨 Version Tag Check Failed" ref-name: ${{ github.ref_name }} - build-desktop: + # Create GitHub release first, before desktop builds start. + # This ensures all desktop matrix jobs upload to the same release instead of + # racing to create duplicate releases. + create-release: needs: determine-builds if: needs.determine-builds.outputs.build-desktop == 'true' + runs-on: ubuntu-slim + timeout-minutes: 10 + permissions: + contents: write + outputs: + release-id: ${{ steps.create-release.outputs.id }} + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 + with: + persist-credentials: false + + - name: Determine release tag + id: release-tag + env: + IS_TEST_RUN: ${{ needs.determine-builds.outputs.is-test-run }} + SHORT_SHA: ${{ needs.determine-builds.outputs.short-sha }} + run: | + if [ "${IS_TEST_RUN}" == "true" ]; then + echo "tag=v0.0.0-dev+${SHORT_SHA}" >> "$GITHUB_OUTPUT" + else + echo "tag=${GITHUB_REF_NAME}" >> "$GITHUB_OUTPUT" + fi + + - name: Create GitHub Release + id: create-release + uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # ratchet:softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.release-tag.outputs.tag }} + name: ${{ steps.release-tag.outputs.tag }} + body: "See the assets to download this version and install." + draft: true + prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + build-desktop: + needs: + - determine-builds + - create-release + if: needs.determine-builds.outputs.build-desktop == 'true' permissions: id-token: write contents: write @@ -208,12 +266,12 @@ jobs: steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6.0.2 with: - # NOTE: persist-credentials is needed for tauri-action to create GitHub releases. + # NOTE: persist-credentials is needed for tauri-action to upload assets to GitHub releases. persist-credentials: true # zizmor: ignore[artipacked] - name: Configure AWS credentials if: startsWith(matrix.platform, 'macos-') - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -249,7 +307,7 @@ jobs: xdg-utils - name: setup node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # ratchet:actions/setup-node@v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # ratchet:actions/setup-node@v6.3.0 with: node-version: 24 package-manager-cache: false @@ -353,11 +411,9 @@ jobs: APPLE_SIGNING_IDENTITY: ${{ env.CERT_ID }} APPLE_TEAM_ID: ${{ env.APPLE_TEAM_ID }} with: - tagName: ${{ needs.determine-builds.outputs.is-test-run != 'true' && 'v__VERSION__' || format('v0.0.0-dev+{0}', needs.determine-builds.outputs.short-sha) }} - releaseName: ${{ needs.determine-builds.outputs.is-test-run != 'true' && 'v__VERSION__' || format('v0.0.0-dev+{0}', needs.determine-builds.outputs.short-sha) }} - releaseBody: "See the assets to download this version and install." - releaseDraft: true - prerelease: false + # Use the release created by the create-release job to avoid race conditions + # when multiple matrix jobs try to create/update the same release simultaneously + releaseId: ${{ needs.create-release.outputs.release-id }} assetNamePattern: "[name]_[arch][ext]" args: ${{ matrix.args }} @@ -384,7 +440,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -399,7 +455,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | @@ -426,8 +482,9 @@ jobs: ONYX_VERSION=${{ github.ref_name }} NODE_OPTIONS=--max-old-space-size=8192 cache-from: | - type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-amd64 + type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge + type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest cache-to: | type=inline type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-amd64,mode=max @@ -457,7 +514,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -472,7 +529,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | @@ -499,8 +556,9 @@ jobs: ONYX_VERSION=${{ github.ref_name }} NODE_OPTIONS=--max-old-space-size=8192 cache-from: | - type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-arm64 + type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge + type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest cache-to: | type=inline type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:web-cache-arm64,mode=max @@ -525,7 +583,7 @@ jobs: - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -549,14 +607,15 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | latest=false tags: | type=raw,value=${{ needs.determine-builds.outputs.is-test-run == 'true' && format('web-{0}', needs.determine-builds.outputs.sanitized-tag) || github.ref_name }} - type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-stable == 'true' && 'latest' || '' }} + type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-latest == 'true' && 'latest' || '' }} + type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-latest == 'true' && 'craft-latest' || '' }} type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && env.EDGE_TAG == 'true' && 'edge' || '' }} type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-beta == 'true' && 'beta' || '' }} @@ -595,7 +654,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -610,7 +669,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | @@ -645,9 +704,12 @@ jobs: NEXT_PUBLIC_FORGOT_PASSWORD_ENABLED=true NEXT_PUBLIC_INCLUDE_ERROR_POPUP_SUPPORT_LINK=true NODE_OPTIONS=--max-old-space-size=8192 + SENTRY_RELEASE=${{ github.sha }} + secrets: | + sentry_auth_token=${{ secrets.SENTRY_AUTH_TOKEN }} cache-from: | - type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:cloudweb-cache-amd64 + type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest cache-to: | type=inline type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:cloudweb-cache-amd64,mode=max @@ -677,7 +739,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -692,7 +754,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | @@ -727,9 +789,12 @@ jobs: NEXT_PUBLIC_FORGOT_PASSWORD_ENABLED=true NEXT_PUBLIC_INCLUDE_ERROR_POPUP_SUPPORT_LINK=true NODE_OPTIONS=--max-old-space-size=8192 + SENTRY_RELEASE=${{ github.sha }} + secrets: | + sentry_auth_token=${{ secrets.SENTRY_AUTH_TOKEN }} cache-from: | - type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:cloudweb-cache-arm64 + type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest cache-to: | type=inline type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:cloudweb-cache-arm64,mode=max @@ -754,7 +819,7 @@ jobs: - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -778,7 +843,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | @@ -821,7 +886,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -836,7 +901,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | @@ -862,8 +927,9 @@ jobs: build-args: | ONYX_VERSION=${{ github.ref_name }} cache-from: | - type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-amd64 + type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge + type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest cache-to: | type=inline type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-amd64,mode=max @@ -893,7 +959,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -908,7 +974,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | @@ -934,8 +1000,9 @@ jobs: build-args: | ONYX_VERSION=${{ github.ref_name }} cache-from: | - type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-arm64 + type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge + type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest cache-to: | type=inline type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-cache-arm64,mode=max @@ -960,7 +1027,7 @@ jobs: - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -984,14 +1051,14 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | latest=false tags: | type=raw,value=${{ needs.determine-builds.outputs.is-test-run == 'true' && format('backend-{0}', needs.determine-builds.outputs.sanitized-tag) || github.ref_name }} - type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-stable-standalone == 'true' && 'latest' || '' }} + type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-latest == 'true' && 'latest' || '' }} type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && env.EDGE_TAG == 'true' && 'edge' || '' }} type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-beta-standalone == 'true' && 'beta' || '' }} @@ -1030,7 +1097,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -1045,7 +1112,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ env.REGISTRY_IMAGE }} flavor: | @@ -1072,8 +1139,8 @@ jobs: ONYX_VERSION=${{ github.ref_name }} ENABLE_CRAFT=true cache-from: | - type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-craft-cache-amd64 + type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest cache-to: | type=inline type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-craft-cache-amd64,mode=max @@ -1103,7 +1170,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -1118,7 +1185,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ env.REGISTRY_IMAGE }} flavor: | @@ -1145,8 +1212,8 @@ jobs: ONYX_VERSION=${{ github.ref_name }} ENABLE_CRAFT=true cache-from: | - type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-craft-cache-arm64 + type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest cache-to: | type=inline type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:backend-craft-cache-arm64,mode=max @@ -1172,7 +1239,7 @@ jobs: - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -1196,15 +1263,13 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ env.REGISTRY_IMAGE }} flavor: | latest=false tags: | type=raw,value=craft-latest - # TODO: Consider aligning craft-latest tags with regular backend builds (e.g., latest, edge, beta) - # to keep tagging strategy consistent across all backend images - name: Create and push manifest env: @@ -1242,7 +1307,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -1257,7 +1322,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | @@ -1287,8 +1352,9 @@ jobs: build-args: | ONYX_VERSION=${{ github.ref_name }} cache-from: | - type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-amd64 + type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge + type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest cache-to: | type=inline type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-amd64,mode=max @@ -1321,7 +1387,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -1336,7 +1402,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | @@ -1366,8 +1432,9 @@ jobs: build-args: | ONYX_VERSION=${{ github.ref_name }} cache-from: | - type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-arm64 + type=registry,ref=${{ env.REGISTRY_IMAGE }}:edge + type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest cache-to: | type=inline type=registry,ref=${{ env.RUNS_ON_ECR_CACHE }}:model-server-cache-arm64,mode=max @@ -1394,7 +1461,7 @@ jobs: - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -1418,14 +1485,15 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ needs.determine-builds.outputs.is-test-run == 'true' && env.RUNS_ON_ECR_CACHE || env.REGISTRY_IMAGE }} flavor: | latest=false tags: | type=raw,value=${{ needs.determine-builds.outputs.is-test-run == 'true' && format('model-server-{0}', needs.determine-builds.outputs.sanitized-tag) || github.ref_name }} - type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-stable-standalone == 'true' && 'latest' || '' }} + type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-latest == 'true' && 'latest' || '' }} + type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-latest == 'true' && 'craft-latest' || '' }} type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && env.EDGE_TAG == 'true' && 'edge' || '' }} type=raw,value=${{ needs.determine-builds.outputs.is-test-run != 'true' && needs.determine-builds.outputs.is-beta-standalone == 'true' && 'beta' || '' }} @@ -1441,232 +1509,105 @@ jobs: $(printf '%s\n' "${META_TAGS}" | xargs -I {} echo -t {}) \ $IMAGES - trivy-scan-web: + trivy-scan: needs: - determine-builds - merge-web - if: needs.merge-web.result == 'success' - runs-on: - - runs-on - - runner=2cpu-linux-arm64 - - run-id=${{ github.run_id }}-trivy-scan-web - - extras=ecr-cache - timeout-minutes: 90 - environment: release - env: - REGISTRY_IMAGE: onyxdotapp/onyx-web-server - steps: - - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 - with: - role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} - aws-region: us-east-2 - - - name: Get AWS Secrets - uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 - with: - secret-ids: | - DOCKER_USERNAME, deploy/docker-username - DOCKER_TOKEN, deploy/docker-token - parse-json-secrets: true - - - name: Run Trivy vulnerability scanner - uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # ratchet:nick-fields/retry@v3 - with: - timeout_minutes: 30 - max_attempts: 3 - retry_wait_seconds: 10 - command: | - if [ "${{ needs.determine-builds.outputs.is-test-run }}" == "true" ]; then - SCAN_IMAGE="${{ env.RUNS_ON_ECR_CACHE }}:web-${{ needs.determine-builds.outputs.sanitized-tag }}" - else - SCAN_IMAGE="docker.io/${{ env.REGISTRY_IMAGE }}:${{ github.ref_name }}" - fi - docker run --rm -v $HOME/.cache/trivy:/root/.cache/trivy \ - -e TRIVY_DB_REPOSITORY="public.ecr.aws/aquasecurity/trivy-db:2" \ - -e TRIVY_JAVA_DB_REPOSITORY="public.ecr.aws/aquasecurity/trivy-java-db:1" \ - -e TRIVY_USERNAME="${{ env.DOCKER_USERNAME }}" \ - -e TRIVY_PASSWORD="${{ env.DOCKER_TOKEN }}" \ - aquasec/trivy@sha256:a22415a38938a56c379387a8163fcb0ce38b10ace73e593475d3658d578b2436 \ - image \ - --skip-version-check \ - --timeout 20m \ - --severity CRITICAL,HIGH \ - ${SCAN_IMAGE} - - trivy-scan-web-cloud: - needs: - - determine-builds - merge-web-cloud - if: needs.merge-web-cloud.result == 'success' - runs-on: - - runs-on - - runner=2cpu-linux-arm64 - - run-id=${{ github.run_id }}-trivy-scan-web-cloud - - extras=ecr-cache - timeout-minutes: 90 - environment: release - env: - REGISTRY_IMAGE: onyxdotapp/onyx-web-server-cloud - steps: - - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 - with: - role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} - aws-region: us-east-2 - - - name: Get AWS Secrets - uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 - with: - secret-ids: | - DOCKER_USERNAME, deploy/docker-username - DOCKER_TOKEN, deploy/docker-token - parse-json-secrets: true - - - name: Run Trivy vulnerability scanner - uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # ratchet:nick-fields/retry@v3 - with: - timeout_minutes: 30 - max_attempts: 3 - retry_wait_seconds: 10 - command: | - if [ "${{ needs.determine-builds.outputs.is-test-run }}" == "true" ]; then - SCAN_IMAGE="${{ env.RUNS_ON_ECR_CACHE }}:web-cloud-${{ needs.determine-builds.outputs.sanitized-tag }}" - else - SCAN_IMAGE="docker.io/${{ env.REGISTRY_IMAGE }}:${{ github.ref_name }}" - fi - docker run --rm -v $HOME/.cache/trivy:/root/.cache/trivy \ - -e TRIVY_DB_REPOSITORY="public.ecr.aws/aquasecurity/trivy-db:2" \ - -e TRIVY_JAVA_DB_REPOSITORY="public.ecr.aws/aquasecurity/trivy-java-db:1" \ - -e TRIVY_USERNAME="${{ env.DOCKER_USERNAME }}" \ - -e TRIVY_PASSWORD="${{ env.DOCKER_TOKEN }}" \ - aquasec/trivy@sha256:a22415a38938a56c379387a8163fcb0ce38b10ace73e593475d3658d578b2436 \ - image \ - --skip-version-check \ - --timeout 20m \ - --severity CRITICAL,HIGH \ - ${SCAN_IMAGE} - - trivy-scan-backend: - needs: - - determine-builds - merge-backend - if: needs.merge-backend.result == 'success' + - merge-model-server + if: >- + always() && !cancelled() && + (needs.merge-web.result == 'success' || + needs.merge-web-cloud.result == 'success' || + needs.merge-backend.result == 'success' || + needs.merge-model-server.result == 'success') runs-on: - runs-on - runner=2cpu-linux-arm64 - - run-id=${{ github.run_id }}-trivy-scan-backend + - run-id=${{ github.run_id }}-trivy-scan-${{ matrix.component }} - extras=ecr-cache - timeout-minutes: 90 - environment: release - env: - REGISTRY_IMAGE: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-backend-cloud' || 'onyxdotapp/onyx-backend' }} + permissions: + security-events: write # needed for SARIF uploads + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + include: + - component: web + registry-image: onyxdotapp/onyx-web-server + - component: web-cloud + registry-image: onyxdotapp/onyx-web-server-cloud + - component: backend + registry-image: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-backend-cloud' || 'onyxdotapp/onyx-backend' }} + trivyignore: backend/.trivyignore + - component: model-server + registry-image: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-model-server-cloud' || 'onyxdotapp/onyx-model-server' }} steps: + - name: Check if this scan should run + id: should-run + run: | + case "$COMPONENT" in + web) RESULT="$MERGE_WEB" ;; + web-cloud) RESULT="$MERGE_WEB_CLOUD" ;; + backend) RESULT="$MERGE_BACKEND" ;; + model-server) RESULT="$MERGE_MODEL_SERVER" ;; + esac + if [ "$RESULT" == "success" ]; then + echo "run=true" >> "$GITHUB_OUTPUT" + else + echo "run=false" >> "$GITHUB_OUTPUT" + fi + env: + COMPONENT: ${{ matrix.component }} + MERGE_WEB: ${{ needs.merge-web.result }} + MERGE_WEB_CLOUD: ${{ needs.merge-web-cloud.result }} + MERGE_BACKEND: ${{ needs.merge-backend.result }} + MERGE_MODEL_SERVER: ${{ needs.merge-model-server.result }} + - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 + if: steps.should-run.outputs.run == 'true' - name: Checkout + if: steps.should-run.outputs.run == 'true' && matrix.trivyignore != '' uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 with: persist-credentials: false - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 - with: - role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} - aws-region: us-east-2 - - - name: Get AWS Secrets - uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 - with: - secret-ids: | - DOCKER_USERNAME, deploy/docker-username - DOCKER_TOKEN, deploy/docker-token - parse-json-secrets: true + - name: Determine scan image + if: steps.should-run.outputs.run == 'true' + id: scan-image + run: | + if [ "$IS_TEST_RUN" == "true" ]; then + echo "image=${RUNS_ON_ECR_CACHE}:${TAG_PREFIX}-${SANITIZED_TAG}" >> "$GITHUB_OUTPUT" + else + echo "image=docker.io/${REGISTRY_IMAGE}:${REF_NAME}" >> "$GITHUB_OUTPUT" + fi + env: + IS_TEST_RUN: ${{ needs.determine-builds.outputs.is-test-run }} + TAG_PREFIX: ${{ matrix.component }} + SANITIZED_TAG: ${{ needs.determine-builds.outputs.sanitized-tag }} + REGISTRY_IMAGE: ${{ matrix.registry-image }} + REF_NAME: ${{ github.ref_name }} - name: Run Trivy vulnerability scanner - uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # ratchet:nick-fields/retry@v3 - with: - timeout_minutes: 30 - max_attempts: 3 - retry_wait_seconds: 10 - command: | - if [ "${{ needs.determine-builds.outputs.is-test-run }}" == "true" ]; then - SCAN_IMAGE="${{ env.RUNS_ON_ECR_CACHE }}:backend-${{ needs.determine-builds.outputs.sanitized-tag }}" - else - SCAN_IMAGE="docker.io/${{ env.REGISTRY_IMAGE }}:${{ github.ref_name }}" - fi - docker run --rm -v $HOME/.cache/trivy:/root/.cache/trivy \ - -v ${{ github.workspace }}/backend/.trivyignore:/tmp/.trivyignore:ro \ - -e TRIVY_DB_REPOSITORY="public.ecr.aws/aquasecurity/trivy-db:2" \ - -e TRIVY_JAVA_DB_REPOSITORY="public.ecr.aws/aquasecurity/trivy-java-db:1" \ - -e TRIVY_USERNAME="${{ env.DOCKER_USERNAME }}" \ - -e TRIVY_PASSWORD="${{ env.DOCKER_TOKEN }}" \ - aquasec/trivy@sha256:a22415a38938a56c379387a8163fcb0ce38b10ace73e593475d3658d578b2436 \ - image \ - --skip-version-check \ - --timeout 20m \ - --severity CRITICAL,HIGH \ - --ignorefile /tmp/.trivyignore \ - ${SCAN_IMAGE} - - trivy-scan-model-server: - needs: - - determine-builds - - merge-model-server - if: needs.merge-model-server.result == 'success' - runs-on: - - runs-on - - runner=2cpu-linux-arm64 - - run-id=${{ github.run_id }}-trivy-scan-model-server - - extras=ecr-cache - timeout-minutes: 90 - environment: release - env: - REGISTRY_IMAGE: ${{ contains(github.ref_name, 'cloud') && 'onyxdotapp/onyx-model-server-cloud' || 'onyxdotapp/onyx-model-server' }} - steps: - - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 - with: - role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} - aws-region: us-east-2 + if: steps.should-run.outputs.run == 'true' + uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # ratchet:aquasecurity/trivy-action@v0.35.0 + with: + image-ref: ${{ steps.scan-image.outputs.image }} + severity: CRITICAL,HIGH + format: "sarif" + output: "trivy-results.sarif" + trivyignores: ${{ matrix.trivyignore }} + env: + TRIVY_USERNAME: ${{ secrets.DOCKER_USERNAME }} + TRIVY_PASSWORD: ${{ secrets.DOCKER_TOKEN }} - - name: Get AWS Secrets - uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 + - name: Upload Trivy scan results to GitHub Security tab + if: steps.should-run.outputs.run == 'true' + uses: github/codeql-action/upload-sarif@ba454b8ab46733eb6145342877cd148270bb77ab with: - secret-ids: | - DOCKER_USERNAME, deploy/docker-username - DOCKER_TOKEN, deploy/docker-token - parse-json-secrets: true - - - name: Run Trivy vulnerability scanner - uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # ratchet:nick-fields/retry@v3 - with: - timeout_minutes: 30 - max_attempts: 3 - retry_wait_seconds: 10 - command: | - if [ "${{ needs.determine-builds.outputs.is-test-run }}" == "true" ]; then - SCAN_IMAGE="${{ env.RUNS_ON_ECR_CACHE }}:model-server-${{ needs.determine-builds.outputs.sanitized-tag }}" - else - SCAN_IMAGE="docker.io/${{ env.REGISTRY_IMAGE }}:${{ github.ref_name }}" - fi - docker run --rm -v $HOME/.cache/trivy:/root/.cache/trivy \ - -e TRIVY_DB_REPOSITORY="public.ecr.aws/aquasecurity/trivy-db:2" \ - -e TRIVY_JAVA_DB_REPOSITORY="public.ecr.aws/aquasecurity/trivy-java-db:1" \ - -e TRIVY_USERNAME="${{ env.DOCKER_USERNAME }}" \ - -e TRIVY_PASSWORD="${{ env.DOCKER_TOKEN }}" \ - aquasec/trivy@sha256:a22415a38938a56c379387a8163fcb0ce38b10ace73e593475d3658d578b2436 \ - image \ - --skip-version-check \ - --timeout 20m \ - --severity CRITICAL,HIGH \ - ${SCAN_IMAGE} + sarif_file: "trivy-results.sarif" notify-slack-on-failure: needs: diff --git a/.github/workflows/helm-chart-releases.yml b/.github/workflows/helm-chart-releases.yml index 1264c189fde..ab9928e21c4 100644 --- a/.github/workflows/helm-chart-releases.yml +++ b/.github/workflows/helm-chart-releases.yml @@ -21,7 +21,7 @@ jobs: persist-credentials: false - name: Install Helm CLI - uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # ratchet:azure/setup-helm@v4 + uses: azure/setup-helm@dda3372f752e03dde6b3237bc9431cdc2f7a02a2 # ratchet:azure/setup-helm@v5.0.0 with: version: v3.12.1 @@ -47,7 +47,8 @@ jobs: done - name: Publish Helm charts to gh-pages - uses: stefanprodan/helm-gh-pages@0ad2bb377311d61ac04ad9eb6f252fb68e207260 # ratchet:stefanprodan/helm-gh-pages@v1.7.0 + # NOTE: HEAD of https://github.com/stefanprodan/helm-gh-pages/pull/43 + uses: stefanprodan/helm-gh-pages@ad32ad3b8720abfeaac83532fd1e9bdfca5bbe27 # zizmor: ignore[impostor-commit] with: token: ${{ secrets.GITHUB_TOKEN }} charts_dir: deployment/helm/charts diff --git a/.github/workflows/nightly-close-stale-issues.yml b/.github/workflows/nightly-close-stale-issues.yml index b100ed45091..accaeb5365b 100644 --- a/.github/workflows/nightly-close-stale-issues.yml +++ b/.github/workflows/nightly-close-stale-issues.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 45 steps: - - uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # ratchet:actions/stale@v10 + - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # ratchet:actions/stale@v10 with: stale-issue-message: 'This issue is stale because it has been open 75 days with no activity. Remove stale label or comment or this will be closed in 15 days.' stale-pr-message: 'This PR is stale because it has been open 75 days with no activity. Remove stale label or comment or this will be closed in 15 days.' diff --git a/.github/workflows/nightly-llm-provider-chat.yml b/.github/workflows/nightly-llm-provider-chat.yml index a6fbdea6569..f673facda3d 100644 --- a/.github/workflows/nightly-llm-provider-chat.yml +++ b/.github/workflows/nightly-llm-provider-chat.yml @@ -15,6 +15,11 @@ permissions: jobs: provider-chat-test: uses: ./.github/workflows/reusable-nightly-llm-provider-chat.yml + secrets: + AWS_OIDC_ROLE_ARN: ${{ secrets.AWS_OIDC_ROLE_ARN }} + permissions: + contents: read + id-token: write with: openai_models: ${{ vars.NIGHTLY_LLM_OPENAI_MODELS }} anthropic_models: ${{ vars.NIGHTLY_LLM_ANTHROPIC_MODELS }} @@ -25,21 +30,12 @@ jobs: ollama_models: ${{ vars.NIGHTLY_LLM_OLLAMA_MODELS }} openrouter_models: ${{ vars.NIGHTLY_LLM_OPENROUTER_MODELS }} strict: true - secrets: - openai_api_key: ${{ secrets.OPENAI_API_KEY }} - anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - bedrock_api_key: ${{ secrets.BEDROCK_API_KEY }} - vertex_ai_custom_config_json: ${{ secrets.NIGHTLY_LLM_VERTEX_AI_CUSTOM_CONFIG_JSON }} - azure_api_key: ${{ secrets.AZURE_API_KEY }} - ollama_api_key: ${{ secrets.OLLAMA_API_KEY }} - openrouter_api_key: ${{ secrets.OPENROUTER_API_KEY }} - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_TOKEN: ${{ secrets.DOCKER_TOKEN }} notify-slack-on-failure: needs: [provider-chat-test] if: failure() && github.event_name == 'schedule' runs-on: ubuntu-slim + environment: ci-protected timeout-minutes: 5 steps: - name: Checkout diff --git a/.github/workflows/post-merge-beta-cherry-pick.yml b/.github/workflows/post-merge-beta-cherry-pick.yml index 06993fa5a53..81202ad5a68 100644 --- a/.github/workflows/post-merge-beta-cherry-pick.yml +++ b/.github/workflows/post-merge-beta-cherry-pick.yml @@ -1,65 +1,112 @@ name: Post-Merge Beta Cherry-Pick on: - push: - branches: - - main + pull_request_target: + types: + - closed +# SECURITY NOTE: +# This workflow intentionally uses pull_request_target so post-merge automation can +# use base-repo credentials. Do not checkout PR head refs in this workflow +# (e.g. github.event.pull_request.head.sha). Only trusted base refs are allowed. permissions: - contents: write - pull-requests: write + contents: read jobs: - cherry-pick-to-latest-release: + resolve-cherry-pick-request: + if: >- + github.event.pull_request.merged == true + && github.event.pull_request.base.ref == 'main' + && github.event.pull_request.head.repo.full_name == github.repository outputs: should_cherrypick: ${{ steps.gate.outputs.should_cherrypick }} pr_number: ${{ steps.gate.outputs.pr_number }} - cherry_pick_reason: ${{ steps.run_cherry_pick.outputs.reason }} - cherry_pick_details: ${{ steps.run_cherry_pick.outputs.details }} + merge_commit_sha: ${{ steps.gate.outputs.merge_commit_sha }} + merged_by: ${{ steps.gate.outputs.merged_by }} + gate_error: ${{ steps.gate.outputs.gate_error }} runs-on: ubuntu-latest - timeout-minutes: 45 + timeout-minutes: 10 steps: - name: Resolve merged PR and checkbox state id: gate env: GH_TOKEN: ${{ github.token }} + PR_NUMBER: ${{ github.event.pull_request.number }} + # SECURITY: keep PR body in env/plain-text handling; avoid directly + # inlining github.event.pull_request.body into shell commands. + PR_BODY: ${{ github.event.pull_request.body }} + MERGE_COMMIT_SHA: ${{ github.event.pull_request.merge_commit_sha }} + MERGED_BY: ${{ github.event.pull_request.merged_by.login }} + # Explicit merger allowlist used because pull_request_target runs with + # the default GITHUB_TOKEN, which cannot reliably read org/team + # membership for this repository context. + ALLOWED_MERGERS: | + acaprau + bo-onyx + danelegend + duo-onyx + evan-onyx + jessicasingh7 + jmelahman + joachim-danswer + justin-tahara + nmgarza5 + raunakab + rohoswagger + subash-mohan + trial2onyx + wenxi-onyx + weves + yuhongsun96 run: | - # For the commit that triggered this workflow (HEAD on main), fetch all - # associated PRs and keep only the PR that was actually merged into main - # with this exact merge commit SHA. - pr_numbers="$(gh api "repos/${GITHUB_REPOSITORY}/commits/${GITHUB_SHA}/pulls" | jq -r --arg sha "${GITHUB_SHA}" '.[] | select(.merged_at != null and .base.ref == "main" and .merge_commit_sha == $sha) | .number')" - match_count="$(printf '%s\n' "$pr_numbers" | sed '/^[[:space:]]*$/d' | wc -l | tr -d ' ')" - pr_number="$(printf '%s\n' "$pr_numbers" | sed '/^[[:space:]]*$/d' | head -n 1)" - - if [ "${match_count}" -gt 1 ]; then - echo "::warning::Multiple merged PRs matched commit ${GITHUB_SHA}. Using PR #${pr_number}." - fi + echo "pr_number=${PR_NUMBER}" >> "$GITHUB_OUTPUT" + echo "merged_by=${MERGED_BY}" >> "$GITHUB_OUTPUT" - if [ -z "$pr_number" ]; then - echo "No merged PR associated with commit ${GITHUB_SHA}; skipping." + if ! echo "${PR_BODY}" | grep -qiE "\\[x\\][[:space:]]*(\\[[^]]+\\][[:space:]]*)?Please cherry-pick this PR to the latest release version"; then echo "should_cherrypick=false" >> "$GITHUB_OUTPUT" + echo "Cherry-pick checkbox not checked for PR #${PR_NUMBER}. Skipping." exit 0 fi - # Read the PR once so we can gate behavior and infer preferred actor. - pr_json="$(gh api "repos/${GITHUB_REPOSITORY}/pulls/${pr_number}")" - pr_body="$(printf '%s' "$pr_json" | jq -r '.body // ""')" - merged_by="$(printf '%s' "$pr_json" | jq -r '.merged_by.login // ""')" + # Keep should_cherrypick output before any possible exit 1 below so + # notify-slack can still gate on this output even if this job fails. + echo "should_cherrypick=true" >> "$GITHUB_OUTPUT" + echo "Cherry-pick checkbox checked for PR #${PR_NUMBER}." - echo "pr_number=$pr_number" >> "$GITHUB_OUTPUT" - echo "merged_by=$merged_by" >> "$GITHUB_OUTPUT" + if [ -z "${MERGE_COMMIT_SHA}" ] || [ "${MERGE_COMMIT_SHA}" = "null" ]; then + echo "gate_error=missing-merge-commit-sha" >> "$GITHUB_OUTPUT" + echo "::error::PR #${PR_NUMBER} requested cherry-pick, but merge_commit_sha is missing." + exit 1 + fi - if echo "$pr_body" | grep -qiE "\\[x\\][[:space:]]*(\\[[^]]+\\][[:space:]]*)?Please cherry-pick this PR to the latest release version"; then - echo "should_cherrypick=true" >> "$GITHUB_OUTPUT" - echo "Cherry-pick checkbox checked for PR #${pr_number}." - exit 0 + echo "merge_commit_sha=${MERGE_COMMIT_SHA}" >> "$GITHUB_OUTPUT" + + normalized_merged_by="$(printf '%s' "${MERGED_BY}" | tr '[:upper:]' '[:lower:]')" + normalized_allowed_mergers="$(printf '%s\n' "${ALLOWED_MERGERS}" | tr '[:upper:]' '[:lower:]')" + if ! printf '%s\n' "${normalized_allowed_mergers}" | grep -Fxq "${normalized_merged_by}"; then + echo "gate_error=not-allowed-merger" >> "$GITHUB_OUTPUT" + echo "::error::${MERGED_BY} is not in the explicit cherry-pick merger allowlist. Failing cherry-pick gate." + exit 1 fi - echo "should_cherrypick=false" >> "$GITHUB_OUTPUT" - echo "Cherry-pick checkbox not checked for PR #${pr_number}. Skipping." + exit 0 + cherry-pick-to-latest-release: + needs: + - resolve-cherry-pick-request + if: needs.resolve-cherry-pick-request.outputs.should_cherrypick == 'true' && needs.resolve-cherry-pick-request.result == 'success' + permissions: + contents: write + pull-requests: write + outputs: + cherry_pick_pr_url: ${{ steps.run_cherry_pick.outputs.pr_url }} + cherry_pick_reason: ${{ steps.run_cherry_pick.outputs.reason }} + cherry_pick_details: ${{ steps.run_cherry_pick.outputs.details }} + runs-on: ubuntu-latest + timeout-minutes: 45 + steps: - name: Checkout repository - if: steps.gate.outputs.should_cherrypick == 'true' + # SECURITY: keep checkout pinned to trusted base branch; do not switch to PR head refs. uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 with: fetch-depth: 0 @@ -67,34 +114,44 @@ jobs: ref: main - name: Install the latest version of uv - if: steps.gate.outputs.should_cherrypick == 'true' - uses: astral-sh/setup-uv@61cb8a9741eeb8a550a1b8544337180c0fc8476b # ratchet:astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # ratchet:astral-sh/setup-uv@v7 with: enable-cache: false version: "0.9.9" - name: Configure git identity - if: steps.gate.outputs.should_cherrypick == 'true' run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - name: Create cherry-pick PR to latest release id: run_cherry_pick - if: steps.gate.outputs.should_cherrypick == 'true' - continue-on-error: true env: GH_TOKEN: ${{ github.token }} GITHUB_TOKEN: ${{ github.token }} - CHERRY_PICK_ASSIGNEE: ${{ steps.gate.outputs.merged_by }} + CHERRY_PICK_ASSIGNEE: ${{ needs.resolve-cherry-pick-request.outputs.merged_by }} + MERGE_COMMIT_SHA: ${{ needs.resolve-cherry-pick-request.outputs.merge_commit_sha }} run: | - set -o pipefail output_file="$(mktemp)" - uv run --no-sync --with onyx-devtools ods cherry-pick "${GITHUB_SHA}" --yes --no-verify 2>&1 | tee "$output_file" - exit_code="${PIPESTATUS[0]}" + set +e + uv run --no-sync --with onyx-devtools ods cherry-pick "${MERGE_COMMIT_SHA}" --yes --no-verify 2>&1 | tee "$output_file" + pipe_statuses=("${PIPESTATUS[@]}") + exit_code="${pipe_statuses[0]}" + tee_exit="${pipe_statuses[1]:-0}" + set -e + if [ "${tee_exit}" -ne 0 ]; then + echo "status=failure" >> "$GITHUB_OUTPUT" + echo "reason=output-capture-failed" >> "$GITHUB_OUTPUT" + echo "::error::tee failed to capture cherry-pick output (exit ${tee_exit}); cannot classify result." + exit 1 + fi if [ "${exit_code}" -eq 0 ]; then + pr_url="$(sed -n 's/^.*PR created successfully: \(https:\/\/github\.com\/[^[:space:]]\+\/pull\/[0-9]\+\).*$/\1/p' "$output_file" | tail -n 1)" echo "status=success" >> "$GITHUB_OUTPUT" + if [ -n "${pr_url}" ]; then + echo "pr_url=${pr_url}" >> "$GITHUB_OUTPUT" + fi exit 0 fi @@ -113,18 +170,70 @@ jobs: } >> "$GITHUB_OUTPUT" - name: Mark workflow as failed if cherry-pick failed - if: steps.gate.outputs.should_cherrypick == 'true' && steps.run_cherry_pick.outputs.status == 'failure' + if: steps.run_cherry_pick.outputs.status == 'failure' env: CHERRY_PICK_REASON: ${{ steps.run_cherry_pick.outputs.reason }} run: | echo "::error::Automated cherry-pick failed (${CHERRY_PICK_REASON})." exit 1 + notify-slack-on-cherry-pick-success: + needs: + - resolve-cherry-pick-request + - cherry-pick-to-latest-release + if: needs.resolve-cherry-pick-request.outputs.should_cherrypick == 'true' && needs.resolve-cherry-pick-request.result == 'success' && needs.cherry-pick-to-latest-release.result == 'success' + runs-on: ubuntu-slim + environment: ci-protected + timeout-minutes: 10 + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 + with: + persist-credentials: false + + - name: Fail if Slack webhook secret is missing + env: + CHERRY_PICK_PRS_WEBHOOK: ${{ secrets.CHERRY_PICK_PRS_WEBHOOK }} + run: | + if [ -z "${CHERRY_PICK_PRS_WEBHOOK}" ]; then + echo "::error::CHERRY_PICK_PRS_WEBHOOK is not configured." + exit 1 + fi + + - name: Build cherry-pick success summary + id: success-summary + env: + SOURCE_PR_NUMBER: ${{ needs.resolve-cherry-pick-request.outputs.pr_number }} + MERGE_COMMIT_SHA: ${{ needs.resolve-cherry-pick-request.outputs.merge_commit_sha }} + CHERRY_PICK_PR_URL: ${{ needs.cherry-pick-to-latest-release.outputs.cherry_pick_pr_url }} + run: | + source_pr_url="https://github.com/${GITHUB_REPOSITORY}/pull/${SOURCE_PR_NUMBER}" + details="*Cherry-pick PR opened successfully.*\\n• author: {mention}\\n• source PR: ${source_pr_url}" + if [ -n "${CHERRY_PICK_PR_URL}" ]; then + details="${details}\\n• cherry-pick PR: ${CHERRY_PICK_PR_URL}" + fi + if [ -n "${MERGE_COMMIT_SHA}" ]; then + details="${details}\\n• merge SHA: ${MERGE_COMMIT_SHA}" + fi + + echo "details=${details}" >> "$GITHUB_OUTPUT" + + - name: Notify #cherry-pick-prs about cherry-pick success + uses: ./.github/actions/slack-notify + with: + webhook-url: ${{ secrets.CHERRY_PICK_PRS_WEBHOOK }} + mention: ${{ needs.resolve-cherry-pick-request.outputs.merged_by }} + details: ${{ steps.success-summary.outputs.details }} + title: "✅ Automated Cherry-Pick PR Opened" + ref-name: ${{ github.event.pull_request.base.ref }} + notify-slack-on-cherry-pick-failure: needs: + - resolve-cherry-pick-request - cherry-pick-to-latest-release - if: always() && needs.cherry-pick-to-latest-release.outputs.should_cherrypick == 'true' && needs.cherry-pick-to-latest-release.result != 'success' + if: always() && needs.resolve-cherry-pick-request.outputs.should_cherrypick == 'true' && (needs.resolve-cherry-pick-request.result == 'failure' || needs.cherry-pick-to-latest-release.result == 'failure') runs-on: ubuntu-slim + environment: ci-protected timeout-minutes: 10 steps: - name: Checkout @@ -132,32 +241,58 @@ jobs: with: persist-credentials: false + - name: Fail if Slack webhook secret is missing + env: + CHERRY_PICK_PRS_WEBHOOK: ${{ secrets.CHERRY_PICK_PRS_WEBHOOK }} + run: | + if [ -z "${CHERRY_PICK_PRS_WEBHOOK}" ]; then + echo "::error::CHERRY_PICK_PRS_WEBHOOK is not configured." + exit 1 + fi + - name: Build cherry-pick failure summary id: failure-summary env: - SOURCE_PR_NUMBER: ${{ needs.cherry-pick-to-latest-release.outputs.pr_number }} + SOURCE_PR_NUMBER: ${{ needs.resolve-cherry-pick-request.outputs.pr_number }} + MERGE_COMMIT_SHA: ${{ needs.resolve-cherry-pick-request.outputs.merge_commit_sha }} + GATE_ERROR: ${{ needs.resolve-cherry-pick-request.outputs.gate_error }} CHERRY_PICK_REASON: ${{ needs.cherry-pick-to-latest-release.outputs.cherry_pick_reason }} CHERRY_PICK_DETAILS: ${{ needs.cherry-pick-to-latest-release.outputs.cherry_pick_details }} run: | source_pr_url="https://github.com/${GITHUB_REPOSITORY}/pull/${SOURCE_PR_NUMBER}" reason_text="cherry-pick command failed" - if [ "${CHERRY_PICK_REASON}" = "merge-conflict" ]; then + if [ "${GATE_ERROR}" = "missing-merge-commit-sha" ]; then + reason_text="requested cherry-pick but merge commit SHA was missing" + elif [ "${GATE_ERROR}" = "not-allowed-merger" ]; then + reason_text="merger is not in the explicit cherry-pick allowlist" + elif [ "${CHERRY_PICK_REASON}" = "output-capture-failed" ]; then + reason_text="failed to capture cherry-pick output for classification" + elif [ "${CHERRY_PICK_REASON}" = "merge-conflict" ]; then reason_text="merge conflict during cherry-pick" fi details_excerpt="$(printf '%s' "${CHERRY_PICK_DETAILS}" | tail -n 8 | tr '\n' ' ' | sed "s/[[:space:]]\\+/ /g" | sed "s/\"/'/g" | cut -c1-350)" - failed_jobs="• cherry-pick-to-latest-release\\n• source PR: ${source_pr_url}\\n• reason: ${reason_text}" + if [ -n "${GATE_ERROR}" ]; then + failed_job_label="resolve-cherry-pick-request" + else + failed_job_label="cherry-pick-to-latest-release" + fi + details="• author: {mention}\\n• ${failed_job_label}\\n• source PR: ${source_pr_url}\\n• reason: ${reason_text}" + if [ -n "${MERGE_COMMIT_SHA}" ]; then + details="${details}\\n• merge SHA: ${MERGE_COMMIT_SHA}" + fi if [ -n "${details_excerpt}" ]; then - failed_jobs="${failed_jobs}\\n• excerpt: ${details_excerpt}" + details="${details}\\n• excerpt: ${details_excerpt}" fi - echo "jobs=${failed_jobs}" >> "$GITHUB_OUTPUT" + echo "details=${details}" >> "$GITHUB_OUTPUT" - name: Notify #cherry-pick-prs about cherry-pick failure uses: ./.github/actions/slack-notify with: webhook-url: ${{ secrets.CHERRY_PICK_PRS_WEBHOOK }} - failed-jobs: ${{ steps.failure-summary.outputs.jobs }} + mention: ${{ needs.resolve-cherry-pick-request.outputs.merged_by }} + details: ${{ steps.failure-summary.outputs.details }} title: "🚨 Automated Cherry-Pick Failed" - ref-name: ${{ github.ref_name }} + ref-name: ${{ github.event.pull_request.base.ref }} diff --git a/.github/workflows/pr-desktop-build.yml b/.github/workflows/pr-desktop-build.yml index 9bf0b3f3b96..284c56ab812 100644 --- a/.github/workflows/pr-desktop-build.yml +++ b/.github/workflows/pr-desktop-build.yml @@ -50,20 +50,20 @@ jobs: persist-credentials: false - name: Setup node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f with: node-version: 24 cache: "npm" # zizmor: ignore[cache-poisoning] cache-dependency-path: ./desktop/package-lock.json - name: Setup Rust - uses: dtolnay/rust-toolchain@4be9e76fd7c4901c61fb841f559994984270fce7 + uses: dtolnay/rust-toolchain@efa25f7f19611383d5b0ccf2d1c8914531636bf9 with: toolchain: stable targets: ${{ matrix.target }} - name: Cache Cargo registry and build - uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # zizmor: ignore[cache-poisoning] + uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # zizmor: ignore[cache-poisoning] with: path: | ~/.cargo/bin/ @@ -105,7 +105,7 @@ jobs: - name: Upload build artifacts if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f with: name: desktop-build-${{ matrix.platform }}-${{ github.run_id }} path: | diff --git a/.github/workflows/pr-external-dependency-unit-tests.yml b/.github/workflows/pr-external-dependency-unit-tests.yml index 673dbb5e200..7c5e4714162 100644 --- a/.github/workflows/pr-external-dependency-unit-tests.yml +++ b/.github/workflows/pr-external-dependency-unit-tests.yml @@ -7,6 +7,15 @@ on: merge_group: pull_request: branches: [main] + paths: + - "backend/**" + - "pyproject.toml" + - "uv.lock" + - ".github/workflows/pr-external-dependency-unit-tests.yml" + - ".github/actions/setup-python-and-install-dependencies/**" + - ".github/actions/setup-playwright/**" + - "deployment/docker_compose/docker-compose.yml" + - "deployment/docker_compose/docker-compose.dev.yml" push: tags: - "v*.*.*" @@ -160,7 +169,7 @@ jobs: cd deployment/docker_compose # Get list of running containers - containers=$(docker compose -f docker-compose.yml -f docker-compose.dev.yml -f docker-compose.opensearch.yml ps -q) + containers=$(docker compose -f docker-compose.yml -f docker-compose.dev.yml ps -q) # Collect logs from each container for container in $containers; do @@ -174,7 +183,7 @@ jobs: - name: Upload Docker logs if: failure() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f with: name: docker-logs-${{ matrix.test-dir }} path: docker-logs/ diff --git a/.github/workflows/pr-golang-tests.yml b/.github/workflows/pr-golang-tests.yml new file mode 100644 index 00000000000..3c6263fd51a --- /dev/null +++ b/.github/workflows/pr-golang-tests.yml @@ -0,0 +1,56 @@ +name: Golang Tests +concurrency: + group: Golang-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }} + cancel-in-progress: true + +on: + merge_group: + pull_request: + branches: + - main + - "release/**" + push: + tags: + - "v*.*.*" + +permissions: {} + +env: + GO_VERSION: "1.26" + +jobs: + detect-modules: + runs-on: ubuntu-latest + timeout-minutes: 10 + outputs: + modules: ${{ steps.set-modules.outputs.modules }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + with: + persist-credentials: false + - id: set-modules + run: echo "modules=$(find . -name 'go.mod' -exec dirname {} \; | jq -Rc '[.,inputs]')" >> "$GITHUB_OUTPUT" + + golang: + needs: detect-modules + runs-on: ubuntu-latest + timeout-minutes: 10 + strategy: + matrix: + modules: ${{ fromJSON(needs.detect-modules.outputs.modules) }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 + with: + persist-credentials: false + - uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # zizmor: ignore[cache-poisoning] + with: + go-version: ${{ env.GO_VERSION }} + cache-dependency-path: "**/go.sum" + + - run: go mod tidy + working-directory: ${{ matrix.modules }} + - run: git diff --exit-code go.mod go.sum + working-directory: ${{ matrix.modules }} + + - run: go test ./... + working-directory: ${{ matrix.modules }} diff --git a/.github/workflows/pr-helm-chart-testing.yml b/.github/workflows/pr-helm-chart-testing.yml index 3bd8f53d6d1..87da631633d 100644 --- a/.github/workflows/pr-helm-chart-testing.yml +++ b/.github/workflows/pr-helm-chart-testing.yml @@ -36,12 +36,12 @@ jobs: persist-credentials: false - name: Set up Helm - uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # ratchet:azure/setup-helm@v4.3.1 + uses: azure/setup-helm@dda3372f752e03dde6b3237bc9431cdc2f7a02a2 # ratchet:azure/setup-helm@v5.0.0 with: version: v3.19.0 - name: Set up chart-testing - uses: helm/chart-testing-action@b5eebdd9998021f29756c53432f48dab66394810 + uses: helm/chart-testing-action@2e2940618cb426dce2999631d543b53cdcfc8527 with: uv_version: "0.9.9" @@ -71,7 +71,7 @@ jobs: - name: Create kind cluster if: steps.list-changed.outputs.changed == 'true' - uses: helm/kind-action@92086f6be054225fa813e0a4b13787fc9088faab # ratchet:helm/kind-action@v1.13.0 + uses: helm/kind-action@ef37e7f390d99f746eb8b610417061a60e82a6cc # ratchet:helm/kind-action@v1.14.0 - name: Pre-install cluster status check if: steps.list-changed.outputs.changed == 'true' @@ -133,7 +133,7 @@ jobs: echo "=== Validating chart dependencies ===" cd deployment/helm/charts/onyx helm dependency update - helm lint . + helm lint . --set auth.userauth.values.user_auth_secret=placeholder - name: Run chart-testing (install) with enhanced monitoring timeout-minutes: 25 @@ -194,6 +194,7 @@ jobs: --set=vespa.enabled=false \ --set=opensearch.enabled=true \ --set=auth.opensearch.enabled=true \ + --set=auth.userauth.values.user_auth_secret=test-secret \ --set=slackbot.enabled=false \ --set=postgresql.enabled=true \ --set=postgresql.cluster.storage.storageClass=standard \ @@ -230,6 +231,10 @@ jobs: if: steps.list-changed.outputs.changed == 'true' run: | echo "=== Post-install verification ===" + if ! kubectl cluster-info >/dev/null 2>&1; then + echo "ERROR: Kubernetes cluster is not reachable after install" + exit 1 + fi kubectl get pods --all-namespaces kubectl get services --all-namespaces # Only show issues if they exist @@ -239,6 +244,10 @@ jobs: if: failure() && steps.list-changed.outputs.changed == 'true' run: | echo "=== Cleanup on failure ===" + if ! kubectl cluster-info >/dev/null 2>&1; then + echo "Skipping failure cleanup: Kubernetes cluster is not reachable" + exit 0 + fi echo "=== Final cluster state ===" kubectl get pods --all-namespaces kubectl get events --all-namespaces --sort-by=.lastTimestamp | tail -10 diff --git a/.github/workflows/pr-integration-tests.yml b/.github/workflows/pr-integration-tests.yml index 6797f3d03d8..93e153e6346 100644 --- a/.github/workflows/pr-integration-tests.yml +++ b/.github/workflows/pr-integration-tests.yml @@ -316,6 +316,7 @@ jobs: # Base config shared by both editions cat < deployment/docker_compose/.env COMPOSE_PROFILES=s3-filestore + OPENSEARCH_FOR_ONYX_ENABLED=false AUTH_TYPE=basic POSTGRES_POOL_PRE_PING=true POSTGRES_USE_NULL_POOL=true @@ -335,7 +336,6 @@ jobs: # TODO(Nik): https://linear.app/onyx-app/issue/ENG-1/update-test-infra-to-use-test-license LICENSE_ENFORCEMENT_ENABLED=false CHECK_TTL_MANAGEMENT_TASK_FREQUENCY_IN_HOURS=0.001 - USE_LIGHTWEIGHT_BACKGROUND_WORKER=false EOF fi @@ -419,6 +419,7 @@ jobs: -e POSTGRES_POOL_PRE_PING=true \ -e POSTGRES_USE_NULL_POOL=true \ -e VESPA_HOST=index \ + -e ENABLE_OPENSEARCH_INDEXING_FOR_ONYX=false \ -e REDIS_HOST=cache \ -e API_SERVER_HOST=api_server \ -e OPENAI_API_KEY=${OPENAI_API_KEY} \ @@ -465,19 +466,19 @@ jobs: - name: Upload logs if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f with: name: docker-all-logs-${{ matrix.edition }}-${{ matrix.test-dir.name }} path: ${{ github.workspace }}/docker-compose.log # ------------------------------------------------------------ - no-vectordb-tests: + onyx-lite-tests: needs: [build-backend-image, build-integration-image] runs-on: [ runs-on, runner=4cpu-linux-arm64, - "run-id=${{ github.run_id }}-no-vectordb-tests", + "run-id=${{ github.run_id }}-onyx-lite-tests", "extras=ecr-cache", ] timeout-minutes: 45 @@ -495,13 +496,12 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_TOKEN }} - - name: Create .env file for no-vectordb Docker Compose + - name: Create .env file for Onyx Lite Docker Compose env: ECR_CACHE: ${{ env.RUNS_ON_ECR_CACHE }} RUN_ID: ${{ github.run_id }} run: | cat < deployment/docker_compose/.env - COMPOSE_PROFILES=s3-filestore ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=true LICENSE_ENFORCEMENT_ENABLED=false AUTH_TYPE=basic @@ -509,28 +509,23 @@ jobs: POSTGRES_USE_NULL_POOL=true REQUIRE_EMAIL_VERIFICATION=false DISABLE_TELEMETRY=true - DISABLE_VECTOR_DB=true ONYX_BACKEND_IMAGE=${ECR_CACHE}:integration-test-backend-test-${RUN_ID} INTEGRATION_TESTS_MODE=true - USE_LIGHTWEIGHT_BACKGROUND_WORKER=true EOF - # Start only the services needed for no-vectordb mode (no Vespa, no model servers) - - name: Start Docker containers (no-vectordb) + # Start only the services needed for Onyx Lite (Postgres + API server) + - name: Start Docker containers (onyx-lite) run: | cd deployment/docker_compose - docker compose -f docker-compose.yml -f docker-compose.no-vectordb.yml -f docker-compose.dev.yml up \ + docker compose -f docker-compose.yml -f docker-compose.onyx-lite.yml -f docker-compose.dev.yml up \ relational_db \ - cache \ - minio \ api_server \ - background \ -d - id: start_docker_no_vectordb + id: start_docker_onyx_lite - name: Wait for services to be ready run: | - echo "Starting wait-for-service script (no-vectordb)..." + echo "Starting wait-for-service script (onyx-lite)..." start_time=$(date +%s) timeout=300 while true; do @@ -552,14 +547,14 @@ jobs: sleep 5 done - - name: Run No-VectorDB Integration Tests + - name: Run Onyx Lite Integration Tests uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # ratchet:nick-fields/retry@v3 with: timeout_minutes: 20 max_attempts: 3 retry_wait_seconds: 10 command: | - echo "Running no-vectordb integration tests..." + echo "Running onyx-lite integration tests..." docker run --rm --network onyx_default \ --name test-runner \ -e POSTGRES_HOST=relational_db \ @@ -570,39 +565,38 @@ jobs: -e DB_READONLY_PASSWORD=password \ -e POSTGRES_POOL_PRE_PING=true \ -e POSTGRES_USE_NULL_POOL=true \ - -e REDIS_HOST=cache \ -e API_SERVER_HOST=api_server \ -e OPENAI_API_KEY=${OPENAI_API_KEY} \ -e TEST_WEB_HOSTNAME=test-runner \ ${{ env.RUNS_ON_ECR_CACHE }}:integration-test-${{ github.run_id }} \ /app/tests/integration/tests/no_vectordb - - name: Dump API server logs (no-vectordb) + - name: Dump API server logs (onyx-lite) if: always() run: | cd deployment/docker_compose - docker compose -f docker-compose.yml -f docker-compose.no-vectordb.yml -f docker-compose.dev.yml \ - logs --no-color api_server > $GITHUB_WORKSPACE/api_server_no_vectordb.log || true + docker compose -f docker-compose.yml -f docker-compose.onyx-lite.yml -f docker-compose.dev.yml \ + logs --no-color api_server > $GITHUB_WORKSPACE/api_server_onyx_lite.log || true - - name: Dump all-container logs (no-vectordb) + - name: Dump all-container logs (onyx-lite) if: always() run: | cd deployment/docker_compose - docker compose -f docker-compose.yml -f docker-compose.no-vectordb.yml -f docker-compose.dev.yml \ - logs --no-color > $GITHUB_WORKSPACE/docker-compose-no-vectordb.log || true + docker compose -f docker-compose.yml -f docker-compose.onyx-lite.yml -f docker-compose.dev.yml \ + logs --no-color > $GITHUB_WORKSPACE/docker-compose-onyx-lite.log || true - - name: Upload logs (no-vectordb) + - name: Upload logs (onyx-lite) if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f with: - name: docker-all-logs-no-vectordb - path: ${{ github.workspace }}/docker-compose-no-vectordb.log + name: docker-all-logs-onyx-lite + path: ${{ github.workspace }}/docker-compose-onyx-lite.log - - name: Stop Docker containers (no-vectordb) + - name: Stop Docker containers (onyx-lite) if: always() run: | cd deployment/docker_compose - docker compose -f docker-compose.yml -f docker-compose.no-vectordb.yml -f docker-compose.dev.yml down -v + docker compose -f docker-compose.yml -f docker-compose.onyx-lite.yml -f docker-compose.dev.yml down -v multitenant-tests: needs: @@ -645,6 +639,7 @@ jobs: ONYX_BACKEND_IMAGE=${ECR_CACHE}:integration-test-backend-test-${RUN_ID} \ ONYX_MODEL_SERVER_IMAGE=${ECR_CACHE}:integration-test-model-server-test-${RUN_ID} \ DEV_MODE=true \ + OPENSEARCH_FOR_ONYX_ENABLED=false \ docker compose -f docker-compose.multitenant-dev.yml up \ relational_db \ index \ @@ -699,6 +694,7 @@ jobs: -e POSTGRES_DB=postgres \ -e POSTGRES_USE_NULL_POOL=true \ -e VESPA_HOST=index \ + -e ENABLE_OPENSEARCH_INDEXING_FOR_ONYX=false \ -e REDIS_HOST=cache \ -e API_SERVER_HOST=api_server \ -e OPENAI_API_KEY=${OPENAI_API_KEY} \ @@ -729,7 +725,7 @@ jobs: - name: Upload logs (multi-tenant) if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f with: name: docker-all-logs-multitenant path: ${{ github.workspace }}/docker-compose-multitenant.log @@ -744,7 +740,7 @@ jobs: # NOTE: Github-hosted runners have about 20s faster queue times and are preferred here. runs-on: ubuntu-slim timeout-minutes: 45 - needs: [integration-tests, no-vectordb-tests, multitenant-tests] + needs: [integration-tests, onyx-lite-tests, multitenant-tests] if: ${{ always() }} steps: - name: Check job status diff --git a/.github/workflows/pr-jest-tests.yml b/.github/workflows/pr-jest-tests.yml index e7fa59d117b..924d65f6997 100644 --- a/.github/workflows/pr-jest-tests.yml +++ b/.github/workflows/pr-jest-tests.yml @@ -28,10 +28,10 @@ jobs: persist-credentials: false - name: Setup node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # ratchet:actions/setup-node@v4 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # ratchet:actions/setup-node@v4 with: node-version: 22 - cache: "npm" + cache: "npm" # zizmor: ignore[cache-poisoning] test-only workflow; no deploy artifacts cache-dependency-path: ./web/package-lock.json - name: Install node dependencies @@ -44,7 +44,7 @@ jobs: - name: Upload coverage reports if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f with: name: jest-coverage-${{ github.run_id }} path: ./web/coverage diff --git a/.github/workflows/pr-playwright-tests.yml b/.github/workflows/pr-playwright-tests.yml index 6abaad2a525..f41f3f05a20 100644 --- a/.github/workflows/pr-playwright-tests.yml +++ b/.github/workflows/pr-playwright-tests.yml @@ -12,6 +12,9 @@ on: push: tags: - "v*.*.*" + # TODO: Remove this if we enable merge-queues for release branches. + branches: + - "release/**" permissions: contents: read @@ -268,10 +271,11 @@ jobs: persist-credentials: false - name: Setup node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # ratchet:actions/setup-node@v4 + # zizmor: ignore[cache-poisoning] ephemeral runners; no release artifacts + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # ratchet:actions/setup-node@v4 with: node-version: 22 - cache: "npm" + cache: "npm" # zizmor: ignore[cache-poisoning] cache-dependency-path: ./web/package-lock.json - name: Install node dependencies @@ -279,7 +283,8 @@ jobs: run: npm ci - name: Cache playwright cache - uses: runs-on/cache@50350ad4242587b6c8c2baa2e740b1bc11285ff4 # ratchet:runs-on/cache@v4 + # zizmor: ignore[cache-poisoning] ephemeral runners; no release artifacts + uses: runs-on/cache@a5f51d6f3fece787d03b7b4e981c82538a0654ed # ratchet:runs-on/cache@v4 with: path: ~/.cache/ms-playwright key: ${{ runner.os }}-playwright-npm-${{ hashFiles('web/package-lock.json') }} @@ -440,7 +445,7 @@ jobs: run: | npx playwright test --project ${PROJECT} - - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f if: always() with: # Includes test results and trace.zip files @@ -449,7 +454,7 @@ jobs: retention-days: 30 - name: Upload screenshots - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f if: always() with: name: playwright-screenshots-${{ matrix.project }}-${{ github.run_id }} @@ -459,14 +464,14 @@ jobs: # --- Visual Regression Diff --- - name: Configure AWS credentials if: always() - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 - name: Install the latest version of uv if: always() - uses: astral-sh/setup-uv@61cb8a9741eeb8a550a1b8544337180c0fc8476b # ratchet:astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # ratchet:astral-sh/setup-uv@v7 with: enable-cache: false version: "0.9.9" @@ -529,7 +534,7 @@ jobs: "s3://${PLAYWRIGHT_S3_BUCKET}/reports/pr-${PR_NUMBER}/${RUN_ID}/${PROJECT}/" - name: Upload visual diff summary - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f if: always() with: name: screenshot-diff-summary-${{ matrix.project }} @@ -538,7 +543,7 @@ jobs: retention-days: 5 - name: Upload visual diff report artifact - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f if: always() with: name: screenshot-diff-report-${{ matrix.project }}-${{ github.run_id }} @@ -585,11 +590,113 @@ jobs: - name: Upload logs if: success() || failure() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f with: name: docker-logs-${{ matrix.project }}-${{ github.run_id }} path: ${{ github.workspace }}/docker-compose.log + playwright-tests-lite: + needs: [build-web-image, build-backend-image] + name: Playwright Tests (lite) + runs-on: + - runs-on + - runner=4cpu-linux-arm64 + - "run-id=${{ github.run_id }}-playwright-tests-lite" + - "extras=ecr-cache" + timeout-minutes: 30 + steps: + - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 + + - name: Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 + with: + persist-credentials: false + + - name: Setup node + # zizmor: ignore[cache-poisoning] ephemeral runners; no release artifacts + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # ratchet:actions/setup-node@v4 + with: + node-version: 22 + cache: "npm" # zizmor: ignore[cache-poisoning] + cache-dependency-path: ./web/package-lock.json + + - name: Install node dependencies + working-directory: ./web + run: npm ci + + - name: Cache playwright cache + # zizmor: ignore[cache-poisoning] ephemeral runners; no release artifacts + uses: runs-on/cache@a5f51d6f3fece787d03b7b4e981c82538a0654ed # ratchet:runs-on/cache@v4 + with: + path: ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-npm-${{ hashFiles('web/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-playwright-npm- + + - name: Install playwright browsers + working-directory: ./web + run: npx playwright install --with-deps + + - name: Create .env file for Docker Compose + env: + OPENAI_API_KEY_VALUE: ${{ env.OPENAI_API_KEY }} + ECR_CACHE: ${{ env.RUNS_ON_ECR_CACHE }} + RUN_ID: ${{ github.run_id }} + run: | + cat < deployment/docker_compose/.env + ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=true + LICENSE_ENFORCEMENT_ENABLED=false + AUTH_TYPE=basic + INTEGRATION_TESTS_MODE=true + GEN_AI_API_KEY=${OPENAI_API_KEY_VALUE} + MOCK_LLM_RESPONSE=true + REQUIRE_EMAIL_VERIFICATION=false + DISABLE_TELEMETRY=true + ONYX_BACKEND_IMAGE=${ECR_CACHE}:playwright-test-backend-${RUN_ID} + ONYX_WEB_SERVER_IMAGE=${ECR_CACHE}:playwright-test-web-${RUN_ID} + EOF + + # needed for pulling external images otherwise, we hit the "Unauthenticated users" limit + # https://docs.docker.com/docker-hub/usage/ + - name: Login to Docker Hub + uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # ratchet:docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_TOKEN }} + + - name: Start Docker containers (lite) + run: | + cd deployment/docker_compose + docker compose -f docker-compose.yml -f docker-compose.onyx-lite.yml -f docker-compose.dev.yml up -d + id: start_docker + + - name: Run Playwright tests (lite) + working-directory: ./web + run: npx playwright test --project lite + + - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f + if: always() + with: + name: playwright-test-results-lite-${{ github.run_id }} + path: ./web/output/playwright/ + retention-days: 30 + + - name: Save Docker logs + if: success() || failure() + env: + WORKSPACE: ${{ github.workspace }} + run: | + cd deployment/docker_compose + docker compose logs > docker-compose.log + mv docker-compose.log ${WORKSPACE}/docker-compose.log + + - name: Upload logs + if: success() || failure() + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f + with: + name: docker-logs-lite-${{ github.run_id }} + path: ${{ github.workspace }}/docker-compose.log + # Post a single combined visual regression comment after all matrix jobs finish visual-regression-comment: needs: [playwright-tests] @@ -603,7 +710,7 @@ jobs: pull-requests: write steps: - name: Download visual diff summaries - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 + uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 with: pattern: screenshot-diff-summary-* path: summaries/ @@ -686,7 +793,7 @@ jobs: # NOTE: Github-hosted runners have about 20s faster queue times and are preferred here. runs-on: ubuntu-slim timeout-minutes: 45 - needs: [playwright-tests] + needs: [playwright-tests, playwright-tests-lite] if: ${{ always() }} steps: - name: Check job status diff --git a/.github/workflows/pr-python-checks.yml b/.github/workflows/pr-python-checks.yml index a9f95d985af..fc7931d06fd 100644 --- a/.github/workflows/pr-python-checks.yml +++ b/.github/workflows/pr-python-checks.yml @@ -8,7 +8,7 @@ on: pull_request: branches: - main - - 'release/**' + - "release/**" push: tags: - "v*.*.*" @@ -21,7 +21,13 @@ jobs: # See https://runs-on.com/runners/linux/ # Note: Mypy seems quite optimized for x64 compared to arm64. # Similarly, mypy is single-threaded and incremental, so 2cpu is sufficient. - runs-on: [runs-on, runner=2cpu-linux-x64, "run-id=${{ github.run_id }}-mypy-check", "extras=s3-cache"] + runs-on: + [ + runs-on, + runner=2cpu-linux-x64, + "run-id=${{ github.run_id }}-mypy-check", + "extras=s3-cache", + ] timeout-minutes: 45 steps: @@ -50,23 +56,16 @@ jobs: - name: Cache mypy cache if: ${{ vars.DISABLE_MYPY_CACHE != 'true' }} - uses: runs-on/cache@50350ad4242587b6c8c2baa2e740b1bc11285ff4 # ratchet:runs-on/cache@v4 + uses: runs-on/cache@a5f51d6f3fece787d03b7b4e981c82538a0654ed # ratchet:runs-on/cache@v4 with: - path: backend/.mypy_cache - key: mypy-${{ runner.os }}-${{ github.base_ref || github.event.merge_group.base_ref || 'main' }}-${{ hashFiles('**/*.py', '**/*.pyi', 'backend/pyproject.toml') }} + path: .mypy_cache + key: mypy-${{ runner.os }}-${{ github.base_ref || github.event.merge_group.base_ref || 'main' }}-${{ hashFiles('**/*.py', '**/*.pyi', 'pyproject.toml') }} restore-keys: | mypy-${{ runner.os }}-${{ github.base_ref || github.event.merge_group.base_ref || 'main' }}- mypy-${{ runner.os }}- - name: Run MyPy - working-directory: ./backend env: MYPY_FORCE_COLOR: 1 TERM: xterm-256color run: mypy . - - - name: Run MyPy (tools/) - env: - MYPY_FORCE_COLOR: 1 - TERM: xterm-256color - run: mypy tools/ diff --git a/.github/workflows/pr-python-connector-tests.yml b/.github/workflows/pr-python-connector-tests.yml index a8c5647a871..d8f2508d312 100644 --- a/.github/workflows/pr-python-connector-tests.yml +++ b/.github/workflows/pr-python-connector-tests.yml @@ -7,6 +7,13 @@ on: merge_group: pull_request: branches: [main] + paths: + - "backend/**" + - "pyproject.toml" + - "uv.lock" + - ".github/workflows/pr-python-connector-tests.yml" + - ".github/actions/setup-python-and-install-dependencies/**" + - ".github/actions/setup-playwright/**" push: tags: - "v*.*.*" @@ -15,132 +22,40 @@ on: - cron: "0 16 * * *" permissions: + id-token: write # Required for OIDC-based AWS credential exchange contents: read env: - # AWS - AWS_ACCESS_KEY_ID_DAILY_CONNECTOR_TESTS: ${{ secrets.AWS_ACCESS_KEY_ID_DAILY_CONNECTOR_TESTS }} - AWS_SECRET_ACCESS_KEY_DAILY_CONNECTOR_TESTS: ${{ secrets.AWS_SECRET_ACCESS_KEY_DAILY_CONNECTOR_TESTS }} - - # Cloudflare R2 + PYTHONPATH: ./backend + DISABLE_TELEMETRY: "true" R2_ACCOUNT_ID_DAILY_CONNECTOR_TESTS: ${{ vars.R2_ACCOUNT_ID_DAILY_CONNECTOR_TESTS }} - R2_ACCESS_KEY_ID_DAILY_CONNECTOR_TESTS: ${{ secrets.R2_ACCESS_KEY_ID_DAILY_CONNECTOR_TESTS }} - R2_SECRET_ACCESS_KEY_DAILY_CONNECTOR_TESTS: ${{ secrets.R2_SECRET_ACCESS_KEY_DAILY_CONNECTOR_TESTS }} - - # Google Cloud Storage - GCS_ACCESS_KEY_ID_DAILY_CONNECTOR_TESTS: ${{ secrets.GCS_ACCESS_KEY_ID_DAILY_CONNECTOR_TESTS }} - GCS_SECRET_ACCESS_KEY_DAILY_CONNECTOR_TESTS: ${{ secrets.GCS_SECRET_ACCESS_KEY_DAILY_CONNECTOR_TESTS }} - - # Confluence CONFLUENCE_TEST_SPACE_URL: ${{ vars.CONFLUENCE_TEST_SPACE_URL }} CONFLUENCE_TEST_SPACE: ${{ vars.CONFLUENCE_TEST_SPACE }} - CONFLUENCE_TEST_PAGE_ID: ${{ secrets.CONFLUENCE_TEST_PAGE_ID }} CONFLUENCE_USER_NAME: ${{ vars.CONFLUENCE_USER_NAME }} - CONFLUENCE_ACCESS_TOKEN: ${{ secrets.CONFLUENCE_ACCESS_TOKEN }} - CONFLUENCE_ACCESS_TOKEN_SCOPED: ${{ secrets.CONFLUENCE_ACCESS_TOKEN_SCOPED }} - - # Jira - JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} - JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }} - JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} - JIRA_API_TOKEN_SCOPED: ${{ secrets.JIRA_API_TOKEN_SCOPED }} - - # Gong - GONG_ACCESS_KEY: ${{ secrets.GONG_ACCESS_KEY }} - GONG_ACCESS_KEY_SECRET: ${{ secrets.GONG_ACCESS_KEY_SECRET }} - - # Google - GOOGLE_DRIVE_SERVICE_ACCOUNT_JSON_STR: ${{ secrets.GOOGLE_DRIVE_SERVICE_ACCOUNT_JSON_STR }} - GOOGLE_DRIVE_OAUTH_CREDENTIALS_JSON_STR_TEST_USER_1: ${{ secrets.GOOGLE_DRIVE_OAUTH_CREDENTIALS_JSON_STR_TEST_USER_1 }} - GOOGLE_DRIVE_OAUTH_CREDENTIALS_JSON_STR: ${{ secrets.GOOGLE_DRIVE_OAUTH_CREDENTIALS_JSON_STR }} - GOOGLE_GMAIL_SERVICE_ACCOUNT_JSON_STR: ${{ secrets.GOOGLE_GMAIL_SERVICE_ACCOUNT_JSON_STR }} - GOOGLE_GMAIL_OAUTH_CREDENTIALS_JSON_STR: ${{ secrets.GOOGLE_GMAIL_OAUTH_CREDENTIALS_JSON_STR }} - - # Slab - SLAB_BOT_TOKEN: ${{ secrets.SLAB_BOT_TOKEN }} - - # Zendesk - ZENDESK_SUBDOMAIN: ${{ secrets.ZENDESK_SUBDOMAIN }} - ZENDESK_EMAIL: ${{ secrets.ZENDESK_EMAIL }} - ZENDESK_TOKEN: ${{ secrets.ZENDESK_TOKEN }} - - # Salesforce SF_USERNAME: ${{ vars.SF_USERNAME }} - SF_PASSWORD: ${{ secrets.SF_PASSWORD }} - SF_SECURITY_TOKEN: ${{ secrets.SF_SECURITY_TOKEN }} - - # Hubspot - HUBSPOT_ACCESS_TOKEN: ${{ secrets.HUBSPOT_ACCESS_TOKEN }} - - # IMAP IMAP_HOST: ${{ vars.IMAP_HOST }} IMAP_USERNAME: ${{ vars.IMAP_USERNAME }} - IMAP_PASSWORD: ${{ secrets.IMAP_PASSWORD }} IMAP_MAILBOXES: ${{ vars.IMAP_MAILBOXES }} - - # Airtable AIRTABLE_TEST_BASE_ID: ${{ vars.AIRTABLE_TEST_BASE_ID }} AIRTABLE_TEST_TABLE_ID: ${{ vars.AIRTABLE_TEST_TABLE_ID }} AIRTABLE_TEST_TABLE_NAME: ${{ vars.AIRTABLE_TEST_TABLE_NAME }} - AIRTABLE_ACCESS_TOKEN: ${{ secrets.AIRTABLE_ACCESS_TOKEN }} - - # Sharepoint SHAREPOINT_CLIENT_ID: ${{ vars.SHAREPOINT_CLIENT_ID }} - SHAREPOINT_CLIENT_SECRET: ${{ secrets.SHAREPOINT_CLIENT_SECRET }} SHAREPOINT_CLIENT_DIRECTORY_ID: ${{ vars.SHAREPOINT_CLIENT_DIRECTORY_ID }} SHAREPOINT_SITE: ${{ vars.SHAREPOINT_SITE }} - PERM_SYNC_SHAREPOINT_CLIENT_ID: ${{ secrets.PERM_SYNC_SHAREPOINT_CLIENT_ID }} - PERM_SYNC_SHAREPOINT_PRIVATE_KEY: ${{ secrets.PERM_SYNC_SHAREPOINT_PRIVATE_KEY }} - PERM_SYNC_SHAREPOINT_CERTIFICATE_PASSWORD: ${{ secrets.PERM_SYNC_SHAREPOINT_CERTIFICATE_PASSWORD }} - PERM_SYNC_SHAREPOINT_DIRECTORY_ID: ${{ secrets.PERM_SYNC_SHAREPOINT_DIRECTORY_ID }} - - # Github - ACCESS_TOKEN_GITHUB: ${{ secrets.ACCESS_TOKEN_GITHUB }} - - # Gitlab - GITLAB_ACCESS_TOKEN: ${{ secrets.GITLAB_ACCESS_TOKEN }} - - # Gitbook - GITBOOK_SPACE_ID: ${{ secrets.GITBOOK_SPACE_ID }} - GITBOOK_API_KEY: ${{ secrets.GITBOOK_API_KEY }} - - # Notion - NOTION_INTEGRATION_TOKEN: ${{ secrets.NOTION_INTEGRATION_TOKEN }} - - # Highspot - HIGHSPOT_KEY: ${{ secrets.HIGHSPOT_KEY }} - HIGHSPOT_SECRET: ${{ secrets.HIGHSPOT_SECRET }} - - # Slack - SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} - - # Discord - DISCORD_CONNECTOR_BOT_TOKEN: ${{ secrets.DISCORD_CONNECTOR_BOT_TOKEN }} - - # Teams - TEAMS_APPLICATION_ID: ${{ secrets.TEAMS_APPLICATION_ID }} - TEAMS_DIRECTORY_ID: ${{ secrets.TEAMS_DIRECTORY_ID }} - TEAMS_SECRET: ${{ secrets.TEAMS_SECRET }} - - # Bitbucket - BITBUCKET_WORKSPACE: ${{ secrets.BITBUCKET_WORKSPACE }} - BITBUCKET_REPOSITORIES: ${{ secrets.BITBUCKET_REPOSITORIES }} - BITBUCKET_PROJECTS: ${{ secrets.BITBUCKET_PROJECTS }} BITBUCKET_EMAIL: ${{ vars.BITBUCKET_EMAIL }} - BITBUCKET_API_TOKEN: ${{ secrets.BITBUCKET_API_TOKEN }} - - # Fireflies - FIREFLIES_API_KEY: ${{ secrets.FIREFLIES_API_KEY }} jobs: connectors-check: # See https://runs-on.com/runners/linux/ - runs-on: [runs-on, runner=8cpu-linux-x64, "run-id=${{ github.run_id }}-connectors-check", "extras=s3-cache"] + runs-on: + [ + runs-on, + runner=8cpu-linux-x64, + "run-id=${{ github.run_id }}-connectors-check", + "extras=s3-cache", + ] timeout-minutes: 45 - - env: - PYTHONPATH: ./backend - DISABLE_TELEMETRY: "true" + environment: ci-protected steps: - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 @@ -181,6 +96,66 @@ jobs: - 'backend/onyx/file_processing/**' - 'uv.lock' + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # ratchet:aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} + aws-region: us-east-2 + + - name: Get connector test secrets from AWS Secrets Manager + uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 # ratchet:aws-actions/aws-secretsmanager-get-secrets@v2 + with: + parse-json-secrets: false + secret-ids: | + AWS_ACCESS_KEY_ID_DAILY_CONNECTOR_TESTS, test/aws-access-key-id + AWS_SECRET_ACCESS_KEY_DAILY_CONNECTOR_TESTS, test/aws-secret-access-key + R2_ACCESS_KEY_ID_DAILY_CONNECTOR_TESTS, test/r2-access-key-id + R2_SECRET_ACCESS_KEY_DAILY_CONNECTOR_TESTS, test/r2-secret-access-key + GCS_ACCESS_KEY_ID_DAILY_CONNECTOR_TESTS, test/gcs-access-key-id + GCS_SECRET_ACCESS_KEY_DAILY_CONNECTOR_TESTS, test/gcs-secret-access-key + CONFLUENCE_ACCESS_TOKEN, test/confluence-access-token + CONFLUENCE_ACCESS_TOKEN_SCOPED, test/confluence-access-token-scoped + JIRA_BASE_URL, test/jira-base-url + JIRA_USER_EMAIL, test/jira-user-email + JIRA_API_TOKEN, test/jira-api-token + JIRA_API_TOKEN_SCOPED, test/jira-api-token-scoped + GONG_ACCESS_KEY, test/gong-access-key + GONG_ACCESS_KEY_SECRET, test/gong-access-key-secret + GOOGLE_DRIVE_SERVICE_ACCOUNT_JSON_STR, test/google-drive-service-account-json + GOOGLE_DRIVE_OAUTH_CREDENTIALS_JSON_STR_TEST_USER_1, test/google-drive-oauth-creds-test-user-1 + GOOGLE_DRIVE_OAUTH_CREDENTIALS_JSON_STR, test/google-drive-oauth-creds + GOOGLE_GMAIL_SERVICE_ACCOUNT_JSON_STR, test/google-gmail-service-account-json + GOOGLE_GMAIL_OAUTH_CREDENTIALS_JSON_STR, test/google-gmail-oauth-creds + SLAB_BOT_TOKEN, test/slab-bot-token + ZENDESK_SUBDOMAIN, test/zendesk-subdomain + ZENDESK_EMAIL, test/zendesk-email + ZENDESK_TOKEN, test/zendesk-token + SF_PASSWORD, test/sf-password + SF_SECURITY_TOKEN, test/sf-security-token + HUBSPOT_ACCESS_TOKEN, test/hubspot-access-token + IMAP_PASSWORD, test/imap-password + AIRTABLE_ACCESS_TOKEN, test/airtable-access-token + SHAREPOINT_CLIENT_SECRET, test/sharepoint-client-secret + PERM_SYNC_SHAREPOINT_CLIENT_ID, test/perm-sync-sharepoint-client-id + PERM_SYNC_SHAREPOINT_PRIVATE_KEY, test/perm-sync-sharepoint-private-key + PERM_SYNC_SHAREPOINT_CERTIFICATE_PASSWORD, test/perm-sync-sharepoint-cert-password + PERM_SYNC_SHAREPOINT_DIRECTORY_ID, test/perm-sync-sharepoint-directory-id + ACCESS_TOKEN_GITHUB, test/github-access-token + GITLAB_ACCESS_TOKEN, test/gitlab-access-token + GITBOOK_SPACE_ID, test/gitbook-space-id + GITBOOK_API_KEY, test/gitbook-api-key + NOTION_INTEGRATION_TOKEN, test/notion-integration-token + HIGHSPOT_KEY, test/highspot-key + HIGHSPOT_SECRET, test/highspot-secret + SLACK_BOT_TOKEN, test/slack-bot-token + DISCORD_CONNECTOR_BOT_TOKEN, test/discord-bot-token + TEAMS_APPLICATION_ID, test/teams-application-id + TEAMS_DIRECTORY_ID, test/teams-directory-id + TEAMS_SECRET, test/teams-secret + BITBUCKET_WORKSPACE, test/bitbucket-workspace + BITBUCKET_API_TOKEN, test/bitbucket-api-token + FIREFLIES_API_KEY, test/fireflies-api-key + - name: Run Tests (excluding HubSpot, Salesforce, GitHub, and Coda) shell: script -q -e -c "bash --noprofile --norc -eo pipefail {0}" run: | diff --git a/.github/workflows/pr-python-model-tests.yml b/.github/workflows/pr-python-model-tests.yml index fb6cd790ac3..450714d500d 100644 --- a/.github/workflows/pr-python-model-tests.yml +++ b/.github/workflows/pr-python-model-tests.yml @@ -31,6 +31,7 @@ jobs: - runner=4cpu-linux-arm64 - "run-id=${{ github.run_id }}-model-check" - "extras=ecr-cache" + environment: ci-protected timeout-minutes: 45 env: @@ -73,7 +74,7 @@ jobs: uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f - name: Build and load - uses: docker/bake-action@5be5f02ff8819ecd3092ea6b2e6261c31774f2b4 # ratchet:docker/bake-action@v6 + uses: docker/bake-action@82490499d2e5613fcead7e128237ef0b0ea210f7 # ratchet:docker/bake-action@v7.0.0 env: TAG: model-server-${{ github.run_id }} with: @@ -122,7 +123,7 @@ jobs: - name: Upload logs if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f with: name: docker-all-logs path: ${{ github.workspace }}/docker-compose.log diff --git a/.github/workflows/pr-quality-checks.yml b/.github/workflows/pr-quality-checks.yml index ac9a9bd36f5..58d310af28f 100644 --- a/.github/workflows/pr-quality-checks.yml +++ b/.github/workflows/pr-quality-checks.yml @@ -28,9 +28,9 @@ jobs: with: python-version: "3.11" - name: Setup Terraform - uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd # ratchet:hashicorp/setup-terraform@v3 + uses: hashicorp/setup-terraform@5e8dbf3c6d9deaf4193ca7a8fb23f2ac83bb6c85 # ratchet:hashicorp/setup-terraform@v4.0.0 - name: Setup node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # ratchet:actions/setup-node@v6 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # ratchet:actions/setup-node@v6 with: # zizmor: ignore[cache-poisoning] node-version: 22 cache: "npm" @@ -38,9 +38,9 @@ jobs: - name: Install node dependencies working-directory: ./web run: npm ci - - uses: j178/prek-action@9d6a3097e0c1865ecce00cfb89fe80f2ee91b547 # ratchet:j178/prek-action@v1 + - uses: j178/prek-action@0bb87d7f00b0c99306c8bcb8b8beba1eb581c037 # ratchet:j178/prek-action@v1 with: - prek-version: '0.2.21' + prek-version: '0.3.4' extra-args: ${{ github.event_name == 'pull_request' && format('--from-ref {0} --to-ref {1}', github.event.pull_request.base.sha, github.event.pull_request.head.sha) || github.event_name == 'merge_group' && format('--from-ref {0} --to-ref {1}', github.event.merge_group.base_sha, github.event.merge_group.head_sha) || github.ref_name == 'main' && '--all-files' || '' }} - name: Check Actions uses: giner/check-actions@28d366c7cbbe235f9624a88aa31a628167eee28c # ratchet:giner/check-actions@v1.0.1 diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml index 92358a91186..dbbeecda301 100644 --- a/.github/workflows/preview.yml +++ b/.github/workflows/preview.yml @@ -22,7 +22,7 @@ jobs: persist-credentials: false - name: Setup node - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # ratchet:actions/setup-node@v4 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # ratchet:actions/setup-node@v4 with: node-version: 22 cache: "npm" diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml new file mode 100644 index 00000000000..32263e12bf5 --- /dev/null +++ b/.github/workflows/release-cli.yml @@ -0,0 +1,207 @@ +name: Release CLI + +on: + push: + tags: + - "cli/v*.*.*" + +jobs: + pypi: + runs-on: ubuntu-latest + environment: + name: release-cli + permissions: + id-token: write + timeout-minutes: 10 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 + with: + persist-credentials: false + - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # ratchet:astral-sh/setup-uv@v7 + with: + enable-cache: false + version: "0.9.9" + - run: | + for goos in linux windows darwin; do + for goarch in amd64 arm64; do + GOOS="$goos" GOARCH="$goarch" uv build --wheel + done + done + working-directory: cli + - run: uv publish + working-directory: cli + + docker-amd64: + runs-on: + - runs-on + - runner=2cpu-linux-x64 + - run-id=${{ github.run_id }}-cli-amd64 + - extras=ecr-cache + environment: deploy + permissions: + id-token: write + timeout-minutes: 30 + outputs: + digest: ${{ steps.build.outputs.digest }} + env: + REGISTRY_IMAGE: onyxdotapp/onyx-cli + steps: + - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 + + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 + with: + persist-credentials: false + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # ratchet:aws-actions/configure-aws-credentials@v6.0.0 + with: + role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} + aws-region: us-east-2 + + - name: Get AWS Secrets + uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 # ratchet:aws-actions/aws-secretsmanager-get-secrets@v2.0.10 + with: + secret-ids: | + DOCKER_USERNAME, deploy/docker-username + DOCKER_TOKEN, deploy/docker-token + parse-json-secrets: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # ratchet:docker/setup-buildx-action@v4 + + - name: Login to Docker Hub + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # ratchet:docker/login-action@v4 + with: + username: ${{ env.DOCKER_USERNAME }} + password: ${{ env.DOCKER_TOKEN }} + + - name: Build and push AMD64 + id: build + uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # ratchet:docker/build-push-action@v7 + with: + context: ./cli + file: ./cli/Dockerfile + platforms: linux/amd64 + cache-from: type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest + cache-to: type=inline + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + + docker-arm64: + runs-on: + - runs-on + - runner=2cpu-linux-arm64 + - run-id=${{ github.run_id }}-cli-arm64 + - extras=ecr-cache + environment: deploy + permissions: + id-token: write + timeout-minutes: 30 + outputs: + digest: ${{ steps.build.outputs.digest }} + env: + REGISTRY_IMAGE: onyxdotapp/onyx-cli + steps: + - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 + + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 + with: + persist-credentials: false + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # ratchet:aws-actions/configure-aws-credentials@v6.0.0 + with: + role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} + aws-region: us-east-2 + + - name: Get AWS Secrets + uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 # ratchet:aws-actions/aws-secretsmanager-get-secrets@v2.0.10 + with: + secret-ids: | + DOCKER_USERNAME, deploy/docker-username + DOCKER_TOKEN, deploy/docker-token + parse-json-secrets: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # ratchet:docker/setup-buildx-action@v4 + + - name: Login to Docker Hub + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # ratchet:docker/login-action@v4 + with: + username: ${{ env.DOCKER_USERNAME }} + password: ${{ env.DOCKER_TOKEN }} + + - name: Build and push ARM64 + id: build + uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # ratchet:docker/build-push-action@v7 + with: + context: ./cli + file: ./cli/Dockerfile + platforms: linux/arm64 + cache-from: type=registry,ref=${{ env.REGISTRY_IMAGE }}:latest + cache-to: type=inline + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + + merge-docker: + needs: + - docker-amd64 + - docker-arm64 + runs-on: + - runs-on + - runner=2cpu-linux-x64 + - run-id=${{ github.run_id }}-cli-merge + environment: deploy + permissions: + id-token: write + timeout-minutes: 10 + env: + REGISTRY_IMAGE: onyxdotapp/onyx-cli + steps: + - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # ratchet:aws-actions/configure-aws-credentials@v6.0.0 + with: + role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} + aws-region: us-east-2 + + - name: Get AWS Secrets + uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 # ratchet:aws-actions/aws-secretsmanager-get-secrets@v2.0.10 + with: + secret-ids: | + DOCKER_USERNAME, deploy/docker-username + DOCKER_TOKEN, deploy/docker-token + parse-json-secrets: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # ratchet:docker/setup-buildx-action@v4 + + - name: Login to Docker Hub + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # ratchet:docker/login-action@v4 + with: + username: ${{ env.DOCKER_USERNAME }} + password: ${{ env.DOCKER_TOKEN }} + + - name: Create and push manifest + env: + AMD64_DIGEST: ${{ needs.docker-amd64.outputs.digest }} + ARM64_DIGEST: ${{ needs.docker-arm64.outputs.digest }} + TAG: ${{ github.ref_name }} + run: | + SANITIZED_TAG="${TAG#cli/}" + IMAGES=( + "${REGISTRY_IMAGE}@${AMD64_DIGEST}" + "${REGISTRY_IMAGE}@${ARM64_DIGEST}" + ) + + if [[ "$TAG" =~ ^cli/v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + docker buildx imagetools create \ + -t "${REGISTRY_IMAGE}:${SANITIZED_TAG}" \ + -t "${REGISTRY_IMAGE}:latest" \ + "${IMAGES[@]}" + else + docker buildx imagetools create \ + -t "${REGISTRY_IMAGE}:${SANITIZED_TAG}" \ + "${IMAGES[@]}" + fi diff --git a/.github/workflows/release-devtools.yml b/.github/workflows/release-devtools.yml index d883d2d206d..8a19c22d455 100644 --- a/.github/workflows/release-devtools.yml +++ b/.github/workflows/release-devtools.yml @@ -22,13 +22,11 @@ jobs: - { goos: "windows", goarch: "arm64" } - { goos: "darwin", goarch: "amd64" } - { goos: "darwin", goarch: "arm64" } - - { goos: "", goarch: "" } steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v6 with: persist-credentials: false - fetch-depth: 0 - - uses: astral-sh/setup-uv@61cb8a9741eeb8a550a1b8544337180c0fc8476b # ratchet:astral-sh/setup-uv@v7 + - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # ratchet:astral-sh/setup-uv@v7 with: enable-cache: false version: "0.9.9" diff --git a/.github/workflows/reusable-nightly-llm-provider-chat.yml b/.github/workflows/reusable-nightly-llm-provider-chat.yml index 20417e2e88c..4248b4e24bd 100644 --- a/.github/workflows/reusable-nightly-llm-provider-chat.yml +++ b/.github/workflows/reusable-nightly-llm-provider-chat.yml @@ -49,27 +49,13 @@ on: default: true type: boolean secrets: - openai_api_key: - required: false - anthropic_api_key: - required: false - bedrock_api_key: - required: false - vertex_ai_custom_config_json: - required: false - azure_api_key: - required: false - ollama_api_key: - required: false - openrouter_api_key: - required: false - DOCKER_USERNAME: - required: true - DOCKER_TOKEN: + AWS_OIDC_ROLE_ARN: + description: "AWS role ARN for OIDC auth" required: true permissions: contents: read + id-token: write jobs: build-backend-image: @@ -81,6 +67,7 @@ jobs: "extras=ecr-cache", ] timeout-minutes: 45 + environment: ci-protected steps: - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 @@ -89,6 +76,19 @@ jobs: with: persist-credentials: false + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 + with: + role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} + aws-region: us-east-2 + + - name: Get AWS Secrets + uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 + with: + secret-ids: | + DOCKER_USERNAME, test/docker-username + DOCKER_TOKEN, test/docker-token + - name: Build backend image uses: ./.github/actions/build-backend-image with: @@ -97,8 +97,8 @@ jobs: pr-number: ${{ github.event.pull_request.number }} github-sha: ${{ github.sha }} run-id: ${{ github.run_id }} - docker-username: ${{ secrets.DOCKER_USERNAME }} - docker-token: ${{ secrets.DOCKER_TOKEN }} + docker-username: ${{ env.DOCKER_USERNAME }} + docker-token: ${{ env.DOCKER_TOKEN }} docker-no-cache: ${{ vars.DOCKER_NO_CACHE == 'true' && 'true' || 'false' }} build-model-server-image: @@ -110,6 +110,7 @@ jobs: "extras=ecr-cache", ] timeout-minutes: 45 + environment: ci-protected steps: - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 @@ -118,6 +119,19 @@ jobs: with: persist-credentials: false + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 + with: + role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} + aws-region: us-east-2 + + - name: Get AWS Secrets + uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 + with: + secret-ids: | + DOCKER_USERNAME, test/docker-username + DOCKER_TOKEN, test/docker-token + - name: Build model server image uses: ./.github/actions/build-model-server-image with: @@ -126,8 +140,8 @@ jobs: pr-number: ${{ github.event.pull_request.number }} github-sha: ${{ github.sha }} run-id: ${{ github.run_id }} - docker-username: ${{ secrets.DOCKER_USERNAME }} - docker-token: ${{ secrets.DOCKER_TOKEN }} + docker-username: ${{ env.DOCKER_USERNAME }} + docker-token: ${{ env.DOCKER_TOKEN }} build-integration-image: runs-on: @@ -138,6 +152,7 @@ jobs: "extras=ecr-cache", ] timeout-minutes: 45 + environment: ci-protected steps: - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 @@ -146,6 +161,19 @@ jobs: with: persist-credentials: false + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 + with: + role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} + aws-region: us-east-2 + + - name: Get AWS Secrets + uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 + with: + secret-ids: | + DOCKER_USERNAME, test/docker-username + DOCKER_TOKEN, test/docker-token + - name: Build integration image uses: ./.github/actions/build-integration-image with: @@ -154,8 +182,8 @@ jobs: pr-number: ${{ github.event.pull_request.number }} github-sha: ${{ github.sha }} run-id: ${{ github.run_id }} - docker-username: ${{ secrets.DOCKER_USERNAME }} - docker-token: ${{ secrets.DOCKER_TOKEN }} + docker-username: ${{ env.DOCKER_USERNAME }} + docker-token: ${{ env.DOCKER_TOKEN }} provider-chat-test: needs: @@ -170,56 +198,56 @@ jobs: include: - provider: openai models: ${{ inputs.openai_models }} - api_key_secret: openai_api_key - custom_config_secret: "" + api_key_env: OPENAI_API_KEY + custom_config_env: "" api_base: "" api_version: "" deployment_name: "" required: true - provider: anthropic models: ${{ inputs.anthropic_models }} - api_key_secret: anthropic_api_key - custom_config_secret: "" + api_key_env: ANTHROPIC_API_KEY + custom_config_env: "" api_base: "" api_version: "" deployment_name: "" required: true - provider: bedrock models: ${{ inputs.bedrock_models }} - api_key_secret: bedrock_api_key - custom_config_secret: "" + api_key_env: BEDROCK_API_KEY + custom_config_env: "" api_base: "" api_version: "" deployment_name: "" required: false - provider: vertex_ai models: ${{ inputs.vertex_ai_models }} - api_key_secret: "" - custom_config_secret: vertex_ai_custom_config_json + api_key_env: "" + custom_config_env: NIGHTLY_LLM_VERTEX_AI_CUSTOM_CONFIG_JSON api_base: "" api_version: "" deployment_name: "" required: false - provider: azure models: ${{ inputs.azure_models }} - api_key_secret: azure_api_key - custom_config_secret: "" + api_key_env: AZURE_API_KEY + custom_config_env: "" api_base: ${{ inputs.azure_api_base }} api_version: "2025-04-01-preview" deployment_name: "" required: false - provider: ollama_chat models: ${{ inputs.ollama_models }} - api_key_secret: ollama_api_key - custom_config_secret: "" + api_key_env: OLLAMA_API_KEY + custom_config_env: "" api_base: "https://ollama.com" api_version: "" deployment_name: "" required: false - provider: openrouter models: ${{ inputs.openrouter_models }} - api_key_secret: openrouter_api_key - custom_config_secret: "" + api_key_env: OPENROUTER_API_KEY + custom_config_env: "" api_base: "https://openrouter.ai/api/v1" api_version: "" deployment_name: "" @@ -230,6 +258,7 @@ jobs: - "run-id=${{ github.run_id }}-nightly-${{ matrix.provider }}-provider-chat-test" - extras=ecr-cache timeout-minutes: 45 + environment: ci-protected steps: - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 @@ -238,21 +267,43 @@ jobs: with: persist-credentials: false + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 + with: + role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} + aws-region: us-east-2 + + - name: Get AWS Secrets + uses: aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802 + with: + # Keep JSON values unparsed so vertex custom config is passed as raw JSON. + parse-json-secrets: false + secret-ids: | + DOCKER_USERNAME, test/docker-username + DOCKER_TOKEN, test/docker-token + OPENAI_API_KEY, test/openai-api-key + ANTHROPIC_API_KEY, test/anthropic-api-key + BEDROCK_API_KEY, test/bedrock-api-key + NIGHTLY_LLM_VERTEX_AI_CUSTOM_CONFIG_JSON, test/nightly-llm-vertex-ai-custom-config-json + AZURE_API_KEY, test/azure-api-key + OLLAMA_API_KEY, test/ollama-api-key + OPENROUTER_API_KEY, test/openrouter-api-key + - name: Run nightly provider chat test uses: ./.github/actions/run-nightly-provider-chat-test with: provider: ${{ matrix.provider }} models: ${{ matrix.models }} - provider-api-key: ${{ matrix.api_key_secret && secrets[matrix.api_key_secret] || '' }} + provider-api-key: ${{ matrix.api_key_env && env[matrix.api_key_env] || '' }} strict: ${{ inputs.strict && 'true' || 'false' }} api-base: ${{ matrix.api_base }} api-version: ${{ matrix.api_version }} deployment-name: ${{ matrix.deployment_name }} - custom-config-json: ${{ matrix.custom_config_secret && secrets[matrix.custom_config_secret] || '' }} + custom-config-json: ${{ matrix.custom_config_env && env[matrix.custom_config_env] || '' }} runs-on-ecr-cache: ${{ env.RUNS_ON_ECR_CACHE }} run-id: ${{ github.run_id }} - docker-username: ${{ secrets.DOCKER_USERNAME }} - docker-token: ${{ secrets.DOCKER_TOKEN }} + docker-username: ${{ env.DOCKER_USERNAME }} + docker-token: ${{ env.DOCKER_TOKEN }} - name: Dump API server logs if: always() @@ -268,7 +319,7 @@ jobs: - name: Upload logs if: always() - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f with: name: docker-all-logs-nightly-${{ matrix.provider }}-llm-provider path: | diff --git a/.github/workflows/sandbox-deployment.yml b/.github/workflows/sandbox-deployment.yml index 151addc2380..935d071f04a 100644 --- a/.github/workflows/sandbox-deployment.yml +++ b/.github/workflows/sandbox-deployment.yml @@ -110,7 +110,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -125,7 +125,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ env.REGISTRY_IMAGE }} flavor: | @@ -180,7 +180,7 @@ jobs: persist-credentials: false - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -195,7 +195,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ env.REGISTRY_IMAGE }} flavor: | @@ -244,7 +244,7 @@ jobs: - uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # ratchet:runs-on/action@v2 - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 + uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 with: role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }} aws-region: us-east-2 @@ -268,7 +268,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # ratchet:docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # ratchet:docker/metadata-action@v6.0.0 with: images: ${{ env.REGISTRY_IMAGE }} flavor: | diff --git a/.github/workflows/storybook-deploy.yml b/.github/workflows/storybook-deploy.yml new file mode 100644 index 00000000000..08d40e84100 --- /dev/null +++ b/.github/workflows/storybook-deploy.yml @@ -0,0 +1,71 @@ +name: Storybook Deploy +env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: prj_sG49mVsA25UsxIPhN2pmBJlikJZM + VERCEL_CLI: vercel@50.14.1 + VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} + +concurrency: + group: storybook-deploy-production + cancel-in-progress: true + +on: + workflow_dispatch: + push: + branches: + - main + paths: + - "web/lib/opal/**" + - "web/src/refresh-components/**" + - "web/.storybook/**" + - "web/package.json" + - "web/package-lock.json" +permissions: + contents: read +jobs: + Deploy-Storybook: + runs-on: ubuntu-latest + environment: ci-protected + timeout-minutes: 30 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v4 + with: + persist-credentials: false + + - name: Setup node + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # ratchet:actions/setup-node@v4 + with: + node-version: 22 + cache: "npm" + cache-dependency-path: ./web/package-lock.json + + - name: Install dependencies + working-directory: web + run: npm ci + + - name: Build Storybook + working-directory: web + run: npm run storybook:build + + - name: Deploy to Vercel (Production) + working-directory: web + run: npx --yes "$VERCEL_CLI" deploy storybook-static/ --prod --yes --token="$VERCEL_TOKEN" + + notify-slack-on-failure: + needs: Deploy-Storybook + if: always() && needs.Deploy-Storybook.result == 'failure' + runs-on: ubuntu-latest + environment: ci-protected + timeout-minutes: 10 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # ratchet:actions/checkout@v4 + with: + persist-credentials: false + sparse-checkout: .github/actions/slack-notify + + - name: Send Slack notification + uses: ./.github/actions/slack-notify + with: + webhook-url: ${{ secrets.MONITOR_DEPLOYMENTS_WEBHOOK }} + failed-jobs: "• Deploy-Storybook" + title: "🚨 Storybook Deploy Failed" diff --git a/.github/workflows/sync_foss.yml b/.github/workflows/sync_foss.yml index f44f1378465..b1f323e0f8a 100644 --- a/.github/workflows/sync_foss.yml +++ b/.github/workflows/sync_foss.yml @@ -9,6 +9,7 @@ on: jobs: sync-foss: runs-on: ubuntu-latest + environment: ci-protected timeout-minutes: 45 permissions: contents: read diff --git a/.github/workflows/tag-nightly.yml b/.github/workflows/tag-nightly.yml index 3e4cf4ecd75..f6cbc102b43 100644 --- a/.github/workflows/tag-nightly.yml +++ b/.github/workflows/tag-nightly.yml @@ -11,6 +11,7 @@ permissions: jobs: create-and-push-tag: runs-on: ubuntu-slim + environment: ci-protected timeout-minutes: 45 steps: diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml index 32f550fbb87..7553ba075f6 100644 --- a/.github/workflows/zizmor.yml +++ b/.github/workflows/zizmor.yml @@ -24,7 +24,7 @@ jobs: persist-credentials: false - name: Install the latest version of uv - uses: astral-sh/setup-uv@61cb8a9741eeb8a550a1b8544337180c0fc8476b # ratchet:astral-sh/setup-uv@v7 + uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # ratchet:astral-sh/setup-uv@v7 with: enable-cache: false version: "0.9.9" diff --git a/.gitignore b/.gitignore index 0f2e82a982e..08885ad7867 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,6 @@ node_modules # plans plans/ + +# Added context for LLMs +onyx-llm-context/ diff --git a/.greptile/config.json b/.greptile/config.json new file mode 100644 index 00000000000..49b6c0aaaeb --- /dev/null +++ b/.greptile/config.json @@ -0,0 +1,64 @@ +{ + "labels": [], + "comment": "", + "fixWithAI": true, + "hideFooter": false, + "strictness": 3, + "statusCheck": true, + "commentTypes": [ + "logic", + "syntax", + "style" + ], + "instructions": "", + "disabledLabels": [], + "excludeAuthors": [ + "dependabot[bot]", + "renovate[bot]" + ], + "ignoreKeywords": "", + "ignorePatterns": "", + "includeAuthors": [], + "summarySection": { + "included": true, + "collapsible": false, + "defaultOpen": false + }, + "excludeBranches": [], + "fileChangeLimit": 300, + "includeBranches": [], + "includeKeywords": "", + "triggerOnUpdates": true, + "updateExistingSummaryComment": true, + "updateSummaryOnly": false, + "issuesTableSection": { + "included": true, + "collapsible": false, + "defaultOpen": false + }, + "statusCommentsEnabled": true, + "confidenceScoreSection": { + "included": true, + "collapsible": false + }, + "sequenceDiagramSection": { + "included": true, + "collapsible": false, + "defaultOpen": false + }, + "shouldUpdateDescription": false, + "rules": [ + { + "scope": ["web/**"], + "rule": "In Onyx's Next.js app, the `app/ee/admin/` directory is a filesystem convention for Enterprise Edition route overrides — it does NOT add an `/ee/` prefix to the URL. Both `app/admin/groups/page.tsx` and `app/ee/admin/groups/page.tsx` serve the same URL `/admin/groups`. Hardcoded `/admin/...` paths in router.push() calls are correct and do NOT break EE deployments. Do not flag hardcoded admin paths as bugs." + }, + { + "scope": ["web/**"], + "rule": "In Onyx, each API key creates a unique user row in the database with a unique `user_id` (UUID). There is a 1:1 mapping between API keys and their backing user records. Multiple API keys do NOT share the same `user_id`. Do not flag potential duplicate row IDs when using `user_id` from API key descriptors." + }, + { + "scope": ["backend/**/*.py"], + "rule": "Never raise HTTPException directly in business code. Use `raise OnyxError(OnyxErrorCode.XXX, \"message\")` from `onyx.error_handling.exceptions`. A global FastAPI exception handler converts OnyxError into structured JSON responses with {\"error_code\": \"...\", \"detail\": \"...\"}. Error codes are defined in `onyx.error_handling.error_codes.OnyxErrorCode`. For upstream errors with dynamic HTTP status codes, use `status_code_override`: `raise OnyxError(OnyxErrorCode.BAD_GATEWAY, detail, status_code_override=upstream_status)`." + } + ] +} diff --git a/.greptile/files.json b/.greptile/files.json new file mode 100644 index 00000000000..6551ec71ee4 --- /dev/null +++ b/.greptile/files.json @@ -0,0 +1,57 @@ +[ + { + "scope": [], + "path": "contributing_guides/best_practices.md", + "description": "Best practices for contributing to the codebase" + }, + { + "scope": ["web/**"], + "path": "web/AGENTS.md", + "description": "Frontend coding standards for the web directory" + }, + { + "scope": ["web/**"], + "path": "web/tests/README.md", + "description": "Frontend testing guide and conventions" + }, + { + "scope": ["web/**"], + "path": "web/CLAUDE.md", + "description": "Single source of truth for frontend coding standards" + }, + { + "scope": ["web/**"], + "path": "web/lib/opal/README.md", + "description": "Opal component library usage guide" + }, + { + "scope": ["backend/**"], + "path": "backend/tests/README.md", + "description": "Backend testing guide covering all 4 test types, fixtures, and conventions" + }, + { + "scope": ["backend/onyx/connectors/**"], + "path": "backend/onyx/connectors/README.md", + "description": "Connector development guide covering design, interfaces, and required changes" + }, + { + "scope": [], + "path": "CLAUDE.md", + "description": "Project instructions and coding standards" + }, + { + "scope": [], + "path": "backend/alembic/README.md", + "description": "Migration guidance, including multi-tenant migration behavior" + }, + { + "scope": [], + "path": "deployment/helm/charts/onyx/values-lite.yaml", + "description": "Lite deployment Helm values and service assumptions" + }, + { + "scope": [], + "path": "deployment/docker_compose/docker-compose.onyx-lite.yml", + "description": "Lite deployment Docker Compose overlay and disabled service behavior" + } +] diff --git a/.greptile/rules.md b/.greptile/rules.md new file mode 100644 index 00000000000..bde420fb893 --- /dev/null +++ b/.greptile/rules.md @@ -0,0 +1,44 @@ +# Greptile Review Rules + +## Type Annotations + +Use explicit type annotations for variables to enhance code clarity, especially when moving type hints around in the code. + +## Best Practices + +Use the "Engineering Best Practices" section of `CONTRIBUTING.md` as core review context. Prefer consistency with existing patterns, fix issues in code you touch, avoid tacking new features onto muddy interfaces, fail loudly instead of silently swallowing errors, keep code strictly typed, preserve clear state boundaries, remove duplicate or dead logic, break up overly long functions, avoid hidden import-time side effects, respect module boundaries, and favor correctness-by-construction over relying on callers to use an API correctly. + +## TODOs + +Whenever a TODO is added, there must always be an associated name or ticket with that TODO in the style of `TODO(name): ...` or `TODO(1234): ...` + +## Debugging Code + +Remove temporary debugging code before merging to production, especially tenant-specific debugging logs. + +## Hardcoded Booleans + +When hardcoding a boolean variable to a constant value, remove the variable entirely and clean up all places where it's used rather than just setting it to a constant. + +## Multi-tenant vs Single-tenant + +Code changes must consider both multi-tenant and single-tenant deployments. In multi-tenant mode, preserve tenant isolation, ensure tenant context is propagated correctly, and avoid assumptions that only hold for a single shared schema or globally shared state. In single-tenant mode, avoid introducing unnecessary tenant-specific requirements or cloud-only control-plane dependencies. + +## Nginx Routing — New Backend Routes + +Whenever a new backend route is added that does NOT start with `/api`, it must also be explicitly added to ALL nginx configs: + +- `deployment/helm/charts/onyx/templates/nginx-conf.yaml` (Helm/k8s) +- `deployment/data/nginx/app.conf.template` (docker-compose dev) +- `deployment/data/nginx/app.conf.template.prod` (docker-compose prod) +- `deployment/data/nginx/app.conf.template.no-letsencrypt` (docker-compose no-letsencrypt) + +Routes not starting with `/api` are not caught by the existing `^/(api|openapi\.json)` location block and will fall through to `location /`, which proxies to the Next.js web server and returns an HTML 404. The new location block must be placed before the `/api` block. Examples of routes that need this treatment: `/scim`, `/mcp`. + +## Full vs Lite Deployments + +Code changes must consider both regular Onyx deployments and Onyx lite deployments. Lite deployments disable the vector DB, Redis, model servers, and background workers by default, use PostgreSQL-backed cache/auth/file storage, and rely on the API server to handle background work. Do not assume those services are available unless the code path is explicitly limited to full deployments. + +## SWR Cache Keys — Always Use SWR_KEYS Registry + +All `useSWR()` calls and `mutate()` calls in the frontend must reference the centralized `SWR_KEYS` registry in `web/src/lib/swr-keys.ts` instead of inline endpoint strings or local string constants. Never write `useSWR("/api/some/endpoint", ...)` or `mutate("/api/some/endpoint")` — always use the corresponding `SWR_KEYS.someEndpoint` constant. If the endpoint does not yet exist in the registry, add it there first. This applies to all variants of an endpoint (e.g. query-string variants like `?get_editable=true` must also be registered as their own key). diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c996ce2dc07..213699e29a3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,6 @@ repos: rev: d30b4298e4fb63ce8609e29acdbcf4c9018a483c hooks: - id: uv-sync - args: ["--locked", "--all-extras"] - id: uv-lock - id: uv-export name: uv-export default.txt @@ -18,7 +17,7 @@ repos: "--no-emit-project", "--no-default-groups", "--no-hashes", - "--extra", + "--group", "backend", "-o", "backend/requirements/default.txt", @@ -31,7 +30,7 @@ repos: "--no-emit-project", "--no-default-groups", "--no-hashes", - "--extra", + "--group", "dev", "-o", "backend/requirements/dev.txt", @@ -44,7 +43,7 @@ repos: "--no-emit-project", "--no-default-groups", "--no-hashes", - "--extra", + "--group", "ee", "-o", "backend/requirements/ee.txt", @@ -57,7 +56,7 @@ repos: "--no-emit-project", "--no-default-groups", "--no-hashes", - "--extra", + "--group", "model_server", "-o", "backend/requirements/model_server.txt", @@ -119,10 +118,11 @@ repos: ] - repo: https://github.com/golangci/golangci-lint - rev: 9f61b0f53f80672872fced07b6874397c3ed197b # frozen: v2.7.2 + rev: 5d1e709b7be35cb2025444e19de266b056b7b7ee # frozen: v2.10.1 hooks: - id: golangci-lint - entry: bash -c "find tools/ -name go.mod -print0 | xargs -0 -I{} bash -c 'cd \"$(dirname {})\" && golangci-lint run ./...'" + language_version: "1.26.1" + entry: bash -c "find . -name go.mod -not -path './.venv/*' -print0 | xargs -0 -I{} bash -c 'cd \"$(dirname {})\" && golangci-lint run ./...'" - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. diff --git a/.vscode/env_template.txt b/.vscode/env_template.txt index cd398ab3ef5..3b19a3de58e 100644 --- a/.vscode/env_template.txt +++ b/.vscode/env_template.txt @@ -7,6 +7,9 @@ AUTH_TYPE=basic +# Recommended for basic auth - used for signing password reset and verification tokens +# Generate a secure value with: openssl rand -hex 32 +USER_AUTH_SECRET="" DEV_MODE=true diff --git a/.vscode/launch.json b/.vscode/launch.json index 41a8164c45f..925dd9b1241 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -40,19 +40,7 @@ } }, { - "name": "Celery (lightweight mode)", - "configurations": [ - "Celery primary", - "Celery background", - "Celery beat" - ], - "presentation": { - "group": "1" - }, - "stopAll": true - }, - { - "name": "Celery (standard mode)", + "name": "Celery", "configurations": [ "Celery primary", "Celery light", @@ -129,7 +117,8 @@ "presentation": { "group": "2" }, - "consoleTitle": "API Server Console" + "consoleTitle": "API Server Console", + "justMyCode": false }, { "name": "Slack Bot", @@ -253,35 +242,6 @@ }, "consoleTitle": "Celery light Console" }, - { - "name": "Celery background", - "type": "debugpy", - "request": "launch", - "module": "celery", - "cwd": "${workspaceFolder}/backend", - "envFile": "${workspaceFolder}/.vscode/.env", - "env": { - "LOG_LEVEL": "INFO", - "PYTHONUNBUFFERED": "1", - "PYTHONPATH": "." - }, - "args": [ - "-A", - "onyx.background.celery.versioned_apps.background", - "worker", - "--pool=threads", - "--concurrency=20", - "--prefetch-multiplier=4", - "--loglevel=INFO", - "--hostname=background@%n", - "-Q", - "vespa_metadata_sync,connector_deletion,doc_permissions_upsert,checkpoint_cleanup,index_attempt_cleanup,docprocessing,connector_doc_fetching,connector_pruning,connector_doc_permissions_sync,connector_external_group_sync,csv_generation,kg_processing,monitoring,user_file_processing,user_file_project_sync,user_file_delete,opensearch_migration" - ], - "presentation": { - "group": "2" - }, - "consoleTitle": "Celery background Console" - }, { "name": "Celery heavy", "type": "debugpy", @@ -309,7 +269,8 @@ "presentation": { "group": "2" }, - "consoleTitle": "Celery heavy Console" + "consoleTitle": "Celery heavy Console", + "justMyCode": false }, { "name": "Celery kg_processing", @@ -396,7 +357,8 @@ "presentation": { "group": "2" }, - "consoleTitle": "Celery user_file_processing Console" + "consoleTitle": "Celery user_file_processing Console", + "justMyCode": false }, { "name": "Celery docfetching", @@ -454,7 +416,8 @@ "presentation": { "group": "2" }, - "consoleTitle": "Celery docprocessing Console" + "consoleTitle": "Celery docprocessing Console", + "justMyCode": false }, { "name": "Celery beat", @@ -526,21 +489,6 @@ "group": "3" } }, - { - "name": "Clear and Restart OpenSearch Container", - // Generic debugger type, required arg but has no bearing on bash. - "type": "node", - "request": "launch", - "runtimeExecutable": "bash", - "runtimeArgs": [ - "${workspaceFolder}/backend/scripts/restart_opensearch_container.sh" - ], - "cwd": "${workspaceFolder}", - "console": "integratedTerminal", - "presentation": { - "group": "3" - } - }, { "name": "Eval CLI", "type": "debugpy", @@ -583,8 +531,7 @@ "request": "launch", "runtimeExecutable": "uv", "runtimeArgs": [ - "sync", - "--all-extras" + "sync" ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", diff --git a/AGENTS.md b/AGENTS.md index 5acea7ecfe5..5004309c542 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -86,37 +86,6 @@ Onyx uses Celery for asynchronous task processing with multiple specialized work - Monitoring tasks (every 5 minutes) - Cleanup tasks (hourly) -#### Worker Deployment Modes - -Onyx supports two deployment modes for background workers, controlled by the `USE_LIGHTWEIGHT_BACKGROUND_WORKER` environment variable: - -**Lightweight Mode** (default, `USE_LIGHTWEIGHT_BACKGROUND_WORKER=true`): - -- Runs a single consolidated `background` worker that handles all background tasks: - - Light worker tasks (Vespa operations, permissions sync, deletion) - - Document processing (indexing pipeline) - - Document fetching (connector data retrieval) - - Pruning operations (from `heavy` worker) - - Knowledge graph processing (from `kg_processing` worker) - - Monitoring tasks (from `monitoring` worker) - - User file processing (from `user_file_processing` worker) -- Lower resource footprint (fewer worker processes) -- Suitable for smaller deployments or development environments -- Default concurrency: 20 threads (increased to handle combined workload) - -**Standard Mode** (`USE_LIGHTWEIGHT_BACKGROUND_WORKER=false`): - -- Runs separate specialized workers as documented above (light, docprocessing, docfetching, heavy, kg_processing, monitoring, user_file_processing) -- Better isolation and scalability -- Can scale individual workers independently based on workload -- Suitable for production deployments with higher load - -The deployment mode affects: - -- **Backend**: Worker processes spawned by supervisord or dev scripts -- **Helm**: Which Kubernetes deployments are created -- **Dev Environment**: Which workers `dev_run_background_jobs.py` spawns - #### Key Features - **Thread-based Workers**: All workers use thread pools (not processes) for stability @@ -135,6 +104,10 @@ The deployment mode affects: - Always use `@shared_task` rather than `@celery_app` - Put tasks under `background/celery/tasks/` or `ee/background/celery/tasks` +- Never enqueue a task without an expiration. Always supply `expires=` when + sending tasks, either from the beat schedule or directly from another task. It + should never be acceptable to submit code which enqueues tasks without an + expiration, as doing so can lead to unbounded task queue growth. **Defining APIs**: When creating new FastAPI APIs, do NOT use the `response_model` field. Instead, just type the @@ -194,284 +167,7 @@ web/ ## Frontend Standards -### 1. Import Standards - -**Always use absolute imports with the `@` prefix.** - -**Reason:** Moving files around becomes easier since you don't also have to update those import statements. This makes modifications to the codebase much nicer. - -```typescript -// ✅ Good -import { Button } from "@/components/ui/button"; -import { useAuth } from "@/hooks/useAuth"; -import { Text } from "@/refresh-components/texts/Text"; - -// ❌ Bad -import { Button } from "../../../components/ui/button"; -import { useAuth } from "./hooks/useAuth"; -``` - -### 2. React Component Functions - -**Prefer regular functions over arrow functions for React components.** - -**Reason:** Functions just become easier to read. - -```typescript -// ✅ Good -function UserProfile({ userId }: UserProfileProps) { - return
User Profile
-} - -// ❌ Bad -const UserProfile = ({ userId }: UserProfileProps) => { - return
User Profile
-} -``` - -### 3. Props Interface Extraction - -**Extract prop types into their own interface definitions.** - -**Reason:** Functions just become easier to read. - -```typescript -// ✅ Good -interface UserCardProps { - user: User - showActions?: boolean - onEdit?: (userId: string) => void -} - -function UserCard({ user, showActions = false, onEdit }: UserCardProps) { - return
User Card
-} - -// ❌ Bad -function UserCard({ - user, - showActions = false, - onEdit -}: { - user: User - showActions?: boolean - onEdit?: (userId: string) => void -}) { - return
User Card
-} -``` - -### 4. Spacing Guidelines - -**Prefer padding over margins for spacing.** - -**Reason:** We want to consolidate usage to paddings instead of margins. - -```typescript -// ✅ Good -
-
Content
-
- -// ❌ Bad -
-
Content
-
-``` - -### 5. Tailwind Dark Mode - -**Strictly forbid using the `dark:` modifier in Tailwind classes, except for logo icon handling.** - -**Reason:** The `colors.css` file already, VERY CAREFULLY, defines what the exact opposite colour of each light-mode colour is. Overriding this behaviour is VERY bad and will lead to horrible UI breakages. - -**Exception:** The `createLogoIcon` helper in `web/src/components/icons/icons.tsx` uses `dark:` modifiers (`dark:invert`, `dark:hidden`, `dark:block`) to handle third-party logo icons that cannot automatically adapt through `colors.css`. This is the ONLY acceptable use of dark mode modifiers. - -```typescript -// ✅ Good - Standard components use `tailwind-themes/tailwind.config.js` / `src/app/css/colors.css` -
- Content -
- -// ✅ Good - Logo icons with dark mode handling via createLogoIcon -export const GithubIcon = createLogoIcon(githubLightIcon, { - monochromatic: true, // Will apply dark:invert internally -}); - -export const GitbookIcon = createLogoIcon(gitbookLightIcon, { - darkSrc: gitbookDarkIcon, // Will use dark:hidden/dark:block internally -}); - -// ❌ Bad - Manual dark mode overrides -
- Content -
-``` - -### 6. Class Name Utilities - -**Use the `cn` utility instead of raw string formatting for classNames.** - -**Reason:** `cn`s are easier to read. They also allow for more complex types (i.e., string-arrays) to get formatted properly (it flattens each element in that string array down). As a result, it can allow things such as conditionals (i.e., `myCondition && "some-tailwind-class"`, which evaluates to `false` when `myCondition` is `false`) to get filtered out. - -```typescript -import { cn } from '@/lib/utils' - -// ✅ Good -
- Content -
- -// ❌ Bad -
- Content -
-``` - -### 7. Custom Hooks Organization - -**Follow a "hook-per-file" layout. Each hook should live in its own file within `web/src/hooks`.** - -**Reason:** This is just a layout preference. Keeps code clean. - -```typescript -// web/src/hooks/useUserData.ts -export function useUserData(userId: string) { - // hook implementation -} - -// web/src/hooks/useLocalStorage.ts -export function useLocalStorage(key: string, initialValue: T) { - // hook implementation -} -``` - -### 8. Icon Usage - -**ONLY use icons from the `web/src/icons` directory. Do NOT use icons from `react-icons`, `lucide`, or other external libraries.** - -**Reason:** We have a very carefully curated selection of icons that match our Onyx guidelines. We do NOT want to muddy those up with different aesthetic stylings. - -```typescript -// ✅ Good -import SvgX from "@/icons/x"; -import SvgMoreHorizontal from "@/icons/more-horizontal"; - -// ❌ Bad -import { User } from "lucide-react"; -import { FiSearch } from "react-icons/fi"; -``` - -**Missing Icons**: If an icon is needed but doesn't exist in the `web/src/icons` directory, import it from Figma using the Figma MCP tool and add it to the icons directory. -If you need help with this step, reach out to `raunak@onyx.app`. - -### 9. Text Rendering - -**Prefer using the `refresh-components/texts/Text` component for all text rendering. Avoid "naked" text nodes.** - -**Reason:** The `Text` component is fully compliant with the stylings provided in Figma. It provides easy utilities to specify the text-colour and font-size in the form of flags. Super duper easy. - -```typescript -// ✅ Good -import { Text } from '@/refresh-components/texts/Text' - -function UserCard({ name }: { name: string }) { - return ( - - {name} - - ) -} - -// ❌ Bad -function UserCard({ name }: { name: string }) { - return ( -
-

{name}

-

User details

-
- ) -} -``` - -### 10. Component Usage - -**Heavily avoid raw HTML input components. Always use components from the `web/src/refresh-components` or `web/lib/opal/src` directory.** - -**Reason:** We've put in a lot of effort to unify the components that are rendered in the Onyx app. Using raw components breaks the entire UI of the application, and leaves it in a muddier state than before. - -```typescript -// ✅ Good -import Button from '@/refresh-components/buttons/Button' -import InputTypeIn from '@/refresh-components/inputs/InputTypeIn' -import SvgPlusCircle from '@/icons/plus-circle' - -function ContactForm() { - return ( -
- - - - ) -} - -// ❌ Bad -function ContactForm() { - return ( -
- -