Skip to content

feat(crossseed): only poll status endpoints when features are enabled#738

Merged
s0up4200 merged 3 commits intomainfrom
fix/conditional-crossseed-polling
Dec 10, 2025
Merged

feat(crossseed): only poll status endpoints when features are enabled#738
s0up4200 merged 3 commits intomainfrom
fix/conditional-crossseed-polling

Conversation

@s0up4200
Copy link
Copy Markdown
Collaborator

@s0up4200 s0up4200 commented Dec 10, 2025

Summary by CodeRabbit

  • Improvements
    • Polling now respects RSS enablement and reduces unnecessary requests when disabled.
    • Search-status polling dynamically increases during active searches and slows when idle for efficiency.
    • Instance state now exposes loading, error and status indicators so UI shows current fetch state more reliably.
    • UI layout components updated to consume the consolidated instance state shape.

✏️ Tip: You can customize this high-level summary in your review settings.

@s0up4200 s0up4200 added this to the v1.10.0 milestone Dec 10, 2025
@s0up4200 s0up4200 added the enhancement New feature or request label Dec 10, 2025
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Dec 10, 2025

Walkthrough

Replaces the previous raw return of useCrossSeedInstanceState with a typed object, adds settingsQuery to determine rssEnabled, gates status/search queries on rssEnabled, implements dynamic polling intervals for search status, refactors state memoization, and updates three UI call sites to destructure the hook's state property.

Changes

Cohort / File(s) Summary
Cross-seed instance state hook
web/src/hooks/useCrossSeedInstanceState.ts
Introduces public return type CrossSeedInstanceStateResult and changes export to useCrossSeedInstanceState(): CrossSeedInstanceStateResult. Adds settingsQuery to compute rssEnabled; gates status/search queries with enabled: rssEnabled; implements dynamic refetchInterval (5s when searching, 60s otherwise); recalculates per-target state only when rssEnabled is true; returns state, isLoading, isError, and error.
Hook call sites — UI components
web/src/components/layout/Header.tsx, web/src/components/layout/MobileFooterNav.tsx, web/src/components/layout/Sidebar.tsx
Update call sites to destructure the hook result and use the state property: const { state: crossSeedInstanceState } = useCrossSeedInstanceState() (replacing previous direct assignment). No other logic changes at call sites.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Areas needing attention:
    • Correctness of rssEnabled gating and interaction with enabled flags on queries
    • Polling intervals and conditional refetchInterval behavior for search status
    • Memoization dependencies and construction of per-target state
    • Call-site updates to ensure no remaining usages assume the old return shape

Possibly related PRs

Suggested labels

cross-seed, web

Poem

🐰 I nibbled code beneath the moonlit tree,
Polling hops at five, then thirty, whee!
I tuck RSS flags into my burrowed state,
Destructure my pockets — everything's straight.
Hooray for tidy returns and a hopping update!

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately reflects the main change: conditional polling of cross-seed status endpoints based on feature enablement (rssEnabled gating).
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/conditional-crossseed-polling

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

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
web/src/hooks/useCrossSeedInstanceState.ts (1)

37-40: Consider explicit typing for the query parameter.

The dynamic polling logic correctly implements search-active-only polling. For improved type safety and code clarity, consider explicitly typing the function parameter.

-    refetchInterval: (query) => {
+    refetchInterval: (query: { state: { data?: { running?: boolean } } }) => {
       // Only poll while a search is actively running
       return query.state.data?.running ? 5_000 : false
     },

Alternatively, import the Query type from @tanstack/react-query:

import { useQuery, type Query } from "@tanstack/react-query"

// Then use:
refetchInterval: (query: Query) => {
  return query.state.data?.running ? 5_000 : false
},
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3baa007 and 1196715.

📒 Files selected for processing (1)
  • web/src/hooks/useCrossSeedInstanceState.ts (2 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: s0up4200
Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go:209-212
Timestamp: 2025-11-28T20:32:30.126Z
Learning: Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go
Learning: The cross-seed recheck-resume worker intentionally runs for the process lifetime and keys pending entries by hash only. This is acceptable under the current constraint that background seeded-search runs operate on a single instance at a time; graceful shutdown and instanceID|hash keying are deferred by design.
📚 Learning: 2025-11-28T20:32:30.126Z
Learnt from: s0up4200
Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go:209-212
Timestamp: 2025-11-28T20:32:30.126Z
Learning: Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go
Learning: The cross-seed recheck-resume worker intentionally runs for the process lifetime and keys pending entries by hash only. This is acceptable under the current constraint that background seeded-search runs operate on a single instance at a time; graceful shutdown and instanceID|hash keying are deferred by design.

Applied to files:

  • web/src/hooks/useCrossSeedInstanceState.ts
🧬 Code graph analysis (1)
web/src/hooks/useCrossSeedInstanceState.ts (1)
web/src/lib/api.ts (1)
  • api (1696-1696)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Run tests
🔇 Additional comments (4)
web/src/hooks/useCrossSeedInstanceState.ts (4)

13-20: LGTM! Settings caching strategy is well-chosen.

The 5-minute stale time and 10-minute GC time are appropriate for settings that rarely change, reducing unnecessary API calls while ensuring reasonably fresh data.


22-22: LGTM! Safe extraction with fail-safe default.

The nullish coalescing provides a conservative default when settings are unavailable, preventing unnecessary polling during errors or initial load.


24-31: LGTM! Conditional polling correctly implemented.

The combination of enabled: rssEnabled and conditional refetchInterval ensures the status endpoint is only queried when RSS automation is active, achieving the PR objective efficiently.


44-67: LGTM! Conditional state population correctly gated.

The if (rssEnabled) guard prevents unnecessary state entries when RSS is disabled, and adding rssEnabled to the dependency array ensures the memo recalculates appropriately when RSS status changes.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
web/src/hooks/useCrossSeedInstanceState.ts (1)

47-54: Variable rssEnabled shadows outer declaration.

The rssEnabled on line 52 shadows the one declared on line 27. While functionally equivalent, this can cause confusion during maintenance. Consider renaming to make the data flow clearer.

   const state = useMemo(() => {
     const settings = settingsQuery.data
     const crossSeedStatus = statusQuery.data
     const crossSeedSearchStatus = searchStatusQuery.data
 
-    const rssEnabled = settings?.enabled ?? false
+    const isRssEnabled = settings?.enabled ?? false
     const rssRunning = crossSeedStatus?.running ?? false
     const rssTargetIds = crossSeedStatus?.settings?.targetInstanceIds ?? []

Then update usage on line 60 and 62 accordingly.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1196715 and 1dbc8ae.

📒 Files selected for processing (4)
  • web/src/components/layout/Header.tsx (1 hunks)
  • web/src/components/layout/MobileFooterNav.tsx (1 hunks)
  • web/src/components/layout/Sidebar.tsx (1 hunks)
  • web/src/hooks/useCrossSeedInstanceState.ts (2 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: s0up4200
Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go:209-212
Timestamp: 2025-11-28T20:32:30.126Z
Learning: Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go
Learning: The cross-seed recheck-resume worker intentionally runs for the process lifetime and keys pending entries by hash only. This is acceptable under the current constraint that background seeded-search runs operate on a single instance at a time; graceful shutdown and instanceID|hash keying are deferred by design.
📚 Learning: 2025-11-28T20:32:30.126Z
Learnt from: s0up4200
Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go:209-212
Timestamp: 2025-11-28T20:32:30.126Z
Learning: Repo: autobrr/qui PR: 641
File: internal/services/crossseed/service.go
Learning: The cross-seed recheck-resume worker intentionally runs for the process lifetime and keys pending entries by hash only. This is acceptable under the current constraint that background seeded-search runs operate on a single instance at a time; graceful shutdown and instanceID|hash keying are deferred by design.

Applied to files:

  • web/src/hooks/useCrossSeedInstanceState.ts
🧬 Code graph analysis (3)
web/src/hooks/useCrossSeedInstanceState.ts (1)
web/src/lib/api.ts (1)
  • api (1696-1696)
web/src/components/layout/MobileFooterNav.tsx (1)
web/src/hooks/useCrossSeedInstanceState.ts (1)
  • useCrossSeedInstanceState (19-82)
web/src/components/layout/Header.tsx (1)
web/src/hooks/useCrossSeedInstanceState.ts (1)
  • useCrossSeedInstanceState (19-82)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Run tests
🔇 Additional comments (5)
web/src/hooks/useCrossSeedInstanceState.ts (2)

37-45: searchStatusQuery always polls regardless of feature state.

The PR objective is to "only poll status endpoints when features are enabled", but searchStatusQuery runs unconditionally. Consider whether this query should also be gated (e.g., by a setting or by checking if cross-seed is configured at all) to fully achieve the optimization goal.

If this is intentional (e.g., to detect new searches started externally), the 60-second idle interval is reasonable, but it might be worth adding a brief comment explaining why this query isn't gated.


76-81: LGTM!

The aggregated loading/error states correctly handle the case where statusQuery may be disabled. TanStack Query v5 properly reports isLoading: false for disabled queries, so the OR aggregation works as expected.

web/src/components/layout/Header.tsx (1)

172-172: LGTM!

The destructuring correctly adapts to the new CrossSeedInstanceStateResult return type while maintaining the same variable name for downstream usage.

web/src/components/layout/Sidebar.tsx (1)

90-90: LGTM!

Consistent with the changes in Header.tsx, the destructuring correctly adapts to the new hook return type.

web/src/components/layout/MobileFooterNav.tsx (1)

122-122: LGTM!

Consistent with the changes in Header.tsx and Sidebar.tsx. All three consumer components now correctly destructure the state property from the updated hook.

@s0up4200 s0up4200 merged commit c8bbe07 into main Dec 10, 2025
12 checks passed
@s0up4200 s0up4200 deleted the fix/conditional-crossseed-polling branch December 10, 2025 16:24
@coderabbitai coderabbitai bot mentioned this pull request Dec 11, 2025
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Dec 18, 2025
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/autobrr/qui](https://github.com/autobrr/qui) | minor | `v1.9.1` -> `v1.10.0` |

---

### Release Notes

<details>
<summary>autobrr/qui (ghcr.io/autobrr/qui)</summary>

### [`v1.10.0`](https://github.com/autobrr/qui/releases/tag/v1.10.0)

[Compare Source](autobrr/qui@v1.9.1...v1.10.0)

#### Changelog

##### New Features

- [`f2b17e6`](autobrr/qui@f2b17e6): feat(config): add SESSION\_SECRET\_FILE env var ([#&#8203;661](autobrr/qui#661)) ([@&#8203;undefined-landmark](https://github.com/undefined-landmark))
- [`f5ede56`](autobrr/qui@f5ede56): feat(crossseed): add RSS source filters for categories and tags ([#&#8203;757](autobrr/qui#757)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`9dee7bb`](autobrr/qui@9dee7bb): feat(crossseed): add Unicode normalization for title and file matching ([#&#8203;742](autobrr/qui#742)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d44058f`](autobrr/qui@d44058f): feat(crossseed): add skip auto-resume settings per mode ([#&#8203;755](autobrr/qui#755)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`9e3534a`](autobrr/qui@9e3534a): feat(crossseed): add webhook source filters for categories and tags ([#&#8203;763](autobrr/qui#763)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c8bbe07`](autobrr/qui@c8bbe07): feat(crossseed): only poll status endpoints when features are enabled ([#&#8203;738](autobrr/qui#738)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fda8101`](autobrr/qui@fda8101): feat(sidebar): add size tooltips and deduplicate cross-seed sizes ([#&#8203;724](autobrr/qui#724)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e4c0556`](autobrr/qui@e4c0556): feat(torrent): add sequential download toggles ([#&#8203;776](autobrr/qui#776)) ([@&#8203;rare-magma](https://github.com/rare-magma))
- [`2a43f15`](autobrr/qui@2a43f15): feat(torrents): autocomplete paths ([#&#8203;634](autobrr/qui#634)) ([@&#8203;rare-magma](https://github.com/rare-magma))
- [`1c07b33`](autobrr/qui@1c07b33): feat(torrents): replace filtered speeds with global ([#&#8203;745](autobrr/qui#745)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`cd0deee`](autobrr/qui@cd0deee): feat(tracker): add per-domain stats inclusion toggle for merged trackers ([#&#8203;781](autobrr/qui#781)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`b6a6200`](autobrr/qui@b6a6200): feat(web): add Size column to Tracker Breakdown table ([#&#8203;770](autobrr/qui#770)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`560071b`](autobrr/qui@560071b): feat(web): add zebra striping to torrent table ([#&#8203;726](autobrr/qui#726)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`f8f65a8`](autobrr/qui@f8f65a8): feat(web): improve auto-search on completion UX ([#&#8203;743](autobrr/qui#743)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e36312f`](autobrr/qui@e36312f): feat(web): improve torrent selection UX with unified click and escape behavior ([#&#8203;782](autobrr/qui#782)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`27c1daa`](autobrr/qui@27c1daa): feat(web): napster theme ([#&#8203;728](autobrr/qui#728)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`e3950de`](autobrr/qui@e3950de): feat(web): new torrent details panel for desktop ([#&#8203;760](autobrr/qui#760)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`6c66ba5`](autobrr/qui@6c66ba5): feat(web): persist tab state in URL for CrossSeed and Settings pages ([#&#8203;775](autobrr/qui#775)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`59884a9`](autobrr/qui@59884a9): feat(web): share tracker customizations with filtersidebar ([#&#8203;717](autobrr/qui#717)) ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Bug Fixes

- [`fafd278`](autobrr/qui@fafd278): fix(api): add webhook source filter fields to PATCH settings endpoint ([#&#8203;774](autobrr/qui#774)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`bdf0339`](autobrr/qui@bdf0339): fix(api): support apikey query param with custom base URL ([#&#8203;748](autobrr/qui#748)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c3c8d66`](autobrr/qui@c3c8d66): fix(crossseed): compare Site and Sum fields for anime releases ([#&#8203;769](autobrr/qui#769)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`cb4c965`](autobrr/qui@cb4c965): fix(crossseed): detect file name differences and fix hasExtraSourceFiles ([#&#8203;741](autobrr/qui#741)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`fd9e054`](autobrr/qui@fd9e054): fix(crossseed): fix batch completion searches and remove legacy settings ([#&#8203;744](autobrr/qui#744)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`26706a0`](autobrr/qui@26706a0): fix(crossseed): normalize punctuation in title matching ([#&#8203;718](autobrr/qui#718)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`db30566`](autobrr/qui@db30566): fix(crossseed): rename files before folder to avoid path conflicts ([#&#8203;752](autobrr/qui#752)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`8886ac4`](autobrr/qui@8886ac4): fix(crossseed): resolve category creation race condition and relax autoTMM ([#&#8203;767](autobrr/qui#767)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`f8f2a05`](autobrr/qui@f8f2a05): fix(crossseed): support game scene releases with RAR files ([#&#8203;768](autobrr/qui#768)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`918adee`](autobrr/qui@918adee): fix(crossseed): treat x264/H.264/H264/AVC as equivalent codecs ([#&#8203;766](autobrr/qui#766)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`c4b1f0a`](autobrr/qui@c4b1f0a): fix(dashboard): merge tracker customizations with duplicate displayName ([#&#8203;751](autobrr/qui#751)) ([@&#8203;jabloink](https://github.com/jabloink))
- [`3c6e0f9`](autobrr/qui@3c6e0f9): fix(license): remove redundant validation call after activation ([#&#8203;749](autobrr/qui#749)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`a9c7754`](autobrr/qui@a9c7754): fix(reannounce): simplify tracker detection to match qbrr logic ([#&#8203;746](autobrr/qui#746)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`3baa007`](autobrr/qui@3baa007): fix(rss): skip download when torrent already exists by infohash ([#&#8203;715](autobrr/qui#715)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`55d0ccc`](autobrr/qui@55d0ccc): fix(swagger): respect base URL for API docs routes ([#&#8203;758](autobrr/qui#758)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`47695fd`](autobrr/qui@47695fd): fix(web): add height constraint to filter sidebar wrapper for proper scrolling ([#&#8203;778](autobrr/qui#778)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`4b3bfea`](autobrr/qui@4b3bfea): fix(web): default torrent format to v1 in creator dialog ([#&#8203;723](autobrr/qui#723)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2d54b79`](autobrr/qui@2d54b79): fix(web): pin submit button in Services sheet footer ([#&#8203;756](autobrr/qui#756)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`2bcd6a3`](autobrr/qui@2bcd6a3): fix(web): preserve folder collapse state during file tree sync ([#&#8203;740](autobrr/qui#740)) ([@&#8203;ewenjo](https://github.com/ewenjo))
- [`57f3f1d`](autobrr/qui@57f3f1d): fix(web): sort Peers column by total peers instead of connected ([#&#8203;759](autobrr/qui#759)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`53a8818`](autobrr/qui@53a8818): fix(web): sort Seeds column by total seeds instead of connected ([#&#8203;747](autobrr/qui#747)) ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`d171915`](autobrr/qui@d171915): fix(web): sort folders before files in torrent file tree ([#&#8203;764](autobrr/qui#764)) ([@&#8203;s0up4200](https://github.com/s0up4200))

##### Other Changes

- [`172b4aa`](autobrr/qui@172b4aa): chore(assets): replace napster.svg with napster.png for logo update ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`dc83102`](autobrr/qui@dc83102): chore(deps): bump the github group with 3 updates ([#&#8203;761](autobrr/qui#761)) ([@&#8203;dependabot](https://github.com/dependabot)\[bot])
- [`75357d3`](autobrr/qui@75357d3): chore: fix napster logo ([@&#8203;s0up4200](https://github.com/s0up4200))
- [`206c4b2`](autobrr/qui@206c4b2): refactor(web): extract CrossSeed completion to accordion component ([#&#8203;762](autobrr/qui#762)) ([@&#8203;s0up4200](https://github.com/s0up4200))

**Full Changelog**: <autobrr/qui@v1.9.1...v1.10.0>

#### Docker images

- `docker pull ghcr.io/autobrr/qui:v1.10.0`
- `docker pull ghcr.io/autobrr/qui:latest`

#### What to do next?

- Join our [Discord server](https://discord.autobrr.com/qui)

Thank you for using qui!

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4zOS4xIiwidXBkYXRlZEluVmVyIjoiNDIuMzkuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/2664
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant