Skip to content

chore(deps): combine open Dependabot updates - #678

Merged
galshubeli merged 4 commits into
stagingfrom
deps/combined-dependabot-2026-08-03
Aug 4, 2026
Merged

chore(deps): combine open Dependabot updates#678
galshubeli merged 4 commits into
stagingfrom
deps/combined-dependabot-2026-08-03

Conversation

@barakb

@barakb barakb commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Combines the following Dependabot updates into one PR:

Python (uv):

npm (app/):

GitHub Actions:

Verified locally: uv run pytest (210 passed, 1 skipped), uv run pylint (10.00/10), npm run lint and npm run build (in app/), all against a running FalkorDB Docker container.

Closes #663, #665, #666, #667, #668, #669, #670, #671, #672, #674, #675, #676, #677.


Security fix (beyond the Dependabot bumps above):

  • Migrated react-router-dom (^7.18.2) to react-router (^8.3.0) to pick up the fix for
    GHSA-qwww-vcr4-c8h2
    (CSRF bypass in unstable RSC mode), which was flagged by the dependency-review CI check.
    react-router-dom's final release (7.18.2) never received a backport of this fix — it's only
    patched in react-router 8.3.0+, after react-router-dom was folded back into the main
    react-router package. There's an open community request for a 7.x backport
    (remix-run/react-router#15348) but no
    maintainer commitment or ETA, so upgrading to v8 was the only way to close this out.
    • QueryWeaver already met v8's runtime requirements (React 19.2+, Node 22+) and only uses plain
      SPA routing (BrowserRouter/Routes/Route/Link/useNavigate/useLocation) with no
      loaders, actions, middleware, or meta() usage, so none of v8's breaking-change surface
      (always-on middleware, removed AppLoadContext, meta({data}) removal, ESM-only) applies here.
    • Updated imports in App.tsx, Sidebar.tsx, Settings.tsx, NotFound.tsx from
      react-router-dom to react-router.
    • Added e2e coverage (e2e/tests/sidebar.spec.ts) for /settings navigation and unknown-route
      (404) rendering to exercise the migrated router APIs.
    • Verified: npm run lint, npm run build (in app/), and npx playwright test --list all pass;
      no react-router-dom references remain in the codebase.

Summary by CodeRabbit

  • Chores
    • Refreshed automated build, test, publishing, linting, spellcheck, and security-review workflows.
    • Updated application, server, and development tooling dependencies.
    • Improved compatibility with newer tooling versions.
  • Tests
    • Expanded end-to-end coverage for settings navigation, route persistence after refresh, and unknown-page handling.
  • Bug Fixes
    • No user-facing features or behavior changes were introduced.

Combines the following Dependabot updates into a single PR:
- Bump mcp from 1.27.2 to 1.28.1 (#663)
- Bump actions/setup-python from 6.3.0 to 7.0.0 (#665)
- Bump actions/checkout from 7.0.0 to 7.0.1 (#666)
- Bump astral-sh/setup-uv from 8.3.2 to 9.0.0 (#667)
- Bump openai from 2.45.0 to 2.48.0 (#668)
- Bump fastapi from 0.139.0 to 0.140.0 (#669)
- Bump sqlglot from 30.12.0 to 30.13.0 (#670)
- Bump snowflake-connector-python from 4.6.0 to 4.7.1 (#671)
- Bump fastmcp from 3.2.4 to 3.4.4 (#672)
- Bump brace-expansion from 5.0.7 to 5.0.9 (latest available) in /app (#674)
- Bump rojopolis/spellcheck-github-actions from 0.63.0 to 0.63.1 (#675)
- Bump docker/login-action from 4.4.0 to 4.6.0 (#676)
- Bump the npm-minor-patch group across 1 directory with 29 updates in /app (#677)

Verified locally: uv run pytest (210 passed), uv run pylint (10.00/10),
npm run lint and npm run build (in app/), all against a running
FalkorDB container.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 3, 2026 08:24
@railway-app

railway-app Bot commented Aug 3, 2026

Copy link
Copy Markdown

This PR was not deployed automatically as @barakb does not have access to the Railway project.

In order to get automatic PR deploys, please add @barakb to your workspace on Railway.

@overcut-ai

overcut-ai Bot commented Aug 3, 2026

Copy link
Copy Markdown

Completed Working on "Code Review"

✅ Review publishing completed successfully. Posted comments from all chunks and submitted final review: COMMENT with 2 total comments across 2 files.

✅ Workflow completed successfully.


👉 View complete log

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 191a0562-b011-4efd-ae04-0744fe566404

📥 Commits

Reviewing files that changed from the base of the PR and between b6564a2 and 4f5ea3a.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (5)
  • .github/workflows/playwright.yml
  • .github/workflows/publish-docker.yml
  • .github/workflows/pylint.yml
  • .github/workflows/tests.yml
  • pyproject.toml
🚧 Files skipped from review as they are similar to previous changes (5)
  • .github/workflows/playwright.yml
  • pyproject.toml
  • .github/workflows/publish-docker.yml
  • .github/workflows/pylint.yml
  • .github/workflows/tests.yml

📝 Walkthrough

Walkthrough

The pull request updates pinned GitHub Actions revisions, refreshes frontend and server dependencies, migrates router imports to react-router, and adds end-to-end tests for settings and unknown-route navigation.

Changes

Dependency refresh

Layer / File(s) Summary
Frontend and server dependency constraints
app/package.json, pyproject.toml
Frontend package versions are updated. FastAPI, FastMCP, and Snowflake Connector constraints are changed.
Frontend router package migration
app/src/App.tsx, app/src/components/layout/Sidebar.tsx, app/src/pages/NotFound.tsx, app/src/pages/Settings.tsx
Router APIs now use imports from react-router instead of react-router-dom.

Workflow action refresh

Layer / File(s) Summary
GitHub Actions pin updates
.github/workflows/*.yml
Pinned revisions are updated for checkout, Python setup, uv setup, Docker login, and spellcheck actions. Selected uv setup steps enable cache pruning.

End-to-end routing coverage

Layer / File(s) Summary
Routing test support
e2e/infra/ui/basePage.ts, e2e/logic/pom/sidebar.ts
The Playwright page objects can read page content and click the visible settings button.
Sidebar and not-found routing tests
e2e/tests/sidebar.spec.ts
Tests cover navigation to /settings, route persistence after refresh, and unknown-route rendering.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested reviewers: copilot, galshubeli

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The pull request includes workflow, app dependency, router migration, and end-to-end test changes unrelated to linked issue #663. Separate unrelated dependency, workflow, router, and end-to-end test changes into appropriately linked pull requests.
Linked Issues check ❓ Inconclusive The mcp update cannot be verified because the relevant uv.lock file is excluded by the !**/*.lock path filter. Include reviewable evidence for uv.lock or provide the resolved mcp version to verify issue #663 compliance.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the primary dependency-update purpose of the pull request.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch deps/combined-dependabot-2026-08-03

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

Dependency Review

The following issues were found:

  • ✅ 0 vulnerable package(s)
  • ✅ 0 package(s) with incompatible licenses
  • ✅ 0 package(s) with invalid SPDX license definitions
  • ⚠️ 7 package(s) with unknown licenses.

View full job summary

@overcut-ai overcut-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary of posted review findings:

  • Counts by importance: 0 BLOCKER, 0 CRITICAL, 2 MAJOR, 0 MINOR, 0 SUGGESTION, 0 PRAISE.
  • Affected files: 2 (.github/workflows/publish-docker.yml, pyproject.toml).

Key themes:

  1. Dependency/version governance and reproducibility risk (unbounded runtime dependency range).
  2. CI/security auditability clarity for pinned GitHub Actions (comment/version mismatch).

Actionable next steps:

  • Constrain fastmcp to a bounded, validated 3.x range and regenerate the lockfile.
  • Update the Docker login action inline comment to match the pinned release version for consistent maintenance and security review context.

Comment thread .github/workflows/publish-docker.yml Outdated
Comment thread pyproject.toml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/playwright.yml:
- Around line 40-42: Configure setup-uv caching steps with prune-cache: true to
preserve cache pruning. Apply this to .github/workflows/playwright.yml lines
40-42, .github/workflows/pylint.yml lines 21-22, and both setup-uv steps in
.github/workflows/tests.yml lines 41-42 and 125-126.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6d715458-a58d-40d3-a2cd-e849af01aaa8

📥 Commits

Reviewing files that changed from the base of the PR and between 0113633 and bfbd111.

⛔ Files ignored due to path filters (2)
  • app/package-lock.json is excluded by !**/package-lock.json
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (9)
  • .github/workflows/dependency-review.yml
  • .github/workflows/playwright.yml
  • .github/workflows/publish-docker.yml
  • .github/workflows/publish-pypi.yml
  • .github/workflows/pylint.yml
  • .github/workflows/spellcheck.yml
  • .github/workflows/tests.yml
  • app/package.json
  • pyproject.toml

Comment thread .github/workflows/playwright.yml

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR consolidates multiple Dependabot updates across the Python backend (uv-managed), the React/TypeScript frontend (npm-managed), and GitHub Actions workflows to keep dependencies and CI tooling current.

Changes:

  • Bumps Python dependencies and refreshes uv.lock (notably FastAPI, OpenAI SDK, MCP, SQLGlot, Snowflake connector, FastMCP).
  • Updates frontend dependency versions in app/package.json.
  • Updates pinned SHAs for several GitHub Actions used in CI workflows.

Reviewed changes

Copilot reviewed 9 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
uv.lock Updates resolved Python dependency versions and metadata for the uv lockfile.
pyproject.toml Expands version bounds for fastapi and snowflake-connector-python in the server extra.
app/package.json Bumps frontend direct dependencies (Radix UI, React, React Router, Vite plugin, PostCSS, etc.).
.github/workflows/tests.yml Updates pinned SHAs for checkout/setup-python/setup-uv used by test jobs.
.github/workflows/spellcheck.yml Updates pinned SHAs for checkout and the spellcheck action.
.github/workflows/pylint.yml Updates pinned SHAs for checkout/setup-python/setup-uv used by pylint job.
.github/workflows/publish-pypi.yml Updates pinned SHAs for checkout/setup-python/setup-uv in PyPI publish workflow.
.github/workflows/publish-docker.yml Updates pinned SHAs for checkout and docker/login-action.
.github/workflows/playwright.yml Updates pinned SHAs for checkout/setup-python/setup-uv used by Playwright workflow.
.github/workflows/dependency-review.yml Updates pinned SHA for checkout in dependency review workflow.

Comment thread app/package.json
The root package.json depends on queryweaver-app via 'file:app', so its
lockfile embeds a resolved snapshot of app/'s dependency tree. It was
left stale after the app/ dependency bumps, causing 'npm ci' to fail in
CI ('lock file does not satisfy...'). Regenerated via 'npm install'.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 3, 2026 08:31

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 12 changed files in this pull request and generated no new comments.

Suppressed comments (4)

.github/workflows/tests.yml:129

  • astral-sh/setup-uv was bumped to v9, which changed the default prune-cache to false (breaking change). Consider setting prune-cache explicitly here so cache size/cost behavior is intentional.
    - name: Install uv
      uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
      with:
        version: "latest"

.github/workflows/pylint.yml:25

  • After upgrading to astral-sh/setup-uv v9, the default prune-cache is now false. Set it explicitly to keep CI cache usage predictable (and optionally preserve the pre-v9 behavior).
    - name: Install uv
      uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
      with:
        version: "latest"

.github/workflows/playwright.yml:45

  • With astral-sh/setup-uv v9, prune-cache defaults to false (breaking change). If you want to avoid cache growth surprises, set prune-cache explicitly in this step.
    - name: Install uv
      uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
      with:
        version: "0.7.12"

.github/workflows/tests.yml:45

  • astral-sh/setup-uv was bumped to v9, which changed the default prune-cache to false (breaking change). If you want to preserve the previous behavior and avoid unbounded cache growth/cost surprises, set prune-cache explicitly in the workflow.

This issue also appears on line 125 of the same file.

    - name: Install uv
      uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
      with:
        version: "0.7.12"

…c8h2)

react-router-dom's latest release (7.18.2) never received a fix for
GHSA-qwww-vcr4-c8h2 (CSRF bypass in unstable RSC mode) — the fix only
ships in react-router v8.3.0+, after react-router-dom was folded back
into the react-router package.

QueryWeaver already meets v8's runtime requirements (React 19.2+, Node
22+) and only uses plain SPA routing (BrowserRouter/Routes/Route/Link/
useNavigate/useLocation) with no loaders, actions, middleware, or
meta() usage, so none of v8's actual breaking-change surface applies.

Changes:
- app/package.json, app/package-lock.json: drop react-router-dom,
  add react-router@^8.3.0
- app/src/App.tsx, Sidebar.tsx, Settings.tsx, NotFound.tsx: update
  imports from "react-router-dom" to "react-router"
- package-lock.json (root): resync with app/'s file: dependency
- e2e: add settings-navigation and unknown-route (404) coverage to
  sidebar.spec.ts/sidebar POM to exercise the migrated router APIs,
  plus a small getPageContent() helper on BasePage

Verified locally: npm run lint, npm run build (app/), and
`npx playwright test --list` all pass; no react-router-dom references
remain.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 3, 2026 09:03

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 16 out of 19 changed files in this pull request and generated no new comments.

Suppressed comments (2)

e2e/tests/sidebar.spec.ts:70

  • The test name says it verifies that browser back navigation returns home, but the test never performs a back-navigation action or asserts the home route. This makes the test description misleading and harder to understand when it fails.
  // Routing tests: verify react-router (v8) navigation still works after the
  // react-router-dom -> react-router migration.
  test('settings button navigates to /settings and back navigates home', async () => {

e2e/tests/sidebar.spec.ts:69

  • PR description says no react-router-dom references remain in the codebase, but this comment still contains the string react-router-dom. If you want that statement to be literally true (and keep future greps/CI checks clean), reword the comment to avoid mentioning react-router-dom by name.
  // Routing tests: verify react-router (v8) navigation still works after the
  // react-router-dom -> react-router migration.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
app/package.json (1)

55-60: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Set Node 22.22.0 before using React Router v8.

react-router@8.3.0 requires Node >=22.22.0, but the root package.json has no engines.node and CI only uses NODE_VERSION: 'lts/*'. Make every install/runtime path Node 22.22.0+ or use an older react-router version.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/package.json` around lines 55 - 60, Ensure the project’s declared and
CI/runtime Node version is at least 22.22.0 before retaining react-router
v8.3.0: add or update the root package engine and all installation/runtime
configuration, including the CI NODE_VERSION setting, to enforce Node 22.22.0+.
Alternatively, downgrade the react-router dependency to a version compatible
with the existing Node support.
🧹 Nitpick comments (2)
e2e/tests/sidebar.spec.ts (2)

70-70: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Align the test title with its assertions.

The title says that the test verifies navigation back to home. The test does not navigate back or assert /. Rename the test to describe settings navigation and refresh persistence, or add the missing back-navigation assertion.

Minimal rename
-  test('settings button navigates to /settings and back navigates home', async () => {
+  test('settings button navigates to /settings and persists after refresh', async () => {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@e2e/tests/sidebar.spec.ts` at line 70, Rename the test titled “settings
button navigates to /settings and back navigates home” to accurately describe
only the settings navigation and refresh persistence it currently asserts,
without adding back-navigation behavior.

78-80: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Verify the rendered Settings page after refresh.

The assertion checks only the browser URL. A refresh can leave /settings in the address bar while rendering an error response. Assert a stable Settings-specific element or text after refreshPage().

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@e2e/tests/sidebar.spec.ts` around lines 78 - 80, Update the test around
sidebar.refreshPage() to assert a stable Settings-specific element or text in
the rendered page after refreshing, while retaining the existing URL assertion.
Use an existing Settings page locator or content assertion rather than relying
only on sidebar.getCurrentURL().
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@app/package.json`:
- Around line 55-60: Ensure the project’s declared and CI/runtime Node version
is at least 22.22.0 before retaining react-router v8.3.0: add or update the root
package engine and all installation/runtime configuration, including the CI
NODE_VERSION setting, to enforce Node 22.22.0+. Alternatively, downgrade the
react-router dependency to a version compatible with the existing Node support.

---

Nitpick comments:
In `@e2e/tests/sidebar.spec.ts`:
- Line 70: Rename the test titled “settings button navigates to /settings and
back navigates home” to accurately describe only the settings navigation and
refresh persistence it currently asserts, without adding back-navigation
behavior.
- Around line 78-80: Update the test around sidebar.refreshPage() to assert a
stable Settings-specific element or text in the rendered page after refreshing,
while retaining the existing URL assertion. Use an existing Settings page
locator or content assertion rather than relying only on
sidebar.getCurrentURL().

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e9c69b9d-2c4d-41dc-b918-37a8be937e60

📥 Commits

Reviewing files that changed from the base of the PR and between bfbd111 and b6564a2.

⛔ Files ignored due to path filters (2)
  • app/package-lock.json is excluded by !**/package-lock.json
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (8)
  • app/package.json
  • app/src/App.tsx
  • app/src/components/layout/Sidebar.tsx
  • app/src/pages/NotFound.tsx
  • app/src/pages/Settings.tsx
  • e2e/infra/ui/basePage.ts
  • e2e/logic/pom/sidebar.ts
  • e2e/tests/sidebar.spec.ts

- publish-docker.yml: fix stale docker/login-action version comment
  (was still "# v4" after the bump to v4.6.0)
- pyproject.toml/uv.lock: bound fastmcp to >=3.4.4,<4.0.0 (was
  unbounded >=3.2.4), matching the bounded-range convention used by
  the other server-extra deps in this file
- playwright.yml, pylint.yml, tests.yml (x2): explicitly set
  prune-cache: true on setup-uv steps — astral-sh/setup-uv v9.0.0
  (bumped in this PR) silently flipped the prune-cache default from
  true to false, which would otherwise change cache-retention
  behavior as a side effect of the version bump

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 3, 2026 09:53
@barakb

barakb commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

Addressed in 4f5ea3a:

  • docker/login-action comment updated to # v4.6.0.
  • fastmcp bounded to >=3.4.4,<4.0.0 and uv.lock regenerated.
  • prune-cache: true explicitly set on all 4 setup-uv steps (playwright.yml, pylint.yml, tests.yml x2) since v9.0.0 flipped the default.
  • The root package-lock.json sync issue was already fixed in b6564a2 (before this review ran).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 16 out of 19 changed files in this pull request and generated no new comments.

Suppressed comments (1)

e2e/tests/sidebar.spec.ts:80

  • The test name says it verifies “back navigates home”, but the test never navigates back/home; it only refreshes and re-asserts the /settings URL. This makes the test intent misleading and leaves the settings-toggle behavior (settings -> home) untested.
  test('settings button navigates to /settings and back navigates home', async () => {

@barakb
barakb requested a review from galshubeli August 3, 2026 11:36
@galshubeli
galshubeli merged commit 180b407 into staging Aug 4, 2026
14 checks passed
@galshubeli
galshubeli deleted the deps/combined-dependabot-2026-08-03 branch August 4, 2026 07:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants