@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.
- package/README.md +18 -8
- package/dist/fence.d.ts +12 -1
- package/dist/fence.d.ts.map +1 -1
- package/dist/fence.js +0 -0
- package/dist/fence.js.map +1 -1
- package/dist/huazhu/backend.d.ts +9 -0
- package/dist/huazhu/backend.d.ts.map +1 -1
- package/dist/huazhu/backend.js +18 -2
- package/dist/huazhu/backend.js.map +1 -1
- package/dist/huazhu/cancel-policy.d.ts.map +1 -1
- package/dist/huazhu/cancel-policy.js +3 -1
- package/dist/huazhu/cancel-policy.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/legal.js +1 -1
- package/dist/legal.js.map +1 -1
- package/dist/money.d.ts +2 -0
- package/dist/money.d.ts.map +1 -1
- package/dist/money.js +43 -6
- package/dist/money.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +9 -1
- package/dist/server.js.map +1 -1
- package/dist/sessions.d.ts.map +1 -1
- package/dist/sessions.js +3 -2
- package/dist/sessions.js.map +1 -1
- package/dist/surface.d.ts +2 -0
- package/dist/surface.d.ts.map +1 -1
- package/dist/surface.js +10 -1
- package/dist/surface.js.map +1 -1
- package/dist/tools.d.ts +4 -4
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +21 -8
- package/dist/tools.js.map +1 -1
- package/dist/trip-ids.js +1 -1
- package/dist/trip-ids.js.map +1 -1
- package/package.json +10 -11
- package/dist/__tests__/__fixtures__/huazhu-fake.d.ts +0 -2
- package/dist/__tests__/__fixtures__/huazhu-fake.d.ts.map +0 -1
- package/dist/__tests__/__fixtures__/huazhu-fake.js +0 -3
- package/dist/__tests__/__fixtures__/huazhu-fake.js.map +0 -1
- package/dist/__tests__/__helpers__/sessions.d.ts +0 -10
- package/dist/__tests__/__helpers__/sessions.d.ts.map +0 -1
- package/dist/__tests__/__helpers__/sessions.js +0 -40
- package/dist/__tests__/__helpers__/sessions.js.map +0 -1
- package/dist/__tests__/audit-p0.test.d.ts +0 -2
- package/dist/__tests__/audit-p0.test.d.ts.map +0 -1
- package/dist/__tests__/audit-p0.test.js +0 -274
- package/dist/__tests__/audit-p0.test.js.map +0 -1
- package/dist/__tests__/audit-p2.test.d.ts +0 -2
- package/dist/__tests__/audit-p2.test.d.ts.map +0 -1
- package/dist/__tests__/audit-p2.test.js +0 -98
- package/dist/__tests__/audit-p2.test.js.map +0 -1
- package/dist/__tests__/card-contract.test.d.ts +0 -2
- package/dist/__tests__/card-contract.test.d.ts.map +0 -1
- package/dist/__tests__/card-contract.test.js +0 -282
- package/dist/__tests__/card-contract.test.js.map +0 -1
- package/dist/__tests__/data.test.d.ts +0 -2
- package/dist/__tests__/data.test.d.ts.map +0 -1
- package/dist/__tests__/data.test.js +0 -210
- package/dist/__tests__/data.test.js.map +0 -1
- package/dist/__tests__/dates.test.d.ts +0 -2
- package/dist/__tests__/dates.test.d.ts.map +0 -1
- package/dist/__tests__/dates.test.js +0 -107
- package/dist/__tests__/dates.test.js.map +0 -1
- package/dist/__tests__/demo-hotels.test.d.ts +0 -2
- package/dist/__tests__/demo-hotels.test.d.ts.map +0 -1
- package/dist/__tests__/demo-hotels.test.js +0 -765
- package/dist/__tests__/demo-hotels.test.js.map +0 -1
- package/dist/__tests__/huazhu-audit.test.d.ts +0 -2
- package/dist/__tests__/huazhu-audit.test.d.ts.map +0 -1
- package/dist/__tests__/huazhu-audit.test.js +0 -234
- package/dist/__tests__/huazhu-audit.test.js.map +0 -1
- package/dist/__tests__/huazhu-backend.test.d.ts +0 -2
- package/dist/__tests__/huazhu-backend.test.d.ts.map +0 -1
- package/dist/__tests__/huazhu-backend.test.js +0 -1326
- package/dist/__tests__/huazhu-backend.test.js.map +0 -1
- package/dist/__tests__/huazhu-cancel-policy.test.d.ts +0 -2
- package/dist/__tests__/huazhu-cancel-policy.test.d.ts.map +0 -1
- package/dist/__tests__/huazhu-cancel-policy.test.js +0 -82
- package/dist/__tests__/huazhu-cancel-policy.test.js.map +0 -1
- package/dist/__tests__/huazhu-sandbox.test.d.ts +0 -2
- package/dist/__tests__/huazhu-sandbox.test.d.ts.map +0 -1
- package/dist/__tests__/huazhu-sandbox.test.js +0 -195
- package/dist/__tests__/huazhu-sandbox.test.js.map +0 -1
- package/dist/__tests__/huazhu-sellable.test.d.ts +0 -2
- package/dist/__tests__/huazhu-sellable.test.d.ts.map +0 -1
- package/dist/__tests__/huazhu-sellable.test.js +0 -192
- package/dist/__tests__/huazhu-sellable.test.js.map +0 -1
- package/dist/__tests__/present.test.d.ts +0 -2
- package/dist/__tests__/present.test.d.ts.map +0 -1
- package/dist/__tests__/present.test.js +0 -367
- package/dist/__tests__/present.test.js.map +0 -1
- package/dist/__tests__/prose.test.d.ts +0 -2
- package/dist/__tests__/prose.test.d.ts.map +0 -1
- package/dist/__tests__/prose.test.js +0 -171
- package/dist/__tests__/prose.test.js.map +0 -1
- package/dist/__tests__/server.test.d.ts +0 -2
- package/dist/__tests__/server.test.d.ts.map +0 -1
- package/dist/__tests__/server.test.js +0 -557
- package/dist/__tests__/server.test.js.map +0 -1
- package/dist/__tests__/state.test.d.ts +0 -2
- package/dist/__tests__/state.test.d.ts.map +0 -1
- package/dist/__tests__/state.test.js +0 -204
- package/dist/__tests__/state.test.js.map +0 -1
- package/dist/__tests__/tool-descriptions.test.d.ts +0 -2
- package/dist/__tests__/tool-descriptions.test.d.ts.map +0 -1
- package/dist/__tests__/tool-descriptions.test.js +0 -220
- package/dist/__tests__/tool-descriptions.test.js.map +0 -1
- package/dist/__tests__/tools.test.d.ts +0 -2
- package/dist/__tests__/tools.test.d.ts.map +0 -1
- package/dist/__tests__/tools.test.js +0 -1598
- 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 +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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":""}
|