fix(email): scoped 'anything suspicious?' query no longer dumps the full triage report #4149
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved. | |
| # SPDX-License-Identifier: MIT | |
| # Fast unit tests that don't require Lemonade server or external dependencies | |
| # These tests run first to provide quick feedback on core SDK components | |
| # Platform: Ubuntu (pure Python tests, no platform-specific code) | |
| name: Unit Tests | |
| on: | |
| workflow_call: | |
| push: | |
| branches: [ main ] | |
| paths: | |
| - 'src/**' | |
| - 'tests/**' | |
| - 'setup.py' | |
| - 'pyproject.toml' | |
| - '.github/workflows/test_unit.yml' | |
| pull_request: | |
| branches: [ main ] | |
| types: [opened, synchronize, reopened, ready_for_review] | |
| paths: | |
| - 'src/**' | |
| - 'tests/**' | |
| - 'setup.py' | |
| - 'pyproject.toml' | |
| - '.github/workflows/test_unit.yml' | |
| merge_group: | |
| workflow_dispatch: | |
| # Cancel in-progress runs when a new run is triggered | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} | |
| cancel-in-progress: true | |
| permissions: | |
| contents: read | |
| jobs: | |
| unit-tests: | |
| name: Unit Tests (py${{ matrix.python-version }}) | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| if: github.event_name != 'pull_request' || github.event.pull_request.draft == false || contains(github.event.pull_request.labels.*.name, 'ready_for_ci') | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: ['3.10', '3.11', '3.12'] | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Set up Python | |
| uses: actions/setup-python@v7 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Install uv | |
| run: curl -LsSf https://astral.sh/uv/install.sh | sh | |
| - name: Install dependencies | |
| run: | | |
| # pyfakefs is required by tests/unit/installer/test_uninstall_command.py | |
| # which uses the `fs` fixture to build a fake filesystem for testing | |
| # tiered uninstall logic cross-platform without touching the real FS. | |
| # pytest-mock is required by the browser/filesystem tool tests. | |
| # keyring + httpx + respx are required by tests/unit/connections/ | |
| # (issue #915). The in-memory keyring backend in tests/conftest.py | |
| # avoids the SecretService daemon prerequisite on Linux runners. | |
| # matplotlib is required by tests/unit/test_perf_analysis.py, which | |
| # exercises the perf-vis plotting functions headlessly (Agg backend). | |
| # It stays out of the runtime extras on purpose — gaia.perf_analysis | |
| # imports it lazily and errors loudly when it is missing. | |
| # pymupdf (fitz) is required by tests/unit/test_structured_vlm_extraction.py: | |
| # the PDF branch of StructuredExtractor.extract() does `import fitz`, and | |
| # mocker.patch("fitz.open") can only resolve that target if the module | |
| # exists. It ships in the [ui]/[rag] extras, which this job does not install. | |
| # cvss is required by tests/unit/test_cvss4.py and test_findings_to_sarif.py | |
| # (the security-audit scorer); it lives in the [dev] extra, not [api]. | |
| # responses is required by tests/unit/test_lemonade_error_classification.py | |
| # — same story as cvss: declared in [dev], and this job installs [api]. | |
| uv pip install --system pytest pytest-cov pytest-asyncio pytest-mock pytest-timeout \ | |
| pyfakefs keyring httpx respx matplotlib pymupdf cvss responses | |
| uv pip install --system -e ".[api]" | |
| - name: Validate packaging integrity | |
| run: | | |
| echo "=== Validating Packaging Integrity ===" | |
| echo "Checking setup.py packages, __init__.py files, and entry points" | |
| echo "" | |
| pytest tests/unit/test_packaging.py -v --tb=short | |
| echo "✅ Packaging integrity checks passed" | |
| - name: Run unit tests | |
| env: | |
| # Skip memory init — Lemonade isn't available in this CI job; the | |
| # unit tests don't exercise memory functionality (memory has its | |
| # own dedicated tests with mocked embeddings). | |
| GAIA_MEMORY_DISABLED: "1" | |
| run: | | |
| echo "=== Running Unit Tests ===" | |
| echo "These are fast tests for core SDK components" | |
| echo "" | |
| pytest tests/unit/ -v --tb=short \ | |
| --cov=src/gaia --cov-report=term-missing --cov-report=xml:coverage.xml | |
| - name: Upload coverage to Codecov | |
| if: always() | |
| uses: codecov/codecov-action@v7 | |
| with: | |
| files: coverage.xml | |
| flags: unit | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| fail_ci_if_error: false | |
| - name: Run DatabaseMixin integration tests | |
| env: | |
| GAIA_MEMORY_DISABLED: "1" | |
| run: | | |
| echo "=== Running DatabaseMixin Integration Tests ===" | |
| echo "Testing DatabaseMixin with Agent class" | |
| echo "" | |
| pytest tests/integration/test_database_mixin_integration.py -v --tb=short | |
| - name: Run DatabaseAgent integration tests | |
| env: | |
| GAIA_MEMORY_DISABLED: "1" | |
| run: | | |
| echo "=== Running DatabaseAgent Integration Tests ===" | |
| echo "Testing DatabaseAgent with auto-registered tools" | |
| echo "" | |
| pytest tests/integration/test_database_agent.py -v --tb=short | |
| - name: Run Lemonade release-asset resolution test | |
| env: | |
| GAIA_MEMORY_DISABLED: "1" | |
| run: | | |
| echo "=== Resolving Lemonade installer URLs against live upstream ===" | |
| echo "Catches an upstream asset rename before it 404s gaia init" | |
| echo "" | |
| pytest tests/integration/test_lemonade_release_assets.py -v --tb=short | |
| - name: Run daemon integration tests | |
| env: | |
| GAIA_MEMORY_DISABLED: "1" | |
| run: | | |
| echo "=== Running Daemon Integration Tests ===" | |
| echo "Real python -m gaia.daemon lifecycle + sidecar supervision (#2142)" | |
| echo "" | |
| pytest tests/integration/test_daemon.py tests/integration/test_daemon_sidecars.py -v --tb=short | |
| - name: Unit test summary | |
| if: always() | |
| run: | | |
| echo "" | |
| echo "=== Test Coverage ===" | |
| echo "CLI Smoke Tests (pytest, auto-discovered):" | |
| echo " - tests/unit/cli/test_cli_smoke.py: --help for every subcommand + console script" | |
| echo "" | |
| echo "Unit Tests:" | |
| echo " - SDToolsMixin: Stable Diffusion image generation for agents" | |
| echo " - DatabaseMixin: SQLite database access for agents" | |
| echo " - FileWatcher: File system monitoring utilities" | |
| echo " - Testing Utilities: MockLLMProvider, MockVLMClient, fixtures" | |
| echo " - EMR Agent: Medical intake form processing" | |
| echo " - EMR CLI: Command-line interface for EMR agent" | |
| echo " - LLM Client: Language model client utilities" | |
| echo " - ASR: Automatic speech recognition utilities" | |
| echo " - TTS: Text-to-speech utilities" | |
| echo " - InitCommand: gaia init profiles and installer logic" | |
| echo " - FileSystemIndex: Persistent file index with FTS5 search" | |
| echo " - FileSystemToolsMixin: browse_directory, tree, file_info, find_files, read_file, bookmark tools" | |
| echo " - ScratchpadService: SQLite working memory for data analysis" | |
| echo " - ScratchpadToolsMixin: create_table, insert_data, query_data, list_tables, drop_table tools" | |
| echo " - BrowserTools: WebClient SSRF prevention, HTML extraction, downloads" | |
| echo " - WebClient Edge Cases: parse_html fallback, extract_text, tables, links, download redirects" | |
| echo " - Categorizer: auto_categorize, category map completeness, extension uniqueness" | |
| echo " - ChatAgent Integration: filesystem, scratchpad, browser init/config/cleanup" | |
| echo " - File Write Guardrails: blocked dirs, sensitive files, size limits, backup, audit" | |
| echo " - Security Edge Cases: symlinks, audit logging, TOCTOU, prompt_overwrite" | |
| echo " - Service Edge Cases: DB corruption rebuild, shared DB, row limits, transaction atomicity" | |
| echo "" | |
| echo "Integration Tests:" | |
| echo " - DatabaseMixin + Agent: Full agent lifecycle with database" | |
| echo " - DatabaseAgent: Auto-registered database tools" | |
| # Experimental macOS smoke test — validates core SDK imports and pure-Python | |
| # unit tests on Darwin. continue-on-error until the full suite is macOS-clean. | |
| unit-tests-macos: | |
| name: Unit Tests (macOS smoke) | |
| runs-on: macos-latest | |
| if: github.event_name != 'pull_request' || github.event.pull_request.draft == false || contains(github.event.pull_request.labels.*.name, 'ready_for_ci') | |
| continue-on-error: true | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Set up Python | |
| uses: actions/setup-python@v7 | |
| with: | |
| python-version: '3.12' | |
| - name: Install uv | |
| run: curl -LsSf https://astral.sh/uv/install.sh | sh | |
| - name: Install dependencies | |
| run: | | |
| uv pip install --system pytest pytest-asyncio pytest-mock pytest-timeout \ | |
| pyfakefs keyring httpx respx matplotlib pymupdf cvss responses | |
| uv pip install --system -e ".[api]" | |
| - name: Validate packaging integrity | |
| run: | | |
| echo "=== Validating Packaging Integrity ===" | |
| echo "Checking setup.py packages, __init__.py files, and entry points" | |
| echo "" | |
| pytest tests/unit/test_packaging.py -v --tb=short | |
| echo "✅ Packaging integrity checks passed" | |
| - name: Run unit tests (macOS smoke) | |
| env: | |
| GAIA_MEMORY_DISABLED: "1" | |
| run: | | |
| echo "=== macOS Smoke Test ===" | |
| echo "Running unit tests on macOS to catch platform-specific issues" | |
| echo "" | |
| pytest tests/unit/ -x --timeout=60 -v --tb=short |