@curless/hotel-storefront 0.27.5 → 0.27.7

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 (113) hide show
  1. package/README.md +18 -8
  2. package/dist/fence.d.ts +12 -1
  3. package/dist/fence.d.ts.map +1 -1
  4. package/dist/fence.js +0 -0
  5. package/dist/fence.js.map +1 -1
  6. package/dist/huazhu/backend.d.ts +9 -0
  7. package/dist/huazhu/backend.d.ts.map +1 -1
  8. package/dist/huazhu/backend.js +18 -2
  9. package/dist/huazhu/backend.js.map +1 -1
  10. package/dist/huazhu/cancel-policy.d.ts.map +1 -1
  11. package/dist/huazhu/cancel-policy.js +3 -1
  12. package/dist/huazhu/cancel-policy.js.map +1 -1
  13. package/dist/index.js +0 -0
  14. package/dist/legal.js +1 -1
  15. package/dist/legal.js.map +1 -1
  16. package/dist/money.d.ts +2 -0
  17. package/dist/money.d.ts.map +1 -1
  18. package/dist/money.js +43 -6
  19. package/dist/money.js.map +1 -1
  20. package/dist/server.d.ts +1 -1
  21. package/dist/server.d.ts.map +1 -1
  22. package/dist/server.js +9 -1
  23. package/dist/server.js.map +1 -1
  24. package/dist/sessions.d.ts.map +1 -1
  25. package/dist/sessions.js +3 -2
  26. package/dist/sessions.js.map +1 -1
  27. package/dist/surface.d.ts +2 -0
  28. package/dist/surface.d.ts.map +1 -1
  29. package/dist/surface.js +10 -1
  30. package/dist/surface.js.map +1 -1
  31. package/dist/tools.d.ts +4 -4
  32. package/dist/tools.d.ts.map +1 -1
  33. package/dist/tools.js +21 -8
  34. package/dist/tools.js.map +1 -1
  35. package/dist/trip-ids.js +1 -1
  36. package/dist/trip-ids.js.map +1 -1
  37. package/package.json +10 -11
  38. package/dist/__tests__/__fixtures__/huazhu-fake.d.ts +0 -2
  39. package/dist/__tests__/__fixtures__/huazhu-fake.d.ts.map +0 -1
  40. package/dist/__tests__/__fixtures__/huazhu-fake.js +0 -3
  41. package/dist/__tests__/__fixtures__/huazhu-fake.js.map +0 -1
  42. package/dist/__tests__/__helpers__/sessions.d.ts +0 -10
  43. package/dist/__tests__/__helpers__/sessions.d.ts.map +0 -1
  44. package/dist/__tests__/__helpers__/sessions.js +0 -40
  45. package/dist/__tests__/__helpers__/sessions.js.map +0 -1
  46. package/dist/__tests__/audit-p0.test.d.ts +0 -2
  47. package/dist/__tests__/audit-p0.test.d.ts.map +0 -1
  48. package/dist/__tests__/audit-p0.test.js +0 -274
  49. package/dist/__tests__/audit-p0.test.js.map +0 -1
  50. package/dist/__tests__/audit-p2.test.d.ts +0 -2
  51. package/dist/__tests__/audit-p2.test.d.ts.map +0 -1
  52. package/dist/__tests__/audit-p2.test.js +0 -98
  53. package/dist/__tests__/audit-p2.test.js.map +0 -1
  54. package/dist/__tests__/card-contract.test.d.ts +0 -2
  55. package/dist/__tests__/card-contract.test.d.ts.map +0 -1
  56. package/dist/__tests__/card-contract.test.js +0 -282
  57. package/dist/__tests__/card-contract.test.js.map +0 -1
  58. package/dist/__tests__/data.test.d.ts +0 -2
  59. package/dist/__tests__/data.test.d.ts.map +0 -1
  60. package/dist/__tests__/data.test.js +0 -210
  61. package/dist/__tests__/data.test.js.map +0 -1
  62. package/dist/__tests__/dates.test.d.ts +0 -2
  63. package/dist/__tests__/dates.test.d.ts.map +0 -1
  64. package/dist/__tests__/dates.test.js +0 -107
  65. package/dist/__tests__/dates.test.js.map +0 -1
  66. package/dist/__tests__/demo-hotels.test.d.ts +0 -2
  67. package/dist/__tests__/demo-hotels.test.d.ts.map +0 -1
  68. package/dist/__tests__/demo-hotels.test.js +0 -765
  69. package/dist/__tests__/demo-hotels.test.js.map +0 -1
  70. package/dist/__tests__/huazhu-audit.test.d.ts +0 -2
  71. package/dist/__tests__/huazhu-audit.test.d.ts.map +0 -1
  72. package/dist/__tests__/huazhu-audit.test.js +0 -234
  73. package/dist/__tests__/huazhu-audit.test.js.map +0 -1
  74. package/dist/__tests__/huazhu-backend.test.d.ts +0 -2
  75. package/dist/__tests__/huazhu-backend.test.d.ts.map +0 -1
  76. package/dist/__tests__/huazhu-backend.test.js +0 -1326
  77. package/dist/__tests__/huazhu-backend.test.js.map +0 -1
  78. package/dist/__tests__/huazhu-cancel-policy.test.d.ts +0 -2
  79. package/dist/__tests__/huazhu-cancel-policy.test.d.ts.map +0 -1
  80. package/dist/__tests__/huazhu-cancel-policy.test.js +0 -82
  81. package/dist/__tests__/huazhu-cancel-policy.test.js.map +0 -1
  82. package/dist/__tests__/huazhu-sandbox.test.d.ts +0 -2
  83. package/dist/__tests__/huazhu-sandbox.test.d.ts.map +0 -1
  84. package/dist/__tests__/huazhu-sandbox.test.js +0 -195
  85. package/dist/__tests__/huazhu-sandbox.test.js.map +0 -1
  86. package/dist/__tests__/huazhu-sellable.test.d.ts +0 -2
  87. package/dist/__tests__/huazhu-sellable.test.d.ts.map +0 -1
  88. package/dist/__tests__/huazhu-sellable.test.js +0 -192
  89. package/dist/__tests__/huazhu-sellable.test.js.map +0 -1
  90. package/dist/__tests__/present.test.d.ts +0 -2
  91. package/dist/__tests__/present.test.d.ts.map +0 -1
  92. package/dist/__tests__/present.test.js +0 -367
  93. package/dist/__tests__/present.test.js.map +0 -1
  94. package/dist/__tests__/prose.test.d.ts +0 -2
  95. package/dist/__tests__/prose.test.d.ts.map +0 -1
  96. package/dist/__tests__/prose.test.js +0 -171
  97. package/dist/__tests__/prose.test.js.map +0 -1
  98. package/dist/__tests__/server.test.d.ts +0 -2
  99. package/dist/__tests__/server.test.d.ts.map +0 -1
  100. package/dist/__tests__/server.test.js +0 -557
  101. package/dist/__tests__/server.test.js.map +0 -1
  102. package/dist/__tests__/state.test.d.ts +0 -2
  103. package/dist/__tests__/state.test.d.ts.map +0 -1
  104. package/dist/__tests__/state.test.js +0 -204
  105. package/dist/__tests__/state.test.js.map +0 -1
  106. package/dist/__tests__/tool-descriptions.test.d.ts +0 -2
  107. package/dist/__tests__/tool-descriptions.test.d.ts.map +0 -1
  108. package/dist/__tests__/tool-descriptions.test.js +0 -220
  109. package/dist/__tests__/tool-descriptions.test.js.map +0 -1
  110. package/dist/__tests__/tools.test.d.ts +0 -2
  111. package/dist/__tests__/tools.test.d.ts.map +0 -1
  112. package/dist/__tests__/tools.test.js +0 -1598
  113. package/dist/__tests__/tools.test.js.map +0 -1
@@ -1,557 +0,0 @@
1
- import { mkdtempSync, readFileSync, readdirSync } from 'node:fs';
2
- import { tmpdir } from 'node:os';
3
- import { join } from 'node:path';
4
- import { fileURLToPath } from 'node:url';
5
- import { beforeEach, describe, expect, it } from 'vitest';
6
- import { loadHotelData } from '../data.js';
7
- import { checkHuazhu } from '../huazhu/check.js';
8
- import { CARD_MIME, CARD_URI, TRIP_META_KEY, VERSION, buildServer, imageDomainsOf, loadConfig, } from '../server.js';
9
- import { createFakeHuazhu, fakeHotel, product } from './__fixtures__/huazhu-fake.js';
10
- import { namedSessions } from './__helpers__/sessions.js';
11
- // The protocol surface, over the real app: what a host actually sends, and what
12
- // it gets back. Every assertion here is a line a host reads and acts on - the
13
- // ones that were learned the hard way carry the reason.
14
- const FIXTURE_DATA = new URL('./__fixtures__/brand.json', import.meta.url);
15
- const HUAZHU_API = {
16
- provider: 'huazhu',
17
- baseUrl: 'https://biz.huazhu.test',
18
- authUrl: 'https://auth.huazhu.test',
19
- stateDir: 'state',
20
- };
21
- const { config, configPath } = loadConfig(fileURLToPath(new URL('./__fixtures__/config.json', import.meta.url)));
22
- let app;
23
- let brand;
24
- const sessions = namedSessions(() => app.request);
25
- const rpc = async (method, params, headers = {}) => {
26
- const res = await app.request('/mcp', {
27
- method: 'POST',
28
- headers: await sessions.headers(method, { 'content-type': 'application/json', ...headers }),
29
- body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
30
- });
31
- const text = await res.text();
32
- return {
33
- status: res.status,
34
- body: text ? JSON.parse(text) : null,
35
- sessionId: res.headers.get('mcp-session-id'),
36
- };
37
- };
38
- const callTool = (name, args, session) => rpc('tools/call', { name, arguments: args }, { 'mcp-session-id': session });
39
- beforeEach(() => {
40
- const built = buildServer({ config, configPath, now: () => Date.parse('2026-10-01T02:00:00Z') });
41
- app = built.app;
42
- brand = built.brand;
43
- sessions.reset();
44
- });
45
- describe('initialize', () => {
46
- it('issues a session id, because a host sent none has none to send back', async () => {
47
- const res = await rpc('initialize', { protocolVersion: '2025-06-18' });
48
- expect(res.sessionId).toMatch(/[0-9a-f-]{36}/);
49
- expect(res.body.result.serverInfo.title).toBe('Shangri-La Hotels (demo)');
50
- expect(res.body.result.capabilities).toEqual({ tools: {}, resources: {} });
51
- });
52
- // ⚠️ A NEW ONE, ALWAYS. The id is what a conversation's trip, bookings and
53
- // sign-in are filed under; a caller that could choose it could choose
54
- // somebody else's (2026-09-28 audit).
55
- it('issues its own session id, never one the caller brought', async () => {
56
- const res = await rpc('initialize', {}, { 'mcp-session-id': 'sess-1' });
57
- expect(res.sessionId).not.toBe('sess-1');
58
- expect(res.sessionId).toMatch(/[0-9a-f-]{36}/);
59
- });
60
- it('hands the host the behaviour, not just the tools', async () => {
61
- const { body } = await rpc('initialize', {});
62
- expect(body.result.instructions).toContain('A city usually has several hotels');
63
- expect(body.result.instructions).toContain('IT TAKES NO MONEY AND COLLECTS NO CARD');
64
- });
65
- });
66
- // ⚠️ A session id was any string the caller sent: twelve made-up ones, one
67
- // booking each, emptied a hotel for a month (2026-10-05 audit).
68
- describe('sessions', () => {
69
- const raw = (method, headers = {}) => app.request('/mcp', {
70
- method: 'POST',
71
- headers: { 'content-type': 'application/json', ...headers },
72
- body: JSON.stringify({
73
- jsonrpc: '2.0',
74
- id: 7,
75
- method,
76
- params: { name: brand.tools.listHotels, arguments: {} },
77
- }),
78
- });
79
- it('answers a session id it never issued 404 - the protocol\'s "initialize again"', async () => {
80
- const res = await raw('tools/call', { 'mcp-session-id': 'made-up' });
81
- expect(res.status).toBe(404);
82
- expect((await res.json()).error).toMatchObject({ code: -32001 });
83
- });
84
- // ⚠️ A call with no session was answered as a conversation of its own, so
85
- // a script skipped initialize and every per-conversation limit with it
86
- // (2026-10-05 audit, P0-2).
87
- it('answers the one it issued, and refuses a call that carries none', async () => {
88
- const init = await raw('initialize');
89
- const id = init.headers.get('mcp-session-id') ?? '';
90
- expect((await raw('tools/call', { 'mcp-session-id': id })).status).toBe(200);
91
- const none = await raw('tools/call');
92
- expect(none.status).toBe(400);
93
- expect((await none.json()).error).toMatchObject({ code: -32600 });
94
- });
95
- // A deploy that forgot the ids would answer every open conversation 404.
96
- it('still knows its sessions, the trip and the bookings after a restart', async () => {
97
- const dir = mkdtempSync(join(tmpdir(), 'hotel-server-'));
98
- const boot = () => buildServer({
99
- config,
100
- configPath,
101
- env: { HOTEL_STATE_DIR: dir },
102
- now: () => Date.parse('2026-10-01T02:00:00Z'),
103
- });
104
- const first = boot();
105
- app = first.app;
106
- const id = (await raw('initialize')).headers.get('mcp-session-id') ?? '';
107
- // The id itself, not a name for one: it has to mean the same after the restart.
108
- const as = async (name, args) => {
109
- const res = await app.request('/mcp', {
110
- method: 'POST',
111
- headers: { 'content-type': 'application/json', 'mcp-session-id': id },
112
- body: JSON.stringify({
113
- jsonrpc: '2.0',
114
- id: 1,
115
- method: 'tools/call',
116
- params: { name, arguments: args },
117
- }),
118
- });
119
- // A JSON-RPC answer, read by its shape - as `rpc` above types it.
120
- return {
121
- status: res.status,
122
- body: (await res.json()),
123
- };
124
- };
125
- const stay = { checkIn: '2026-10-19', checkOut: '2026-10-21', guests: 2 };
126
- const room = { hotel: 'hong-kong-kerry', room: 'deluxe', ...stay };
127
- await as(brand.tools.addToTrip, room);
128
- const booked = await as(brand.tools.requestBooking, {
129
- name: 'Robin Ruan',
130
- email: 'robin@example.com',
131
- });
132
- const code = JSON.stringify(booked.body.result.structuredContent).match(/SL-[A-Z0-9]+/)?.[0];
133
- expect(code).toBeDefined();
134
- await as(brand.tools.addToTrip, room); // the next trip, not yet booked
135
- first.flush();
136
- expect(readdirSync(dir)).toEqual(expect.arrayContaining([
137
- 'demo-bookings.json',
138
- 'sessions.json',
139
- 'trips.json',
140
- 'trip-ids.json',
141
- ]));
142
- app = boot().app;
143
- const mine = await as(brand.tools.listBookings, {});
144
- expect(mine.status).toBe(200);
145
- expect(JSON.stringify(mine.body.result.structuredContent)).toContain(code);
146
- const trip = await as(brand.tools.viewTrip, {});
147
- expect(trip.body.result.structuredContent.lines).toHaveLength(1);
148
- });
149
- it('says on its privacy page what it keeps on disk, and only when it does', async () => {
150
- const inMemory = await (await app.request('/privacy')).text();
151
- expect(inMemory).toContain('not written to disk');
152
- const onDisk = buildServer({
153
- config,
154
- configPath,
155
- env: { HOTEL_STATE_DIR: mkdtempSync(join(tmpdir(), 'hotel-privacy-')) },
156
- });
157
- const page = await (await onDisk.app.request('/privacy')).text();
158
- expect(page).not.toContain('not written to disk');
159
- expect(page).toContain('until 90 days after the check-out date');
160
- expect(page).toContain('forgotten 30 days after it was last used');
161
- });
162
- });
163
- // ⚠️ The shopping connector answered -32601 to ping and Claude told the buyer
164
- // it could not reach the shop - over a connection on which every tool call was
165
- // succeeding.
166
- describe('the two methods that are not about tools', () => {
167
- it('answers ping with an empty result', async () => {
168
- const { body } = await rpc('ping');
169
- expect(body.result).toEqual({});
170
- });
171
- it('accepts notifications/initialized without a body', async () => {
172
- const res = await rpc('notifications/initialized');
173
- expect(res.status).toBe(202);
174
- });
175
- it('says so for a method it does not have', async () => {
176
- const { body } = await rpc('resources/subscribe');
177
- expect(body.error.code).toBe(-32601);
178
- });
179
- });
180
- describe('tools/list', () => {
181
- it('lists every tool, each with its card and its output schema', async () => {
182
- const { body } = await rpc('tools/list');
183
- const tools = body.result.tools;
184
- // The count comes from the names the config generates, so adding a tool is
185
- // one change rather than two - and a tool that exists without a card or a
186
- // schema still fails below.
187
- expect(tools).toHaveLength(Object.keys(brand.tools).length);
188
- for (const t of tools) {
189
- expect(t.outputSchema, `${t.name} has no output schema`).toBeTruthy();
190
- expect(typeof t.annotations.title).toBe('string');
191
- }
192
- const list = tools.find((t) => t.name === brand.tools.listHotels);
193
- // Both namespaces: Claude reads ui.resourceUri, ChatGPT reads
194
- // openai/outputTemplate, and widgetAccessible is what lets the rendered
195
- // card call back - without it every button on it does nothing.
196
- expect(list._meta.ui.resourceUri).toBe(CARD_URI);
197
- expect(list._meta['openai/outputTemplate']).toBe(CARD_URI);
198
- expect(list._meta['openai/widgetAccessible']).toBe(true);
199
- });
200
- it('gives the policy tool no card, because that answer is text', async () => {
201
- const { body } = await rpc('tools/list');
202
- const policies = body.result.tools.find((t) => t.name === brand.tools.policies);
203
- expect(policies._meta).toEqual({});
204
- });
205
- // ⚠️ THE WHOLE POINT OF THE TOOL: a card per lookup is what stacked six
206
- // cards above one comparison (robin, 2026-09-29).
207
- it('gives the look-up no card, because reading up draws nothing', async () => {
208
- const { body } = await rpc('tools/list');
209
- const lookUp = body.result.tools.find((t) => t.name === brand.tools.lookUp);
210
- expect(lookUp._meta).toEqual({});
211
- });
212
- it('adds the card-filled trip argument to the tools the card calls', async () => {
213
- const { body } = await rpc('tools/list');
214
- const tools = body.result.tools;
215
- const add = tools.find((t) => t.name === brand.tools.addToTrip);
216
- // Said as a fact, not an order: a tool description instructs nobody.
217
- expect(add.inputSchema.properties.trip.description).toContain('which the card sets itself');
218
- const search = tools.find((t) => t.name === brand.tools.listHotels);
219
- expect(search.inputSchema.properties.trip).toBeUndefined();
220
- });
221
- });
222
- describe('resources', () => {
223
- it('serves the card under its versioned uri', async () => {
224
- const { body } = await rpc('resources/read', { uri: CARD_URI });
225
- expect(body.result.contents[0].mimeType).toBe(CARD_MIME);
226
- expect(body.result.contents[0].text).toContain('<!doctype html>');
227
- });
228
- // A host still holding an older uri asks for a resource we would otherwise
229
- // refuse, and ChatGPT showed "Failed to fetch template" until the connector
230
- // was deleted and re-added. And it gets back the uri it asked for: a host
231
- // handed an answer to a question it did not ask may discard it.
232
- it('answers an older card uri with the current card, echoing what was asked for', async () => {
233
- const old = 'ui://curless/hotel/booking-v0.html';
234
- const { body } = await rpc('resources/read', { uri: old });
235
- expect(body.result.contents[0].uri).toBe(old);
236
- expect(body.result.contents[0].text).toContain('<!doctype html>');
237
- });
238
- it('refuses a uri that is not ours', async () => {
239
- const { body } = await rpc('resources/read', { uri: 'ui://someone-else/card.html' });
240
- expect(body.error.code).toBe(-32602);
241
- });
242
- // ⚠️ A CARD IN A SANDBOXED IFRAME LOADS NOTHING THE META DID NOT LIST. The
243
- // data now carries a photograph per hotel, and if the host they are served
244
- // from is missing here every tile is a grey plate with nothing in any log to
245
- // say why - the shopping connector lost three rounds to exactly this.
246
- it('lists the host its photographs are served from, for hotels AND for rooms', async () => {
247
- const { body } = await rpc('tools/list');
248
- const list = body.result.tools.find((t) => t.name === brand.tools.listHotels);
249
- const domains = list._meta.ui.csp.resourceDomains;
250
- expect(domains).toContain('https://sitecore-cd-imgr.shangri-la.com');
251
- expect(list._meta['openai/widgetCSP'].resource_domains).toEqual(domains);
252
- });
253
- it('counts a room photograph from somewhere else, not only the hotel’s own', () => {
254
- expect(imageDomainsOf([
255
- {
256
- imageUrl: 'https://pictures.example.com/a.jpg',
257
- rooms: [{ imageUrl: 'https://rooms.example.net/b.jpg' }, {}],
258
- },
259
- { rooms: [{ imageUrl: 'https://rooms.example.net/c.jpg' }] },
260
- { rooms: [{ imageUrl: 'not a url' }] },
261
- ])).toEqual(['https://pictures.example.com', 'https://rooms.example.net']);
262
- });
263
- });
264
- describe('tools/call', () => {
265
- it('answers with text for the model and structure for the card', async () => {
266
- const { body } = await callTool(brand.tools.listHotels, { city: 'Hong Kong' }, 's1');
267
- expect(body.result.content[0].text).toContain('4 Shangri-La hotels');
268
- expect(body.result.structuredContent.view).toBe('hotels');
269
- expect(body.result.structuredContent.demo).toBe(true);
270
- });
271
- it('keeps one conversation’s trip to itself', async () => {
272
- const stay = { checkIn: '2026-10-19', checkOut: '2026-10-21', guests: 2 };
273
- await callTool(brand.tools.addToTrip, { hotel: 'hong-kong-island', room: 'deluxe-city', ...stay }, 's1');
274
- const mine = await callTool(brand.tools.viewTrip, {}, 's1');
275
- const theirs = await callTool(brand.tools.viewTrip, {}, 's2');
276
- expect(mine.body.result.structuredContent.lines).toHaveLength(1);
277
- expect(theirs.body.result.structuredContent.lines).toHaveLength(0);
278
- });
279
- // ⚠️ THE BUG THIS EXISTS TO PREVENT. The card's calls arrive on a different
280
- // connection from the conversation's; without the trip id, a guest who
281
- // filled the trip on the card was told by the assistant that it was empty.
282
- it('lets the card name the trip it is showing, from any connection', async () => {
283
- const stay = { checkIn: '2026-10-19', checkOut: '2026-10-21', guests: 2 };
284
- const first = await callTool(brand.tools.addToTrip, { hotel: 'hong-kong-island', room: 'deluxe-city', ...stay }, 'the-conversation');
285
- const tripId = first.body.result._meta[TRIP_META_KEY].tripId;
286
- expect(tripId).toMatch(/[0-9a-f-]{36}/);
287
- expect(first.body.result._meta[TRIP_META_KEY].count).toBe(1);
288
- const fromCard = await callTool(brand.tools.viewTrip, { trip: tripId }, 'a-different-connection');
289
- expect(fromCard.body.result.structuredContent.lines).toHaveLength(1);
290
- });
291
- // ⚠️ An unknown trip id fell back to the card's own connection - another
292
- // trip - and the card took that trip's id as its own; the guest's rooms then
293
- // went where the assistant could not see them (2026-10-05 audit).
294
- it('says so when the card names a trip it no longer keeps, and hands it no other', async () => {
295
- const gone = await callTool(brand.tools.viewTrip, { trip: 'not-a-trip-we-know' }, 'card');
296
- expect(gone.body.result.isError).toBe(true);
297
- expect(gone.body.result.structuredContent).toMatchObject({ view: 'error', error: 'trip-gone' });
298
- expect(gone.body.result._meta[TRIP_META_KEY]).toBeUndefined();
299
- // A question that is not about the trip is still answered - without a trip beside it.
300
- const hotels = await callTool(brand.tools.listHotels, { trip: 'not-a-trip-we-know' }, 'card');
301
- expect(hotels.body.result.isError).toBeUndefined();
302
- expect(hotels.body.result._meta[TRIP_META_KEY]).toBeUndefined();
303
- });
304
- it('carries the trip count beside every answer, so the card can badge its header', async () => {
305
- const stay = { checkIn: '2026-10-19', checkOut: '2026-10-21', guests: 2 };
306
- await callTool(brand.tools.addToTrip, { hotel: 'hong-kong-island', room: 'deluxe-city', ...stay }, 's3');
307
- const elsewhere = await callTool(brand.tools.listHotels, {}, 's3');
308
- expect(elsewhere.body.result._meta[TRIP_META_KEY].count).toBe(1);
309
- });
310
- it('names an unknown tool rather than pretending', async () => {
311
- const { body } = await callTool('book_me_a_flight', {}, 's1');
312
- expect(body.result.structuredContent.view).toBe('error');
313
- });
314
- });
315
- describe('membership', () => {
316
- const STAY = { checkIn: '2026-10-19', checkOut: '2026-10-21', guests: 2 };
317
- it('takes a number and the surname on it - and no password anywhere', async () => {
318
- const { body } = await rpc('tools/list');
319
- const signIn = body.result.tools.find((x) => x.name === brand.tools.signIn);
320
- expect(Object.keys(signIn.inputSchema.properties).sort()).toEqual(['number', 'surname']);
321
- // ⚠️ The word must not appear: a description that mentions a password
322
- // invites a model to ask for one, in a chat transcript.
323
- expect(JSON.stringify(signIn).toLowerCase()).not.toContain('password');
324
- });
325
- it('quotes the member rate once signed in, and the public one after signing out', async () => {
326
- const before = await callTool(brand.tools.getHotel, { hotel: 'hong-kong-island', ...STAY }, 'm1');
327
- const publicTotal = before.body.result.structuredContent.rooms[0].stayTotal;
328
- expect(publicTotal).toBe('HK$8,588');
329
- const signIn = await callTool(brand.tools.signIn, { number: 'SLC-4471-8820', surname: 'Ruan' }, 'm1');
330
- expect(signIn.body.result.structuredContent.member.tier.name).toBe('Jade');
331
- const after = await callTool(brand.tools.getHotel, { hotel: 'hong-kong-island', ...STAY }, 'm1');
332
- const room = after.body.result.structuredContent.rooms[0];
333
- // 10% off the room, tax on what is actually paid.
334
- expect(room.stayTotal).toBe('HK$7,729');
335
- expect(room.publicStayTotal).toBe('HK$8,588');
336
- expect(room.memberRate.tier).toBe('Jade');
337
- await callTool(brand.tools.signOut, {}, 'm1');
338
- const out = await callTool(brand.tools.getHotel, { hotel: 'hong-kong-island', ...STAY }, 'm1');
339
- expect(out.body.result.structuredContent.rooms[0].stayTotal).toBe('HK$8,588');
340
- });
341
- it('is one conversation’s sign-in and nobody else’s', async () => {
342
- await callTool(brand.tools.signIn, { number: 'SLC-4471-8820', surname: 'Ruan' }, 'mine');
343
- const theirs = await callTool(brand.tools.getHotel, { hotel: 'hong-kong-island', ...STAY }, 'theirs');
344
- expect(theirs.body.result.structuredContent.rooms[0].publicStayTotal).toBeUndefined();
345
- });
346
- it('gives a wrong surname nothing, rather than being generous', async () => {
347
- const { body } = await callTool(brand.tools.signIn, { number: 'SLC-4471-8820', surname: 'Nobody' }, 'm2');
348
- expect(body.result.structuredContent.view).toBe('member-not-found');
349
- expect(body.result.content[0].text).toContain('never asks for a password');
350
- });
351
- });
352
- describe('the pages a listing asks for', () => {
353
- it('says what it does, and what it will not do', async () => {
354
- const html = await (await app.request('/docs')).text();
355
- expect(html).toContain('This is a demonstration');
356
- expect(html).toContain('Guess dates');
357
- expect(html).toContain('collects no card details');
358
- });
359
- it('describes what is actually held, including the trip in memory', async () => {
360
- const html = await (await app.request('/privacy')).text();
361
- expect(html).toContain('in memory');
362
- expect(html).toContain('No card numbers');
363
- expect(html).toContain('four hours');
364
- // ⚠️ AND WHAT IS TRUE OF IT (2026-09-28 audit): who can open a booking,
365
- // that the session id is ours and never shown, that an accessible room is
366
- // never remembered, and where the pictures come from.
367
- expect(html).toContain('The email alone opens nothing');
368
- expect(html).toContain('is never shown in an answer');
369
- expect(html).toContain('never an accessible room');
370
- expect(html).toContain('phone number');
371
- for (const host of imageDomainsOf(loadHotelData(fileURLToPath(FIXTURE_DATA)).hotels))
372
- expect(html).toContain(host.replace(/^https?:\/\//, ''));
373
- });
374
- it('does not call a held booking a reservation', async () => {
375
- const html = await (await app.request('/terms')).text();
376
- expect(html).toContain('is not a confirmed reservation');
377
- });
378
- it('answers healthz with what it is serving', async () => {
379
- const body = (await (await app.request('/healthz')).json());
380
- expect(body).toMatchObject({ ok: true, brand: 'Shangri-La', demo: true });
381
- // However many the brand file holds - healthz reports the file it loaded,
382
- // which is the point of the number being there at all.
383
- expect(body.hotels).toBe(loadHotelData(fileURLToPath(FIXTURE_DATA)).hotels.length);
384
- });
385
- it('serves this brand’s own artwork, and 404s for one that supplied none', async () => {
386
- const icon = await app.request('/icon.png');
387
- expect(icon.status).toBe(200);
388
- expect(icon.headers.get('content-type')).toBe('image/png');
389
- expect((await app.request('/logo.png')).status).toBe(200);
390
- // ⚠️ The half that matters more. The shopping connector once served the
391
- // FIRST merchant's logo to a merchant who had supplied none, naming the
392
- // wrong party on someone else's connector. Nothing is borrowed: a
393
- // deployment with no artwork 404s.
394
- const bare = buildServer({
395
- config: { ...config, server: { ...config.server, iconFile: undefined, logoFile: undefined } },
396
- configPath,
397
- });
398
- expect((await bare.app.request('/icon.png')).status).toBe(404);
399
- expect((await bare.app.request('/logo.png')).status).toBe(404);
400
- });
401
- it('tells the host where the brand’s icon is, now that there is one', async () => {
402
- const { body } = await rpc('initialize', {});
403
- expect(body.result.serverInfo.icons).toEqual([
404
- {
405
- src: 'https://wallet.curless.ai/shangrila/icon.png',
406
- mimeType: 'image/png',
407
- sizes: ['256x256'],
408
- },
409
- ]);
410
- });
411
- });
412
- describe('a config this build cannot honour', () => {
413
- it('refuses to start rather than answering with nothing', () => {
414
- expect(() => buildServer({ config: { ...config, data: { source: 'api' } }, configPath })).toThrow(/needs data.api/);
415
- });
416
- it('names the credentials that are missing, and never prints the ones that are there', () => {
417
- const run = () => buildServer({
418
- config: { ...config, data: { source: 'api', api: HUAZHU_API } },
419
- configPath,
420
- env: { HUAZHU_CLIENT_ID: 'id-that-must-not-be-printed' },
421
- background: false,
422
- });
423
- expect(run).toThrow(/HUAZHU_CLIENT_SECRET, HUAZHU_DISTRIBUTOR_ID are not set/);
424
- try {
425
- run();
426
- }
427
- catch (err) {
428
- expect(String(err)).not.toContain('id-that-must-not-be-printed');
429
- }
430
- });
431
- });
432
- // ⚠️ THE SAME SERVER OVER HUAZHU'S API - the fake of it built from its
433
- // documentation - driven the way a host drives it: the tool list, a hotel, a
434
- // booking, the card's payload. What the backend cannot do is not offered.
435
- describe('a Huazhu deployment', () => {
436
- const T = Date.parse('2026-10-01T02:00:00Z');
437
- const make = async () => {
438
- const fake = createFakeHuazhu({
439
- hotels: [fakeHotel('1001')],
440
- rates: { '1001': [{ product: product('DR1', 'BAR'), price: () => 328, cancel: 'AD0_0' }] },
441
- now: () => T,
442
- });
443
- const built = buildServer({
444
- config: {
445
- ...config,
446
- brand: 'Huazhu',
447
- naming: { prefix: 'huazhu' },
448
- data: {
449
- source: 'api',
450
- api: { ...HUAZHU_API, stateDir: mkdtempSync(join(tmpdir(), 'hz-server-')) },
451
- },
452
- },
453
- configPath,
454
- env: {
455
- HUAZHU_CLIENT_ID: 'cid',
456
- HUAZHU_CLIENT_SECRET: 'sec',
457
- HUAZHU_DISTRIBUTOR_ID: 'CURLESS',
458
- },
459
- fetch: fake.fetch,
460
- now: () => T,
461
- background: false,
462
- });
463
- await built.ready();
464
- app = built.app;
465
- brand = built.brand;
466
- sessions.reset();
467
- return { built, fake };
468
- };
469
- it('lists only what Huazhu can do, and says nothing of a demo', async () => {
470
- await make();
471
- const init = await rpc('initialize', {});
472
- expect(init.body.result.instructions).not.toMatch(/Demonstration data/);
473
- expect(init.body.result.instructions).toMatch(/PAID AT THE HOTEL/);
474
- const names = (await rpc('tools/list')).body.result.tools.map((t) => t.name);
475
- expect(names).toContain('request_huazhu_booking');
476
- for (const gone of [
477
- 'sign_in_huazhu_member',
478
- 'list_huazhu_extras',
479
- 'change_huazhu_booking',
480
- 'preview_huazhu_booking_change',
481
- ])
482
- expect(names).not.toContain(gone);
483
- const refused = await rpc('tools/call', { name: 'sign_in_huazhu_member', arguments: {} });
484
- expect(refused.body.result.isError).toBe(true);
485
- const health = await (await app.request('/healthz')).json();
486
- expect(health).toMatchObject({ hotels: 1, demo: false });
487
- // The public answer says what is running and nothing about volume.
488
- expect(Object.keys(health).sort()).toEqual([
489
- 'brand',
490
- 'demo',
491
- 'hotels',
492
- 'ok',
493
- 'version',
494
- ]);
495
- const detail = await (await app.request('/healthz/detail')).json();
496
- expect(detail).toMatchObject({ hotels: 1, catalog: { hotels: 1 }, needsAPerson: 0 });
497
- });
498
- it('books a room end to end, and the card is told what it may offer', async () => {
499
- await make();
500
- const session = { 'mcp-session-id': 'conv-hz' };
501
- const stay = { checkIn: '2026-10-10', checkOut: '2026-10-11', guests: 2 };
502
- const hotel = await rpc('tools/call', { name: 'get_huazhu_hotel', arguments: { hotel: '1001', ...stay } }, session);
503
- const sc = hotel.body.result.structuredContent;
504
- expect(sc.bookingMode).toBe('pay-at-hotel');
505
- expect(Object.keys(sc.toolNames)).not.toContain('signIn');
506
- expect(Object.keys(sc.toolNames)).not.toContain('listExtras');
507
- expect(hotel.body.result._meta['openai/widgetCSP'].resource_domains).toEqual([
508
- 'https://ws-p.example.com',
509
- ]);
510
- await rpc('tools/call', { name: 'add_to_huazhu_trip', arguments: { hotel: '1001', room: 'DR1~BAR', ...stay } }, session);
511
- const booked = await rpc('tools/call', {
512
- name: 'request_huazhu_booking',
513
- arguments: { name: 'Wei Zhang', email: 'wei@example.com', phone: '13800000000' },
514
- }, session);
515
- const text = booked.body.result.content[0].text;
516
- expect(text).toMatch(/\*\*HZ-[A-HJ-NP-Z2-9]{8}\*\*/);
517
- expect(text).toMatch(/paid at the hotel/);
518
- expect(text).not.toMatch(/held until/);
519
- expect(booked.body.result.structuredContent.paid).toBe(false);
520
- });
521
- it('says on its privacy page that it keeps a copy of a booking, and nothing about memberships', async () => {
522
- await make();
523
- const html = await (await app.request('/privacy')).text();
524
- expect(html).toMatch(/keeps a copy on its own server, until 90 days after the check-out date/);
525
- expect(html).not.toMatch(/membership/i);
526
- expect(html).not.toMatch(/demonstration/i);
527
- const terms = await (await app.request('/terms')).text();
528
- expect(terms).toMatch(/paid at the hotel/);
529
- expect(terms).not.toMatch(/hold lapses/);
530
- });
531
- it('checks a real environment read-only, prebook and all, and never books', async () => {
532
- const fake = createFakeHuazhu({
533
- hotels: [fakeHotel('1001')],
534
- rates: {
535
- '1001': [{ product: product('DR1', 'BAR'), price: () => 328, cancel: '6PM1D1N_100P' }],
536
- },
537
- now: () => Date.now(),
538
- });
539
- const lines = [];
540
- const ok = await checkHuazhu(HUAZHU_API, { HUAZHU_CLIENT_ID: 'cid', HUAZHU_CLIENT_SECRET: 'sec', HUAZHU_DISTRIBUTOR_ID: 'CURLESS' }, (l) => lines.push(l), fake.fetch);
541
- expect(ok, lines.join('\n')).toBe(true);
542
- expect(lines.join('\n')).toMatch(/prebook accepted our price/);
543
- expect(fake.calls.some((c) => c.path === '/reservation/book')).toBe(false);
544
- });
545
- });
546
- // ⚠️ THE ONE NUMBER AN OPERATOR HAS. `/healthz`, the MCP handshake and the boot
547
- // banner all report `VERSION`, and it is a hand-written constant beside a
548
- // hand-written package version. It said 0.7.0 for five releases (2026-09-22) -
549
- // so the banner of a freshly deployed container listed seventeen tools under
550
- // the version that had eleven.
551
- describe('the version it reports', () => {
552
- it('is the version it was published as', () => {
553
- const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
554
- expect(VERSION, 'src/server.ts VERSION has drifted from package.json').toBe(pkg.version);
555
- });
556
- });
557
- //# sourceMappingURL=server.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../src/__tests__/server.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=state.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/state.test.ts"],"names":[],"mappings":""}