@cyanheads/wsdot-mcp-server 0.3.0 → 0.4.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.
Files changed (43) hide show
  1. package/AGENTS.md +1 -1
  2. package/CLAUDE.md +1 -1
  3. package/README.md +15 -11
  4. package/changelog/0.4.x/0.4.0.md +26 -0
  5. package/dist/index.js +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.d.ts +9 -2
  8. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.d.ts.map +1 -1
  9. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.js +40 -5
  10. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.js.map +1 -1
  11. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.d.ts +10 -3
  12. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.d.ts.map +1 -1
  13. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.js +89 -19
  14. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.js.map +1 -1
  15. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.d.ts +2 -2
  16. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.d.ts.map +1 -1
  17. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.js +12 -5
  18. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.js.map +1 -1
  19. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.d.ts +2 -2
  20. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.d.ts.map +1 -1
  21. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.js +9 -4
  22. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.js.map +1 -1
  23. package/dist/services/ferry/ferry-service.d.ts +20 -0
  24. package/dist/services/ferry/ferry-service.d.ts.map +1 -1
  25. package/dist/services/ferry/ferry-service.js +186 -49
  26. package/dist/services/ferry/ferry-service.js.map +1 -1
  27. package/dist/services/ferry/types.d.ts +52 -4
  28. package/dist/services/ferry/types.d.ts.map +1 -1
  29. package/dist/services/text-field.d.ts +31 -0
  30. package/dist/services/text-field.d.ts.map +1 -0
  31. package/dist/services/text-field.js +41 -0
  32. package/dist/services/text-field.js.map +1 -0
  33. package/dist/services/traffic/traffic-service.d.ts.map +1 -1
  34. package/dist/services/traffic/traffic-service.js +66 -86
  35. package/dist/services/traffic/traffic-service.js.map +1 -1
  36. package/dist/services/traffic/types.d.ts +3 -3
  37. package/dist/services/traffic/types.d.ts.map +1 -1
  38. package/dist/services/wcf-date.d.ts +6 -4
  39. package/dist/services/wcf-date.d.ts.map +1 -1
  40. package/dist/services/wcf-date.js +8 -4
  41. package/dist/services/wcf-date.js.map +1 -1
  42. package/package.json +1 -1
  43. package/server.json +3 -3
@@ -8,7 +8,7 @@ import { coordinatePair } from '../coordinate-pair.js';
8
8
  import { getFerryApiService } from '../../../services/ferry/ferry-service.js';
9
9
  export const getFerryTerminals = tool('wsdot_get_ferry_terminals', {
10
10
  title: 'Get Ferry Terminals',
11
- description: 'Returns all WSF ferry terminals with their numeric IDs, names, and abbreviations. ' +
11
+ description: 'Returns all WSF ferry terminals with their numeric IDs, names, abbreviations, and coordinates. ' +
12
12
  'Call this first to resolve human-readable terminal names (e.g. "Bainbridge Island", ' +
13
13
  '"Seattle", "Kingston") to the numeric terminal IDs required by the schedule and space tools. ' +
14
14
  'The terminal list is small (20 terminals) and rarely changes.',
@@ -20,8 +20,12 @@ export const getFerryTerminals = tool('wsdot_get_ferry_terminals', {
20
20
  .object({
21
21
  terminalId: z
22
22
  .number()
23
- .describe('Numeric terminal ID used in schedule and space API calls.'),
24
- terminalName: z.string().describe('Full terminal name (e.g. "Bainbridge Island").'),
23
+ .optional()
24
+ .describe('Numeric terminal ID used in schedule and space API calls. Absent when upstream omits it.'),
25
+ terminalName: z
26
+ .string()
27
+ .optional()
28
+ .describe('Full terminal name (e.g. "Bainbridge Island"). Absent when upstream omits it.'),
25
29
  terminalAbbrev: z.string().optional().describe('Short abbreviation (e.g. "BI").'),
26
30
  latitude: z.number().optional().describe('Terminal latitude.'),
27
31
  longitude: z.number().optional().describe('Terminal longitude.'),
@@ -70,8 +74,11 @@ export const getFerryTerminals = tool('wsdot_get_ferry_terminals', {
70
74
  const lines = [];
71
75
  for (const t of result.terminals) {
72
76
  const abbrev = t.terminalAbbrev ? ` (${t.terminalAbbrev})` : '';
73
- const pair = coordinatePair(t.latitude, t.longitude);
74
- lines.push(`- **${t.terminalName}**${abbrev} — ID: ${t.terminalId}${pair ? ` | ${pair}` : ''}`);
77
+ const details = [
78
+ t.terminalId != null ? `ID: ${t.terminalId}` : undefined,
79
+ coordinatePair(t.latitude, t.longitude),
80
+ ].filter(Boolean);
81
+ lines.push(`- **${t.terminalName ?? 'Terminal'}**${abbrev}${details.length > 0 ? ` — ${details.join(' | ')}` : ''}`);
75
82
  }
76
83
  return [{ type: 'text', text: lines.join('\n') }];
77
84
  },
@@ -1 +1 @@
1
- {"version":3,"file":"get-ferry-terminals.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-ferry-terminals.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-ferry-terminals.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-ferry-terminals.tool.ts"],"names":[],"mappings":"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"}
@@ -6,8 +6,8 @@ import { z } from '@cyanheads/mcp-ts-core';
6
6
  import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
7
  export declare const getMountainPasses: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
8
8
  passes: z.ZodArray<z.ZodObject<{
9
- mountainPassId: z.ZodNumber;
10
- mountainPassName: z.ZodString;
9
+ mountainPassId: z.ZodOptional<z.ZodNumber>;
10
+ mountainPassName: z.ZodOptional<z.ZodString>;
11
11
  elevation: z.ZodOptional<z.ZodNumber>;
12
12
  temperatureInFahrenheit: z.ZodOptional<z.ZodNumber>;
13
13
  weatherCondition: z.ZodOptional<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"get-mountain-passes.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-mountain-passes.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkK5B,CAAC"}
1
+ {"version":3,"file":"get-mountain-passes.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-mountain-passes.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwK5B,CAAC"}
@@ -18,10 +18,14 @@ export const getMountainPasses = tool('wsdot_get_mountain_passes', {
18
18
  passes: z
19
19
  .array(z
20
20
  .object({
21
- mountainPassId: z.number().describe('Numeric identifier for the pass.'),
21
+ mountainPassId: z
22
+ .number()
23
+ .optional()
24
+ .describe('Numeric identifier for the pass. Absent when upstream omits it.'),
22
25
  mountainPassName: z
23
26
  .string()
24
- .describe('Human-readable pass name (e.g. "Snoqualmie Pass").'),
27
+ .optional()
28
+ .describe('Human-readable pass name (e.g. "Snoqualmie Pass"). Absent when upstream omits it.'),
25
29
  elevation: z.number().optional().describe('Pass summit elevation in feet.'),
26
30
  temperatureInFahrenheit: z
27
31
  .number()
@@ -116,7 +120,7 @@ export const getMountainPasses = tool('wsdot_get_mountain_passes', {
116
120
  }
117
121
  const lines = [];
118
122
  for (const p of result.passes) {
119
- lines.push(`### ${p.mountainPassName}`);
123
+ lines.push(`### ${p.mountainPassName ?? 'Mountain pass'}`);
120
124
  if (p.elevation != null)
121
125
  lines.push(`**Elevation:** ${p.elevation} ft`);
122
126
  if (p.temperatureInFahrenheit != null)
@@ -142,7 +146,8 @@ export const getMountainPasses = tool('wsdot_get_mountain_passes', {
142
146
  }
143
147
  if (p.dateUpdated)
144
148
  lines.push(`**Updated:** ${p.dateUpdated}`);
145
- lines.push(`**ID:** ${p.mountainPassId}`);
149
+ if (p.mountainPassId != null)
150
+ lines.push(`**ID:** ${p.mountainPassId}`);
146
151
  const coords = coordinatePair(p.latitude, p.longitude);
147
152
  if (coords)
148
153
  lines.push(`**Coords:** ${coords}`);
@@ -1 +1 @@
1
- {"version":3,"file":"get-mountain-passes.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-mountain-passes.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-mountain-passes.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-mountain-passes.tool.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,13 @@ import type { AppConfig } from '@cyanheads/mcp-ts-core/config';
8
8
  import type { StorageService } from '@cyanheads/mcp-ts-core/storage';
9
9
  import type { FerryAlert, FerryRoute, FerrySchedule, FerryTerminal, TerminalSailingSpace, VesselLocation } from './types.js';
10
10
  export declare class FerryApiService {
11
+ /**
12
+ * Terminal pairs keyed by `{tripDate}/{routeId}`. WSF lists the lookup as cacheable until its
13
+ * `cacheflushdate` stamp changes, so the entries hold only while {@link pairCacheStamp} matches it;
14
+ * a new stamp empties the map. Public upstream data, so it is shared across tenants.
15
+ */
16
+ private readonly pairCache;
17
+ private pairCacheStamp;
11
18
  constructor(_config: AppConfig, _storage: StorageService);
12
19
  private accessCode;
13
20
  private buildUrl;
@@ -26,7 +33,20 @@ export declare class FerryApiService {
26
33
  */
27
34
  static todayFerryDate(): string;
28
35
  getTerminals(ctx: Context): Promise<FerryTerminal[]>;
36
+ private fetchRoutes;
37
+ /**
38
+ * Whether WSF lists any route for the trip date. A date inside WSF's window whose season has no
39
+ * sailings loaded yet lists none — and WSF then rejects every terminal pair on it exactly as it
40
+ * rejects a pair that never has service, so this is what tells the two apart.
41
+ */
42
+ hasRoutes(tripDate: string, ctx: Context): Promise<boolean>;
29
43
  getRoutes(tripDate: string, ctx: Context): Promise<FerryRoute[]>;
44
+ /**
45
+ * The pairs each route serves on the trip date, from the cache when WSF's flush stamp still
46
+ * matches and otherwise one `terminalsandmatesbyroute` request per route. Any failed request fails
47
+ * the call — a route list with some routes' pairs missing would read as those routes serving none.
48
+ */
49
+ private terminalPairsByRoute;
30
50
  getSchedule(departingTerminalId: number, arrivingTerminalId: number, tripDate: string, remainingOnly: boolean, ctx: Context): Promise<FerrySchedule>;
31
51
  getVesselLocations(ctx: Context): Promise<VesselLocation[]>;
32
52
  getTerminalSailingSpace(ctx: Context): Promise<TerminalSailingSpace[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"ferry-service.d.ts","sourceRoot":"","sources":["../../../src/services/ferry/ferry-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMrE,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,aAAa,EAOb,oBAAoB,EACpB,cAAc,EACf,MAAM,YAAY,CAAC;AAMpB,qBAAa,eAAe;IAC1B,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAI;IAE5D,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;IAgCjB;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAc1C;IAED;;;;OAIG;IACH,MAAM,CAAC,cAAc,IAAI,MAAM,CAE9B;IAEK,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAUzD;IAEK,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQrE;IAEK,WAAW,CACf,mBAAmB,EAAE,MAAM,EAC3B,kBAAkB,EAAE,MAAM,EAC1B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,OAAO,EACtB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,aAAa,CAAC,CAqCxB;IAEK,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAsBhE;IAEK,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAmD3E;IAEK,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA0BnD;CACF;AAMD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAEpF;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD"}
1
+ {"version":3,"file":"ferry-service.d.ts","sourceRoot":"","sources":["../../../src/services/ferry/ferry-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMrE,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,aAAa,EASb,oBAAoB,EACpB,cAAc,EACf,MAAM,YAAY,CAAC;AAsEpB,qBAAa,eAAe;IAC1B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,cAAc,CAAqB;IAE3C,YAAY,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAI;IAE5D,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;IAoCjB;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAc1C;IAED;;;;OAIG;IACH,MAAM,CAAC,cAAc,IAAI,MAAM,CAE9B;IAEK,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAYzD;YAEa,WAAW;IAMzB;;;;OAIG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAGhE;IAEK,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAWrE;IAED;;;;OAIG;YACW,oBAAoB;IAmD5B,WAAW,CACf,mBAAmB,EAAE,MAAM,EAC3B,kBAAkB,EAAE,MAAM,EAC1B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,OAAO,EACtB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,aAAa,CAAC,CAqDxB;IAEK,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAsBhE;IAEK,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAmD3E;IAEK,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAuBnD;CACF;AAMD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAEpF;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD"}
@@ -6,13 +6,74 @@
6
6
  import { validationError } from '@cyanheads/mcp-ts-core/errors';
7
7
  import { withRetry } from '@cyanheads/mcp-ts-core/utils';
8
8
  import { getServerConfig } from '../../config/server-config.js';
9
- import { htmlToText } from '../html-text.js';
9
+ import { htmlTextField, nonBlank, nonBlankHtml, textField } from '../text-field.js';
10
10
  import { wcfDateField } from '../wcf-date.js';
11
11
  import { assertUpstreamJson, fetchUpstream, redactUrl } from '../wsdot-http.js';
12
12
  const BASE_URL = 'https://www.wsdot.wa.gov/Ferries/API';
13
13
  const TIMEOUT_MS = 15_000;
14
14
  const SERVICE = 'WSF Ferry API';
15
+ /** Most `terminalsandmatesbyroute` lookups one routes call keeps in flight. */
16
+ const PAIR_LOOKUP_CONCURRENCY = 5;
17
+ /**
18
+ * WSF's rejection of a trip date outside the window it has published — "The TripDate 1/1/2099 is
19
+ * not valid. The valid range begins with today's date (…) and extends to the end of the most
20
+ * recently posted schedule (…)." Distinct from a terminal-pair rejection, which names the TripDate
21
+ * only after "is not valid".
22
+ */
23
+ const TRIP_DATE_REJECTED = /\bTripDate\s+\S+\s+is not valid\b/i;
24
+ /** The `Message` WSF puts in a JSON error body, or `undefined` when the body carries none. */
25
+ function wsfMessage(body) {
26
+ try {
27
+ const parsed = JSON.parse(body);
28
+ if (parsed !== null && typeof parsed === 'object' && 'Message' in parsed) {
29
+ const { Message } = parsed;
30
+ return typeof Message === 'string' ? Message : undefined;
31
+ }
32
+ }
33
+ catch {
34
+ // Not JSON — an HTML page or plain text, which assertUpstreamJson classifies.
35
+ }
36
+ return undefined;
37
+ }
38
+ /**
39
+ * Throw `invalid_date` when WSF rejected the request's trip date. WSF's message is kept whole: it
40
+ * states the window it accepts, measured from its own Pacific service day.
41
+ */
42
+ function assertTripDateAccepted(message, endpoint, status, ctx) {
43
+ if (message === undefined || !TRIP_DATE_REJECTED.test(message))
44
+ return;
45
+ throw validationError(`WSF has no schedule for the requested trip date. ${message}`, {
46
+ url: endpoint,
47
+ status,
48
+ reason: 'invalid_date',
49
+ retryable: false,
50
+ ...ctx.recoveryFor('invalid_date'),
51
+ });
52
+ }
53
+ /**
54
+ * A route's pairs as `terminalsandmatesbyroute` lists them. A pair missing either terminal ID is left
55
+ * out — it exists to be passed to the schedule tool, which needs both.
56
+ */
57
+ function normalizeTerminalPairs(raw) {
58
+ return (raw ?? []).flatMap((p) => p.DepartingTerminalID != null && p.ArrivingTerminalID != null
59
+ ? [
60
+ {
61
+ departingTerminalId: p.DepartingTerminalID,
62
+ ...textField('departingTerminalName', p.DepartingDescription),
63
+ arrivingTerminalId: p.ArrivingTerminalID,
64
+ ...textField('arrivingTerminalName', p.ArrivingDescription),
65
+ },
66
+ ]
67
+ : []);
68
+ }
15
69
  export class FerryApiService {
70
+ /**
71
+ * Terminal pairs keyed by `{tripDate}/{routeId}`. WSF lists the lookup as cacheable until its
72
+ * `cacheflushdate` stamp changes, so the entries hold only while {@link pairCacheStamp} matches it;
73
+ * a new stamp empties the map. Public upstream data, so it is shared across tenants.
74
+ */
75
+ pairCache = new Map();
76
+ pairCacheStamp;
16
77
  constructor(_config, _storage) { }
17
78
  accessCode() {
18
79
  return getServerConfig().accessCode;
@@ -28,6 +89,10 @@ export class FerryApiService {
28
89
  // The body is read before any status check: WSF explains an unregistered access code in
29
90
  // the body of a 400, which a status-first throw discards unread.
30
91
  const body = await response.text();
92
+ // A trip date outside WSF's window is an input error whatever the status it arrives with,
93
+ // so it is classified before a non-2xx falls through to api_unavailable.
94
+ if (!response.ok)
95
+ assertTripDateAccepted(wsfMessage(body), endpoint, response.status, ctx);
31
96
  assertUpstreamJson({ body, endpoint, response, service: SERVICE }, ctx);
32
97
  const parsed = JSON.parse(body);
33
98
  // Ferry API returns HTTP 200 with {"Message":"..."} for validation errors
@@ -36,6 +101,7 @@ export class FerryApiService {
36
101
  !Array.isArray(parsed) &&
37
102
  'Message' in parsed) {
38
103
  const msg = parsed.Message;
104
+ assertTripDateAccepted(msg, endpoint, response.status, ctx);
39
105
  throw validationError(`WSF Ferry API error: ${msg}`, { url: endpoint });
40
106
  }
41
107
  return parsed;
@@ -72,57 +138,131 @@ export class FerryApiService {
72
138
  }
73
139
  async getTerminals(ctx) {
74
140
  ctx.log.info('Fetching ferry terminals');
75
- const raw = await this.fetchJson('Terminals/rest/terminalbasics', ctx);
141
+ // terminallocations carries the same IDs, names, and abbreviations as terminalbasics, in the
142
+ // same order, plus the coordinates terminalbasics never sends.
143
+ const raw = await this.fetchJson('Terminals/rest/terminallocations', ctx);
76
144
  return (raw ?? []).map((t) => ({
77
- terminalId: t.TerminalID ?? 0,
78
- terminalName: t.TerminalName ?? 'Unknown',
79
- ...(t.TerminalAbbrev != null && { terminalAbbrev: t.TerminalAbbrev }),
145
+ ...(t.TerminalID != null && { terminalId: t.TerminalID }),
146
+ ...textField('terminalName', t.TerminalName),
147
+ ...textField('terminalAbbrev', t.TerminalAbbrev),
80
148
  ...(t.Latitude != null && { latitude: t.Latitude }),
81
149
  ...(t.Longitude != null && { longitude: t.Longitude }),
82
150
  }));
83
151
  }
152
+ async fetchRoutes(tripDate, ctx) {
153
+ return ((await this.fetchJson(`Schedule/rest/routes/${tripDate}`, ctx)) ?? []);
154
+ }
155
+ /**
156
+ * Whether WSF lists any route for the trip date. A date inside WSF's window whose season has no
157
+ * sailings loaded yet lists none — and WSF then rejects every terminal pair on it exactly as it
158
+ * rejects a pair that never has service, so this is what tells the two apart.
159
+ */
160
+ async hasRoutes(tripDate, ctx) {
161
+ ctx.log.info('Checking for ferry routes', { tripDate });
162
+ return (await this.fetchRoutes(tripDate, ctx)).length > 0;
163
+ }
84
164
  async getRoutes(tripDate, ctx) {
85
165
  ctx.log.info('Fetching ferry routes', { tripDate });
86
- const raw = await this.fetchJson(`Schedule/rest/routes/${tripDate}`, ctx);
87
- return (raw ?? []).map((r) => ({
166
+ const raw = await this.fetchRoutes(tripDate, ctx);
167
+ const routeIds = [...new Set(raw.flatMap((r) => (r.RouteID != null ? [r.RouteID] : [])))];
168
+ const pairs = await this.terminalPairsByRoute(tripDate, routeIds, ctx);
169
+ return raw.map((r) => ({
88
170
  ...(r.RouteID != null && { routeId: r.RouteID }),
89
- ...(r.RouteAbbrev != null && { routeAbbrev: r.RouteAbbrev }),
90
- ...(r.Description != null && { description: r.Description }),
171
+ ...textField('routeAbbrev', r.RouteAbbrev),
172
+ ...textField('description', r.Description),
173
+ ...(r.RouteID != null && { terminalPairs: pairs.get(r.RouteID) ?? [] }),
91
174
  }));
92
175
  }
93
- async getSchedule(departingTerminalId, arrivingTerminalId, tripDate, remainingOnly, ctx) {
94
- let path;
95
- const todayDate = FerryApiService.todayFerryDate();
96
- const isToday = tripDate === todayDate;
97
- // remainingOnly is only meaningful for today's sailings; ignore it for future dates
98
- if (isToday) {
99
- const flag = remainingOnly ? 'true' : 'false';
100
- path = `Schedule/rest/scheduletoday/${departingTerminalId}/${arrivingTerminalId}/${flag}`;
176
+ /**
177
+ * The pairs each route serves on the trip date, from the cache when WSF's flush stamp still
178
+ * matches and otherwise one `terminalsandmatesbyroute` request per route. Any failed request fails
179
+ * the call — a route list with some routes' pairs missing would read as those routes serving none.
180
+ */
181
+ async terminalPairsByRoute(tripDate, routeIds, ctx) {
182
+ const pairs = new Map();
183
+ if (routeIds.length === 0)
184
+ return pairs;
185
+ const stamp = JSON.stringify(await this.fetchJson('Schedule/rest/cacheflushdate', ctx));
186
+ if (stamp !== this.pairCacheStamp) {
187
+ this.pairCache.clear();
188
+ this.pairCacheStamp = stamp;
189
+ }
190
+ const missing = [];
191
+ for (const routeId of routeIds) {
192
+ const cached = this.pairCache.get(`${tripDate}/${routeId}`);
193
+ if (cached)
194
+ pairs.set(routeId, cached);
195
+ else
196
+ missing.push(routeId);
101
197
  }
102
- else {
103
- path = `Schedule/rest/schedule/${tripDate}/${departingTerminalId}/${arrivingTerminalId}`;
198
+ for (let i = 0; i < missing.length; i += PAIR_LOOKUP_CONCURRENCY) {
199
+ const batch = missing.slice(i, i + PAIR_LOOKUP_CONCURRENCY);
200
+ const results = await Promise.all(batch.map((routeId) => this.fetchJson(`Schedule/rest/terminalsandmatesbyroute/${tripDate}/${routeId}`, ctx)));
201
+ batch.forEach((routeId, j) => {
202
+ const routePairs = normalizeTerminalPairs(results[j] ?? null);
203
+ // A concurrent call may have seen a newer stamp while this batch was in flight; pairs
204
+ // fetched under the old one are served to this call but never cached under the new one.
205
+ if (this.pairCacheStamp === stamp)
206
+ this.pairCache.set(`${tripDate}/${routeId}`, routePairs);
207
+ pairs.set(routeId, routePairs);
208
+ });
104
209
  }
210
+ ctx.log.info('Ferry terminal pairs resolved', {
211
+ tripDate,
212
+ routes: routeIds.length,
213
+ lookedUp: missing.length,
214
+ fromCache: routeIds.length - missing.length,
215
+ });
216
+ return pairs;
217
+ }
218
+ async getSchedule(departingTerminalId, arrivingTerminalId, tripDate, remainingOnly, ctx) {
219
+ // remainingOnly applies only to today's sailings — the dated endpoint has no such filter — so
220
+ // the value reported back is the one that actually shaped the result.
221
+ const isToday = tripDate === FerryApiService.todayFerryDate();
222
+ const effectiveRemainingOnly = isToday && remainingOnly;
223
+ const path = isToday
224
+ ? `Schedule/rest/scheduletoday/${departingTerminalId}/${arrivingTerminalId}/${effectiveRemainingOnly}`
225
+ : `Schedule/rest/schedule/${tripDate}/${departingTerminalId}/${arrivingTerminalId}`;
105
226
  ctx.log.info('Fetching ferry schedule', {
106
227
  departingTerminalId,
107
228
  arrivingTerminalId,
108
229
  tripDate,
109
- remainingOnly,
230
+ remainingOnly: effectiveRemainingOnly,
110
231
  });
111
232
  const raw = await this.fetchJson(path, ctx);
112
233
  // Schedule response nests sailings in TerminalCombos[0].Times
113
234
  const combo = raw.TerminalCombos?.[0];
235
+ // Annotations are HTML and some carry nothing once rendered. Dropping a blank one shifts the
236
+ // positions after it, so each sailing's indexes are remapped onto the entries kept — and an
237
+ // index that pointed at nothing is dropped — so every index resolves.
238
+ const annotations = [];
239
+ const keptAt = new Map();
240
+ for (const [i, rawNote] of (combo?.Annotations ?? []).entries()) {
241
+ const note = nonBlankHtml(rawNote);
242
+ if (note == null)
243
+ continue;
244
+ keptAt.set(i, annotations.length);
245
+ annotations.push(note);
246
+ }
114
247
  return {
115
- ...(combo?.DepartingTerminalName != null && {
116
- departingTerminalName: combo.DepartingTerminalName,
117
- }),
118
- ...(combo?.ArrivingTerminalName != null && {
119
- arrivingTerminalName: combo.ArrivingTerminalName,
120
- }),
248
+ ...textField('departingTerminalName', combo?.DepartingTerminalName),
249
+ ...textField('arrivingTerminalName', combo?.ArrivingTerminalName),
121
250
  tripDate,
251
+ remainingOnly: effectiveRemainingOnly,
252
+ ...(combo?.Annotations != null && { annotations }),
253
+ ...htmlTextField('sailingNotes', combo?.SailingNotes),
122
254
  sailings: (combo?.Times ?? []).map((s) => ({
123
255
  ...wcfDateField('departureTime', s.DepartingTime),
124
256
  ...wcfDateField('arrivalTime', s.ArrivingTime),
125
- ...(s.VesselName != null && { vesselName: s.VesselName }),
257
+ ...textField('vesselName', s.VesselName),
258
+ ...(s.VesselID != null && { vesselId: s.VesselID }),
259
+ ...(s.LoadingRule != null && { loadingRule: s.LoadingRule }),
260
+ ...(typeof s.VesselHandicapAccessible === 'boolean' && {
261
+ vesselHandicapAccessible: s.VesselHandicapAccessible,
262
+ }),
263
+ ...(s.AnnotationIndexes != null && {
264
+ annotationIndexes: s.AnnotationIndexes.flatMap((i) => keptAt.get(i) ?? []),
265
+ }),
126
266
  })),
127
267
  };
128
268
  }
@@ -131,13 +271,13 @@ export class FerryApiService {
131
271
  const raw = await this.fetchJson('Vessels/rest/vessellocations', ctx);
132
272
  return (raw ?? []).map((v) => ({
133
273
  ...(v.VesselID != null && { vesselId: v.VesselID }),
134
- ...(v.VesselName != null && { vesselName: v.VesselName }),
274
+ ...textField('vesselName', v.VesselName),
135
275
  ...(typeof v.InService === 'boolean' && { inService: v.InService }),
136
276
  ...(typeof v.AtDock === 'boolean' && { atDock: v.AtDock }),
137
277
  ...(v.DepartingTerminalID != null && { departingTerminalId: v.DepartingTerminalID }),
138
- ...(v.DepartingTerminalName != null && { departingTerminalName: v.DepartingTerminalName }),
278
+ ...textField('departingTerminalName', v.DepartingTerminalName),
139
279
  ...(v.ArrivingTerminalID != null && { arrivingTerminalId: v.ArrivingTerminalID }),
140
- ...(v.ArrivingTerminalName != null && { arrivingTerminalName: v.ArrivingTerminalName }),
280
+ ...textField('arrivingTerminalName', v.ArrivingTerminalName),
141
281
  ...(v.Latitude != null && { latitude: v.Latitude }),
142
282
  ...(v.Longitude != null && { longitude: v.Longitude }),
143
283
  ...(v.Speed != null && { speed: v.Speed }),
@@ -145,7 +285,7 @@ export class FerryApiService {
145
285
  ...wcfDateField('leftDock', v.LeftDock),
146
286
  ...wcfDateField('eta', v.Eta),
147
287
  ...wcfDateField('scheduledDeparture', v.ScheduledDeparture),
148
- opRouteAbbrev: v.OpRouteAbbrev ?? [],
288
+ opRouteAbbrev: (v.OpRouteAbbrev ?? []).flatMap((abbrev) => nonBlank(abbrev) ?? []),
149
289
  ...wcfDateField('timestamp', v.TimeStamp),
150
290
  }));
151
291
  }
@@ -154,7 +294,7 @@ export class FerryApiService {
154
294
  const raw = await this.fetchJson('Terminals/rest/terminalsailingspace', ctx);
155
295
  return (raw ?? []).map((t) => ({
156
296
  ...(t.TerminalID != null && { terminalId: t.TerminalID }),
157
- ...(t.TerminalName != null && { terminalName: t.TerminalName }),
297
+ ...textField('terminalName', t.TerminalName),
158
298
  departingSpaces: (t.DepartingSpaces ?? []).flatMap((s) => {
159
299
  // Space counts are nested per arriving terminal; expand into one entry per arrival terminal
160
300
  const arrivalTerminals = s.SpaceForArrivalTerminals ?? [];
@@ -164,7 +304,7 @@ export class FerryApiService {
164
304
  {
165
305
  ...wcfDateField('departure', s.Departure),
166
306
  ...(typeof s.IsCancelled === 'boolean' && { isCancelled: s.IsCancelled }),
167
- ...(s.VesselName != null && { vesselName: s.VesselName }),
307
+ ...textField('vesselName', s.VesselName),
168
308
  ...(s.MaxSpaceCount != null && { maxSpaceCount: s.MaxSpaceCount }),
169
309
  },
170
310
  ];
@@ -172,10 +312,10 @@ export class FerryApiService {
172
312
  return arrivalTerminals.map((a) => ({
173
313
  ...wcfDateField('departure', s.Departure),
174
314
  ...(typeof s.IsCancelled === 'boolean' && { isCancelled: s.IsCancelled }),
175
- ...(s.VesselName != null && { vesselName: s.VesselName }),
315
+ ...textField('vesselName', s.VesselName),
176
316
  // TerminalName is an itinerary string and its sibling TerminalID is the *departing*
177
317
  // terminal on multi-stop routes; ArrivalTerminalIDs is the only reliable destination.
178
- ...(a.TerminalName != null && { itineraryLabel: a.TerminalName }),
318
+ ...textField('itineraryLabel', a.TerminalName),
179
319
  ...(a.ArrivalTerminalIDs != null &&
180
320
  a.ArrivalTerminalIDs.length > 0 && { arrivingTerminalIds: a.ArrivalTerminalIDs }),
181
321
  ...(typeof a.DisplayDriveUpSpace === 'boolean' && {
@@ -193,7 +333,7 @@ export class FerryApiService {
193
333
  reservableSpaceCount: Math.max(0, a.ReservableSpaceCount),
194
334
  }),
195
335
  ...(s.MaxSpaceCount != null && { maxSpaceCount: s.MaxSpaceCount }),
196
- ...(a.DriveUpSpaceHexColor != null && { driveUpSpaceHexColor: a.DriveUpSpaceHexColor }),
336
+ ...textField('driveUpSpaceHexColor', a.DriveUpSpaceHexColor),
197
337
  }));
198
338
  }),
199
339
  }));
@@ -202,21 +342,18 @@ export class FerryApiService {
202
342
  ctx.log.info('Fetching ferry alerts');
203
343
  const raw = await this.fetchJson('Schedule/rest/alerts', ctx);
204
344
  return (raw ?? []).map((a) => {
205
- // The bulletin body is authored in a rich-text editor and arrives as HTML — nested spans
206
- // carrying Word-paste attributes, lists, anchors. It is rendered to plain text here, before
207
- // either response path reads it, so structuredContent and format() carry the same string.
208
- const bulletinText = a.BulletinText != null ? htmlToText(a.BulletinText) : '';
345
+ const title = nonBlank(a.AlertFullTitle);
346
+ // Prefer the plain-text marquee summary; fall back to the title when it is absent or blank.
347
+ const description = nonBlank(a.RouteAlertText) ?? title;
209
348
  return {
210
349
  ...(a.BulletinID != null && { alertId: a.BulletinID }),
211
- ...(a.AlertFullTitle != null && { alertTitle: a.AlertFullTitle }),
212
- // Prefer plain-text RouteAlertText; fall back to AlertFullTitle when absent
213
- ...(a.RouteAlertText != null
214
- ? { alertDescription: a.RouteAlertText }
215
- : a.AlertFullTitle != null
216
- ? { alertDescription: a.AlertFullTitle }
217
- : {}),
218
- ...(bulletinText && { bulletinText }),
219
- ...(a.AlertType != null && { alertType: a.AlertType }),
350
+ ...(title != null && { alertTitle: title }),
351
+ ...(description != null && { alertDescription: description }),
352
+ // The bulletin body is authored in a rich-text editor and arrives as HTML — nested spans
353
+ // carrying Word-paste attributes, lists, anchors. It is rendered to plain text here, before
354
+ // either response path reads it, so structuredContent and format() carry the same string.
355
+ ...htmlTextField('bulletinText', a.BulletinText),
356
+ ...textField('alertType', a.AlertType),
220
357
  // A fleet-wide alert carries no route IDs, so the flag is what separates "every route"
221
358
  // from "no route" — it is mapped whenever upstream states it either way.
222
359
  ...(typeof a.AllRoutesFlag === 'boolean' && { affectsAllRoutes: a.AllRoutesFlag }),
@@ -1 +1 @@
1
- {"version":3,"file":"ferry-service.js","sourceRoot":"","sources":["../../../src/services/ferry/ferry-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ferry-service.js","sourceRoot":"","sources":["../../../src/services/ferry/ferry-service.ts"],"names":[],"mappings":"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"}