@opentabs-dev/opentabs-plugin-priceline 0.0.74
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 +159 -0
- package/dist/adapter.iife.js +15220 -0
- package/dist/adapter.iife.js.map +7 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/priceline-api.d.ts +8 -0
- package/dist/priceline-api.d.ts.map +1 -0
- package/dist/priceline-api.js +120 -0
- package/dist/priceline-api.js.map +1 -0
- package/dist/tools/get-abandoned-items.d.ts +13 -0
- package/dist/tools/get-abandoned-items.d.ts.map +1 -0
- package/dist/tools/get-abandoned-items.js +42 -0
- package/dist/tools/get-abandoned-items.js.map +1 -0
- package/dist/tools/get-customer-coupons.d.ts +19 -0
- package/dist/tools/get-customer-coupons.d.ts.map +1 -0
- package/dist/tools/get-customer-coupons.js +56 -0
- package/dist/tools/get-customer-coupons.js.map +1 -0
- package/dist/tools/get-customer-profile.d.ts +12 -0
- package/dist/tools/get-customer-profile.d.ts.map +1 -0
- package/dist/tools/get-customer-profile.js +27 -0
- package/dist/tools/get-customer-profile.js.map +1 -0
- package/dist/tools/get-favorite-hotels.d.ts +10 -0
- package/dist/tools/get-favorite-hotels.d.ts.map +1 -0
- package/dist/tools/get-favorite-hotels.js +37 -0
- package/dist/tools/get-favorite-hotels.js.map +1 -0
- package/dist/tools/get-hotel-descriptions.d.ts +10 -0
- package/dist/tools/get-hotel-descriptions.d.ts.map +1 -0
- package/dist/tools/get-hotel-descriptions.js +29 -0
- package/dist/tools/get-hotel-descriptions.js.map +1 -0
- package/dist/tools/get-hotel-filters.d.ts +16 -0
- package/dist/tools/get-hotel-filters.d.ts.map +1 -0
- package/dist/tools/get-hotel-filters.js +41 -0
- package/dist/tools/get-hotel-filters.js.map +1 -0
- package/dist/tools/get-merchandising-badges.d.ts +11 -0
- package/dist/tools/get-merchandising-badges.d.ts.map +1 -0
- package/dist/tools/get-merchandising-badges.js +30 -0
- package/dist/tools/get-merchandising-badges.js.map +1 -0
- package/dist/tools/get-price-guidance.d.ts +23 -0
- package/dist/tools/get-price-guidance.d.ts.map +1 -0
- package/dist/tools/get-price-guidance.js +49 -0
- package/dist/tools/get-price-guidance.js.map +1 -0
- package/dist/tools/navigate-to-hotel.d.ts +12 -0
- package/dist/tools/navigate-to-hotel.d.ts.map +1 -0
- package/dist/tools/navigate-to-hotel.js +29 -0
- package/dist/tools/navigate-to-hotel.js.map +1 -0
- package/dist/tools/navigate-to-search.d.ts +12 -0
- package/dist/tools/navigate-to-search.d.ts.map +1 -0
- package/dist/tools/navigate-to-search.js +29 -0
- package/dist/tools/navigate-to-search.js.map +1 -0
- package/dist/tools/schemas.d.ts +237 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +160 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/search-hotels.d.ts +48 -0
- package/dist/tools/search-hotels.d.ts.map +1 -0
- package/dist/tools/search-hotels.js +78 -0
- package/dist/tools/search-hotels.js.map +1 -0
- package/dist/tools/search-locations.d.ts +19 -0
- package/dist/tools/search-locations.d.ts.map +1 -0
- package/dist/tools/search-locations.js +24 -0
- package/dist/tools/search-locations.js.map +1 -0
- package/dist/tools/search-points-of-interest.d.ts +21 -0
- package/dist/tools/search-points-of-interest.d.ts.map +1 -0
- package/dist/tools/search-points-of-interest.js +35 -0
- package/dist/tools/search-points-of-interest.js.map +1 -0
- package/dist/tools.json +1132 -0
- package/package.json +54 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import type { ToolDefinition } from '@opentabs-dev/plugin-sdk';
|
|
3
|
+
declare class PricelinePlugin extends OpenTabsPlugin {
|
|
4
|
+
readonly name = "priceline";
|
|
5
|
+
readonly description = "OpenTabs plugin for Priceline";
|
|
6
|
+
readonly displayName = "Priceline";
|
|
7
|
+
readonly urlPatterns: string[];
|
|
8
|
+
readonly homepage = "https://www.priceline.com";
|
|
9
|
+
readonly tools: ToolDefinition[];
|
|
10
|
+
isReady(): Promise<boolean>;
|
|
11
|
+
}
|
|
12
|
+
declare const _default: PricelinePlugin;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAgB/D,cAAM,eAAgB,SAAQ,cAAc;IAC1C,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,mCAAmC;IACvD,SAAkB,WAAW,eAAe;IAC5C,QAAQ,CAAC,WAAW,WAA6B;IACjD,SAAkB,QAAQ,+BAA+B;IACzD,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAiB9B;IAEI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAIlC;;AAED,wBAAqC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { isAuthenticated, waitForAuth } from './priceline-api.js';
|
|
3
|
+
import { getAbandonedItems } from './tools/get-abandoned-items.js';
|
|
4
|
+
import { getCustomerCoupons } from './tools/get-customer-coupons.js';
|
|
5
|
+
import { getCustomerProfile } from './tools/get-customer-profile.js';
|
|
6
|
+
import { getFavoriteHotels } from './tools/get-favorite-hotels.js';
|
|
7
|
+
import { getHotelDescriptions } from './tools/get-hotel-descriptions.js';
|
|
8
|
+
import { getHotelFilters } from './tools/get-hotel-filters.js';
|
|
9
|
+
import { getMerchandisingBadges } from './tools/get-merchandising-badges.js';
|
|
10
|
+
import { getPriceGuidance } from './tools/get-price-guidance.js';
|
|
11
|
+
import { navigateToHotel } from './tools/navigate-to-hotel.js';
|
|
12
|
+
import { navigateToSearch } from './tools/navigate-to-search.js';
|
|
13
|
+
import { searchHotels } from './tools/search-hotels.js';
|
|
14
|
+
import { searchLocations } from './tools/search-locations.js';
|
|
15
|
+
import { searchPointsOfInterest } from './tools/search-points-of-interest.js';
|
|
16
|
+
class PricelinePlugin extends OpenTabsPlugin {
|
|
17
|
+
name = 'priceline';
|
|
18
|
+
description = 'OpenTabs plugin for Priceline';
|
|
19
|
+
displayName = 'Priceline';
|
|
20
|
+
urlPatterns = ['*://*.priceline.com/*'];
|
|
21
|
+
homepage = 'https://www.priceline.com';
|
|
22
|
+
tools = [
|
|
23
|
+
// Search
|
|
24
|
+
searchLocations,
|
|
25
|
+
searchPointsOfInterest,
|
|
26
|
+
navigateToSearch,
|
|
27
|
+
// Hotels
|
|
28
|
+
searchHotels,
|
|
29
|
+
getHotelDescriptions,
|
|
30
|
+
getHotelFilters,
|
|
31
|
+
getMerchandisingBadges,
|
|
32
|
+
getPriceGuidance,
|
|
33
|
+
navigateToHotel,
|
|
34
|
+
// Account
|
|
35
|
+
getCustomerProfile,
|
|
36
|
+
getCustomerCoupons,
|
|
37
|
+
getFavoriteHotels,
|
|
38
|
+
getAbandonedItems,
|
|
39
|
+
];
|
|
40
|
+
async isReady() {
|
|
41
|
+
if (isAuthenticated())
|
|
42
|
+
return true;
|
|
43
|
+
return waitForAuth();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export default new PricelinePlugin();
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,MAAM,eAAgB,SAAQ,cAAc;IACjC,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,+BAA+B,CAAC;IACrC,WAAW,GAAG,WAAW,CAAC;IACnC,WAAW,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC/B,QAAQ,GAAG,2BAA2B,CAAC;IAChD,KAAK,GAAqB;QACjC,SAAS;QACT,eAAe;QACf,sBAAsB;QACtB,gBAAgB;QAChB,SAAS;QACT,YAAY;QACZ,oBAAoB;QACpB,eAAe;QACf,sBAAsB;QACtB,gBAAgB;QAChB,eAAe;QACf,UAAU;QACV,kBAAkB;QAClB,kBAAkB;QAClB,iBAAiB;QACjB,iBAAiB;KAClB,CAAC;IAEF,KAAK,CAAC,OAAO;QACX,IAAI,eAAe,EAAE;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;CACF;AAED,eAAe,IAAI,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const isAuthenticated: () => boolean;
|
|
2
|
+
export declare const waitForAuth: () => Promise<boolean>;
|
|
3
|
+
export declare const getEmail: () => string;
|
|
4
|
+
export declare const getCguid: () => string;
|
|
5
|
+
export declare const getAuthToken: () => string;
|
|
6
|
+
export declare const graphql: <T>(operationName: string, variables: Record<string, unknown>, persistedHash?: string) => Promise<T>;
|
|
7
|
+
export declare const rest: <T>(endpoint: string, query?: Record<string, string | number | boolean | undefined>) => Promise<T>;
|
|
8
|
+
//# sourceMappingURL=priceline-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"priceline-api.d.ts","sourceRoot":"","sources":["../src/priceline-api.ts"],"names":[],"mappings":"AAqEA,eAAO,MAAM,eAAe,QAAO,OAA6B,CAAC;AAEjE,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,OAAO,CAUnD,CAAC;AAQF,eAAO,MAAM,QAAQ,QAAO,MAA6B,CAAC;AAC1D,eAAO,MAAM,QAAQ,QAAO,MAA6B,CAAC;AAC1D,eAAO,MAAM,YAAY,QAAO,MAAiC,CAAC;AAclE,eAAO,MAAM,OAAO,GAAU,CAAC,EAC7B,eAAe,MAAM,EACrB,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,gBAAgB,MAAM,KACrB,OAAO,CAAC,CAAC,CAqDX,CAAC;AAIF,eAAO,MAAM,IAAI,GAAU,CAAC,EAC1B,UAAU,MAAM,EAChB,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,KAC5D,OAAO,CAAC,CAAC,CAOX,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { ToolError, fetchJSON, getCookie, getAuthCache, setAuthCache, clearAuthCache, getLocalStorage, waitUntil, buildQueryString, } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
const GRAPH_BASE = 'https://www.priceline.com/pws/v0/pcln-graph/?gqlOp=';
|
|
3
|
+
const REST_BASE = 'https://www.priceline.com/pws/v0';
|
|
4
|
+
const decodeJwtPayload = (jwt) => {
|
|
5
|
+
try {
|
|
6
|
+
const parts = jwt.split('.');
|
|
7
|
+
const encoded = parts[1];
|
|
8
|
+
if (parts.length !== 3 || !encoded)
|
|
9
|
+
return null;
|
|
10
|
+
const payload = atob(encoded.replace(/-/g, '+').replace(/_/g, '/'));
|
|
11
|
+
return JSON.parse(payload);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const getAuth = () => {
|
|
18
|
+
const cached = getAuthCache('priceline');
|
|
19
|
+
if (cached)
|
|
20
|
+
return cached;
|
|
21
|
+
const oktaRaw = getLocalStorage('okta-token-storage');
|
|
22
|
+
if (!oktaRaw)
|
|
23
|
+
return null;
|
|
24
|
+
let okta;
|
|
25
|
+
try {
|
|
26
|
+
okta = JSON.parse(oktaRaw);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const accessTokenObj = okta.accessToken;
|
|
32
|
+
const accessToken = accessTokenObj?.accessToken;
|
|
33
|
+
if (!accessToken)
|
|
34
|
+
return null;
|
|
35
|
+
const claims = decodeJwtPayload(accessToken);
|
|
36
|
+
if (!claims)
|
|
37
|
+
return null;
|
|
38
|
+
const authToken = claims['com.priceline.token.dmc.value'];
|
|
39
|
+
const email = claims.sub;
|
|
40
|
+
if (!authToken || !email)
|
|
41
|
+
return null;
|
|
42
|
+
const cguid = getCookie('PL_CINFO')?.split('~')[0] ?? '';
|
|
43
|
+
const auth = { accessToken, authToken, email, cguid };
|
|
44
|
+
setAuthCache('priceline', auth);
|
|
45
|
+
return auth;
|
|
46
|
+
};
|
|
47
|
+
export const isAuthenticated = () => getAuth() !== null;
|
|
48
|
+
export const waitForAuth = async () => {
|
|
49
|
+
try {
|
|
50
|
+
await waitUntil(() => isAuthenticated(), {
|
|
51
|
+
interval: 500,
|
|
52
|
+
timeout: 5000,
|
|
53
|
+
});
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const requireAuth = () => {
|
|
61
|
+
const auth = getAuth();
|
|
62
|
+
if (!auth)
|
|
63
|
+
throw ToolError.auth('Not authenticated — please log in to Priceline.');
|
|
64
|
+
return auth;
|
|
65
|
+
};
|
|
66
|
+
export const getEmail = () => requireAuth().email;
|
|
67
|
+
export const getCguid = () => requireAuth().cguid;
|
|
68
|
+
export const getAuthToken = () => requireAuth().authToken;
|
|
69
|
+
export const graphql = async (operationName, variables, persistedHash) => {
|
|
70
|
+
const auth = requireAuth();
|
|
71
|
+
const url = `${GRAPH_BASE}${operationName}`;
|
|
72
|
+
const reqBody = {
|
|
73
|
+
operationName,
|
|
74
|
+
variables,
|
|
75
|
+
};
|
|
76
|
+
if (persistedHash) {
|
|
77
|
+
reqBody.extensions = {
|
|
78
|
+
persistedQuery: { version: 1, sha256Hash: persistedHash },
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const headers = {
|
|
82
|
+
'Content-Type': 'application/json',
|
|
83
|
+
Authorization: `Bearer ${auth.accessToken}`,
|
|
84
|
+
authToken: auth.authToken,
|
|
85
|
+
'apollographql-client-name': 'relax',
|
|
86
|
+
'apollographql-client-version': 'master-1.1.1403-v3',
|
|
87
|
+
};
|
|
88
|
+
const init = {
|
|
89
|
+
method: 'POST',
|
|
90
|
+
headers,
|
|
91
|
+
body: JSON.stringify(reqBody),
|
|
92
|
+
};
|
|
93
|
+
const resp = (await fetchJSON(url, init)) ?? {};
|
|
94
|
+
const errors = resp.errors ?? [];
|
|
95
|
+
const data = resp.data;
|
|
96
|
+
if (errors.length > 0 && !data) {
|
|
97
|
+
const firstError = errors[0] ?? {};
|
|
98
|
+
const code = firstError.extensions?.code ?? '';
|
|
99
|
+
const message = firstError.message ?? 'Unknown GraphQL error';
|
|
100
|
+
if (code === 'PERSISTED_QUERY_NOT_FOUND' || message.includes('persisted_query_not_found')) {
|
|
101
|
+
throw ToolError.internal(`Persisted query hash expired for ${operationName} — Priceline may have deployed a new client version.`);
|
|
102
|
+
}
|
|
103
|
+
if (code === 'UNAUTHENTICATED' || message.includes('not authorized')) {
|
|
104
|
+
clearAuthCache('priceline');
|
|
105
|
+
throw ToolError.auth(`Auth error: ${message}`);
|
|
106
|
+
}
|
|
107
|
+
throw ToolError.internal(`GraphQL error (${operationName}): ${message}`);
|
|
108
|
+
}
|
|
109
|
+
return (data ?? resp);
|
|
110
|
+
};
|
|
111
|
+
// --- REST API ---
|
|
112
|
+
export const rest = async (endpoint, query) => {
|
|
113
|
+
const qs = query ? buildQueryString(query) : '';
|
|
114
|
+
const url = qs ? `${REST_BASE}${endpoint}?${qs}` : `${REST_BASE}${endpoint}`;
|
|
115
|
+
const data = await fetchJSON(url);
|
|
116
|
+
if (data === undefined)
|
|
117
|
+
throw ToolError.internal(`Empty response from ${endpoint}`);
|
|
118
|
+
return data;
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=priceline-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"priceline-api.js","sourceRoot":"","sources":["../src/priceline-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getAbandonedItems: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
|
|
3
|
+
items: z.ZodArray<z.ZodObject<{
|
|
4
|
+
type: z.ZodString;
|
|
5
|
+
hotel_name: z.ZodString;
|
|
6
|
+
hotel_id: z.ZodString;
|
|
7
|
+
city_name: z.ZodString;
|
|
8
|
+
check_in: z.ZodString;
|
|
9
|
+
check_out: z.ZodString;
|
|
10
|
+
price: z.ZodNumber;
|
|
11
|
+
}, z.core.$strip>>;
|
|
12
|
+
}, z.core.$strip>>;
|
|
13
|
+
//# sourceMappingURL=get-abandoned-items.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-abandoned-items.d.ts","sourceRoot":"","sources":["../../src/tools/get-abandoned-items.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmBxB,eAAO,MAAM,iBAAiB;;;;;;;;;;kBAwC5B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { graphql, getCguid } from '../priceline-api.js';
|
|
4
|
+
const PERSISTED_HASH = 'bd547859ce08366e86541b80eb6951d93aa36e1e4608842366309826793c223f';
|
|
5
|
+
export const getAbandonedItems = defineTool({
|
|
6
|
+
name: 'get_abandoned_items',
|
|
7
|
+
displayName: 'Get Abandoned Items',
|
|
8
|
+
description: 'Get items the user previously viewed or added to cart but did not complete booking. Useful for resuming interrupted booking flows.',
|
|
9
|
+
summary: 'Get your abandoned cart items',
|
|
10
|
+
icon: 'shopping-cart',
|
|
11
|
+
group: 'Account',
|
|
12
|
+
input: z.object({}),
|
|
13
|
+
output: z.object({
|
|
14
|
+
items: z
|
|
15
|
+
.array(z.object({
|
|
16
|
+
type: z.string().describe('Item type (HOTEL, FLIGHT, CAR)'),
|
|
17
|
+
hotel_name: z.string().describe('Hotel name (if hotel)'),
|
|
18
|
+
hotel_id: z.string().describe('Hotel ID (if hotel)'),
|
|
19
|
+
city_name: z.string().describe('City name'),
|
|
20
|
+
check_in: z.string().describe('Check-in date'),
|
|
21
|
+
check_out: z.string().describe('Check-out date'),
|
|
22
|
+
price: z.number().describe('Price at time of abandonment'),
|
|
23
|
+
}))
|
|
24
|
+
.describe('Abandoned booking items'),
|
|
25
|
+
}),
|
|
26
|
+
handle: async () => {
|
|
27
|
+
const data = await graphql('getAbandonedItemsByCguid', { cguid: getCguid() }, PERSISTED_HASH);
|
|
28
|
+
const items = data.getAbandonedItemsByCguid ?? [];
|
|
29
|
+
return {
|
|
30
|
+
items: items.map(item => ({
|
|
31
|
+
type: item.type ?? '',
|
|
32
|
+
hotel_name: item.hotelName ?? '',
|
|
33
|
+
hotel_id: item.hotelId ?? '',
|
|
34
|
+
city_name: item.cityName ?? '',
|
|
35
|
+
check_in: item.checkIn ?? '',
|
|
36
|
+
check_out: item.checkOut ?? '',
|
|
37
|
+
price: item.price ?? 0,
|
|
38
|
+
})),
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=get-abandoned-items.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-abandoned-items.js","sourceRoot":"","sources":["../../src/tools/get-abandoned-items.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,cAAc,GAAG,kEAAkE,CAAC;AAgB1F,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;IAC1C,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,qBAAqB;IAClC,WAAW,EACT,oIAAoI;IACtI,OAAO,EAAE,+BAA+B;IACxC,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC;aACL,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAC3D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACxD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACpD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAChD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;SAC3D,CAAC,CACH;aACA,QAAQ,CAAC,yBAAyB,CAAC;KACvC,CAAC;IACF,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAoB,0BAA0B,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;QAEjH,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,IAAI,EAAE,CAAC;QAClD,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACxB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;gBACrB,UAAU,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;gBAChC,QAAQ,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC5B,SAAS,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;gBAC9B,QAAQ,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC5B,SAAS,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;gBAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;aACvB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getCustomerCoupons: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
product: z.ZodOptional<z.ZodEnum<{
|
|
4
|
+
STAY: "STAY";
|
|
5
|
+
FLY: "FLY";
|
|
6
|
+
DRIVE: "DRIVE";
|
|
7
|
+
}>>;
|
|
8
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
9
|
+
coupons: z.ZodArray<z.ZodObject<{
|
|
10
|
+
coupon_code: z.ZodString;
|
|
11
|
+
description: z.ZodString;
|
|
12
|
+
expiration_date: z.ZodString;
|
|
13
|
+
min_spend: z.ZodNumber;
|
|
14
|
+
discount: z.ZodNumber;
|
|
15
|
+
discount_type: z.ZodString;
|
|
16
|
+
}, z.core.$strip>>;
|
|
17
|
+
message: z.ZodString;
|
|
18
|
+
}, z.core.$strip>>;
|
|
19
|
+
//# sourceMappingURL=get-customer-coupons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-customer-coupons.d.ts","sourceRoot":"","sources":["../../src/tools/get-customer-coupons.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA6BxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;kBAyD7B,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { graphql } from '../priceline-api.js';
|
|
4
|
+
const PERSISTED_HASH = 'a1131592ee367b7b6dbe778e942d09d7d0219d5eacf47810a1894116d7454b6d';
|
|
5
|
+
const isCouponError = (v) => {
|
|
6
|
+
return 'customerCouponError' in v;
|
|
7
|
+
};
|
|
8
|
+
export const getCustomerCoupons = defineTool({
|
|
9
|
+
name: 'get_customer_coupons',
|
|
10
|
+
displayName: 'Get Customer Coupons',
|
|
11
|
+
description: 'Get available coupons for the authenticated user. Coupons can be filtered by product type (STAY, FLY, DRIVE). Returns coupon codes, descriptions, expiration dates, and discount amounts.',
|
|
12
|
+
summary: 'Get your available coupons',
|
|
13
|
+
icon: 'ticket',
|
|
14
|
+
group: 'Account',
|
|
15
|
+
input: z.object({
|
|
16
|
+
product: z.enum(['STAY', 'FLY', 'DRIVE']).optional().describe('Product type to filter coupons (default STAY)'),
|
|
17
|
+
}),
|
|
18
|
+
output: z.object({
|
|
19
|
+
coupons: z
|
|
20
|
+
.array(z.object({
|
|
21
|
+
coupon_code: z.string().describe('Coupon code'),
|
|
22
|
+
description: z.string().describe('Coupon description'),
|
|
23
|
+
expiration_date: z.string().describe('Expiration date'),
|
|
24
|
+
min_spend: z.number().describe('Minimum spend amount'),
|
|
25
|
+
discount: z.number().describe('Discount amount'),
|
|
26
|
+
discount_type: z.string().describe('Discount type (PERCENT, FIXED)'),
|
|
27
|
+
}))
|
|
28
|
+
.describe('Available coupons'),
|
|
29
|
+
message: z.string().describe('Status message (e.g., no coupons found)'),
|
|
30
|
+
}),
|
|
31
|
+
handle: async (params) => {
|
|
32
|
+
const data = await graphql('CustomerCoupons', {
|
|
33
|
+
customerRequestOptions: {
|
|
34
|
+
products: [params.product ?? 'STAY'],
|
|
35
|
+
},
|
|
36
|
+
}, PERSISTED_HASH);
|
|
37
|
+
const result = data.customerCoupons;
|
|
38
|
+
if (!result || isCouponError(result)) {
|
|
39
|
+
return {
|
|
40
|
+
coupons: [],
|
|
41
|
+
message: result?.customerCouponError ?? 'No coupons available',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const couponData = result;
|
|
45
|
+
const coupons = (couponData.customerCoupons ?? []).map(c => ({
|
|
46
|
+
coupon_code: c.couponCode ?? '',
|
|
47
|
+
description: c.description ?? '',
|
|
48
|
+
expiration_date: c.expirationDate ?? '',
|
|
49
|
+
min_spend: c.minSpend ?? 0,
|
|
50
|
+
discount: c.discount ?? 0,
|
|
51
|
+
discount_type: c.discountType ?? '',
|
|
52
|
+
}));
|
|
53
|
+
return { coupons, message: coupons.length > 0 ? 'OK' : 'No coupons available' };
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=get-customer-coupons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-customer-coupons.js","sourceRoot":"","sources":["../../src/tools/get-customer-coupons.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getCustomerProfile: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
|
|
3
|
+
email: z.ZodString;
|
|
4
|
+
profile: z.ZodObject<{
|
|
5
|
+
loyalty_tier: z.ZodString;
|
|
6
|
+
audiences: z.ZodArray<z.ZodObject<{
|
|
7
|
+
id: z.ZodString;
|
|
8
|
+
name: z.ZodString;
|
|
9
|
+
}, z.core.$strip>>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
}, z.core.$strip>>;
|
|
12
|
+
//# sourceMappingURL=get-customer-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-customer-profile.d.ts","sourceRoot":"","sources":["../../src/tools/get-customer-profile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,kBAAkB;;;;;;;;;kBAwB7B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { graphql, getEmail, getAuthToken } from '../priceline-api.js';
|
|
4
|
+
import { mapCustomerProfile, customerProfileSchema } from './schemas.js';
|
|
5
|
+
const PERSISTED_HASH = '48d8218318dd4384631ab71f001f4475b9e47312a6bcfea98af8beb90526d7ff';
|
|
6
|
+
export const getCustomerProfile = defineTool({
|
|
7
|
+
name: 'get_customer_profile',
|
|
8
|
+
displayName: 'Get Customer Profile',
|
|
9
|
+
description: "Get the authenticated user's Priceline customer profile including loyalty tier and audience segments.",
|
|
10
|
+
summary: 'Get your Priceline profile',
|
|
11
|
+
icon: 'user',
|
|
12
|
+
group: 'Account',
|
|
13
|
+
input: z.object({}),
|
|
14
|
+
output: z.object({
|
|
15
|
+
email: z.string().describe('Customer email address'),
|
|
16
|
+
profile: customerProfileSchema.describe('Customer profile data'),
|
|
17
|
+
}),
|
|
18
|
+
handle: async () => {
|
|
19
|
+
const email = getEmail();
|
|
20
|
+
const data = await graphql('authorizedCustomerProfile', { authToken: getAuthToken(), email }, PERSISTED_HASH);
|
|
21
|
+
return {
|
|
22
|
+
email,
|
|
23
|
+
profile: mapCustomerProfile(data.authorizedCustomerProfile ?? {}),
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=get-customer-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-customer-profile.js","sourceRoot":"","sources":["../../src/tools/get-customer-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAA2B,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAElG,MAAM,cAAc,GAAG,kEAAkE,CAAC;AAM1F,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;IAC3C,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,sBAAsB;IACnC,WAAW,EAAE,uGAAuG;IACpH,OAAO,EAAE,4BAA4B;IACrC,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACpD,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KACjE,CAAC;IACF,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,2BAA2B,EAC3B,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EACpC,cAAc,CACf,CAAC;QACF,OAAO;YACL,KAAK;YACL,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,yBAAyB,IAAI,EAAE,CAAC;SAClE,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getFavoriteHotels: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
city_id: z.ZodNumber;
|
|
4
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
5
|
+
favorites: z.ZodArray<z.ZodObject<{
|
|
6
|
+
hotel_id: z.ZodString;
|
|
7
|
+
hotel_name: z.ZodString;
|
|
8
|
+
}, z.core.$strip>>;
|
|
9
|
+
}, z.core.$strip>>;
|
|
10
|
+
//# sourceMappingURL=get-favorite-hotels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-favorite-hotels.d.ts","sourceRoot":"","sources":["../../src/tools/get-favorite-hotels.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,iBAAiB;;;;;;;kBAuC5B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { graphql, getCguid } from '../priceline-api.js';
|
|
4
|
+
const PERSISTED_HASH = '4fad539cf5e897fb10f0cd40b6f71f1d91562a2adb8142c2be02998641bd50da';
|
|
5
|
+
export const getFavoriteHotels = defineTool({
|
|
6
|
+
name: 'get_favorite_hotels',
|
|
7
|
+
displayName: 'Get Favorite Hotels',
|
|
8
|
+
description: "Get the user's favorite (saved) hotels in a specific city. Returns hotel IDs and names that the user has previously marked as favorites.",
|
|
9
|
+
summary: 'Get your saved hotels in a city',
|
|
10
|
+
icon: 'heart',
|
|
11
|
+
group: 'Account',
|
|
12
|
+
input: z.object({
|
|
13
|
+
city_id: z.number().int().describe('Priceline city ID (numeric)'),
|
|
14
|
+
}),
|
|
15
|
+
output: z.object({
|
|
16
|
+
favorites: z
|
|
17
|
+
.array(z.object({
|
|
18
|
+
hotel_id: z.string().describe('Hotel ID'),
|
|
19
|
+
hotel_name: z.string().describe('Hotel name'),
|
|
20
|
+
}))
|
|
21
|
+
.describe('Favorite hotels in the city'),
|
|
22
|
+
}),
|
|
23
|
+
handle: async (params) => {
|
|
24
|
+
const data = await graphql('FavoriteHotelsByCityId', {
|
|
25
|
+
cityIds: params.city_id,
|
|
26
|
+
cguid: getCguid(),
|
|
27
|
+
}, PERSISTED_HASH);
|
|
28
|
+
const items = data.favoriteHotelsByCityId ?? [];
|
|
29
|
+
return {
|
|
30
|
+
favorites: items.map(f => ({
|
|
31
|
+
hotel_id: f.hotelId ?? '',
|
|
32
|
+
hotel_name: f.hotelName ?? '',
|
|
33
|
+
})),
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=get-favorite-hotels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-favorite-hotels.js","sourceRoot":"","sources":["../../src/tools/get-favorite-hotels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,cAAc,GAAG,kEAAkE,CAAC;AAS1F,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;IAC1C,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,qBAAqB;IAClC,WAAW,EACT,0IAA0I;IAC5I,OAAO,EAAE,iCAAiC;IAC1C,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAClE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,SAAS,EAAE,CAAC;aACT,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;YACP,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;SAC9C,CAAC,CACH;aACA,QAAQ,CAAC,6BAA6B,CAAC;KAC3C,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,wBAAwB,EACxB;YACE,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,QAAQ,EAAE;SAClB,EACD,cAAc,CACf,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,IAAI,EAAE,CAAC;QAChD,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzB,QAAQ,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;gBACzB,UAAU,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;aAC9B,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getHotelDescriptions: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
hotel_ids: z.ZodArray<z.ZodString>;
|
|
4
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
5
|
+
descriptions: z.ZodArray<z.ZodObject<{
|
|
6
|
+
hotel_id: z.ZodString;
|
|
7
|
+
short_description: z.ZodString;
|
|
8
|
+
}, z.core.$strip>>;
|
|
9
|
+
}, z.core.$strip>>;
|
|
10
|
+
//# sourceMappingURL=get-hotel-descriptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-hotel-descriptions.d.ts","sourceRoot":"","sources":["../../src/tools/get-hotel-descriptions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,oBAAoB;;;;;;;kBA4B/B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { graphql, getCguid } from '../priceline-api.js';
|
|
4
|
+
import { mapHotelDescription, hotelDescriptionSchema } from './schemas.js';
|
|
5
|
+
const PERSISTED_HASH = '991edc70fc5972ea86c4db02e07cc45ba1b75fffa12f4b5e2bd3998faaaf70c7';
|
|
6
|
+
export const getHotelDescriptions = defineTool({
|
|
7
|
+
name: 'get_hotel_descriptions',
|
|
8
|
+
displayName: 'Get Hotel Descriptions',
|
|
9
|
+
description: 'Get AI-generated short descriptions for a batch of hotels by their IDs. Useful for enriching hotel search results with descriptive text. Accepts up to 30 hotel IDs.',
|
|
10
|
+
summary: 'Get short descriptions for hotels',
|
|
11
|
+
icon: 'file-text',
|
|
12
|
+
group: 'Hotels',
|
|
13
|
+
input: z.object({
|
|
14
|
+
hotel_ids: z.array(z.string()).describe('Array of Priceline hotel IDs (max 30)'),
|
|
15
|
+
}),
|
|
16
|
+
output: z.object({
|
|
17
|
+
descriptions: z.array(hotelDescriptionSchema).describe('Hotel descriptions'),
|
|
18
|
+
}),
|
|
19
|
+
handle: async (params) => {
|
|
20
|
+
const data = await graphql('getHotelShortDescriptionByIds', {
|
|
21
|
+
hotelIds: params.hotel_ids,
|
|
22
|
+
appc: 'DESKTOP',
|
|
23
|
+
cguid: getCguid(),
|
|
24
|
+
}, PERSISTED_HASH);
|
|
25
|
+
const items = data.hotelInfoByIds ?? [];
|
|
26
|
+
return { descriptions: items.map(mapHotelDescription) };
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=get-hotel-descriptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-hotel-descriptions.js","sourceRoot":"","sources":["../../src/tools/get-hotel-descriptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAA4B,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAErG,MAAM,cAAc,GAAG,kEAAkE,CAAC;AAM1F,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;IAC7C,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,wBAAwB;IACrC,WAAW,EACT,sKAAsK;IACxK,OAAO,EAAE,mCAAmC;IAC5C,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KACjF,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KAC7E,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,+BAA+B,EAC/B;YACE,QAAQ,EAAE,MAAM,CAAC,SAAS;YAC1B,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,QAAQ,EAAE;SAClB,EACD,cAAc,CACf,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;QACxC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC1D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getHotelFilters: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
city_id: z.ZodString;
|
|
4
|
+
check_in: z.ZodString;
|
|
5
|
+
check_out: z.ZodString;
|
|
6
|
+
adults: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
8
|
+
filters: z.ZodArray<z.ZodObject<{
|
|
9
|
+
type: z.ZodString;
|
|
10
|
+
values: z.ZodArray<z.ZodObject<{
|
|
11
|
+
key: z.ZodString;
|
|
12
|
+
display: z.ZodString;
|
|
13
|
+
}, z.core.$strip>>;
|
|
14
|
+
}, z.core.$strip>>;
|
|
15
|
+
}, z.core.$strip>>;
|
|
16
|
+
//# sourceMappingURL=get-hotel-filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-hotel-filters.d.ts","sourceRoot":"","sources":["../../src/tools/get-hotel-filters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;kBAwC1B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { graphql, getCguid, getAuthToken } from '../priceline-api.js';
|
|
4
|
+
import { mapDynamicFilter, dynamicFilterSchema } from './schemas.js';
|
|
5
|
+
const PERSISTED_HASH = '42166a77a084495355dbecd9598223d19017d1a6df298575d4b17894384faa6a';
|
|
6
|
+
export const getHotelFilters = defineTool({
|
|
7
|
+
name: 'get_hotel_filters',
|
|
8
|
+
displayName: 'Get Hotel Filters',
|
|
9
|
+
description: 'Get available dynamic filter options for a hotel search. Returns filter categories (amenities, price ranges, deal types, rate options, zones) with their selectable values. Use these filters to understand what refinements are available for a specific city and date combination.',
|
|
10
|
+
summary: 'Get available hotel search filters',
|
|
11
|
+
icon: 'sliders-horizontal',
|
|
12
|
+
group: 'Hotels',
|
|
13
|
+
input: z.object({
|
|
14
|
+
city_id: z.string().describe('Priceline city ID'),
|
|
15
|
+
check_in: z.string().describe('Check-in date in YYYYMMDD format'),
|
|
16
|
+
check_out: z.string().describe('Check-out date in YYYYMMDD format'),
|
|
17
|
+
adults: z.number().int().min(1).optional().describe('Number of adults (default 2)'),
|
|
18
|
+
}),
|
|
19
|
+
output: z.object({
|
|
20
|
+
filters: z.array(dynamicFilterSchema).describe('Available filter categories and values'),
|
|
21
|
+
}),
|
|
22
|
+
handle: async (params) => {
|
|
23
|
+
const data = await graphql('getHotelDynamicFilters', {
|
|
24
|
+
appc: 'DESKTOP',
|
|
25
|
+
adults: params.adults ?? 2,
|
|
26
|
+
appliedFilters: [],
|
|
27
|
+
authToken: getAuthToken(),
|
|
28
|
+
checkIn: params.check_in,
|
|
29
|
+
checkOut: params.check_out,
|
|
30
|
+
childAges: [],
|
|
31
|
+
children: 0,
|
|
32
|
+
cguid: getCguid(),
|
|
33
|
+
cityId: params.city_id,
|
|
34
|
+
tierLabel: '',
|
|
35
|
+
mapView: false,
|
|
36
|
+
}, PERSISTED_HASH);
|
|
37
|
+
const filters = data.hotelDynamicFilters?.filters ?? [];
|
|
38
|
+
return { filters: filters.map(mapDynamicFilter) };
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=get-hotel-filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-hotel-filters.js","sourceRoot":"","sources":["../../src/tools/get-hotel-filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAyB,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE5F,MAAM,cAAc,GAAG,kEAAkE,CAAC;AAQ1F,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;IACxC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,mBAAmB;IAChC,WAAW,EACT,sRAAsR;IACxR,OAAO,EAAE,oCAAoC;IAC7C,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACjD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QACjE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACnE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KACpF,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACzF,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,wBAAwB,EACxB;YACE,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC;YAC1B,cAAc,EAAE,EAAE;YAClB,SAAS,EAAE,YAAY,EAAE;YACzB,OAAO,EAAE,MAAM,CAAC,QAAQ;YACxB,QAAQ,EAAE,MAAM,CAAC,SAAS;YAC1B,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,QAAQ,EAAE;YACjB,MAAM,EAAE,MAAM,CAAC,OAAO;YACtB,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,KAAK;SACf,EACD,cAAc,CACf,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,OAAO,IAAI,EAAE,CAAC;QACxD,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getMerchandisingBadges: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
hotel_ids: z.ZodArray<z.ZodString>;
|
|
4
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
5
|
+
badges: z.ZodArray<z.ZodObject<{
|
|
6
|
+
hotel_id: z.ZodString;
|
|
7
|
+
is_top_rated: z.ZodBoolean;
|
|
8
|
+
is_top_booked: z.ZodBoolean;
|
|
9
|
+
}, z.core.$strip>>;
|
|
10
|
+
}, z.core.$strip>>;
|
|
11
|
+
//# sourceMappingURL=get-merchandising-badges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-merchandising-badges.d.ts","sourceRoot":"","sources":["../../src/tools/get-merchandising-badges.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,sBAAsB;;;;;;;;kBA6BjC,CAAC"}
|