feat(map): WA-E2 pins e filtros de corpos d'água - #464
Conversation
Permite filtrar pins por subtype hídrico no servidor e expor assetType/assetSubtype no app, com chip Corpos d'água no mapa. Co-authored-by: Cursor <cursoragent@cursor.com>
PR Steward — Apontamentos de botsRegra obrigatóriaTodo apontamento de bot deve ser resolvido ou respondido antes de merge. Não deixar threads abertas em arquivos alterados neste PR. Checklist
Como resolver./scripts/agents/arah-agents.ps1 bot-review -PrNumber <N>
./scripts/agents/arah-agents.ps1 pr-ready -PrNumber <N>Merge
Automático via Status: CI OK — revisar checklist |
📝 WalkthroughWalkthroughThe change adds water-body subtype filtering to map pin APIs and repositories. It returns asset metadata, adds Flutter map filters and water-body marker rendering, updates localization, and documents the WA-E2 delivery. ChangesWater-body map pin flow
Flutter map filters
Documentation
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: Water chip ignores legacy assets
- O filtro Corpos d'água agora usa
assetTypes, restaurando a compatibilidade com pins legados cujo tipo hídrico ainda vive emTypesemSubtype.
- O filtro Corpos d'água agora usa
Or push these changes by commenting:
@cursor push c857fa99c5
Preview (c857fa99c5)
diff --git a/frontend/arah.app/lib/features/map/presentation/providers/map_pins_provider.dart b/frontend/arah.app/lib/features/map/presentation/providers/map_pins_provider.dart
--- a/frontend/arah.app/lib/features/map/presentation/providers/map_pins_provider.dart
+++ b/frontend/arah.app/lib/features/map/presentation/providers/map_pins_provider.dart
@@ -8,13 +8,14 @@
return MapRepository(client: ref.watch(bffClientProvider));
});
-/// Filtro de pins do mapa (WA-E2: corpos d'água via assetSubtypes no servidor).
+/// Filtro de pins do mapa (WA-E2: corpos d'água com compatibilidade legado).
enum MapPinsFilter {
all,
waterBodies,
}
-final mapPinsFilterProvider = StateProvider<MapPinsFilter>((ref) => MapPinsFilter.all);
+final mapPinsFilterProvider =
+ StateProvider<MapPinsFilter>((ref) => MapPinsFilter.all);
class MapPinsQuery {
const MapPinsQuery({required this.territoryId, required this.filter});
@@ -35,8 +36,8 @@
}
/// Pins do mapa para o território. BFF map/pins (filtro server-side).
-final mapPinsProvider =
- FutureProvider.autoDispose.family<List<MapPin>, MapPinsQuery>((ref, query) async {
+final mapPinsProvider = FutureProvider.autoDispose
+ .family<List<MapPin>, MapPinsQuery>((ref, query) async {
final territoryId = query.territoryId;
if (territoryId == null || territoryId.isEmpty) return [];
final repo = ref.watch(mapRepositoryProvider);
@@ -44,7 +45,7 @@
return repo.getPins(
territoryId: territoryId,
types: 'asset',
- assetSubtypes: kWaterBodySubtypesCsv,
+ assetTypes: kWaterBodySubtypesCsv,
);
}
return repo.getPins(territoryId: territoryId);
diff --git a/frontend/arah.app/test/features/map/presentation/map_pins_provider_test.dart b/frontend/arah.app/test/features/map/presentation/map_pins_provider_test.dart
new file mode 100644
--- /dev/null
+++ b/frontend/arah.app/test/features/map/presentation/map_pins_provider_test.dart
@@ -1,0 +1,59 @@
+import 'package:arah_app/core/config/app_config.dart';
+import 'package:arah_app/core/network/bff_client.dart';
+import 'package:arah_app/features/map/data/models/map_pin.dart';
+import 'package:arah_app/features/map/data/repositories/map_repository.dart';
+import 'package:arah_app/features/map/presentation/providers/map_pins_provider.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+class _FakeMapRepository extends MapRepository {
+ _FakeMapRepository()
+ : super(
+ client:
+ BffClient(config: const AppConfig(bffBaseUrl: 'http://test')));
+
+ Map<String, String?>? lastArgs;
+
+ @override
+ Future<List<MapPin>> getPins({
+ required String territoryId,
+ String? types,
+ String? assetTypes,
+ String? assetSubtypes,
+ }) async {
+ lastArgs = {
+ 'territoryId': territoryId,
+ 'types': types,
+ 'assetTypes': assetTypes,
+ 'assetSubtypes': assetSubtypes,
+ };
+ return const [];
+ }
+}
+
+void main() {
+ test('waterBodies usa assetTypes para incluir pins legados', () async {
+ final fakeRepository = _FakeMapRepository();
+ final container = ProviderContainer(
+ overrides: [
+ mapRepositoryProvider.overrideWithValue(fakeRepository),
+ ],
+ );
+ addTearDown(container.dispose);
+
+ await container.read(
+ mapPinsProvider(
+ const MapPinsQuery(
+ territoryId: 'territory-1',
+ filter: MapPinsFilter.waterBodies,
+ ),
+ ).future,
+ );
+
+ expect(fakeRepository.lastArgs, isNotNull);
+ expect(fakeRepository.lastArgs!['territoryId'], 'territory-1');
+ expect(fakeRepository.lastArgs!['types'], 'asset');
+ expect(fakeRepository.lastArgs!['assetTypes'], kWaterBodySubtypesCsv);
+ expect(fakeRepository.lastArgs!['assetSubtypes'], isNull);
+ });
+}You can send follow-ups to the cloud agent here.
Reviewed by Cursor Bugbot for commit a3633fc. Configure here.
QA Agent — ChecklistRevise este PR conforme docs/21_CODE_REVIEW.md e docs/22_COHESION_AND_TESTS.md. Arquitetura
Testes
UI (se aplicável)
PR
Automático via Status gates: ✅ Gates automáticos passaram |
Security Agent — RelatórioDependências
Secrets
LGPD / dados sensíveis
Bloqueio recomendado
Automático via |
assetSubtypes só casa Subtype e omitia pins com type=river/spring sem subtype. Co-authored-by: Cursor <cursoragent@cursor.com>
Agente acionado: Spec Steward (SDD)ID: Verificações automáticas de conduta✅ Guardrail no_merge Conduta compartilhadaConduta comum (todos os agentes)
Checklist do agenteSpec Steward (SDD) — Checklist de condutaEscopo permitido
Antes do PR (spec-before-code)
Skills (ordem sugerida)
Aderência
Proibido
Skills sugeridas (ordem)
Manifest
Visível via |
Agente acionado: Backend AgentID: Verificações automáticas de conduta✅ Guardrail no_merge Conduta compartilhadaConduta comum (todos os agentes)
Checklist do agenteBackend Agent — Checklist de condutaEscopo permitido
SDD (fases S0+)
Antes do PR
Skills (ordem sugerida)
Consultar quando Core/federação
Proibido
Skills sugeridas (ordem)
Manifest
Visível via |
Agente acionado: Solutions Architect (Uncle Bob)ID: Verificações automáticas de conduta✅ Guardrail no_merge Conduta compartilhadaConduta comum (todos os agentes)
Checklist do agenteSolutions Architect — Checklist de condutaPapel (Uncle Bob)
LikeC4 e diagramas
ADR e specs
Skills (ordem sugerida)
Autonomia
Skills sugeridas (ordem)
Manifest
Visível via |
Agente acionado: Flutter AgentID: Verificações automáticas de conduta✅ Guardrail no_merge Conduta compartilhadaConduta comum (todos os agentes)
Checklist do agenteFlutter Agent — Checklist de condutaEscopo permitido
Antes do PR
Skills (ordem sugerida)
Proibido
Skills sugeridas (ordem)
Manifest
Visível via |
Agente acionado: Review / QA AgentID: Verificações automáticas de conduta✅ Guardrail no_merge Conduta compartilhadaConduta comum (todos os agentes)
Checklist do agenteQA Agent — Checklist de condutaPapel
Checklist de review
Skills
ReferênciaSkills sugeridas (ordem)
Manifest
Visível via |
Agente acionado: PR Steward (Review & Merge)ID: Verificações automáticas de conduta✅ Guardrail no_merge Conduta compartilhadaConduta comum (todos os agentes)
Checklist do agentePR Steward — Checklist de condutaObrigatório antes de merge
Skills
ReferênciaSkills sugeridas (ordem)
Manifest
Visível via |
Parecer de domínio: Domain — Mapa, Lugares & Assets TerritoriaisID: Enriquecimento (negócio)O mapa é a leitura do território real: entidades de mapa e assets curados Validar no PR
Arquivos relacionados
Referências
Autonomia via coreografia ( |
Parecer de domínio: Domain — Design & Experiência (UX/UI)ID: Enriquecimento (negócio)Design de baixa excitação, silêncio funcional e ação consciente — território Validar no PR
Arquivos relacionados
Referências
Autonomia via coreografia ( |
Orquestrador Arah — PRAgente principal: Agentes por paths alterados:
Pareceres de domínio: QA agent revisará este PR (checklist em Use .agents/templates/pr-body.md no corpo do PR. Automático via |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a3633fcb10
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| query = query.Where(asset => | ||
| typeList.Contains(asset.Type) || | ||
| (asset.Subtype != null && typeList.Contains(asset.Subtype))); |
There was a problem hiding this comment.
Preserve type-only filtering for the assets API
When a territory contains a new type=natural, subtype=river asset, this shared predicate also returns it from GET /api/v1/assets?types=river, because AssetsController passes that endpoint's types directly through TerritoryAssetService. That endpoint previously and documentarily filters TerritoryAsset.Type, and Assets_ListFiltersByIdAndType asserts that every result has Type == "river", so existing clients can now unexpectedly receive Type == "natural"; keep subtype matching confined to the map's assetTypes path or separate the repository predicates.
AGENTS.md reference: AGENTS.md:L19-L19
Useful? React with 👍 / 👎.
| return repo.getPins( | ||
| territoryId: territoryId, | ||
| types: 'asset', | ||
| assetSubtypes: kWaterBodySubtypesCsv, |
There was a problem hiding this comment.
Include legacy water assets in the water-body chip
When a territory contains pre-WA-E1 assets stored as Type=river or Type=spring with a null subtype, selecting this chip sends only assetSubtypes; the server's subtype predicate requires a non-null Subtype, so those existing water pins disappear. The subtype migration only added a nullable column without backfilling old rows, while the new assetTypes behavior was explicitly implemented to match either legacy types or WA-E1 subtypes, so the chip should use that compatibility filter.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (1)
backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs (1)
118-164: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winSplit
BuildQueryinto focused filter helpers.Lines 118-164 combine identity, classification, status, and text filtering in one 47-line method. Extract focused helpers that compose the same
IQueryable<TerritoryAssetRecord>.As per coding guidelines, “Cada classe ou função deve ter uma responsabilidade; prefira funções com menos de 20 linhas”.
🤖 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 `@backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs` around lines 118 - 164, Split BuildQuery into focused private filter helpers for identity, type/subtype classification, status, and text search, keeping BuildQuery responsible only for composing them. Preserve the existing filtering semantics and normalization behavior, including the legacy type-or-subtype matching, while keeping each helper under 20 lines.Source: Coding guidelines
🤖 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 `@backend/Tests/Arah.Tests/Api/ApiScenariosTests.cs`:
- Around line 1172-1178: Update the test flow before the curator actions in the
scenario containing CurateAssetApprovedAsync to query the map endpoint with
types=asset and the riverAsset.Id while the asset is still pending, and assert
that the response contains no results. Keep the existing post-curation
assertions unchanged so the test covers both the Active gate before curation and
visibility after approval.
In `@backend/Tests/Arah.Tests/Domain/Assets/TerritoryAssetTypeMatchTests.cs`:
- Around line 8-35: Add mixed-case assertions to the existing
Matches_Types_MatchesTypeOrSubtype, Matches_Subtypes_RequiresSubtype, and
Matches_TypesAndSubtypes_AppliesBoth tests, varying casing across Type, Subtype,
types, and subtypes while preserving the expected true and false outcomes. Cover
both matching and non-matching mixed-case inputs to verify case-insensitive
behavior.
In `@docs/backlog-api/CORPOS_DAGUA_TERRITORIO.md`:
- Line 83: Update the WA-E2 backlog entry to replace the English “follow-up”
wording with the Portuguese term “acompanhamento” or “continuação,” while
preserving the rest of the entry unchanged.
---
Nitpick comments:
In
`@backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs`:
- Around line 118-164: Split BuildQuery into focused private filter helpers for
identity, type/subtype classification, status, and text search, keeping
BuildQuery responsible only for composing them. Preserve the existing filtering
semantics and normalization behavior, including the legacy type-or-subtype
matching, while keeping each helper under 20 lines.
🪄 Autofix
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: 7db8c908-f6e5-4c9e-b8e1-be759586d2dd
📒 Files selected for processing (27)
backend/Arah.Api.Bff/Journeys/BffJourneyRegistry.csbackend/Arah.Api/Contracts/Map/MapPinResponse.csbackend/Arah.Api/Controllers/Map/MapController.csbackend/Arah.Application/Models/MapPin.csbackend/Arah.Application/Services/Map/MapPinsService.csbackend/Arah.Infrastructure/InMemory/InMemoryAssetRepository.csbackend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.csbackend/Arah.Modules.Assets/Application/Interfaces/ITerritoryAssetRepository.csbackend/Arah.Modules.Assets/Domain/TerritoryAssetTypeMatch.csbackend/Tests/Arah.Tests/Api/ApiScenariosTests.csbackend/Tests/Arah.Tests/Domain/Assets/TerritoryAssetTypeMatchTests.csdocs/CHANGELOG.mddocs/STATUS_FASES.mddocs/_meta/PHASE_QUEUE.yamldocs/api/60_06_API_MAPA.mddocs/backlog-api/CORPOS_DAGUA_TERRITORIO.mddocs/specs/features/water-bodies-curation.spec.yamlfrontend/arah.app/lib/core/theme/app_design_tokens.dartfrontend/arah.app/lib/features/map/data/models/map_pin.dartfrontend/arah.app/lib/features/map/data/repositories/map_repository.dartfrontend/arah.app/lib/features/map/presentation/providers/map_pins_provider.dartfrontend/arah.app/lib/features/map/presentation/screens/map_screen.dartfrontend/arah.app/lib/l10n/app_en.arbfrontend/arah.app/lib/l10n/app_localizations.dartfrontend/arah.app/lib/l10n/app_localizations_en.dartfrontend/arah.app/lib/l10n/app_localizations_pt.dartfrontend/arah.app/lib/l10n/app_pt.arb
typesOrSubtypes só no map/pins; GET /assets?types= permanece Type-only. Testes: gate Active pré-curadoria, casing misto; docs em PT. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
backend/Arah.Modules.Assets/Domain/TerritoryAssetTypeMatch.cs (1)
48-59: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winUse one representation for no normalized filter.
NormalizeFilterreturnsnullfor absent input but an empty collection when all values are blank; public methods in this codebase must not returnnull. A blank-only filter also behaves differently between repositories: PostgreSQL treats each empty normalizedINlist as no match, while InMemory skips the class filter entirely. ReturnArray.Empty<string>()for absent and blank-only input, and update all callers to apply filters only whenCount > 0. Add regression coverage fornull, empty, and blank-only inputs.🤖 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 `@backend/Arah.Modules.Assets/Domain/TerritoryAssetTypeMatch.cs` around lines 48 - 59, The NormalizeFilter method should use Array.Empty<string>() consistently for null, empty, and blank-only inputs instead of returning null. Update every caller of NormalizeFilter to apply the class filter only when the normalized collection has Count > 0, preserving consistent behavior across PostgreSQL and InMemory repositories. Add regression coverage for null, empty, and blank-only inputs.Source: Coding guidelines
backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs (1)
158-180: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winMake PostgreSQL classification filtering case-insensitive.
TerritoryAsset.TypeandSubtypeare stored asvarcharand can contain non-normalized casing, while the Postgres filters compare lowercase filter values with raw column values. Normalize the database expressions, such asToLowerInvariant(), or normalize values during persistence, so PostgreSQL matchesTerritoryAssetTypeMatch.Matchesbehavior.🤖 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 `@backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs` around lines 158 - 180, Update the type and subtype predicates in the repository’s filtering logic to compare normalized database values against the normalized filter lists, including both the individual filters and normalizedTypesOrSubtypes. Preserve the existing null checks and legacy type-or-subtype matching while ensuring casing matches TerritoryAssetTypeMatch.Matches behavior.
🧹 Nitpick comments (1)
backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs (1)
152-184: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winSplit the multi-stage filter pipelines.
backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs#L152-L184: Extract type, subtype, and combined classification predicates into separate helpers.backend/Arah.Infrastructure/InMemory/InMemoryAssetRepository.cs#L127-L170: Extract identity, classification, status, and search stages into separate helpers.This keeps each method below the preferred size and makes provider behavior easier to compare.
As per coding guidelines, “Cada classe ou função deve ter uma responsabilidade; prefira funções com menos de 20 linhas”.
🤖 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 `@backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs` around lines 152 - 184, Split the filtering pipeline into focused helper methods. In backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs:152-184, extract the type, subtype, and combined classification predicates from ApplyClassificationFilters into separate helpers while preserving behavior. In backend/Arah.Infrastructure/InMemory/InMemoryAssetRepository.cs:127-170, extract the identity, classification, status, and search stages into separate helpers, with no direct changes required to the Postgres helpers beyond their extraction.Source: Coding guidelines
🤖 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
`@backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs`:
- Around line 158-180: Update the type and subtype predicates in the
repository’s filtering logic to compare normalized database values against the
normalized filter lists, including both the individual filters and
normalizedTypesOrSubtypes. Preserve the existing null checks and legacy
type-or-subtype matching while ensuring casing matches
TerritoryAssetTypeMatch.Matches behavior.
In `@backend/Arah.Modules.Assets/Domain/TerritoryAssetTypeMatch.cs`:
- Around line 48-59: The NormalizeFilter method should use Array.Empty<string>()
consistently for null, empty, and blank-only inputs instead of returning null.
Update every caller of NormalizeFilter to apply the class filter only when the
normalized collection has Count > 0, preserving consistent behavior across
PostgreSQL and InMemory repositories. Add regression coverage for null, empty,
and blank-only inputs.
---
Nitpick comments:
In
`@backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs`:
- Around line 152-184: Split the filtering pipeline into focused helper methods.
In
backend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.cs:152-184,
extract the type, subtype, and combined classification predicates from
ApplyClassificationFilters into separate helpers while preserving behavior. In
backend/Arah.Infrastructure/InMemory/InMemoryAssetRepository.cs:127-170, extract
the identity, classification, status, and search stages into separate helpers,
with no direct changes required to the Postgres helpers beyond their extraction.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: c567835b-c64a-48ef-9839-79401990a0c0
📒 Files selected for processing (12)
backend/Arah.Application/Services/Map/MapPinsService.csbackend/Arah.Infrastructure/InMemory/InMemoryAssetRepository.csbackend/Arah.Modules.Assets.Infrastructure/Postgres/PostgresAssetRepository.csbackend/Arah.Modules.Assets/Application/Interfaces/ITerritoryAssetRepository.csbackend/Arah.Modules.Assets/Domain/TerritoryAssetTypeMatch.csbackend/Tests/Arah.Tests/Api/ApiScenariosTests.csbackend/Tests/Arah.Tests/Domain/Assets/TerritoryAssetTypeMatchTests.csdocs/CHANGELOG.mddocs/api/60_06_API_MAPA.mddocs/backlog-api/CORPOS_DAGUA_TERRITORIO.mdfrontend/arah.app/lib/features/map/data/repositories/map_repository.dartfrontend/arah.app/lib/features/map/presentation/providers/map_pins_provider.dart
🚧 Files skipped from review as they are similar to previous changes (7)
- frontend/arah.app/lib/features/map/data/repositories/map_repository.dart
- backend/Arah.Modules.Assets/Application/Interfaces/ITerritoryAssetRepository.cs
- docs/backlog-api/CORPOS_DAGUA_TERRITORIO.md
- backend/Tests/Arah.Tests/Api/ApiScenariosTests.cs
- frontend/arah.app/lib/features/map/presentation/providers/map_pins_provider.dart
- docs/api/60_06_API_MAPA.md
- backend/Arah.Application/Services/Map/MapPinsService.cs


Summary
assetSubtypes;assetTypescasa Type ou Subtype (legado + ponte WA-E1)assetType/assetSubtype; Flutter com chip Corpos d'água (filtro no servidor)Spec-Id:
water-bodies-curationTest plan
dotnet build --configuration Releasedotnet testfiltro Map_Pins / TerritoryAssetTypeMatch / NaturalWaterdart analyzeem map + tokensNotes
Active); teste antigoMap_Pins_FilterAssetscorrigido para curar antes de filtrarMade with Cursor
Summary by CodeRabbit
New Features
Documentation