sbb-mcp 0.4.0 → 0.4.2
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/LICENSE +57 -57
- package/README.md +339 -314
- package/dist/structured.d.ts +119 -0
- package/dist/structured.js +133 -0
- package/dist/structured.js.map +1 -0
- package/dist/tools.js +191 -157
- package/dist/tools.js.map +1 -1
- package/dist/widgets.d.ts +33 -0
- package/dist/widgets.js +120 -0
- package/dist/widgets.js.map +1 -0
- package/package.json +75 -70
- package/web/dist/widgets.css +1 -0
- package/web/dist/widgets.js +1 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure extractors from SMAPI types to widget-friendly DTOs.
|
|
3
|
+
* Shape must stay in sync with web/src/types.ts.
|
|
4
|
+
*
|
|
5
|
+
* Keep these side-effect free. They're tested in unit tests and run on
|
|
6
|
+
* every tool invocation to populate `structuredContent` on responses.
|
|
7
|
+
*/
|
|
8
|
+
import type { SmapiPlace, SmapiTrip, SmapiTripsCollection, SmapiPriceResult } from './transport/smapi-types.js';
|
|
9
|
+
export interface StationDTO {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
lat?: number;
|
|
13
|
+
lon?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface StationsListDTO {
|
|
16
|
+
query: string;
|
|
17
|
+
stations: StationDTO[];
|
|
18
|
+
}
|
|
19
|
+
export interface LegDTO {
|
|
20
|
+
type: 'train' | 'walk';
|
|
21
|
+
line?: string;
|
|
22
|
+
platform?: string;
|
|
23
|
+
minutes: number;
|
|
24
|
+
}
|
|
25
|
+
export interface ConnectionDTO {
|
|
26
|
+
tripId: string;
|
|
27
|
+
departureTime: string;
|
|
28
|
+
arrivalTime: string;
|
|
29
|
+
durationMinutes: number;
|
|
30
|
+
transfers: number;
|
|
31
|
+
legs: LegDTO[];
|
|
32
|
+
}
|
|
33
|
+
export interface ConnectionListDTO {
|
|
34
|
+
origin: StationDTO;
|
|
35
|
+
destination: StationDTO;
|
|
36
|
+
date: string;
|
|
37
|
+
collectionId: string;
|
|
38
|
+
connections: ConnectionDTO[];
|
|
39
|
+
weather?: {
|
|
40
|
+
summary: string;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export interface TripStopDTO {
|
|
44
|
+
name: string;
|
|
45
|
+
arrivalTime?: string;
|
|
46
|
+
departureTime?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface TripLegDTO {
|
|
49
|
+
type: 'train' | 'walk';
|
|
50
|
+
line?: string;
|
|
51
|
+
operator?: string;
|
|
52
|
+
durationMinutes: number;
|
|
53
|
+
from?: {
|
|
54
|
+
name: string;
|
|
55
|
+
time: string;
|
|
56
|
+
platform?: string;
|
|
57
|
+
};
|
|
58
|
+
to?: {
|
|
59
|
+
name: string;
|
|
60
|
+
time: string;
|
|
61
|
+
platform?: string;
|
|
62
|
+
};
|
|
63
|
+
intermediateStops?: TripStopDTO[];
|
|
64
|
+
occupancy?: {
|
|
65
|
+
firstClass?: string;
|
|
66
|
+
secondClass?: string;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export interface TripDetailsDTO {
|
|
70
|
+
tripId: string;
|
|
71
|
+
origin: StationDTO;
|
|
72
|
+
destination: StationDTO;
|
|
73
|
+
departureTime: string;
|
|
74
|
+
arrivalTime: string;
|
|
75
|
+
durationMinutes: number;
|
|
76
|
+
transfers: number;
|
|
77
|
+
status: string;
|
|
78
|
+
legs: TripLegDTO[];
|
|
79
|
+
}
|
|
80
|
+
export interface PriceDTO {
|
|
81
|
+
tripId: string;
|
|
82
|
+
secondClass?: {
|
|
83
|
+
amount: number;
|
|
84
|
+
currency: string;
|
|
85
|
+
};
|
|
86
|
+
firstClass?: {
|
|
87
|
+
amount: number;
|
|
88
|
+
currency: string;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export interface PricesTableDTO {
|
|
92
|
+
prices: PriceDTO[];
|
|
93
|
+
}
|
|
94
|
+
export interface TicketCardDTO {
|
|
95
|
+
tripId: string;
|
|
96
|
+
origin: StationDTO;
|
|
97
|
+
destination: StationDTO;
|
|
98
|
+
departureTime: string;
|
|
99
|
+
arrivalTime: string;
|
|
100
|
+
primaryLink: string;
|
|
101
|
+
affiliateLink?: string;
|
|
102
|
+
}
|
|
103
|
+
export declare function toStationsListDTO(query: string, places: SmapiPlace[]): StationsListDTO;
|
|
104
|
+
export declare function toConnectionListDTO(collection: SmapiTripsCollection, weather?: {
|
|
105
|
+
summary: string;
|
|
106
|
+
}): ConnectionListDTO;
|
|
107
|
+
export declare function toTripDetailsDTO(trip: SmapiTrip): TripDetailsDTO;
|
|
108
|
+
export declare function toPricesTableDTO(results: SmapiPriceResult[]): PricesTableDTO;
|
|
109
|
+
export declare function toTicketCardDTO(params: {
|
|
110
|
+
tripId: string;
|
|
111
|
+
fromName: string;
|
|
112
|
+
fromId: string;
|
|
113
|
+
toName: string;
|
|
114
|
+
toId: string;
|
|
115
|
+
departureTime: string;
|
|
116
|
+
arrivalTime: string;
|
|
117
|
+
primaryLink: string;
|
|
118
|
+
affiliateLink?: string;
|
|
119
|
+
}): TicketCardDTO;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure extractors from SMAPI types to widget-friendly DTOs.
|
|
3
|
+
* Shape must stay in sync with web/src/types.ts.
|
|
4
|
+
*
|
|
5
|
+
* Keep these side-effect free. They're tested in unit tests and run on
|
|
6
|
+
* every tool invocation to populate `structuredContent` on responses.
|
|
7
|
+
*/
|
|
8
|
+
// ──────────────────────────────────────────────────────────────────────
|
|
9
|
+
function toStation(p) {
|
|
10
|
+
return {
|
|
11
|
+
id: p.id,
|
|
12
|
+
name: p.name,
|
|
13
|
+
lat: p.geoPosition?.latitude,
|
|
14
|
+
lon: p.geoPosition?.longitude,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function parseIsoDurationMinutes(iso) {
|
|
18
|
+
const m = iso.match(/PT(?:(\d+)H)?(?:(\d+)M)?/);
|
|
19
|
+
if (!m)
|
|
20
|
+
return 0;
|
|
21
|
+
return parseInt(m[1] ?? '0', 10) * 60 + parseInt(m[2] ?? '0', 10);
|
|
22
|
+
}
|
|
23
|
+
function legToDTO(leg) {
|
|
24
|
+
if (leg.type === 'timed') {
|
|
25
|
+
const tl = leg;
|
|
26
|
+
return {
|
|
27
|
+
type: 'train',
|
|
28
|
+
line: tl.service.publishedLineName,
|
|
29
|
+
platform: tl.board.platform,
|
|
30
|
+
minutes: parseIsoDurationMinutes(tl.duration),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
if (leg.type === 'transfer') {
|
|
34
|
+
const tr = leg;
|
|
35
|
+
return { type: 'walk', minutes: parseIsoDurationMinutes(tr.duration) };
|
|
36
|
+
}
|
|
37
|
+
return { type: 'walk', minutes: parseIsoDurationMinutes(leg.duration) };
|
|
38
|
+
}
|
|
39
|
+
export function toStationsListDTO(query, places) {
|
|
40
|
+
return { query, stations: places.map(toStation) };
|
|
41
|
+
}
|
|
42
|
+
export function toConnectionListDTO(collection, weather) {
|
|
43
|
+
const first = collection.trips[0];
|
|
44
|
+
const fallbackStation = { id: '', name: '—' };
|
|
45
|
+
return {
|
|
46
|
+
origin: first ? toStation(first.origin) : fallbackStation,
|
|
47
|
+
destination: first ? toStation(first.destination) : fallbackStation,
|
|
48
|
+
date: first?.startTime ?? '',
|
|
49
|
+
collectionId: collection.id,
|
|
50
|
+
connections: collection.trips.map((t) => ({
|
|
51
|
+
tripId: t.id,
|
|
52
|
+
departureTime: t.startTime,
|
|
53
|
+
arrivalTime: t.endTime,
|
|
54
|
+
durationMinutes: parseIsoDurationMinutes(t.duration),
|
|
55
|
+
transfers: t.transfers,
|
|
56
|
+
legs: t.legs.map(legToDTO),
|
|
57
|
+
})),
|
|
58
|
+
...(weather ? { weather } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function toTripDetailsDTO(trip) {
|
|
62
|
+
return {
|
|
63
|
+
tripId: trip.id,
|
|
64
|
+
origin: toStation(trip.origin),
|
|
65
|
+
destination: toStation(trip.destination),
|
|
66
|
+
departureTime: trip.startTime,
|
|
67
|
+
arrivalTime: trip.endTime,
|
|
68
|
+
durationMinutes: parseIsoDurationMinutes(trip.duration),
|
|
69
|
+
transfers: trip.transfers,
|
|
70
|
+
status: trip.tripStatus,
|
|
71
|
+
legs: trip.legs.map((leg) => {
|
|
72
|
+
if (leg.type === 'timed') {
|
|
73
|
+
const tl = leg;
|
|
74
|
+
return {
|
|
75
|
+
type: 'train',
|
|
76
|
+
line: tl.service.publishedLineName,
|
|
77
|
+
operator: tl.service.operatorName,
|
|
78
|
+
durationMinutes: parseIsoDurationMinutes(tl.duration),
|
|
79
|
+
from: {
|
|
80
|
+
name: tl.board.stopPlace.name,
|
|
81
|
+
time: tl.board.departureTime,
|
|
82
|
+
platform: tl.board.platform,
|
|
83
|
+
},
|
|
84
|
+
to: {
|
|
85
|
+
name: tl.alight.stopPlace.name,
|
|
86
|
+
time: tl.alight.arrivalTime,
|
|
87
|
+
platform: tl.alight.platform,
|
|
88
|
+
},
|
|
89
|
+
intermediateStops: tl.intermediateStops?.map((s) => ({
|
|
90
|
+
name: s.stopPlace.name,
|
|
91
|
+
arrivalTime: s.arrivalTime,
|
|
92
|
+
departureTime: s.departureTime,
|
|
93
|
+
})),
|
|
94
|
+
occupancy: tl.occupancy
|
|
95
|
+
? {
|
|
96
|
+
firstClass: tl.occupancy.firstClass,
|
|
97
|
+
secondClass: tl.occupancy.secondClass,
|
|
98
|
+
}
|
|
99
|
+
: undefined,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
type: 'walk',
|
|
104
|
+
durationMinutes: parseIsoDurationMinutes(leg.duration),
|
|
105
|
+
};
|
|
106
|
+
}),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export function toPricesTableDTO(results) {
|
|
110
|
+
return {
|
|
111
|
+
prices: results.map((r) => {
|
|
112
|
+
const second = r.prices.find((p) => p.class === '2');
|
|
113
|
+
const first = r.prices.find((p) => p.class === '1');
|
|
114
|
+
return {
|
|
115
|
+
tripId: r.tripId,
|
|
116
|
+
...(second ? { secondClass: { amount: second.amount, currency: second.currency } } : {}),
|
|
117
|
+
...(first ? { firstClass: { amount: first.amount, currency: first.currency } } : {}),
|
|
118
|
+
};
|
|
119
|
+
}),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function toTicketCardDTO(params) {
|
|
123
|
+
return {
|
|
124
|
+
tripId: params.tripId,
|
|
125
|
+
origin: { id: params.fromId, name: params.fromName },
|
|
126
|
+
destination: { id: params.toId, name: params.toName },
|
|
127
|
+
departureTime: params.departureTime,
|
|
128
|
+
arrivalTime: params.arrivalTime,
|
|
129
|
+
primaryLink: params.primaryLink,
|
|
130
|
+
...(params.affiliateLink ? { affiliateLink: params.affiliateLink } : {}),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=structured.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured.js","sourceRoot":"","sources":["../src/structured.ts"],"names":[],"mappings":"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"}
|