@curless/hotel-storefront 0.55.7 → 0.56.0

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 (59) hide show
  1. package/dist/account/fake-mall.d.ts +42 -0
  2. package/dist/account/fake-mall.d.ts.map +1 -0
  3. package/dist/account/fake-mall.js +168 -0
  4. package/dist/account/fake-mall.js.map +1 -0
  5. package/dist/account/index.d.ts +104 -0
  6. package/dist/account/index.d.ts.map +1 -0
  7. package/dist/account/index.js +845 -0
  8. package/dist/account/index.js.map +1 -0
  9. package/dist/account/mall.d.ts +83 -0
  10. package/dist/account/mall.d.ts.map +1 -0
  11. package/dist/account/mall.js +224 -0
  12. package/dist/account/mall.js.map +1 -0
  13. package/dist/account/pages.d.ts +118 -0
  14. package/dist/account/pages.d.ts.map +1 -0
  15. package/dist/account/pages.js +295 -0
  16. package/dist/account/pages.js.map +1 -0
  17. package/dist/account/requests.d.ts +68 -0
  18. package/dist/account/requests.d.ts.map +1 -0
  19. package/dist/account/requests.js +178 -0
  20. package/dist/account/requests.js.map +1 -0
  21. package/dist/account/store.d.ts +67 -0
  22. package/dist/account/store.d.ts.map +1 -0
  23. package/dist/account/store.js +151 -0
  24. package/dist/account/store.js.map +1 -0
  25. package/dist/card.generated.d.ts +1 -1
  26. package/dist/card.generated.js +2 -2
  27. package/dist/card.generated.js.map +1 -1
  28. package/dist/config.d.ts +9 -0
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js.map +1 -1
  31. package/dist/legal.d.ts.map +1 -1
  32. package/dist/legal.js +15 -3
  33. package/dist/legal.js.map +1 -1
  34. package/dist/otaless/backend.d.ts.map +1 -1
  35. package/dist/otaless/backend.js +6 -2
  36. package/dist/otaless/backend.js.map +1 -1
  37. package/dist/otaless/fake.d.ts +6 -3
  38. package/dist/otaless/fake.d.ts.map +1 -1
  39. package/dist/otaless/fake.js +19 -9
  40. package/dist/otaless/fake.js.map +1 -1
  41. package/dist/otaless/places.d.ts.map +1 -1
  42. package/dist/otaless/places.js +16 -4
  43. package/dist/otaless/places.js.map +1 -1
  44. package/dist/otaless/recorded-1105.d.ts +15 -0
  45. package/dist/otaless/recorded-1105.d.ts.map +1 -0
  46. package/dist/otaless/recorded-1105.js +1328 -0
  47. package/dist/otaless/recorded-1105.js.map +1 -0
  48. package/dist/server.d.ts +2 -2
  49. package/dist/server.d.ts.map +1 -1
  50. package/dist/server.js +198 -45
  51. package/dist/server.js.map +1 -1
  52. package/dist/surface.d.ts.map +1 -1
  53. package/dist/surface.js +6 -4
  54. package/dist/surface.js.map +1 -1
  55. package/dist/tools.d.ts +240 -2
  56. package/dist/tools.d.ts.map +1 -1
  57. package/dist/tools.js +21 -3
  58. package/dist/tools.js.map +1 -1
  59. package/package.json +1 -1
@@ -0,0 +1,67 @@
1
+ import { type MallMember, type MallTokens } from './mall.js';
2
+ /** A sign-in untouched this long is forgotten (the members' rule, members.ts). */
3
+ export declare const ACCOUNT_IDLE_MS: number;
4
+ /** What of the member is shown - on the card, on the page, and (name only) to the assistant. */
5
+ export type AccountShown = {
6
+ id: string;
7
+ userName?: string;
8
+ /** The name the account goes by - its nickname, '' where it has none (never the user name). */
9
+ displayName: string;
10
+ /** Their real name, where the mall has one. */
11
+ name?: string;
12
+ email?: string;
13
+ mobile?: string;
14
+ };
15
+ export declare const shownOf: (m: MallMember) => AccountShown;
16
+ export type SignedIn = {
17
+ /** This sign-in, and no other: a web session names it, and dies with it. */
18
+ sid: string;
19
+ shown: AccountShown;
20
+ tokens: MallTokens;
21
+ signedInAt: number;
22
+ /** Last asked of the mall whether these tokens are still theirs. */
23
+ checkedAt: number;
24
+ at: number;
25
+ };
26
+ export declare class AccountStore {
27
+ private readonly now;
28
+ /** A sign-in forgotten here - left too long, or past its tokens: ended at the mall too. */
29
+ private readonly gone;
30
+ private readonly max;
31
+ private readonly byKey;
32
+ constructor(now?: () => number,
33
+ /** A sign-in forgotten here - left too long, or past its tokens: ended at the mall too. */
34
+ gone?: (s: SignedIn) => void, max?: number);
35
+ get(key: string): SignedIn | undefined;
36
+ /**
37
+ * Signed in now: a new sign-in, whatever was there before - or null.
38
+ * ⚠️ A FULL TABLE NEVER PUSHES OUT A LIVE SIGN-IN (review P3-3): the lapsed go
39
+ * first (`sweep`); with only live ones left, the new one is refused.
40
+ */
41
+ set(key: string, member: MallMember, tokens: MallTokens): SignedIn | null;
42
+ /** Signed out: what was kept for this conversation goes. Answers what it was. */
43
+ clear(key: string): SignedIn | undefined;
44
+ get size(): number;
45
+ private sweep;
46
+ }
47
+ export declare const WEB_IDLE_MS: number;
48
+ export type WebSession = {
49
+ key: string;
50
+ sid: string;
51
+ csrf: string;
52
+ last: number;
53
+ flash?: string;
54
+ };
55
+ export declare class WebSessions {
56
+ private readonly now;
57
+ private readonly max;
58
+ private readonly m;
59
+ constructor(now?: () => number, max?: number);
60
+ open(key: string, sid: string): string | null;
61
+ get(id: string | null | undefined): WebSession | null;
62
+ drop(id: string | null | undefined): void;
63
+ /** Every page open on this sign-in - signed out, they all go. */
64
+ dropFor(sid: string): void;
65
+ get size(): number;
66
+ }
67
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/account/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAyB,MAAM,WAAW,CAAC;AAapF,kFAAkF;AAClF,eAAO,MAAM,eAAe,QAAkB,CAAC;AAG/C,gGAAgG;AAChG,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,GAAG,UAAU,KAAG,YAavC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,qBAAa,YAAY;IAIrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAGlC,GAAG,GAAE,MAAM,MAAyB;IACrD,2FAA2F;IAC1E,IAAI,GAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAe,EACtC,GAAG,SAAe;IAGrC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAUtC;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI;IAgBzE,iFAAiF;IACjF,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAMxC,IAAI,IAAI,IAAI,MAAM,CAGjB;IAED,OAAO,CAAC,KAAK;CAcd;AAUD,eAAO,MAAM,WAAW,QAAc,CAAC;AAEvC,MAAM,MAAM,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElG,qBAAa,WAAW;IAIpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAiC;gBAGhC,GAAG,GAAE,MAAM,MAAyB,EACpC,GAAG,SAAQ;IAG9B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAS7C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI;IAarD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAIzC,iEAAiE;IACjE,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI1B,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,151 @@
1
+ import { maskEmail, maskMobile } from './mall.js';
2
+ import { CODE, hashOf, secret } from './requests.js';
3
+ // Who is signed in to their Otaless account, by conversation - and the web
4
+ // sessions of the account page.
5
+ //
6
+ // ⚠️ IN MEMORY ONLY. The mall's tokens are a credential: they are never
7
+ // written to disk, never put in an answer, a URL or a log. A restart signs
8
+ // everybody out, and the card says so the next time it asks.
9
+ //
10
+ // ⚠️ NO EMAIL OR PHONE IS KEPT WHOLE. The page and the card show them masked
11
+ // (`maskEmail` / `maskMobile`); the masked form is all that is kept.
12
+ /** A sign-in untouched this long is forgotten (the members' rule, members.ts). */
13
+ export const ACCOUNT_IDLE_MS = 2 * 60 * 60_000;
14
+ const MAX_ACCOUNTS = 5_000;
15
+ export const shownOf = (m) => {
16
+ const email = maskEmail(m.email);
17
+ const mobile = maskMobile(m.mobile);
18
+ return {
19
+ id: m.id,
20
+ ...(m.userName ? { userName: m.userName } : {}),
21
+ // ⚠️ THE NICKNAME, OR NOTHING (review P2-2): a nickname the mall filled in
22
+ // with the user name is the user name, which signs in.
23
+ displayName: m.nickname && m.nickname !== m.userName ? m.nickname : '',
24
+ ...(m.name ? { name: m.name } : {}),
25
+ ...(email ? { email } : {}),
26
+ ...(mobile ? { mobile } : {}),
27
+ };
28
+ };
29
+ export class AccountStore {
30
+ now;
31
+ gone;
32
+ max;
33
+ byKey = new Map();
34
+ constructor(now = () => Date.now(),
35
+ /** A sign-in forgotten here - left too long, or past its tokens: ended at the mall too. */
36
+ gone = () => { }, max = MAX_ACCOUNTS) {
37
+ this.now = now;
38
+ this.gone = gone;
39
+ this.max = max;
40
+ }
41
+ get(key) {
42
+ this.sweep();
43
+ const s = this.byKey.get(key);
44
+ if (!s)
45
+ return undefined;
46
+ s.at = this.now();
47
+ this.byKey.delete(key);
48
+ this.byKey.set(key, s);
49
+ return s;
50
+ }
51
+ /**
52
+ * Signed in now: a new sign-in, whatever was there before - or null.
53
+ * ⚠️ A FULL TABLE NEVER PUSHES OUT A LIVE SIGN-IN (review P3-3): the lapsed go
54
+ * first (`sweep`); with only live ones left, the new one is refused.
55
+ */
56
+ set(key, member, tokens) {
57
+ this.sweep();
58
+ if (!this.byKey.has(key) && this.byKey.size >= this.max)
59
+ return null;
60
+ const s = {
61
+ sid: secret(),
62
+ shown: shownOf(member),
63
+ tokens,
64
+ signedInAt: this.now(),
65
+ checkedAt: this.now(),
66
+ at: this.now(),
67
+ };
68
+ this.byKey.delete(key);
69
+ this.byKey.set(key, s);
70
+ return s;
71
+ }
72
+ /** Signed out: what was kept for this conversation goes. Answers what it was. */
73
+ clear(key) {
74
+ const s = this.byKey.get(key);
75
+ this.byKey.delete(key);
76
+ return s;
77
+ }
78
+ get size() {
79
+ this.sweep();
80
+ return this.byKey.size;
81
+ }
82
+ sweep() {
83
+ const t = this.now();
84
+ for (const [k, s] of this.byKey) {
85
+ // Untouched too long, or its tokens past renewing: gone.
86
+ const lapsed = t - s.at > ACCOUNT_IDLE_MS ||
87
+ (s.tokens.accessExpires < t &&
88
+ (!s.tokens.refresh || (s.tokens.refreshExpires ?? Number.POSITIVE_INFINITY) < t));
89
+ if (lapsed) {
90
+ this.byKey.delete(k);
91
+ this.gone(s);
92
+ }
93
+ }
94
+ }
95
+ }
96
+ // ── The account page's web sessions ─────────────────────────────────────────
97
+ // A 256-bit random id in an HttpOnly, Secure, SameSite=Strict cookie with the
98
+ // __Host- prefix, set only on the browser that signed in on our page; its hash
99
+ // names the session here. 30 minutes from its last use; gone with the sign-in
100
+ // it was opened for (another sign-in, or a sign-out anywhere), and when the
101
+ // guest leaves the page. Full: the idle ones go first; with none idle, a new
102
+ // one is refused rather than another guest's ended (Nexva's review).
103
+ export const WEB_IDLE_MS = 30 * 60_000;
104
+ export class WebSessions {
105
+ now;
106
+ max;
107
+ m = new Map();
108
+ constructor(now = () => Date.now(), max = 5_000) {
109
+ this.now = now;
110
+ this.max = max;
111
+ }
112
+ open(key, sid) {
113
+ if (this.m.size >= this.max)
114
+ for (const [k, s] of [...this.m])
115
+ if (this.now() - s.last > WEB_IDLE_MS)
116
+ this.m.delete(k);
117
+ if (this.m.size >= this.max)
118
+ return null;
119
+ const id = secret();
120
+ this.m.set(hashOf(id), { key, sid, csrf: secret(), last: this.now() });
121
+ return id;
122
+ }
123
+ get(id) {
124
+ if (!id || !CODE.test(id))
125
+ return null;
126
+ const k = hashOf(id);
127
+ const s = this.m.get(k);
128
+ if (!s)
129
+ return null;
130
+ if (this.now() - s.last > WEB_IDLE_MS) {
131
+ this.m.delete(k);
132
+ return null;
133
+ }
134
+ s.last = this.now();
135
+ return s;
136
+ }
137
+ drop(id) {
138
+ if (id)
139
+ this.m.delete(hashOf(id));
140
+ }
141
+ /** Every page open on this sign-in - signed out, they all go. */
142
+ dropFor(sid) {
143
+ for (const [k, s] of [...this.m])
144
+ if (s.sid === sid)
145
+ this.m.delete(k);
146
+ }
147
+ get size() {
148
+ return this.m.size;
149
+ }
150
+ }
151
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/account/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAErD,2EAA2E;AAC3E,gCAAgC;AAChC,EAAE;AACF,wEAAwE;AACxE,2EAA2E;AAC3E,6DAA6D;AAC7D,EAAE;AACF,6EAA6E;AAC7E,qEAAqE;AAErE,kFAAkF;AAClF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;AAC/C,MAAM,YAAY,GAAG,KAAK,CAAC;AAc3B,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAa,EAAgB,EAAE;IACrD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,2EAA2E;QAC3E,uDAAuD;QACvD,WAAW,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;QACtE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC;AACJ,CAAC,CAAC;AAaF,MAAM,OAAO,YAAY;IAIJ;IAEA;IACA;IANF,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAErD,YACmB,MAAoB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IACrD,2FAA2F;IAC1E,OAA8B,GAAG,EAAE,GAAE,CAAC,EACtC,MAAM,YAAY;QAHlB,QAAG,GAAH,GAAG,CAAiC;QAEpC,SAAI,GAAJ,IAAI,CAAkC;QACtC,QAAG,GAAH,GAAG,CAAe;IAClC,CAAC;IAEJ,GAAG,CAAC,GAAW;QACb,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACzB,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,GAAW,EAAE,MAAkB,EAAE,MAAkB;QACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACrE,MAAM,CAAC,GAAa;YAClB,GAAG,EAAE,MAAM,EAAE;YACb,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;YACtB,MAAM;YACN,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;SACf,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,GAAW;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI;QACN,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAEO,KAAK;QACX,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,yDAAyD;YACzD,MAAM,MAAM,GACV,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,eAAe;gBAC1B,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC;oBACzB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtF,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,4EAA4E;AAC5E,6EAA6E;AAC7E,qEAAqE;AAErE,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,GAAG,MAAM,CAAC;AAIvC,MAAM,OAAO,WAAW;IAIH;IACA;IAJF,CAAC,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEnD,YACmB,MAAoB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EACpC,MAAM,KAAK;QADX,QAAG,GAAH,GAAG,CAAiC;QACpC,QAAG,GAAH,GAAG,CAAQ;IAC3B,CAAC;IAEJ,IAAI,CAAC,GAAW,EAAE,GAAW;QAC3B,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG;YACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gBAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,WAAW;oBAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,GAAG,CAAC,EAA6B;QAC/B,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,EAA6B;QAChC,IAAI,EAAE;YAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,iEAAiE;IACjE,OAAO,CAAC,GAAW;QACjB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG;gBAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACrB,CAAC;CACF"}
@@ -1,6 +1,6 @@
1
1
  export declare const HOTEL_CARD_HTML: string;
2
2
  /** sha256 of everything the card is built from (card-kit's source-hash.mjs) - the drift guard reads this. */
3
- export declare const HOTEL_CARD_SOURCE_SHA = "b56b07d92a3d8a806588f58401e43067ac0bb9cb1f0b11761457f061eb583921";
3
+ export declare const HOTEL_CARD_SOURCE_SHA = "457346d97d5d25021551e854e84f5fab99eb80935eba6e0071fd6c9707c675fc";
4
4
  /** Versions it was built with (card-kit/built-with.mjs) - the drift guard compares them with the lock. */
5
5
  export declare const HOTEL_CARD_BUILT_WITH = "@modelcontextprotocol/ext-apps@1.7.5 @modelcontextprotocol/sdk@1.32.1 esbuild@0.25.12 rollup@4.63.3 vite@6.4.4 vite-plugin-singlefile@2.3.3 zod@4.6.7 zod-to-json-schema@3.25.2";
6
6
  //# sourceMappingURL=card.generated.d.ts.map