@curless/hotel-storefront 0.55.3 → 0.55.5

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.
@@ -0,0 +1,31 @@
1
+ /** A country's code by its English name, or nothing. */
2
+ export declare const codeOfCountry: (name: string) => string | undefined;
3
+ /** A city as two spellings of it are compared: lower case, no spaces or marks. */
4
+ export declare const cityKey: (s: string) => string;
5
+ /** What a search names, found inside its words. */
6
+ export type Wanted = {
7
+ /** The cities, as `cityKey`s. */
8
+ cities: Set<string>;
9
+ /** The countries, by code. */
10
+ countries: Set<string>;
11
+ /** A city that is not also a country was named: a country's other cities do not pass. */
12
+ narrow: boolean;
13
+ };
14
+ /**
15
+ * The city, country, province or part of a city a search names - or nothing,
16
+ * when none is found in its words (and then nothing is narrowed).
17
+ *
18
+ * `known` are the cities and countries of the hotels the answer holds, for a
19
+ * place no table here has. `groups` are the hotel groups' own names, which are
20
+ * never a place: 「香格里拉的酒店」 asks for the group, not the town in Yunnan.
21
+ */
22
+ export declare const wantedIn: (said: string, known?: {
23
+ city?: string;
24
+ country?: string;
25
+ }[], groups?: string[]) => Wanted | undefined;
26
+ /** Whether a hotel is in what a search named (`wantedIn`). */
27
+ export declare const isIn: (h: {
28
+ city: string;
29
+ countryCode?: string;
30
+ }, w: Wanted) => boolean;
31
+ //# sourceMappingURL=places.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"places.d.ts","sourceRoot":"","sources":["../../src/otaless/places.ts"],"names":[],"mappings":"AA6GA,wDAAwD;AACxD,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SACR,CAAC;AAE/C,kFAAkF;AAClF,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,KAAG,MAAoD,CAAC;AAOzF,mDAAmD;AACnD,MAAM,MAAM,MAAM,GAAG;IACnB,iCAAiC;IACjC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,8BAA8B;IAC9B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,yFAAyF;IACzF,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GACnB,MAAM,MAAM,EACZ,QAAO;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAAO,EACjD,SAAQ,MAAM,EAAO,KACpB,MAAM,GAAG,SA8DX,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,IAAI,GAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,KAAG,OAGV,CAAC"}
@@ -0,0 +1,199 @@
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: ['guomao'], city: 'Beijing' },
29
+ { zh: ['王府井'], en: ['wangfujing'], city: 'Beijing' },
30
+ { zh: ['前门'], en: ['qianmen'], city: 'Beijing' },
31
+ { zh: ['西湖'], en: ['west lake', 'westlake'], city: 'Hangzhou' },
32
+ { zh: ['金鸡湖'], en: ['jinji lake'], city: 'Suzhou' },
33
+ { zh: ['钟楼'], en: ['bell tower'], city: "Xi'an" },
34
+ { zh: ['太古里'], en: ['taikoo li', 'taikooli'], city: 'Chengdu' },
35
+ { zh: ['珠江新城'], en: ['zhujiang new town'], city: 'Guangzhou' },
36
+ { zh: ['新街口'], en: ['xinjiekou'], city: 'Nanjing' },
37
+ { zh: ['海棠湾'], en: ['haitang bay'], city: 'Sanya' },
38
+ { zh: ['亚龙湾'], en: ['yalong bay'], city: 'Sanya' },
39
+ { zh: ['福田'], en: ['futian'], city: 'Shenzhen' },
40
+ { zh: ['南山'], en: ['nanshan'], city: 'Shenzhen' },
41
+ { zh: ['尖沙咀'], en: ['tsim sha tsui'], city: 'Hong Kong' },
42
+ { zh: ['中环'], en: [], city: 'Hong Kong' },
43
+ { zh: ['金钟'], en: ['admiralty'], city: 'Hong Kong' },
44
+ { zh: ['乌节路'], en: ['orchard road', 'orchard'], city: 'Singapore' },
45
+ { zh: ['莱佛士坊'], en: ['raffles place'], city: 'Singapore' },
46
+ { zh: ['滨海湾'], en: ['marina bay'], city: 'Singapore' },
47
+ { zh: ['丸之内'], en: ['marunouchi'], city: 'Tokyo' },
48
+ { zh: ['银座'], en: ['ginza'], city: 'Tokyo' },
49
+ { zh: ['新宿'], en: ['shinjuku'], city: 'Tokyo' },
50
+ ];
51
+ /**
52
+ * Provinces, and their cities a guest is likely to mean - 海南 is Sanya and
53
+ * Haikou. A province is the cities in it, not "a place nobody has".
54
+ */
55
+ const PROVINCES = [
56
+ { zh: '海南', en: 'hainan', cities: ['Sanya', 'Haikou'] },
57
+ {
58
+ zh: '广东',
59
+ en: 'guangdong',
60
+ cities: ['Guangzhou', 'Shenzhen', 'Zhuhai', 'Foshan', 'Dongguan'],
61
+ },
62
+ { zh: '浙江', en: 'zhejiang', cities: ['Hangzhou', 'Ningbo', 'Wenzhou', 'Yiwu', 'Zhoushan'] },
63
+ { zh: '江苏', en: 'jiangsu', cities: ['Nanjing', 'Suzhou', 'Yangzhou', 'Wuxi'] },
64
+ { zh: '四川', en: 'sichuan', cities: ['Chengdu'] },
65
+ { zh: '陕西', en: 'shaanxi', cities: ["Xi'an"] },
66
+ { zh: '福建', en: 'fujian', cities: ['Xiamen', 'Fuzhou', 'Putian'] },
67
+ { zh: '山东', en: 'shandong', cities: ['Qingdao', 'Jinan', 'Qufu'] },
68
+ { zh: '湖北', en: 'hubei', cities: ['Wuhan'] },
69
+ { zh: '湖南', en: 'hunan', cities: ['Changsha'] },
70
+ { zh: '辽宁', en: 'liaoning', cities: ['Shenyang', 'Dalian'] },
71
+ { zh: '黑龙江', en: 'heilongjiang', cities: ['Harbin'] },
72
+ { zh: '吉林', en: 'jilin', cities: ['Changchun'] },
73
+ { zh: '安徽', en: 'anhui', cities: ['Hefei'] },
74
+ { zh: '江西', en: 'jiangxi', cities: ['Nanchang'] },
75
+ { zh: '广西', en: 'guangxi', cities: ['Nanning', 'Guilin', 'Beihai'] },
76
+ { zh: '云南', en: 'yunnan', cities: ['Kunming', 'Lijiang'] },
77
+ { zh: '西藏', en: 'tibet', cities: ['Lhasa'] },
78
+ { zh: '河北', en: 'hebei', cities: ['Tangshan', 'Qinhuangdao'] },
79
+ { zh: '内蒙古', en: 'inner mongolia', cities: ['Hohhot', 'Baotou', 'Manzhouli'] },
80
+ ];
81
+ const regionNames = (() => {
82
+ try {
83
+ return new Intl.DisplayNames(['en'], { type: 'region' });
84
+ }
85
+ catch {
86
+ return undefined;
87
+ }
88
+ })();
89
+ /** Every country by its English name - "China" → "CN". */
90
+ const COUNTRY_CODES = (() => {
91
+ const byName = new Map();
92
+ const A = 'A'.charCodeAt(0);
93
+ for (let i = 0; i < 26; i++)
94
+ for (let j = 0; j < 26; j++) {
95
+ const code = String.fromCharCode(A + i, A + j);
96
+ try {
97
+ const n = regionNames?.of(code);
98
+ if (n && n !== code && !byName.has(n.toLowerCase()))
99
+ byName.set(n.toLowerCase(), code);
100
+ }
101
+ catch {
102
+ // not a region
103
+ }
104
+ }
105
+ return byName;
106
+ })();
107
+ /** A country's code by its English name, or nothing. */
108
+ export const codeOfCountry = (name) => COUNTRY_CODES.get(name.trim().toLowerCase());
109
+ /** A city as two spellings of it are compared: lower case, no spaces or marks. */
110
+ export const cityKey = (s) => s.toLowerCase().replace(/[\s'’·.,-]/g, '');
111
+ const asPattern = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
112
+ /** An English name as a word of the text, not a part of one ("Singapore City", not "Singaporean"). */
113
+ const hasWord = (low, name) => new RegExp(`(^|[^a-z])${asPattern(name.toLowerCase())}([^a-z]|$)`).test(low);
114
+ /**
115
+ * The city, country, province or part of a city a search names - or nothing,
116
+ * when none is found in its words (and then nothing is narrowed).
117
+ *
118
+ * `known` are the cities and countries of the hotels the answer holds, for a
119
+ * place no table here has. `groups` are the hotel groups' own names, which are
120
+ * never a place: 「香格里拉的酒店」 asks for the group, not the town in Yunnan.
121
+ */
122
+ export const wantedIn = (said, known = [], groups = []) => {
123
+ const text = said.trim();
124
+ if (!text)
125
+ return undefined;
126
+ const low = text.toLowerCase();
127
+ const isGroup = new Set(groups.map((g) => g.trim().toLowerCase()));
128
+ const cities = new Set();
129
+ const countries = new Set();
130
+ let narrow = false;
131
+ /** One place found, by its English name. */
132
+ const found = (en) => {
133
+ if (isGroup.has(en.toLowerCase()))
134
+ return;
135
+ const code = codeOfCountry(en);
136
+ if (code)
137
+ countries.add(code);
138
+ // A city-state is both; any other country is not a city.
139
+ if (!code || en === 'Singapore' || en === 'Hong Kong' || en === 'Macau' || en === 'Macao') {
140
+ cities.add(cityKey(en));
141
+ if (!code)
142
+ narrow = true;
143
+ }
144
+ };
145
+ // Chinese: the longest names first, each taken out once found - 「上海浦东」 is
146
+ // Shanghai and Pudong, not also a 浦 somewhere.
147
+ let rest = text;
148
+ const zhNames = [
149
+ ...Object.entries(PLACE_NAMES).map(([zh, en]) => ({ zh, cities: [en] })),
150
+ ...DISTRICTS.flatMap((d) => d.zh.map((zh) => ({ zh, cities: [d.city] }))),
151
+ ...PROVINCES.map((p) => ({ zh: p.zh, cities: p.cities })),
152
+ ].sort((a, b) => b.zh.length - a.zh.length);
153
+ for (const n of zhNames) {
154
+ if (isGroup.has(n.zh) || !rest.includes(n.zh))
155
+ continue;
156
+ rest = rest.split(n.zh).join(' ');
157
+ for (const c of n.cities)
158
+ found(c);
159
+ }
160
+ // English: whole words, the longest first.
161
+ const enNames = [
162
+ ...new Set([
163
+ ...Object.values(PLACE_NAMES),
164
+ ...known.flatMap((h) => [h.city, h.country]).filter((x) => !!x?.trim()),
165
+ ...[...COUNTRY_CODES.keys()],
166
+ ]),
167
+ ].sort((a, b) => b.length - a.length);
168
+ let restLow = low;
169
+ for (const en of enNames) {
170
+ if (!hasWord(restLow, en))
171
+ continue;
172
+ restLow = restLow.replace(new RegExp(asPattern(en.toLowerCase()), 'g'), ' ');
173
+ found(en.replace(/\b\w/g, (c) => c.toUpperCase()));
174
+ }
175
+ for (const d of DISTRICTS)
176
+ if (d.en.some((en) => hasWord(restLow, en))) {
177
+ found(d.city);
178
+ }
179
+ for (const p of PROVINCES)
180
+ if (hasWord(restLow, p.en)) {
181
+ for (const c of p.cities)
182
+ found(c);
183
+ }
184
+ // A country by its code, typed alone ("SG", "cn") - as 0.55.4 read it, and
185
+ // 0415fdf7 no longer did (0.55.5 review): its English name is the country.
186
+ if (!cities.size && !countries.size && /^[a-z]{2}$/i.test(text)) {
187
+ const code = text.toUpperCase();
188
+ const name = regionNames?.of(code);
189
+ if (name && name !== code)
190
+ found(name);
191
+ }
192
+ return cities.size || countries.size ? { cities, countries, narrow } : undefined;
193
+ };
194
+ /** Whether a hotel is in what a search named (`wantedIn`). */
195
+ export const isIn = (h, w) =>
196
+ // A hotel's city in Chinese (上海) is its English one (Shanghai) here.
197
+ w.cities.has(cityKey(inEnglish(h.city) ?? h.city)) ||
198
+ (!w.narrow && !!h.countryCode && w.countries.has(h.countryCode));
199
+ //# 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.3";
32
+ export declare const VERSION = "0.55.5";
33
33
  /**
34
34
  * The card's resource URI.
35
35
  *
@@ -38,7 +38,7 @@ export declare const VERSION = "0.55.3";
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-v114.html";
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.3';
51
+ export const VERSION = '0.55.5';
52
52
  /**
53
53
  * The card's resource URI.
54
54
  *
@@ -57,7 +57,7 @@ export const VERSION = '0.55.3';
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-v114.html';
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
  /**
@@ -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(', ')}.` : '',