/** * Shared agent-safe-series/v1 contract types for Delx wellness MCP servers. * Provider-specific shaping (Garmin descriptors, Strava streams, …) stays in * each connector. This package freezes the envelope and the hard caps. * * Canonical narrative: https://github.com/davidmosiah/delx-wellness/blob/main/docs/agent-safe-series.md */ export declare const SERIES_CONTRACT_VERSION: "agent-safe-series/v1"; export declare const SERIES_HARD_MAX_POINTS = 500; export declare const SERIES_DEFAULT_MAX_POINTS = 400; export type ReferenceSource = "caller_provided" | "activity_recorded_max" | "observed_max"; export type CoverageAnchor = "nominal_duration" | "sample_span"; export type AgentSafeSeriesPoint = { t: number; value: number; min: number; max: number; samples: number; }; export type AgentSafeSeries = { contract_version: typeof SERIES_CONTRACT_VERSION; activity_id: string | number; metric: string; unit: string; start_time?: string; t_unit: "seconds_from_start"; resolution_seconds: number; requested_resolution_seconds: number; points: AgentSafeSeriesPoint[]; stats: { avg: number; min: number; max: number; p25: number; p50: number; p75: number; percentile_method: "linear_interpolation"; }; time_in_zone?: { zone_model: "percent_of_reference_max_hr"; reference_max_hr: number; reference_source: ReferenceSource; zones: Array<{ zone: number; min_bpm: number; max_bpm: number | null; seconds: number; percent: number; }>; }; downsampled: boolean; source_points: number; returned_points: number; method: "time_bucket_mean" | "none"; data_quality: { expected_samples: number; actual_samples: number; coverage_ratio: number; longest_gap_seconds: number; sample_interval_seconds: number; coverage_anchor: CoverageAnchor; }; notes: string[]; }; /** * Connector-owned fields. `contract_version`, `t_unit`, `returned_points`, and * `percentile_method` are stamped here so a caller cannot emit a different * contract string by accident. */ export type BuildAgentSafeSeriesInput = Omit & { returned_points?: number; stats: Omit & { percentile_method?: "linear_interpolation"; }; }; /** Assert hard caps used by connectors. */ export declare function clampMaxPoints(maxPoints: number): number; /** * Stamp a frozen v1 envelope after the connector has shaped `points`. * Does not downsample — rejecting an over-budget array is the point. */ export declare function buildAgentSafeSeries(input: BuildAgentSafeSeriesInput): AgentSafeSeries; //# sourceMappingURL=series.d.ts.map