Alpha stage commit

This commit is contained in:
2026-07-02 21:04:05 +02:00
parent c03b183dfb
commit abed21be21
136 changed files with 15531 additions and 15 deletions

150
schemas/domain_types.ts Normal file
View File

@@ -0,0 +1,150 @@
export type Coordinate = {
lat: number;
lon: number;
elevationM?: number;
};
export type BikepackingProfileId =
| 'loaded_gravel'
| 'hardtail_bikepacking'
| 'road_touring'
| 'ebikepacking'
| 'beginner_safe';
export type SleepPreference =
| 'official_campsites'
| 'mixed_budget'
| 'indoor_only'
| 'wild_where_legal'
| 'any_safe_option';
export type PoiCategory =
| 'water'
| 'food'
| 'sleep'
| 'repair'
| 'bailout'
| 'charging'
| 'emergency';
export type Confidence =
| 'known_good'
| 'high'
| 'medium'
| 'low'
| 'unknown'
| 'restricted'
| 'conflicting';
export type WarningSeverity = 'info' | 'notice' | 'warning' | 'critical';
export type TripRequest = {
start: Coordinate;
end: Coordinate;
viaPoints?: Coordinate[];
startDate?: string;
endDate?: string;
profile: BikepackingProfileId;
sleepPreference: SleepPreference;
dailyDistanceKm: { min: number; target: number; max: number };
dailyAscentM?: { target?: number; max?: number };
maxLoadedGradePercent?: number;
preferredUnpavedPercent?: { min?: number; max?: number };
waterGapMaxKm?: number;
foodGapMaxKm?: number;
requireBailoutEveryKm?: number;
};
export type RouteSegment = {
id: string;
geometry: Coordinate[];
distanceM: number;
ascentM?: number;
descentM?: number;
avgGradePercent?: number;
maxGradePercent?: number;
surface?: string;
smoothness?: string;
highway?: string;
bicycleAccess?: string;
legalAccessConfidence: Confidence;
trafficStress?: number;
officialCycleRoute?: boolean;
protectedAreaOverlap?: boolean;
communityScore?: number;
sourceConfidence: Confidence;
};
export type RouteWarning = {
code: string;
severity: WarningSeverity;
title: string;
message: string;
metersFromStart?: number;
segmentId?: string;
};
export type RoutePlan = {
id: string;
tripId: string;
geometry: Coordinate[];
distanceM: number;
ascentM: number;
descentM: number;
segments: RouteSegment[];
surfaceBreakdown: Record<string, number>;
suitabilityScore: number;
warnings: RouteWarning[];
provider: string;
};
export type Poi = {
id: string;
category: PoiCategory;
name: string;
location: Coordinate;
source: string;
confidence: Confidence;
distanceFromRouteM?: number;
metersFromStart?: number;
detourDistanceM?: number;
openingHours?: string;
lastConfirmedAt?: string;
tags?: Record<string, string>;
};
export type StagePlan = {
id: string;
routeId: string;
dayIndex: number;
startMeters: number;
endMeters: number;
distanceM: number;
ascentM?: number;
descentM?: number;
expectedRideTimeMinutes?: { low: number; high: number };
sleepCandidates: Poi[];
waterPois: Poi[];
foodPois: Poi[];
repairPois: Poi[];
bailoutPois: Poi[];
warnings: RouteWarning[];
planB?: {
earlierEndMeters?: number;
laterEndMeters?: number;
reason: string;
};
};
export type OfflinePackManifest = {
packId: string;
tripId: string;
routeId: string;
createdAt: string;
bbox: [number, number, number, number];
routeBufferKm: number;
includedLayers: string[];
dataVersions: Record<string, string>;
files: Array<{ type: string; url?: string; path?: string; bytes?: number }>;
warnings: RouteWarning[];
};