@curless/hotel-storefront 0.55.4 → 0.55.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.
- package/dist/card.generated.d.ts +1 -1
- package/dist/card.generated.js +2 -2
- package/dist/card.generated.js.map +1 -1
- package/dist/otaless/backend.d.ts.map +1 -1
- package/dist/otaless/backend.js +26 -61
- package/dist/otaless/backend.js.map +1 -1
- package/dist/otaless/fake.d.ts.map +1 -1
- package/dist/otaless/fake.js +8 -6
- package/dist/otaless/fake.js.map +1 -1
- package/dist/otaless/places.d.ts +52 -0
- package/dist/otaless/places.d.ts.map +1 -0
- package/dist/otaless/places.js +262 -0
- package/dist/otaless/places.js.map +1 -0
- package/dist/server.d.ts +2 -2
- package/dist/server.js +2 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +35 -0
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { PLACE_NAMES, inEnglish } from '../aggregate/places.js';
|
|
2
|
+
// Which place a search names - for the Otaless backend, which answers a place
|
|
3
|
+
// it cannot match with every hotel the group has (11-04, questions #42), so the
|
|
4
|
+
// market narrows the answer itself.
|
|
5
|
+
//
|
|
6
|
+
// ⚠️ THE PLACE IS FOUND IN WHAT WAS TYPED, NOT TAKEN AS ALL OF IT (0.55.4
|
|
7
|
+
// review): 「Tokyo, Japan」, 「新加坡的酒店」, "hotels in Singapore", "Singapore
|
|
8
|
+
// City", 海南 and 外滩 were each read as one place nobody has, and every
|
|
9
|
+
// hotel was taken out. A city, a country, a province or a part of a city is
|
|
10
|
+
// looked for inside the words; and when none is found, the backend's answer
|
|
11
|
+
// stands as it came - never narrowed to nothing.
|
|
12
|
+
/**
|
|
13
|
+
* Parts of a city a guest names, and the city they are in - so 外滩 is
|
|
14
|
+
* Shanghai's hotels. The English is the one the backend's hotel names use
|
|
15
|
+
* ("Atour Hotel Shanghai Bund").
|
|
16
|
+
*/
|
|
17
|
+
const DISTRICTS = [
|
|
18
|
+
{ zh: ['外滩'], en: ['the bund', 'bund'], city: 'Shanghai' },
|
|
19
|
+
{ zh: ['陆家嘴'], en: ['lujiazui'], city: 'Shanghai' },
|
|
20
|
+
{ zh: ['浦东', '浦东新区'], en: ['pudong'], city: 'Shanghai' },
|
|
21
|
+
{ zh: ['静安'], en: ["jing'an", 'jingan'], city: 'Shanghai' },
|
|
22
|
+
{ zh: ['虹桥'], en: ['hongqiao'], city: 'Shanghai' },
|
|
23
|
+
{ zh: ['新天地'], en: ['xintiandi'], city: 'Shanghai' },
|
|
24
|
+
{ zh: ['人民广场'], en: ["people's square", 'people square'], city: 'Shanghai' },
|
|
25
|
+
{ zh: ['南京路', '南京东路', '南京西路'], en: ['nanjing road'], city: 'Shanghai' },
|
|
26
|
+
{ zh: ['淮海路', '淮海中路'], en: ['huaihai road'], city: 'Shanghai' },
|
|
27
|
+
{ zh: ['三里屯'], en: ['sanlitun'], city: 'Beijing' },
|
|
28
|
+
{ zh: ['朝阳'], en: ['chaoyang'], city: 'Beijing' },
|
|
29
|
+
{ zh: ['国贸'], en: ['guomao'], city: 'Beijing' },
|
|
30
|
+
{ zh: ['王府井'], en: ['wangfujing'], city: 'Beijing' },
|
|
31
|
+
{ zh: ['前门'], en: ['qianmen'], city: 'Beijing' },
|
|
32
|
+
{ zh: ['西湖'], en: ['west lake', 'westlake'], city: 'Hangzhou' },
|
|
33
|
+
{ zh: ['金鸡湖'], en: ['jinji lake'], city: 'Suzhou' },
|
|
34
|
+
{ zh: ['钟楼'], en: ['bell tower'], city: "Xi'an" },
|
|
35
|
+
{ zh: ['太古里'], en: ['taikoo li', 'taikooli'], city: 'Chengdu' },
|
|
36
|
+
{ zh: ['珠江新城'], en: ['zhujiang new town'], city: 'Guangzhou' },
|
|
37
|
+
{ zh: ['新街口'], en: ['xinjiekou'], city: 'Nanjing' },
|
|
38
|
+
{ zh: ['海棠湾'], en: ['haitang bay'], city: 'Sanya' },
|
|
39
|
+
{ zh: ['亚龙湾'], en: ['yalong bay'], city: 'Sanya' },
|
|
40
|
+
{ zh: ['福田'], en: ['futian'], city: 'Shenzhen' },
|
|
41
|
+
{ zh: ['南山'], en: ['nanshan'], city: 'Shenzhen' },
|
|
42
|
+
{ zh: ['尖沙咀'], en: ['tsim sha tsui'], city: 'Hong Kong' },
|
|
43
|
+
{ zh: ['九龙'], en: ['kowloon'], city: 'Hong Kong' },
|
|
44
|
+
{ zh: ['红磡'], en: ['hung hom'], city: 'Hong Kong' },
|
|
45
|
+
{ zh: ['中环'], en: [], city: 'Hong Kong' },
|
|
46
|
+
{ zh: ['金钟'], en: ['admiralty'], city: 'Hong Kong' },
|
|
47
|
+
{ zh: ['乌节路'], en: ['orchard road', 'orchard'], city: 'Singapore' },
|
|
48
|
+
{ zh: ['莱佛士坊'], en: ['raffles place'], city: 'Singapore' },
|
|
49
|
+
{ zh: ['滨海湾'], en: ['marina bay'], city: 'Singapore' },
|
|
50
|
+
{ zh: ['丸之内'], en: ['marunouchi'], city: 'Tokyo' },
|
|
51
|
+
{ zh: ['银座'], en: ['ginza'], city: 'Tokyo' },
|
|
52
|
+
{ zh: ['新宿'], en: ['shinjuku'], city: 'Tokyo' },
|
|
53
|
+
];
|
|
54
|
+
/**
|
|
55
|
+
* Provinces, and their cities a guest is likely to mean - 海南 is Sanya and
|
|
56
|
+
* Haikou. A province is the cities in it, not "a place nobody has".
|
|
57
|
+
*/
|
|
58
|
+
const PROVINCES = [
|
|
59
|
+
{ zh: '海南', en: 'hainan', cities: ['Sanya', 'Haikou'] },
|
|
60
|
+
{
|
|
61
|
+
zh: '广东',
|
|
62
|
+
en: 'guangdong',
|
|
63
|
+
cities: ['Guangzhou', 'Shenzhen', 'Zhuhai', 'Foshan', 'Dongguan'],
|
|
64
|
+
},
|
|
65
|
+
{ zh: '浙江', en: 'zhejiang', cities: ['Hangzhou', 'Ningbo', 'Wenzhou', 'Yiwu', 'Zhoushan'] },
|
|
66
|
+
{ zh: '江苏', en: 'jiangsu', cities: ['Nanjing', 'Suzhou', 'Yangzhou', 'Wuxi'] },
|
|
67
|
+
{ zh: '四川', en: 'sichuan', cities: ['Chengdu'] },
|
|
68
|
+
{ zh: '陕西', en: 'shaanxi', cities: ["Xi'an"] },
|
|
69
|
+
{ zh: '福建', en: 'fujian', cities: ['Xiamen', 'Fuzhou', 'Putian'] },
|
|
70
|
+
{ zh: '山东', en: 'shandong', cities: ['Qingdao', 'Jinan', 'Qufu'] },
|
|
71
|
+
{ zh: '湖北', en: 'hubei', cities: ['Wuhan'] },
|
|
72
|
+
{ zh: '湖南', en: 'hunan', cities: ['Changsha'] },
|
|
73
|
+
{ zh: '辽宁', en: 'liaoning', cities: ['Shenyang', 'Dalian'] },
|
|
74
|
+
{ zh: '黑龙江', en: 'heilongjiang', cities: ['Harbin'] },
|
|
75
|
+
{ zh: '吉林', en: 'jilin', cities: ['Changchun'] },
|
|
76
|
+
{ zh: '安徽', en: 'anhui', cities: ['Hefei'] },
|
|
77
|
+
{ zh: '江西', en: 'jiangxi', cities: ['Nanchang'] },
|
|
78
|
+
{ zh: '广西', en: 'guangxi', cities: ['Nanning', 'Guilin', 'Beihai'] },
|
|
79
|
+
{ zh: '云南', en: 'yunnan', cities: ['Kunming', 'Lijiang'] },
|
|
80
|
+
{ zh: '西藏', en: 'tibet', cities: ['Lhasa'] },
|
|
81
|
+
{ zh: '河北', en: 'hebei', cities: ['Tangshan', 'Qinhuangdao'] },
|
|
82
|
+
{ zh: '内蒙古', en: 'inner mongolia', cities: ['Hohhot', 'Baotou', 'Manzhouli'] },
|
|
83
|
+
];
|
|
84
|
+
const regionNames = (() => {
|
|
85
|
+
try {
|
|
86
|
+
return new Intl.DisplayNames(['en'], { type: 'region' });
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
})();
|
|
92
|
+
/** Every country by its English name - "China" → "CN". */
|
|
93
|
+
const COUNTRY_CODES = (() => {
|
|
94
|
+
const byName = new Map();
|
|
95
|
+
const A = 'A'.charCodeAt(0);
|
|
96
|
+
for (let i = 0; i < 26; i++)
|
|
97
|
+
for (let j = 0; j < 26; j++) {
|
|
98
|
+
const code = String.fromCharCode(A + i, A + j);
|
|
99
|
+
try {
|
|
100
|
+
const n = regionNames?.of(code);
|
|
101
|
+
if (n && n !== code && !byName.has(n.toLowerCase()))
|
|
102
|
+
byName.set(n.toLowerCase(), code);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// not a region
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return byName;
|
|
109
|
+
})();
|
|
110
|
+
/** A country's code by its English name, or nothing. */
|
|
111
|
+
export const codeOfCountry = (name) => COUNTRY_CODES.get(name.trim().toLowerCase());
|
|
112
|
+
/** A city as two spellings of it are compared: lower case, no spaces or marks. */
|
|
113
|
+
export const cityKey = (s) => s.toLowerCase().replace(/[\s'’·.,-]/g, '');
|
|
114
|
+
const asPattern = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
115
|
+
/** …and as it is written, capital and all. */
|
|
116
|
+
const hasCasedWord = (text, name) => new RegExp(`(^|[^A-Za-z])${asPattern(name)}([^A-Za-z]|$)`).test(text);
|
|
117
|
+
/** An English name as a word of the text, not a part of one ("Singapore City", not "Singaporean"). */
|
|
118
|
+
const hasWord = (low, name) => new RegExp(`(^|[^a-z])${asPattern(name.toLowerCase())}([^a-z]|$)`).test(low);
|
|
119
|
+
/**
|
|
120
|
+
* The city, country, province or part of a city a search names - or nothing,
|
|
121
|
+
* when none is found in its words (and then nothing is narrowed).
|
|
122
|
+
*
|
|
123
|
+
* `known` are the cities and countries of the hotels the answer holds, for a
|
|
124
|
+
* place no table here has. `groups` are the hotel groups' own names, which are
|
|
125
|
+
* never a place: 「香格里拉的酒店」 asks for the group, not the town in Yunnan.
|
|
126
|
+
*/
|
|
127
|
+
export const wantedIn = (said, known = [], groups = []) => {
|
|
128
|
+
const whole = placesIn(said, known, groups);
|
|
129
|
+
if (!whole)
|
|
130
|
+
return undefined;
|
|
131
|
+
const text = said.trim();
|
|
132
|
+
// "<city>, <country>": the country is that city's, so it is narrowed by it even
|
|
133
|
+
// where no hotel of the answer is in that city.
|
|
134
|
+
const parts = text
|
|
135
|
+
.split(/[,,、]/)
|
|
136
|
+
.map((x) => x.trim())
|
|
137
|
+
.filter(Boolean);
|
|
138
|
+
if (parts.length > 1) {
|
|
139
|
+
const each = parts.map((x) => ({ x, w: placesIn(x, known, groups) }));
|
|
140
|
+
const last = each.at(-1)?.w;
|
|
141
|
+
const lastIsCountry = !!last && last.countries.size === 1 && last.cities.size === 0;
|
|
142
|
+
const before = each.slice(0, -1);
|
|
143
|
+
if (lastIsCountry && before.some((b) => b.w && [...b.w.cities].some((c) => !codeOfCountry(c))))
|
|
144
|
+
for (const c of last.countries)
|
|
145
|
+
whole.narrowed.add(c);
|
|
146
|
+
// A part that names nothing beside parts that name only countries:
|
|
147
|
+
// 「Osaka, Japan」. Only words that look like a place's name - no digits.
|
|
148
|
+
if (whole.cities.size === 0) {
|
|
149
|
+
const unknown = each
|
|
150
|
+
.filter((b) => !b.w && /^[\p{L}\s'’.-]{2,40}$/u.test(b.x) && b.x.split(/\s+/).length <= 3)
|
|
151
|
+
.map((b) => b.x);
|
|
152
|
+
if (unknown.length)
|
|
153
|
+
whole.unknown = unknown.join(', ');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return whole;
|
|
157
|
+
};
|
|
158
|
+
/** The places in some words - see `wantedIn`, which reads them part by part too. */
|
|
159
|
+
const placesIn = (said, known, groups) => {
|
|
160
|
+
const text = said.trim();
|
|
161
|
+
if (!text)
|
|
162
|
+
return undefined;
|
|
163
|
+
const low = text.toLowerCase();
|
|
164
|
+
const isGroup = new Set(groups.map((g) => g.trim().toLowerCase()));
|
|
165
|
+
const cities = new Set();
|
|
166
|
+
const countries = new Set();
|
|
167
|
+
/** One place found, by its English name. */
|
|
168
|
+
const found = (en) => {
|
|
169
|
+
if (isGroup.has(en.toLowerCase()))
|
|
170
|
+
return;
|
|
171
|
+
const code = codeOfCountry(en);
|
|
172
|
+
if (code)
|
|
173
|
+
countries.add(code);
|
|
174
|
+
// A city-state is both; any other country is not a city.
|
|
175
|
+
if (!code || en === 'Singapore' || en === 'Hong Kong' || en === 'Macau' || en === 'Macao') {
|
|
176
|
+
cities.add(cityKey(en));
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
// Chinese: the longest names first, each taken out once found - 「上海浦东」 is
|
|
180
|
+
// Shanghai and Pudong, not also a 浦 somewhere.
|
|
181
|
+
let rest = text;
|
|
182
|
+
// A part of a city before a name of the same length: 九龙 is Hong Kong's.
|
|
183
|
+
const zhNames = [
|
|
184
|
+
...DISTRICTS.flatMap((d) => d.zh.map((zh) => ({ zh, cities: [d.city] }))),
|
|
185
|
+
...Object.entries(PLACE_NAMES).map(([zh, en]) => ({ zh, cities: [en] })),
|
|
186
|
+
...PROVINCES.map((p) => ({ zh: p.zh, cities: p.cities })),
|
|
187
|
+
].sort((a, b) => b.zh.length - a.zh.length);
|
|
188
|
+
for (const n of zhNames) {
|
|
189
|
+
if (isGroup.has(n.zh) || !rest.includes(n.zh))
|
|
190
|
+
continue;
|
|
191
|
+
rest = rest.split(n.zh).join(' ');
|
|
192
|
+
for (const c of n.cities)
|
|
193
|
+
found(c);
|
|
194
|
+
}
|
|
195
|
+
// English: whole words, the longest first. ⚠️ A CITY ONLY THE ANSWER'S HOTELS
|
|
196
|
+
// NAME IS A PLACE ONLY AS IT IS WRITTEN, CAPITAL AND ALL: "a nice hotel" is not
|
|
197
|
+
// Nice (0.55.5 review). The tables' names and the countries are read in any case.
|
|
198
|
+
const tables = new Set([...Object.values(PLACE_NAMES), ...COUNTRY_CODES.keys()].map((x) => x.toLowerCase()));
|
|
199
|
+
const fromAnswer = [
|
|
200
|
+
...new Set(known
|
|
201
|
+
.flatMap((h) => [h.city, h.country])
|
|
202
|
+
.filter((x) => !!x?.trim() && !tables.has(x.trim().toLowerCase()))),
|
|
203
|
+
];
|
|
204
|
+
const enNames = [
|
|
205
|
+
...[...tables].map((name) => ({ name, cased: false })),
|
|
206
|
+
...fromAnswer.map((name) => ({ name, cased: true })),
|
|
207
|
+
].sort((a, b) => b.name.length - a.name.length);
|
|
208
|
+
let restLow = low;
|
|
209
|
+
let restCased = text;
|
|
210
|
+
for (const { name, cased } of enNames) {
|
|
211
|
+
if (cased ? !hasCasedWord(restCased, name) : !hasWord(restLow, name))
|
|
212
|
+
continue;
|
|
213
|
+
restLow = restLow.replace(new RegExp(asPattern(name.toLowerCase()), 'g'), ' ');
|
|
214
|
+
restCased = restCased.replace(new RegExp(asPattern(name), 'g'), ' ');
|
|
215
|
+
found(name.replace(/\b\w/g, (c) => c.toUpperCase()));
|
|
216
|
+
}
|
|
217
|
+
for (const d of DISTRICTS)
|
|
218
|
+
if (d.en.some((en) => hasWord(restLow, en))) {
|
|
219
|
+
found(d.city);
|
|
220
|
+
}
|
|
221
|
+
for (const p of PROVINCES)
|
|
222
|
+
if (hasWord(restLow, p.en)) {
|
|
223
|
+
for (const c of p.cities)
|
|
224
|
+
found(c);
|
|
225
|
+
}
|
|
226
|
+
// A country by its code, typed alone ("SG", "cn") - as 0.55.4 read it, and
|
|
227
|
+
// 0415fdf7 no longer did (0.55.5 review): its English name is the country.
|
|
228
|
+
if (!cities.size && !countries.size && /^[a-z]{2}$/i.test(text)) {
|
|
229
|
+
const code = text.toUpperCase();
|
|
230
|
+
const name = regionNames?.of(code);
|
|
231
|
+
if (name && name !== code)
|
|
232
|
+
found(name);
|
|
233
|
+
}
|
|
234
|
+
if (!cities.size && !countries.size)
|
|
235
|
+
return undefined;
|
|
236
|
+
// A named city narrows its own country: the answer's hotels say which that is.
|
|
237
|
+
const narrowed = new Set();
|
|
238
|
+
for (const h of known) {
|
|
239
|
+
const c = h.city ? cityKey(inEnglish(h.city) ?? h.city) : '';
|
|
240
|
+
if (c && cities.has(c) && h.countryCode && !codeOfCountry(h.city ?? ''))
|
|
241
|
+
narrowed.add(h.countryCode);
|
|
242
|
+
}
|
|
243
|
+
return { cities, countries, narrowed };
|
|
244
|
+
};
|
|
245
|
+
/**
|
|
246
|
+
* The hotel groups a search names by name - 「香格里拉的酒店」, "Atour in
|
|
247
|
+
* Shanghai" - by their codes (0.55.5 review: a group named alone listed every
|
|
248
|
+
* group's hotels).
|
|
249
|
+
*/
|
|
250
|
+
export const groupsIn = (said, groups) => {
|
|
251
|
+
const text = said.trim();
|
|
252
|
+
const low = text.toLowerCase();
|
|
253
|
+
return groups
|
|
254
|
+
.filter((g) => [g.name, ...Object.values(g.names ?? {})].some((n) => !!n && (/[一-鿿]/.test(n) ? text.includes(n) : hasWord(low, n))))
|
|
255
|
+
.map((g) => g.code);
|
|
256
|
+
};
|
|
257
|
+
/** Whether a hotel is in what a search named (`wantedIn`). */
|
|
258
|
+
export const isIn = (h, w) =>
|
|
259
|
+
// A hotel's city in Chinese (上海) is its English one (Shanghai) here.
|
|
260
|
+
w.cities.has(cityKey(inEnglish(h.city) ?? h.city)) ||
|
|
261
|
+
(!!h.countryCode && w.countries.has(h.countryCode) && !w.narrowed.has(h.countryCode));
|
|
262
|
+
//# sourceMappingURL=places.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"places.js","sourceRoot":"","sources":["../../src/otaless/places.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -29,7 +29,7 @@ export declare const INITIALIZE_PER_MINUTE = 300;
|
|
|
29
29
|
* number. Found by reading the boot banner of a container that had just been
|
|
30
30
|
* deployed (2026-09-22): seventeen tools listed, and "0.7.0" above them.
|
|
31
31
|
*/
|
|
32
|
-
export declare const VERSION = "0.55.
|
|
32
|
+
export declare const VERSION = "0.55.6";
|
|
33
33
|
/**
|
|
34
34
|
* The card's resource URI.
|
|
35
35
|
*
|
|
@@ -38,7 +38,7 @@ export declare const VERSION = "0.55.4";
|
|
|
38
38
|
* connector went storefront-v35 → v40 in a single day of UI work for exactly
|
|
39
39
|
* this reason.
|
|
40
40
|
*/
|
|
41
|
-
export declare const CARD_URI = "ui://curless/hotel/booking-
|
|
41
|
+
export declare const CARD_URI = "ui://curless/hotel/booking-v115.html";
|
|
42
42
|
/**
|
|
43
43
|
* The URI one deployment names its card by: `CARD_URI` with a short hash of
|
|
44
44
|
* everything a host caches under it - the card itself, and the hosts it may
|
package/dist/server.js
CHANGED
|
@@ -48,7 +48,7 @@ export const INITIALIZE_PER_MINUTE = 300;
|
|
|
48
48
|
* number. Found by reading the boot banner of a container that had just been
|
|
49
49
|
* deployed (2026-09-22): seventeen tools listed, and "0.7.0" above them.
|
|
50
50
|
*/
|
|
51
|
-
export const VERSION = '0.55.
|
|
51
|
+
export const VERSION = '0.55.6';
|
|
52
52
|
/**
|
|
53
53
|
* The card's resource URI.
|
|
54
54
|
*
|
|
@@ -57,7 +57,7 @@ export const VERSION = '0.55.4';
|
|
|
57
57
|
* connector went storefront-v35 → v40 in a single day of UI work for exactly
|
|
58
58
|
* this reason.
|
|
59
59
|
*/
|
|
60
|
-
export const CARD_URI = 'ui://curless/hotel/booking-
|
|
60
|
+
export const CARD_URI = 'ui://curless/hotel/booking-v115.html';
|
|
61
61
|
/** The card as it ships, hashed once - what a host caches under the URI. */
|
|
62
62
|
const CARD_HTML_SHA = createHash('sha256').update(HOTEL_CARD_HTML).digest('hex');
|
|
63
63
|
/**
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.js
CHANGED
|
@@ -1371,6 +1371,10 @@ export const buildOutputSchemas = (n) => ({
|
|
|
1371
1371
|
degraded: ARR,
|
|
1372
1372
|
/** What `degraded` means, as the text says it: not that those groups have none here. */
|
|
1373
1373
|
degradedSaid: STR,
|
|
1374
|
+
/** In a market: the place asked for, when it was not recognised - the hotels are not that place's (`unplacedOf`). */
|
|
1375
|
+
unplaced: STR,
|
|
1376
|
+
/** What `unplaced` means, as the text says it. */
|
|
1377
|
+
unplacedSaid: STR,
|
|
1374
1378
|
...HOTEL_PAGE,
|
|
1375
1379
|
},
|
|
1376
1380
|
required: ['view'],
|
|
@@ -1572,6 +1576,9 @@ export const buildOutputSchemas = (n) => ({
|
|
|
1572
1576
|
/** A \`city\` read in a market: the groups that did not answer in time (\`degradedOf\`). */
|
|
1573
1577
|
degraded: ARR,
|
|
1574
1578
|
degradedSaid: STR,
|
|
1579
|
+
/** A \`city\` not recognised as a place: what was read is not that city's (\`unplacedOf\`). */
|
|
1580
|
+
unplaced: STR,
|
|
1581
|
+
unplacedSaid: STR,
|
|
1575
1582
|
},
|
|
1576
1583
|
required: ['view'],
|
|
1577
1584
|
},
|
|
@@ -3053,6 +3060,26 @@ card = !noCards) => {
|
|
|
3053
3060
|
said,
|
|
3054
3061
|
};
|
|
3055
3062
|
};
|
|
3063
|
+
/**
|
|
3064
|
+
* A place no table here knows (`HotelSearchResult.unplaced`), as the sentence the
|
|
3065
|
+
* model is told and the field the card draws its own line from.
|
|
3066
|
+
*
|
|
3067
|
+
* ⚠️ NEVER "N HOTELS IN REYKJAVIK" (总线程 11-04, 0.55.5). Words that name no
|
|
3068
|
+
* place this market knows narrow nothing, and the backend answers a place it
|
|
3069
|
+
* cannot match with every hotel each group has - so the list is Sanya's,
|
|
3070
|
+
* Singapore's, Tokyo's. Said once, in the text and in `structuredContent`
|
|
3071
|
+
* alike: a host with no card has only the words.
|
|
3072
|
+
*/
|
|
3073
|
+
const unplacedOf = (deps, answer,
|
|
3074
|
+
/** The words were a `city` - or a guest's own words (`query`), a place looked for inside them. */
|
|
3075
|
+
asCity) => {
|
|
3076
|
+
const place = answer.unplaced?.trim();
|
|
3077
|
+
if (!place)
|
|
3078
|
+
return { structured: {}, said: '' };
|
|
3079
|
+
const n = deps.vocab.nounPlural;
|
|
3080
|
+
const said = `${asCity ? `"${place}" was not recognised as a place` : `No place was recognised in "${place}"`}, so these are the ${n} the groups returned, each in its own city - they are not ${n} in the place asked for, and are not to be called that.`;
|
|
3081
|
+
return { structured: { unplaced: place, unplacedSaid: said }, said };
|
|
3082
|
+
};
|
|
3056
3083
|
/**
|
|
3057
3084
|
* What is said when a read could not be had because hotel groups did not answer
|
|
3058
3085
|
* in time - one group, or several, or every one.
|
|
@@ -5310,6 +5337,7 @@ const answerTool = async (deps, name, rawArgs, ctx) => {
|
|
|
5310
5337
|
// Every one by name and city, and that there are no others - or, told
|
|
5311
5338
|
// only "2 hotels", the model asked for the list again to learn which.
|
|
5312
5339
|
const degraded = degradedOf(deps, answer, undefined, ctx?.noCards);
|
|
5340
|
+
const unplaced = unplacedOf(deps, answer, !!asked.city);
|
|
5313
5341
|
const inAll = homeList
|
|
5314
5342
|
? `There are ${total} ${branded(deps.vocab, deps.vocab.nounPlural)} here in all, and this answer lists every one: ${hotels
|
|
5315
5343
|
.map((h) => `${hotelName(h.name)}${h.city ? ` in ${h.city}` : ''}`)
|
|
@@ -5364,6 +5392,8 @@ const answerTool = async (deps, name, rawArgs, ctx) => {
|
|
|
5364
5392
|
...(answer.currencies.length > 1 ? { currencies: answer.currencies } : {}),
|
|
5365
5393
|
// A group that did not answer, in both: the card draws a line from it.
|
|
5366
5394
|
...degraded.structured,
|
|
5395
|
+
// A place not recognised, in both: the card heads the list without it.
|
|
5396
|
+
...unplaced.structured,
|
|
5367
5397
|
// In both, like a plan's: a host with no card may hand its model this
|
|
5368
5398
|
// rather than the text.
|
|
5369
5399
|
...(ctx.noCards ? { notDrawn: LIST_NOT_DRAWN } : {}),
|
|
@@ -5372,6 +5402,7 @@ const answerTool = async (deps, name, rawArgs, ctx) => {
|
|
|
5372
5402
|
text: [
|
|
5373
5403
|
inAll ||
|
|
5374
5404
|
`${total} ${branded(deps.vocab, total === 1 ? deps.vocab.noun : deps.vocab.nounPlural)}${where}.`,
|
|
5405
|
+
unplaced.said,
|
|
5375
5406
|
// ⚠️ NO "BELOW", NO "TAP". This sentence is read out by a voice
|
|
5376
5407
|
// assistant as often as it is drawn next to a card, and a guest whose
|
|
5377
5408
|
// host has no card at all cannot tap the one it tells them to tap. The
|
|
@@ -5633,6 +5664,8 @@ const answerTool = async (deps, name, rawArgs, ctx) => {
|
|
|
5633
5664
|
}
|
|
5634
5665
|
// `look_up` draws no card: the guest asks again in words (`askLater`).
|
|
5635
5666
|
const degraded = degradedOf(deps, degradedFound, undefined, ctx?.noCards, false);
|
|
5667
|
+
// A city no table here knows: what was read is not that city's (0.55.5).
|
|
5668
|
+
const unplaced = unplacedOf(deps, degradedFound, true);
|
|
5636
5669
|
const unique = [...new Set(ids)];
|
|
5637
5670
|
// A name that fits more than one is said with the ones it fits; the rest are not found.
|
|
5638
5671
|
const notFound = dropped.filter((d) => !candidates.some((c) => c.for === d));
|
|
@@ -5717,9 +5750,11 @@ const answerTool = async (deps, name, rawArgs, ctx) => {
|
|
|
5717
5750
|
...(dropped.length ? { dropped } : {}),
|
|
5718
5751
|
...(candidates.length ? { candidates } : {}),
|
|
5719
5752
|
...degraded.structured,
|
|
5753
|
+
...unplaced.structured,
|
|
5720
5754
|
},
|
|
5721
5755
|
text: [
|
|
5722
5756
|
`Read ${read.length}${total > read.length ? ` of ${total}` : ''} ${read.length === 1 ? deps.vocab.noun : deps.vocab.nounPlural}. Nothing was shown to the guest.`,
|
|
5757
|
+
unplaced.said,
|
|
5723
5758
|
degraded.said,
|
|
5724
5759
|
...blocks,
|
|
5725
5760
|
notFound.length ? `Not found: ${notFound.map((d) => `"${d}"`).join(', ')}.` : '',
|