@curless/hotel-storefront 0.27.4 → 0.27.6

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 (108) hide show
  1. package/README.md +18 -8
  2. package/dist/card.generated.d.ts +1 -1
  3. package/dist/card.generated.js +2 -2
  4. package/dist/card.generated.js.map +1 -1
  5. package/dist/fence.d.ts +12 -1
  6. package/dist/fence.d.ts.map +1 -1
  7. package/dist/fence.js +0 -0
  8. package/dist/fence.js.map +1 -1
  9. package/dist/legal.js +1 -1
  10. package/dist/legal.js.map +1 -1
  11. package/dist/money.d.ts +2 -0
  12. package/dist/money.d.ts.map +1 -1
  13. package/dist/money.js +43 -6
  14. package/dist/money.js.map +1 -1
  15. package/dist/server.d.ts +8 -8
  16. package/dist/server.d.ts.map +1 -1
  17. package/dist/server.js +10 -2
  18. package/dist/server.js.map +1 -1
  19. package/dist/sessions.d.ts.map +1 -1
  20. package/dist/sessions.js +3 -2
  21. package/dist/sessions.js.map +1 -1
  22. package/dist/surface.d.ts +2 -0
  23. package/dist/surface.d.ts.map +1 -1
  24. package/dist/surface.js +10 -1
  25. package/dist/surface.js.map +1 -1
  26. package/dist/tools.d.ts +4 -4
  27. package/dist/tools.d.ts.map +1 -1
  28. package/dist/tools.js +21 -8
  29. package/dist/tools.js.map +1 -1
  30. package/dist/trip-ids.js +1 -1
  31. package/dist/trip-ids.js.map +1 -1
  32. package/package.json +2 -2
  33. package/dist/__tests__/__fixtures__/huazhu-fake.d.ts +0 -2
  34. package/dist/__tests__/__fixtures__/huazhu-fake.d.ts.map +0 -1
  35. package/dist/__tests__/__fixtures__/huazhu-fake.js +0 -3
  36. package/dist/__tests__/__fixtures__/huazhu-fake.js.map +0 -1
  37. package/dist/__tests__/__helpers__/sessions.d.ts +0 -10
  38. package/dist/__tests__/__helpers__/sessions.d.ts.map +0 -1
  39. package/dist/__tests__/__helpers__/sessions.js +0 -40
  40. package/dist/__tests__/__helpers__/sessions.js.map +0 -1
  41. package/dist/__tests__/audit-p0.test.d.ts +0 -2
  42. package/dist/__tests__/audit-p0.test.d.ts.map +0 -1
  43. package/dist/__tests__/audit-p0.test.js +0 -274
  44. package/dist/__tests__/audit-p0.test.js.map +0 -1
  45. package/dist/__tests__/audit-p2.test.d.ts +0 -2
  46. package/dist/__tests__/audit-p2.test.d.ts.map +0 -1
  47. package/dist/__tests__/audit-p2.test.js +0 -98
  48. package/dist/__tests__/audit-p2.test.js.map +0 -1
  49. package/dist/__tests__/card-contract.test.d.ts +0 -2
  50. package/dist/__tests__/card-contract.test.d.ts.map +0 -1
  51. package/dist/__tests__/card-contract.test.js +0 -268
  52. package/dist/__tests__/card-contract.test.js.map +0 -1
  53. package/dist/__tests__/data.test.d.ts +0 -2
  54. package/dist/__tests__/data.test.d.ts.map +0 -1
  55. package/dist/__tests__/data.test.js +0 -210
  56. package/dist/__tests__/data.test.js.map +0 -1
  57. package/dist/__tests__/dates.test.d.ts +0 -2
  58. package/dist/__tests__/dates.test.d.ts.map +0 -1
  59. package/dist/__tests__/dates.test.js +0 -107
  60. package/dist/__tests__/dates.test.js.map +0 -1
  61. package/dist/__tests__/demo-hotels.test.d.ts +0 -2
  62. package/dist/__tests__/demo-hotels.test.d.ts.map +0 -1
  63. package/dist/__tests__/demo-hotels.test.js +0 -765
  64. package/dist/__tests__/demo-hotels.test.js.map +0 -1
  65. package/dist/__tests__/huazhu-audit.test.d.ts +0 -2
  66. package/dist/__tests__/huazhu-audit.test.d.ts.map +0 -1
  67. package/dist/__tests__/huazhu-audit.test.js +0 -234
  68. package/dist/__tests__/huazhu-audit.test.js.map +0 -1
  69. package/dist/__tests__/huazhu-backend.test.d.ts +0 -2
  70. package/dist/__tests__/huazhu-backend.test.d.ts.map +0 -1
  71. package/dist/__tests__/huazhu-backend.test.js +0 -1326
  72. package/dist/__tests__/huazhu-backend.test.js.map +0 -1
  73. package/dist/__tests__/huazhu-cancel-policy.test.d.ts +0 -2
  74. package/dist/__tests__/huazhu-cancel-policy.test.d.ts.map +0 -1
  75. package/dist/__tests__/huazhu-cancel-policy.test.js +0 -82
  76. package/dist/__tests__/huazhu-cancel-policy.test.js.map +0 -1
  77. package/dist/__tests__/huazhu-sandbox.test.d.ts +0 -2
  78. package/dist/__tests__/huazhu-sandbox.test.d.ts.map +0 -1
  79. package/dist/__tests__/huazhu-sandbox.test.js +0 -195
  80. package/dist/__tests__/huazhu-sandbox.test.js.map +0 -1
  81. package/dist/__tests__/huazhu-sellable.test.d.ts +0 -2
  82. package/dist/__tests__/huazhu-sellable.test.d.ts.map +0 -1
  83. package/dist/__tests__/huazhu-sellable.test.js +0 -192
  84. package/dist/__tests__/huazhu-sellable.test.js.map +0 -1
  85. package/dist/__tests__/present.test.d.ts +0 -2
  86. package/dist/__tests__/present.test.d.ts.map +0 -1
  87. package/dist/__tests__/present.test.js +0 -367
  88. package/dist/__tests__/present.test.js.map +0 -1
  89. package/dist/__tests__/prose.test.d.ts +0 -2
  90. package/dist/__tests__/prose.test.d.ts.map +0 -1
  91. package/dist/__tests__/prose.test.js +0 -171
  92. package/dist/__tests__/prose.test.js.map +0 -1
  93. package/dist/__tests__/server.test.d.ts +0 -2
  94. package/dist/__tests__/server.test.d.ts.map +0 -1
  95. package/dist/__tests__/server.test.js +0 -557
  96. package/dist/__tests__/server.test.js.map +0 -1
  97. package/dist/__tests__/state.test.d.ts +0 -2
  98. package/dist/__tests__/state.test.d.ts.map +0 -1
  99. package/dist/__tests__/state.test.js +0 -204
  100. package/dist/__tests__/state.test.js.map +0 -1
  101. package/dist/__tests__/tool-descriptions.test.d.ts +0 -2
  102. package/dist/__tests__/tool-descriptions.test.d.ts.map +0 -1
  103. package/dist/__tests__/tool-descriptions.test.js +0 -220
  104. package/dist/__tests__/tool-descriptions.test.js.map +0 -1
  105. package/dist/__tests__/tools.test.d.ts +0 -2
  106. package/dist/__tests__/tools.test.d.ts.map +0 -1
  107. package/dist/__tests__/tools.test.js +0 -1598
  108. package/dist/__tests__/tools.test.js.map +0 -1
@@ -1,204 +0,0 @@
1
- import { mkdtempSync, readFileSync, readdirSync, statSync, writeFileSync } 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 { KEEP_AFTER_CHECKOUT_DAYS, createDemoHotels } from '../demo-hotels.js';
8
- import { MEMBER_TTL_MS, MemberStore } from '../members.js';
9
- import { StateDir, StateFile } from '../state.js';
10
- import { TripIds } from '../trip-ids.js';
11
- import { TripStore } from '../trip.js';
12
- // ⚠️ A DEPLOY USED TO FORGET EVERY GUEST (2026-10-05 audit): a confirmation
13
- // code stopped opening its booking, a trip went empty, a member was signed
14
- // out. Each store here is built, written, thrown away and built again from the
15
- // same directory - which is what a restart is.
16
- const DATA = loadHotelData(fileURLToPath(new URL('./__fixtures__/brand.json', import.meta.url)));
17
- const OCT_1 = Date.parse('2026-10-01T02:00:00Z');
18
- const STAY = { checkIn: '2026-10-19', checkOut: '2026-10-21', guests: 2 };
19
- const guest = { name: 'Robin Ruan', email: 'robin@example.com' };
20
- const me = { sessionId: 'session-a' };
21
- let dir;
22
- let clock = OCT_1;
23
- const now = () => clock;
24
- beforeEach(() => {
25
- dir = mkdtempSync(join(tmpdir(), 'hotel-state-'));
26
- clock = OCT_1;
27
- });
28
- /** One store's file, as a fresh process would open it. */
29
- const fileFor = (name) => new StateFile(join(dir, name));
30
- describe('the state file', () => {
31
- it('writes only once asked to flush, owner-only, and reads back what it wrote', () => {
32
- const f = fileFor('x.json');
33
- f.bind(() => ({ hello: 'world' }));
34
- f.changed();
35
- expect(readdirSync(dir)).toEqual([]); // coalesced, not yet written
36
- f.flush();
37
- expect(fileFor('x.json').read()).toEqual({ hello: 'world' });
38
- expect(statSync(join(dir, 'x.json')).mode & 0o777).toBe(0o600);
39
- });
40
- // Overwriting a file that did not parse would destroy the only copy of
41
- // somebody's booking.
42
- it('sets a file that does not parse aside instead of starting over it', () => {
43
- writeFileSync(join(dir, 'bad.json'), '{"bookings": [');
44
- expect(fileFor('bad.json').read()).toBeUndefined();
45
- expect(readdirSync(dir).some((n) => n.startsWith('bad.json.corrupt-'))).toBe(true);
46
- });
47
- it('writes nothing anywhere when the deployment has no directory', () => {
48
- const none = new StateDir(undefined);
49
- expect(none.persisted).toBe(false);
50
- expect(none.file('trips.json')).toBeUndefined();
51
- });
52
- });
53
- describe('across a restart', () => {
54
- it('keeps the trip, under the same key', () => {
55
- const f = fileFor('trips.json');
56
- const first = new TripStore(now, f);
57
- first.set('conv hotel', {
58
- kind: 'room',
59
- hotelId: 'hong-kong-island',
60
- roomId: 'deluxe-city',
61
- stay: STAY,
62
- rooms: 2,
63
- });
64
- first.set('other hotel', {
65
- kind: 'room',
66
- hotelId: 'hong-kong-island',
67
- roomId: 'suite',
68
- stay: STAY,
69
- });
70
- f.flush();
71
- const again = new TripStore(now, fileFor('trips.json'));
72
- expect(again.read('conv hotel')).toEqual([
73
- { kind: 'room', hotelId: 'hong-kong-island', roomId: 'deluxe-city', stay: STAY, rooms: 2 },
74
- ]);
75
- expect(again.size).toBe(2);
76
- });
77
- // The card names its trip by id; an id that did not survive the deploy sent
78
- // the card's rooms into a trip of their own.
79
- it('keeps the id the card names its trip by', () => {
80
- const f = fileFor('trip-ids.json');
81
- const ids = new TripIds(now, f);
82
- const id = ids.idFor('conv hotel');
83
- f.flush();
84
- expect(new TripIds(now, fileFor('trip-ids.json')).keyFor(id)).toBe('conv hotel');
85
- });
86
- it('keeps a sign-in for its two hours, and takes it off the disk after', () => {
87
- const member = { number: 'SLC-4471-8820', name: 'Robin Ruan', surname: 'Ruan' };
88
- const f = fileFor('members.json');
89
- const members = new MemberStore(now, f);
90
- members.set('conv', member);
91
- f.flush();
92
- expect(new MemberStore(now, fileFor('members.json')).read('conv')?.number).toBe('SLC-4471-8820');
93
- clock += MEMBER_TTL_MS + 1;
94
- const later = fileFor('members.json');
95
- const expired = new MemberStore(now, later);
96
- expect(expired.read('conv')).toBeUndefined();
97
- later.flush();
98
- expect(readFileSync(join(dir, 'members.json'), 'utf8')).not.toContain('SLC-4471-8820');
99
- });
100
- });
101
- describe('demo bookings across a restart', () => {
102
- const trip = {
103
- lines: [{ kind: 'room', hotelId: 'hong-kong-kerry', roomId: 'deluxe', stay: STAY }],
104
- };
105
- const make = (file = fileFor('demo.json')) => ({ file, hotels: createDemoHotels({ data: DATA, now, rng: () => 0.5, state: file }) });
106
- it('opens the same booking by its code after the restart, and still holds its room', async () => {
107
- const first = make();
108
- const [booking] = await first.hotels.requestBooking(trip, guest, me);
109
- if (!booking)
110
- throw new Error('no booking');
111
- first.file.flush();
112
- const { hotels } = make();
113
- expect((await hotels.listBookings(me)).map((b) => b.confirmationCode)).toEqual([
114
- booking.confirmationCode,
115
- ]);
116
- const found = await hotels.findBooking(booking.confirmationCode, {
117
- sessionId: 'another-conversation',
118
- email: guest.email,
119
- });
120
- expect(found?.id).toBe(booking.id);
121
- // The hold is still a hold: the room is still off what the next guest sees.
122
- const shown = await hotels.getHotel('hong-kong-kerry', STAY);
123
- expect(shown?.rooms?.find((r) => r.id === 'deluxe')?.roomsLeft).toBe(9);
124
- });
125
- it('keeps who owns a booking on disk, and never in an answer', async () => {
126
- const first = make();
127
- const [booking] = await first.hotels.requestBooking(trip, guest, me);
128
- first.file.flush();
129
- expect(readFileSync(join(dir, 'demo.json'), 'utf8')).toContain('session-a');
130
- expect(JSON.stringify(booking)).not.toContain('session-a');
131
- const { hotels } = make();
132
- expect(JSON.stringify(await hotels.listBookings(me))).not.toContain('session-a');
133
- });
134
- it('keeps saved preferences for the membership', async () => {
135
- const first = make();
136
- const member = await first.hotels.signInMember?.('SLC-4471-8820', 'Ruan');
137
- if (!member)
138
- throw new Error('no member');
139
- await first.hotels.rememberPreferences?.(member, ['high-floor']);
140
- first.file.flush();
141
- const again = await make().hotels.signInMember?.('SLC-4471-8820', 'Ruan');
142
- expect(again?.preferences).toEqual(['high-floor']);
143
- });
144
- // The privacy page says how long; this is that sentence, enforced.
145
- it(`forgets a booking ${KEEP_AFTER_CHECKOUT_DAYS} days after its check-out`, async () => {
146
- const first = make();
147
- const [booking] = await first.hotels.requestBooking(trip, guest, me);
148
- first.file.flush();
149
- clock = Date.parse('2026-10-21T00:00:00Z') + KEEP_AFTER_CHECKOUT_DAYS * 86_400_000 - 3_600_000;
150
- expect((await make().hotels.listBookings(me)).map((b) => b.id)).toEqual([booking?.id]);
151
- clock += 2 * 86_400_000;
152
- const later = make();
153
- expect(await later.hotels.listBookings(me)).toEqual([]);
154
- later.file.flush();
155
- expect(readFileSync(join(dir, 'demo.json'), 'utf8')).not.toContain(guest.email);
156
- });
157
- });
158
- describe('the demo-wide cap on held rooms', () => {
159
- const stayOf = (from, nights) => {
160
- const end = new Date(Date.parse(`${from}T00:00:00Z`) + nights * 86_400_000);
161
- return { checkIn: from, checkOut: end.toISOString().slice(0, 10), guests: 2 };
162
- };
163
- // ⚠️ Twelve made-up conversations, one booking each, emptied a hotel for a
164
- // month. The per-conversation cap cannot see that; this can.
165
- it('refuses a hold that would take more than the demo allows, whoever asks', async () => {
166
- const hotels = createDemoHotels({ data: DATA, now, rng: () => 0.5, maxHeldRoomNights: 10 });
167
- const book = (session, hotelId, roomId, nights, rooms = 1) => hotels.requestBooking({ lines: [{ kind: 'room', hotelId, roomId, stay: stayOf('2026-11-02', nights), rooms }] }, guest, { sessionId: session });
168
- await book('one', 'hong-kong-kerry', 'deluxe', 4, 2); // 8 room-nights
169
- await expect(book('two', 'hong-kong-kowloon', 'deluxe', 3)).rejects.toMatchObject({
170
- code: 'demo-busy',
171
- });
172
- // Two room-nights still fit.
173
- expect(await book('three', 'hong-kong-kowloon', 'deluxe', 2)).toHaveLength(1);
174
- });
175
- it('counts only live holds - a lapsed or cancelled one gives its share back', async () => {
176
- const hotels = createDemoHotels({
177
- data: DATA,
178
- now,
179
- rng: () => 0.5,
180
- maxHeldRoomNights: 4,
181
- holdMs: 3_600_000,
182
- });
183
- const one = {
184
- lines: [
185
- {
186
- kind: 'room',
187
- hotelId: 'hong-kong-kerry',
188
- roomId: 'deluxe',
189
- stay: stayOf('2026-11-02', 4),
190
- },
191
- ],
192
- };
193
- const [first] = await hotels.requestBooking(one, guest, { sessionId: 'a' });
194
- await expect(hotels.requestBooking(one, guest, { sessionId: 'b' })).rejects.toMatchObject({
195
- code: 'demo-busy',
196
- });
197
- await hotels.cancelBooking(first?.confirmationCode ?? '', { sessionId: 'a' });
198
- const [second] = await hotels.requestBooking(one, guest, { sessionId: 'b' });
199
- expect(second?.status).toBe('requested');
200
- clock += 3_600_000 + 1; // lapsed
201
- expect(await hotels.requestBooking(one, guest, { sessionId: 'c' })).toHaveLength(1);
202
- });
203
- });
204
- //# sourceMappingURL=state.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.test.js","sourceRoot":"","sources":["../../src/__tests__/state.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tool-descriptions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-descriptions.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tool-descriptions.test.ts"],"names":[],"mappings":""}
@@ -1,220 +0,0 @@
1
- import { describe, expect, test } from 'vitest';
2
- import { HUAZHU_CAPABILITIES } from '../huazhu/backend.js';
3
- import { buildInstructions as buildInstructionsFor } from '../surface.js';
4
- import { buildTools, withheldTools } from '../tools.js';
5
- import { resolveBrand } from '../vocab.js';
6
- // Both directory submissions have us attest: "Tool descriptions contain no
7
- // instructions about model behavior, other tools, or external instruction
8
- // sources." The shopping connector had to make that true after it was already
9
- // listed (2026-09-17); this package is held to it from its first commit, for
10
- // every deployment shape we expect to ship - a branded demo, and a group wired
11
- // to its own API with no prefix and no hints.
12
- const CONFIGS = [
13
- {
14
- id: 'shangrila',
15
- brand: 'Shangri-La',
16
- server: { name: 'shangrila-hotels', title: 'Shangri-La Hotels (demo)' },
17
- naming: { prefix: 'shangrila', noun: 'hotel', nounPlural: 'hotels' },
18
- data: { source: 'demo', file: 'data/hotels.json' },
19
- payment: { mode: 'none' },
20
- urls: { appUrl: 'https://hotels.curless.ai/shangrila' },
21
- hints: {
22
- search: 'The group runs several brands.',
23
- hotel: 'A Horizon Club room includes the club lounge.',
24
- booking: 'This deployment takes no payment.',
25
- example: 'Island Shangri-La, Hong Kong',
26
- },
27
- legal: {},
28
- },
29
- {
30
- id: 'generic',
31
- brand: 'Hotels',
32
- server: { name: 'hotels', title: 'Hotels' },
33
- data: {
34
- source: 'api',
35
- api: {
36
- provider: 'huazhu',
37
- baseUrl: 'https://example.invalid',
38
- authUrl: 'https://example.invalid',
39
- stateDir: 'state',
40
- },
41
- },
42
- urls: { appUrl: 'https://hotels.curless.ai' },
43
- legal: {},
44
- },
45
- {
46
- id: 'huazhu',
47
- brand: 'Huazhu',
48
- server: { name: 'huazhu-hotels', title: 'Huazhu Hotels' },
49
- naming: { prefix: 'huazhu' },
50
- data: {
51
- source: 'api',
52
- api: {
53
- provider: 'huazhu',
54
- baseUrl: 'https://example.invalid',
55
- authUrl: 'https://example.invalid',
56
- stateDir: 'state',
57
- },
58
- },
59
- urls: { appUrl: 'https://wallet.curless.ai/huazhu' },
60
- legal: {},
61
- },
62
- {
63
- // The same deployment against the simulated Huazhu (`huazhu/sandbox.ts`).
64
- id: 'huazhu-sandbox',
65
- brand: 'Huazhu',
66
- server: { name: 'huazhu-hotels', title: 'Huazhu Hotels (sandbox)' },
67
- naming: { prefix: 'huazhu' },
68
- data: {
69
- source: 'api',
70
- api: {
71
- provider: 'huazhu',
72
- baseUrl: 'http://huazhu-sandbox:8100',
73
- authUrl: 'http://huazhu-sandbox:8100',
74
- stateDir: 'state',
75
- sandbox: true,
76
- },
77
- },
78
- urls: { appUrl: 'https://wallet.curless.ai/huazhu' },
79
- legal: {},
80
- },
81
- ];
82
- /** What each deployment's backend can do - the Huazhu one says what it cannot. */
83
- const capsOf = (config) => config.id.startsWith('huazhu') ? HUAZHU_CAPABILITIES : undefined;
84
- // Imperatives addressed to the model. Not every "do" is one - these are the
85
- // shapes such a description actually reaches for.
86
- const INSTRUCTS = /\b(call this|call it|do not|don't|never|always|instead of|rather than|you must|you should|make sure|ask the guest|ask them|before (?:booking|cancelling|calling))\b|\bFIRST\b/i;
87
- describe.each(CONFIGS)('$id: tool descriptions', (config) => {
88
- const brand = resolveBrand(config);
89
- const caps = capsOf(config);
90
- const tools = buildTools(brand.tools, brand.vocab, caps);
91
- const all = Object.values(brand.tools);
92
- const buildInstructions = (b) => buildInstructionsFor(b, caps);
93
- // ⚠️ A TOOL THE DEPLOYMENT DOES NOT OFFER IS NAMED NOWHERE. A model told
94
- // about a sign-in that does not exist asks the guest for a membership number
95
- // and has nowhere to put it.
96
- test('offer and name nothing the backend cannot do', () => {
97
- const withheld = caps ? [...withheldTools(brand.tools, caps)] : [];
98
- const offered = new Set(tools.map((t) => t.name));
99
- const everything = [
100
- buildInstructions(brand),
101
- ...tools.map((t) => JSON.stringify([t.description, t.inputSchema])),
102
- ].join('\n');
103
- for (const name of withheld) {
104
- expect(offered.has(name), `${name} is offered`).toBe(false);
105
- expect(everything.includes(name), `${name} is named`).toBe(false);
106
- }
107
- // Saying there are none is the one mention allowed: a guest asks for an
108
- // airport pickup whatever the tool list says.
109
- if (caps && !caps.extras)
110
- expect(everything.replaceAll('with no add-ons', '')).not.toMatch(/add-on/i);
111
- if (caps && !caps.members)
112
- expect(everything).not.toMatch(/member/i);
113
- if (caps?.booking === 'pay-at-hotel')
114
- expect(everything).not.toMatch(/hold lapses|held until/i);
115
- });
116
- test('say what the tool does, not what the model should do', () => {
117
- for (const t of tools) {
118
- const own = [
119
- t.description,
120
- ...Object.values(t.inputSchema.properties ??
121
- {}).map((p) => p.description ?? ''),
122
- ].join(' ');
123
- expect(own.match(INSTRUCTS)?.[0], `${t.name}: ${own}`).toBeUndefined();
124
- }
125
- });
126
- test('name no other tool', () => {
127
- for (const t of tools) {
128
- for (const other of all.filter((n) => n !== t.name)) {
129
- expect(t.description.includes(other), `${t.name} names ${other}`).toBe(false);
130
- }
131
- }
132
- });
133
- // OpenAI's review rejected the shopping app's v1.0.0 over an ABSENT hint,
134
- // which a reviewer reads as null. Every one, stated, on every tool.
135
- test('state every annotation hint, and a title a guest can read', () => {
136
- for (const t of tools) {
137
- const a = t.annotations;
138
- expect(typeof a.title, t.name).toBe('string');
139
- for (const hint of ['readOnlyHint', 'destructiveHint', 'idempotentHint', 'openWorldHint']) {
140
- expect(typeof a[hint], `${t.name}.${hint}`).toBe('boolean');
141
- }
142
- // Open world means "answers with whatever a system we do not control says
143
- // at that moment" - true of the group's API, false of a local demo file
144
- // and of the simulated API a test deployment runs against.
145
- expect(a.openWorldHint, `${t.name}.openWorldHint`).toBe(config.data.source === 'api' && !config.data.api?.sandbox);
146
- }
147
- });
148
- test('only the tools that change something say they do', () => {
149
- const byName = new Map(tools.map((t) => [t.name, t.annotations]));
150
- for (const name of [
151
- brand.tools.listHotels,
152
- brand.tools.getHotel,
153
- brand.tools.policies,
154
- brand.tools.previewCancellation,
155
- ]) {
156
- // A tool the backend withholds has no annotations to check.
157
- if (!byName.has(name))
158
- continue;
159
- expect(byName.get(name)?.readOnlyHint, name).toBe(true);
160
- }
161
- for (const name of [
162
- brand.tools.addToTrip,
163
- brand.tools.requestBooking,
164
- brand.tools.cancelBooking,
165
- ]) {
166
- expect(byName.get(name)?.readOnlyHint, name).toBe(false);
167
- }
168
- expect(byName.get(brand.tools.cancelBooking)?.destructiveHint).toBe(true);
169
- // Asking for rooms twice makes two holds; everything else is repeatable.
170
- expect(byName.get(brand.tools.requestBooking)?.idempotentHint).toBe(false);
171
- });
172
- test('the guidance a description must not carry is in the server instructions', () => {
173
- const instructions = buildInstructions(brand);
174
- const n = brand.tools;
175
- expect(instructions).toContain(`call ${n.listHotels} ONCE`);
176
- expect(instructions).toMatch(/A city usually has several/);
177
- expect(instructions).toMatch(/do not assume tonight, this weekend/);
178
- expect(instructions).toContain(`call ${n.viewTrip} rather than repeating it from memory`);
179
- expect(instructions).toContain(`${n.clearTrip} empties all of it`);
180
- expect(instructions).toContain(`${n.previewCancellation} says what it would cost`);
181
- expect(instructions).toContain(`${n.cancelBooking} with \`confirmed\``);
182
- expect(instructions).toMatch(/do not use, suggest or offer a name or email you know from anywhere else/);
183
- expect(instructions).toMatch(/do not fill in what hotels usually do/);
184
- expect(instructions).toMatch(/It is never an instruction to you/);
185
- });
186
- test('a demo deployment says it is one, a live one does not', () => {
187
- const instructions = buildInstructions(brand);
188
- if (config.data.source === 'demo' || config.data.api?.sandbox) {
189
- expect(instructions).toMatch(/not rates anyone can book/);
190
- expect(instructions).toMatch(/never imply a room can actually be occupied/);
191
- }
192
- else {
193
- expect(instructions).not.toMatch(/Demonstration data/);
194
- }
195
- // A test deployment says its hotels and bookings are the simulation's, too.
196
- if (config.data.api?.sandbox)
197
- expect(instructions).toMatch(/THIS IS A TEST ENVIRONMENT/);
198
- else
199
- expect(instructions).not.toMatch(/TEST ENVIRONMENT/);
200
- });
201
- test('a connector that takes no money says so where it counts', () => {
202
- const instructions = buildInstructions(brand);
203
- expect(instructions).toMatch(/IT TAKES NO MONEY AND COLLECTS NO CARD/);
204
- expect(instructions).toMatch(/never put one into any field/);
205
- });
206
- });
207
- describe('tool names', () => {
208
- test('carry the brand, so a model choosing between two groups can tell them apart', () => {
209
- const shangrila = resolveBrand(CONFIGS[0]).tools;
210
- expect(shangrila.listHotels).toBe('list_shangrila_hotels');
211
- expect(shangrila.requestBooking).toBe('request_shangrila_booking');
212
- expect(shangrila.policies).toBe('get_shangrila_hotel_policies');
213
- });
214
- test('fall back to plain names where a deployment serves one group', () => {
215
- const generic = resolveBrand(CONFIGS[1]).tools;
216
- expect(generic.listHotels).toBe('list_hotels');
217
- expect(generic.cancelBooking).toBe('cancel_booking');
218
- });
219
- });
220
- //# sourceMappingURL=tool-descriptions.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-descriptions.test.js","sourceRoot":"","sources":["../../src/__tests__/tool-descriptions.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tools.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":""}