export type DepthDatum = 'belowTransducer' | 'belowKeel' | 'belowSurface'; export interface Snapshot { ts: number; lat: number | null; lon: number | null; sog: number | null; cog: number | null; heading_mag: number | null; heading_true: number | null; rate_of_turn: number | null; magnetic_variation: number | null; magnetic_deviation: number | null; nav_state: string | null; wind_speed_apparent: number | null; wind_angle_apparent: number | null; wind_speed_true: number | null; wind_gust: number | null; wind_direction_true: number | null; air_temp_k: number | null; air_pressure_pa: number | null; depth: number | null; depth_datum?: DepthDatum | null; water_temp_k: number | null; gps_satellites: number | null; ais_class: string | null; path_values?: Record; } export type MetricField = Exclude; export type MetricKind = 'position' | 'linear' | 'angular' | 'text'; export declare const METRIC_KIND: { readonly lat: "position"; readonly lon: "position"; readonly sog: "linear"; readonly rate_of_turn: "linear"; readonly magnetic_variation: "linear"; readonly magnetic_deviation: "linear"; readonly wind_speed_apparent: "linear"; readonly wind_speed_true: "linear"; readonly wind_gust: "linear"; readonly air_temp_k: "linear"; readonly air_pressure_pa: "linear"; readonly depth: "linear"; readonly water_temp_k: "linear"; readonly gps_satellites: "linear"; readonly cog: "angular"; readonly heading_mag: "angular"; readonly heading_true: "angular"; readonly wind_angle_apparent: "angular"; readonly wind_direction_true: "angular"; readonly nav_state: "text"; readonly ais_class: "text"; readonly depth_datum: "text"; }; export declare function metricFields(...kinds: MetricKind[]): MetricField[]; export interface MetricAgg { min?: number; max?: number; avg?: number; n?: number; last: number | string | null; } export interface RollupHour { hour: string; count: number; first_ts: number; last_ts: number; distance_nm: number; pos_first: { lat: number; lon: number; } | null; pos_last: { lat: number; lon: number; } | null; metrics: Partial>; path_metrics?: Record; } export interface RollupDay { date: string; count: number; first_ts: number; last_ts: number; distance_nm: number; pos_first: { lat: number; lon: number; } | null; pos_last: { lat: number; lon: number; } | null; metrics: Partial>; path_metrics?: Record; } export interface SnapshotsQuery { from?: number; to?: number; bucket: 1 | 60 | 360 | 1440; limit?: number; offset?: number; order?: 'asc' | 'desc'; } export interface SnapshotsResult { rows: Snapshot[]; clamped: boolean; minutesFrom?: number; } export interface PathSeriesPoint { ts: number; min: number; max: number; avg: number; last: number; } export interface PathSeriesResult { path: string; points: PathSeriesPoint[]; clamped: boolean; minutesFrom?: number; } export interface HistoryRequest { type: 'history'; id: string; path: string; query: SnapshotsQuery; } export type HistoryResponse = { type: 'history'; id: string; result: PathSeriesResult; } | { type: 'history'; id: string; error: { code: string; message: string; }; }; export interface SnapshotsRequest { type: 'snapshots'; id: string; query: SnapshotsQuery; } export type SnapshotsResponse = { type: 'snapshots'; id: string; result: SnapshotsResult; } | { type: 'snapshots'; id: string; error: { code: string; message: string; }; }; export interface VoyagesRequest { type: 'voyages'; id: string; limit: number; } export type VoyagesResponse = { type: 'voyages'; id: string; result: VoyageListResult; } | { type: 'voyages'; id: string; error: { code: string; message: string; }; }; export interface TrackRequest { type: 'track'; id: string; voyageId: number; } export type TrackResponse = { type: 'track'; id: string; result: TrackResult; } | { type: 'track'; id: string; error: { code: string; message: string; }; }; export interface PhasesRequest { type: 'phases'; id: string; limit: number; } export type PhasesResponse = { type: 'phases'; id: string; result: PhaseListResult; } | { type: 'phases'; id: string; error: { code: string; message: string; }; }; export interface LiveResult extends Snapshot { data_age_s: number | null; paths?: Record; path_ages?: Record; field_ages?: Partial>; } export interface InventoryEntry { path: string; units: string | null; } export interface InventoryResult { paths: InventoryEntry[]; } export interface HealthResult { status: 'ok' | 'degraded'; security_off?: boolean; pairing_locked?: boolean; now: number; started_at: number; version: string; boat_name: string | null; last_delta_ts: number | null; last_snapshot_ts: number | null; snapshots_today: number; diagnosis: { code: string; message: string; since_ts: number | null; }; paths: Record; storage: { raw_bytes: number; cap_bytes: number; raw_files: number; oldest_raw: string | null; }; rollup: { last_hour: string | null; hours_pending: number; }; ais: { receiver_seen: boolean; first_seen_ts: number | null; }; sealing: { devices: number; mode: 'sealed' | 'blocked' | 'none'; reason: string | null; screens: string[]; screens_pinned: boolean; screens_skipped: { kid: string; reason: string; }[]; screens_rejected: { kid: string; reason: string; }[]; }; } export type PhaseKind = 'underway' | 'anchored' | 'moored' | 'stopped'; export interface Phase { kind: PhaseKind; start_ts: number; end_ts: number | null; start_lat: number | null; start_lon: number | null; end_lat: number | null; end_lon: number | null; } export interface Voyage { id: number; start_ts: number; end_ts: number | null; start_lat: number | null; start_lon: number | null; end_lat: number | null; end_lon: number | null; distance_nm: number; hours_underway: number; avg_sog_kn: number | null; max_sog_kn: number | null; fuel_used_l: number | null; start_port: string | null; end_port: string | null; status: 'open' | 'closed'; } export interface VoyageListResult { voyages: Voyage[]; } export interface PhaseListResult { phases: Phase[]; } export interface VoyageWindowStats { distance_nm: number; hours_underway: number; avg_sog_kn: number | null; max_sog_kn: number | null; } export interface VoyageStatsResult { today: VoyageWindowStats; yesterday: VoyageWindowStats; rolling_7d: VoyageWindowStats; season: VoyageWindowStats; } export interface TrackPoint { ts: number; lat: number; lon: number; sog: number | null; } export interface TrackResult { track: TrackPoint[]; decimated: boolean; } export interface AisTarget { mmsi: string; name: string | null; lat: number; lon: number; sog_kn: number | null; cog_deg: number | null; heading_deg: number | null; nav_state: string | null; ais_class: string | null; ship_type: string | null; length_m: number | null; distance_nm: number | null; ts: number | null; } export interface AisFeed { targets: AisTarget[]; own: { lat: number; lon: number; } | null; count: number; error?: string; } export interface ApiError { error: { code: string; message: string; }; } export interface WrappedKey { kid: string; wrap: string; } export interface SealedFrame { v: number; boat: string; ts: number; eph: string; nonce: string; body: string; keys: WrappedKey[]; sig: string; [extension: string]: unknown; } export interface BoatPublicKeys { identity: string; inbox: string; } export interface DeviceApproval { by: string; mac: string; } export interface DevicePublicKey { kid: string; pub: string; approvals?: DeviceApproval[]; } export interface RollupsRequest { type: 'rollups'; id: string; from: number; to: number; } export interface RollupsResult { rows: RollupHour[]; } export type RollupsResponse = { type: 'rollups'; id: string; result: RollupsResult; } | { type: 'rollups'; id: string; error: { code: string; message: string; }; }; export interface StatsRequest { type: 'stats'; id: string; } export type StatsResponse = { type: 'stats'; id: string; result: VoyageStatsResult; } | { type: 'stats'; id: string; error: { code: string; message: string; }; }; export interface FuelPathsView { available: string[]; selected: string[]; } export interface FuelRequest { type: 'fuel'; id: string; } export type FuelResponse = { type: 'fuel'; id: string; result: FuelPathsView; } | { type: 'fuel'; id: string; error: { code: string; message: string; }; }; export interface AisRequest { type: 'ais'; id: string; maxNm?: number; limit?: number; } export type AisResponse = { type: 'ais'; id: string; result: AisFeed; } | { type: 'ais'; id: string; error: { code: string; message: string; }; }; export interface HealthRequest { type: 'health'; id: string; } export type HealthResponse = { type: 'health'; id: string; result: HealthResult; } | { type: 'health'; id: string; error: { code: string; message: string; }; };