@sessionplan/contracts 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # @sessionplan/contracts
2
+
3
+ Type declarations for the SessionPlan API.
4
+
5
+ > **Public for installation convenience; not a stable external contract until 1.0.**
6
+ > These types describe the shapes exchanged between the SessionPlan API and its
7
+ > first-party clients (the MCP server, the web app). They may change without a
8
+ > major version bump while the package is in the `0.x` range. Do not depend on
9
+ > this package for third-party integrations yet.
10
+
11
+ ## Install
12
+
13
+ ```sh
14
+ npm install @sessionplan/contracts
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```ts
20
+ import type {
21
+ GenerationContext,
22
+ WorkspaceListResponse,
23
+ SessionResponse,
24
+ ResolveExercisesResponse,
25
+ PerformanceSummary,
26
+ HealthResponse,
27
+ } from '@sessionplan/contracts';
28
+ ```
29
+
30
+ The package is **type-only** apart from a single runtime export, `ContractVersion`,
31
+ which mirrors the package version so clients can report the contract revision they
32
+ were built against.
33
+
34
+ ```ts
35
+ import { ContractVersion } from '@sessionplan/contracts';
36
+
37
+ console.log(ContractVersion); // "0.1.0"
38
+ ```
39
+
40
+ ## Scope
41
+
42
+ This package is the single source of truth for the API wire contract. It contains
43
+ **only** `interface` / `type` declarations (plus `ContractVersion`). Runtime
44
+ builders, validators, and helpers stay in the API and its clients.
45
+
46
+ | Module | Covers |
47
+ | ------------ | ------------------------------------------------------------- |
48
+ | `common` | Shared primitives: `JsonValue`, units, scopes, pagination |
49
+ | `profile` | Physical profile + training-context narrative shapes |
50
+ | `context` | `GenerationContext` and its nested context blocks |
51
+ | `workspaces` | Workspace list/detail responses |
52
+ | `sessions` | Session create/update requests and responses |
53
+ | `logs` | Performance log content + `PerformanceSummary` |
54
+ | `exercises` | Exercise resolution and search responses |
55
+ | `reports` | Progress report content and list/detail responses |
56
+ | `health` | `/health` diagnostics response |
57
+
58
+ ## Versioning
59
+
60
+ While in `0.x`, minor versions may introduce breaking changes. Consumers pin an
61
+ **exact** version (`"@sessionplan/contracts": "0.1.0"`). See the contracts release
62
+ playbook in the SES-80 work item for the publish/upgrade flow.
63
+
64
+ ## Development
65
+
66
+ ```sh
67
+ npm install
68
+ npm run build # emit dist/ declarations + js
69
+ npm run typecheck # type-check without emitting
70
+ ```
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Shared primitives used across the SessionPlan contract modules.
3
+ *
4
+ * This package is standalone: it does not import from the API codebase. The
5
+ * `JsonValue` alias below mirrors the Supabase `Json` type used server-side so
6
+ * that JSONB payload fields stay structurally compatible without a dependency.
7
+ */
8
+ /** Recursive JSON value — mirrors the server-side Supabase `Json` type. */
9
+ export type JsonValue = string | number | boolean | null | {
10
+ [key: string]: JsonValue | undefined;
11
+ } | JsonValue[];
12
+ export type UnitSystem = 'metric' | 'imperial';
13
+ export type WeightUnit = 'lb' | 'kg';
14
+ export type DistanceUnit = 'mi' | 'km';
15
+ export type HeightUnit = 'ft' | 'cm';
16
+ export type WorkspaceRole = 'admin' | 'member';
17
+ export type TeamRole = 'facilitator' | 'participant';
18
+ export type SessionScope = 'private' | 'workspace' | 'team';
19
+ export type ExerciseScope = 'system' | 'workspace';
20
+ export type LocationScope = 'system' | 'workspace' | 'private';
21
+ export interface PaginationParams {
22
+ /** 1-indexed, default 1 */
23
+ page?: number;
24
+ /** default 20, max 100 */
25
+ limit?: number;
26
+ }
27
+ export interface PaginationMeta {
28
+ page: number;
29
+ limit: number;
30
+ total: number;
31
+ pages: number;
32
+ }
33
+ export interface PaginatedResponse<T> {
34
+ data: T[];
35
+ pagination: PaginationMeta;
36
+ }
37
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;CAAE,GACxC,SAAS,EAAE,CAAC;AAMhB,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAC/C,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AACrC,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AAMrC,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC/C,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,aAAa,CAAC;AAErD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,CAAC;AACnD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;AAM/D,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,UAAU,EAAE,cAAc,CAAC;CAC5B"}
package/dist/common.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shared primitives used across the SessionPlan contract modules.
3
+ *
4
+ * This package is standalone: it does not import from the API codebase. The
5
+ * `JsonValue` alias below mirrors the Supabase `Json` type used server-side so
6
+ * that JSONB payload fields stay structurally compatible without a dependency.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Generation context: the bundled, raw-data payload the API assembles for AI
3
+ * session generation. This is the single largest contract surface.
4
+ *
5
+ * IMPORTANT: this is RAW DATA for the AI to interpret. It contains no
6
+ * recommendations or training decisions — those stay with the AI client.
7
+ */
8
+ import type { UnitSystem } from './common.js';
9
+ import type { PhysicalProfile, ProfileNarrativeBlocks, MovementLimitation, TrainingProgramConfig, Sport } from './profile.js';
10
+ import type { ExerciseSummary } from './logs.js';
11
+ import type { ReportKPI } from './reports.js';
12
+ export interface UserPreferences {
13
+ /** Total session time in minutes (wall-clock, including warm-up and cooldown). */
14
+ maxSessionMinutes: number;
15
+ }
16
+ export interface ProfileContext {
17
+ userId: string;
18
+ displayName?: string;
19
+ unitSystem: UnitSystem;
20
+ physical: PhysicalProfile;
21
+ narrativeBlocks: ProfileNarrativeBlocks;
22
+ movementLimitations: MovementLimitation[];
23
+ activeAggravatingPatternTags: string[];
24
+ injuries: string[];
25
+ experienceLevel: string;
26
+ goals: string | null;
27
+ trainingDays: string[];
28
+ splitStructure: string | null;
29
+ priorityMuscleGroups: string[];
30
+ rpeTarget: [number, number];
31
+ trainingProgram: TrainingProgramConfig;
32
+ deloadFrequencyWeeks?: number;
33
+ defaultLocationId: string | null;
34
+ sports: Sport[];
35
+ recoveryModalities: string[];
36
+ preferences: UserPreferences;
37
+ }
38
+ export interface EquipmentConfig {
39
+ type?: string;
40
+ weights?: number[];
41
+ angles?: number[];
42
+ available?: boolean;
43
+ }
44
+ export interface EquipmentContext {
45
+ locationId: string;
46
+ locationName: string;
47
+ locationType: 'personal' | 'commercial' | 'hotel' | 'outdoor';
48
+ equipment: Record<string, EquipmentConfig>;
49
+ dumbbellLadder?: number[];
50
+ }
51
+ export interface UnitContext {
52
+ system: UnitSystem;
53
+ weight: 'lb' | 'kg';
54
+ distance: 'mi' | 'km';
55
+ height: 'ft' | 'cm';
56
+ }
57
+ export interface ExerciseHistorySnapshot {
58
+ date: string;
59
+ load: string;
60
+ reps: number;
61
+ rpe: number;
62
+ }
63
+ export interface ExerciseHistorySummary {
64
+ exercise: string;
65
+ lastPerformed: string;
66
+ lastLoad: string;
67
+ lastReps: number;
68
+ avgRPE: number;
69
+ peakLoad?: string;
70
+ peakReps?: number;
71
+ peakDate?: string;
72
+ recentSessions?: ExerciseHistorySnapshot[];
73
+ volumeChange?: string;
74
+ prAchieved?: boolean;
75
+ }
76
+ export interface ExerciseIndexLog {
77
+ performed_at: string;
78
+ exerciseIndex?: Record<string, ExerciseSummary>;
79
+ unitSystem?: 'metric' | 'imperial';
80
+ }
81
+ /** Condensed from ExerciseProgressionRow — only the fields the AI needs. */
82
+ export interface ProgressionTrend {
83
+ exercise: string;
84
+ volumeChange: string;
85
+ volumeChangeSentiment: 'positive' | 'neutral' | 'negative';
86
+ sessions: string;
87
+ }
88
+ export interface ReportSummary {
89
+ id: string;
90
+ grade: string;
91
+ periodStart: string;
92
+ periodEnd: string;
93
+ highlights: string[];
94
+ focusAreas: string[];
95
+ injuryStatus: string;
96
+ kpis?: ReportKPI[];
97
+ progressionTrends?: ProgressionTrend[];
98
+ recommendations?: string[];
99
+ blockRange?: string | null;
100
+ }
101
+ export interface HistoryContext {
102
+ source: 'report' | 'logs';
103
+ recentSessions: number;
104
+ exerciseHistory: ExerciseHistorySummary[];
105
+ reportSummary?: ReportSummary;
106
+ }
107
+ export interface SameWeekSession {
108
+ sessionId: string;
109
+ title: string;
110
+ scheduledFor: string;
111
+ exercises: string[];
112
+ /** Per-exercise set counts extracted from prescription (key = exercise name). */
113
+ exerciseSets?: Record<string, number>;
114
+ }
115
+ export interface CompactPrescription {
116
+ sets?: number | null;
117
+ reps?: number | string | null;
118
+ weight?: number | string | null;
119
+ multiplier?: number | null;
120
+ angle?: number | null;
121
+ rpe?: number | null;
122
+ timeSeconds?: number | null;
123
+ holdSeconds?: number | null;
124
+ distanceMeters?: number | null;
125
+ distanceMiles?: number | null;
126
+ restSeconds?: number | null;
127
+ }
128
+ export interface RecentSessionTemplateItem {
129
+ kind: 'exercise' | 'superset' | 'circuit';
130
+ name: string;
131
+ link?: string | null;
132
+ prescription?: CompactPrescription | null;
133
+ children?: Array<{
134
+ name: string;
135
+ link?: string | null;
136
+ prescription?: CompactPrescription | null;
137
+ }> | null;
138
+ }
139
+ export interface RecentSessionTemplateSection {
140
+ type: string;
141
+ title: string;
142
+ displayMode?: 'reference' | 'log' | null;
143
+ items: RecentSessionTemplateItem[];
144
+ }
145
+ export interface RecentSessionTemplate {
146
+ sessionId: string;
147
+ title: string;
148
+ scheduledFor: string | null;
149
+ block?: number | null;
150
+ week?: number | null;
151
+ sessionType?: string | null;
152
+ completion?: {
153
+ status: 'planned' | 'logged';
154
+ logId?: string;
155
+ performedAt?: string;
156
+ logKind?: 'quick' | 'full';
157
+ signalCompleteness?: 'session-only' | 'set-level';
158
+ completionStatus?: 'completed' | 'partial' | 'skipped';
159
+ sessionRpe?: number;
160
+ painType?: 'none' | 'soreness' | 'acute';
161
+ skippedSections?: string[];
162
+ };
163
+ sections: RecentSessionTemplateSection[];
164
+ }
165
+ export interface PeriodizationSignals {
166
+ current?: {
167
+ block?: number;
168
+ week?: number;
169
+ weekInCycle?: number;
170
+ cycleLength?: number;
171
+ phase?: 'reset' | 'build' | 'peak' | 'deload';
172
+ };
173
+ lastDeload?: {
174
+ block: number;
175
+ week: number;
176
+ scheduledFrom: string | null;
177
+ scheduledTo: string | null;
178
+ sessionIds: string[];
179
+ detectedBy: Array<'cycle-position' | 'prescription-reduction' | 'low-rpe'>;
180
+ };
181
+ lastHardWeek?: {
182
+ block: number;
183
+ week: number;
184
+ scheduledFrom: string | null;
185
+ scheduledTo: string | null;
186
+ sessionIds: string[];
187
+ relation: 'pre-deload' | 'latest-non-deload';
188
+ };
189
+ }
190
+ export type DefaultLogType = 'strength' | 'isometric' | 'conditioning' | 'endurance' | 'carry' | 'mobility' | 'stretch';
191
+ export interface ExerciseEntry {
192
+ name: string;
193
+ equipment: string[];
194
+ tags: string[];
195
+ primary_muscles: string[];
196
+ secondary_muscles: string[];
197
+ movement_pattern: string | null;
198
+ level: string | null;
199
+ defaultLogType: DefaultLogType;
200
+ }
201
+ export interface ExerciseIndex {
202
+ [slug: string]: ExerciseEntry;
203
+ }
204
+ /** Per-muscle-group weekly set count. */
205
+ export interface WeeklyMuscleVolume {
206
+ muscle: string;
207
+ sets: number;
208
+ sessions: number;
209
+ }
210
+ /** Metadata that helps AI clients distinguish absent profile data from user-confirmed settings. */
211
+ export interface OnboardingState {
212
+ isZeroProfile: boolean;
213
+ hasNarrativeContext: boolean;
214
+ hasTrainingHistory: boolean;
215
+ hasDefaultLocation: boolean;
216
+ defaultedFields: string[];
217
+ recentLogCount: number;
218
+ recentSessionCount: number;
219
+ lastContextWriteAt: string | null;
220
+ staleContext: boolean;
221
+ }
222
+ export interface GenerationContext {
223
+ unitSystem: UnitSystem;
224
+ units: UnitContext;
225
+ /** Pre-formatted delimited block for prompt assembly. */
226
+ userUnitsBlock: string;
227
+ profile: ProfileContext;
228
+ equipment: EquipmentContext;
229
+ history: HistoryContext;
230
+ onboardingState: OnboardingState;
231
+ exercises: ExerciseIndex;
232
+ sameWeekSessions: SameWeekSession[];
233
+ recentSessionTemplates: RecentSessionTemplate[];
234
+ weeklyVolume?: WeeklyMuscleVolume[];
235
+ derivedBlock?: number;
236
+ derivedWeek?: number;
237
+ periodizationSignals?: PeriodizationSignals;
238
+ }
239
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Exercise resolution, search, and detail responses.
3
+ */
4
+ import type { JsonValue, ExerciseScope, PaginationParams } from './common.js';
5
+ /** Confidence level of exercise name resolution. */
6
+ export type ResolveConfidence = 'exact' | 'alias' | 'fuzzy' | 'unresolved';
7
+ /** Single resolution result. */
8
+ export interface ExerciseResolution {
9
+ /** The name the AI provided. */
10
+ inputName: string;
11
+ /** Canonical slug (always populated — computed via slugify even if unresolved). */
12
+ slug: string;
13
+ /** Whether the exercise exists in the database. */
14
+ found: boolean;
15
+ /** How the match was made. */
16
+ confidence: ResolveConfidence;
17
+ /** Canonical display name (from DB if found, from input if not). */
18
+ canonicalName: string;
19
+ /** Link path (only if found in DB). */
20
+ link: string | null;
21
+ /** Suggested alternative if fuzzy matched to a different exercise. */
22
+ suggestion?: string;
23
+ }
24
+ /** Batch resolution request. */
25
+ export interface ResolveExercisesRequest {
26
+ names: string[];
27
+ workspace_id: string;
28
+ }
29
+ /** Batch resolution response. */
30
+ export interface ResolveExercisesResponse {
31
+ resolutions: ExerciseResolution[];
32
+ stats: {
33
+ total: number;
34
+ exact: number;
35
+ alias: number;
36
+ fuzzy: number;
37
+ unresolved: number;
38
+ };
39
+ }
40
+ export interface ExerciseListParams extends PaginationParams {
41
+ tag?: string;
42
+ equipment?: string;
43
+ search?: string;
44
+ scope?: ExerciseScope;
45
+ }
46
+ export interface ExerciseCreateRequest {
47
+ slug: string;
48
+ name: string;
49
+ equipment?: string[];
50
+ tags?: string[];
51
+ setup?: string[];
52
+ steps?: string[];
53
+ cues?: string[];
54
+ mistakes?: string[];
55
+ safety?: string;
56
+ scaling?: {
57
+ regressions?: string[];
58
+ progressions?: string[];
59
+ };
60
+ variations?: string[];
61
+ prescription_hints?: Record<string, unknown>;
62
+ joints?: Record<string, unknown>;
63
+ media?: Record<string, unknown>;
64
+ }
65
+ export interface ExerciseUpdateRequest {
66
+ name?: string;
67
+ equipment?: string[];
68
+ tags?: string[];
69
+ setup?: string[];
70
+ steps?: string[];
71
+ cues?: string[];
72
+ mistakes?: string[];
73
+ safety?: string;
74
+ scaling?: {
75
+ regressions?: string[];
76
+ progressions?: string[];
77
+ };
78
+ variations?: string[];
79
+ prescription_hints?: Record<string, unknown>;
80
+ joints?: Record<string, unknown>;
81
+ media?: Record<string, unknown>;
82
+ }
83
+ /** Exercise with scope info for API responses. */
84
+ export interface ExerciseWithScope {
85
+ id: string;
86
+ slug: string;
87
+ name: string;
88
+ equipment: string[];
89
+ tags: string[];
90
+ setup: string[];
91
+ steps: string[];
92
+ cues: string[];
93
+ mistakes: string[];
94
+ safety: string | null;
95
+ scaling: JsonValue | null;
96
+ variations: string[];
97
+ prescription_hints: JsonValue | null;
98
+ joints: JsonValue | null;
99
+ media: JsonValue | null;
100
+ scope: ExerciseScope;
101
+ workspace_id: string | null;
102
+ created_by: string | null;
103
+ created_at: string;
104
+ updated_at: string;
105
+ }
106
+ //# sourceMappingURL=exercises.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exercises.d.ts","sourceRoot":"","sources":["../src/exercises.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAM9E,oDAAoD;AACpD,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,CAAC;AAE3E,gCAAgC;AAChC,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,OAAO,CAAC;IACf,8BAA8B;IAC9B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,gCAAgC;AAChC,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,iCAAiC;AACjC,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAMD,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,kDAAkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB,EAAE,SAAS,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=exercises.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exercises.js","sourceRoot":"","sources":["../src/exercises.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Health / diagnostics response shared by SessionPlan services.
3
+ *
4
+ * `version` is the service's own package version; `contractsVersion` is the
5
+ * `@sessionplan/contracts` revision the service was built against. Services also
6
+ * surface these as `X-Service-Version` / `X-Contracts-Version` response headers.
7
+ */
8
+ export interface HealthResponse {
9
+ status: 'ok' | 'degraded' | 'error';
10
+ service: string;
11
+ timestamp: string;
12
+ /** Service package version (e.g. the API or MCP server version). */
13
+ version?: string;
14
+ /** `@sessionplan/contracts` version the service was built against. */
15
+ contractsVersion?: string;
16
+ database?: {
17
+ connected: boolean;
18
+ exerciseCount?: number;
19
+ locationCount?: number;
20
+ error?: string;
21
+ };
22
+ }
23
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,OAAO,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE;QACT,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH"}
package/dist/health.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @sessionplan/contracts
3
+ *
4
+ * Shared TypeScript wire contracts for the SessionPlan API. Type-only except for
5
+ * the `ContractVersion` constant below.
6
+ *
7
+ * Public for installation convenience; not a stable external contract until 1.0.
8
+ */
9
+ export * from './common.js';
10
+ export * from './profile.js';
11
+ export * from './context.js';
12
+ export * from './workspaces.js';
13
+ export * from './sessions.js';
14
+ export * from './logs.js';
15
+ export * from './exercises.js';
16
+ export * from './reports.js';
17
+ export * from './health.js';
18
+ /**
19
+ * The contract revision this build was published at. Mirrors package.json
20
+ * version so clients can report the contract they were compiled against.
21
+ */
22
+ export declare const ContractVersion = "0.1.0";
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAE5B;;;GAGG;AACH,eAAO,MAAM,eAAe,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @sessionplan/contracts
3
+ *
4
+ * Shared TypeScript wire contracts for the SessionPlan API. Type-only except for
5
+ * the `ContractVersion` constant below.
6
+ *
7
+ * Public for installation convenience; not a stable external contract until 1.0.
8
+ */
9
+ export * from './common.js';
10
+ export * from './profile.js';
11
+ export * from './context.js';
12
+ export * from './workspaces.js';
13
+ export * from './sessions.js';
14
+ export * from './logs.js';
15
+ export * from './exercises.js';
16
+ export * from './reports.js';
17
+ export * from './health.js';
18
+ /**
19
+ * The contract revision this build was published at. Mirrors package.json
20
+ * version so clients can report the contract they were compiled against.
21
+ */
22
+ export const ContractVersion = '0.1.0';
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAE5B;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC"}