@opentabs-dev/opentabs-plugin-priceline 0.0.84 → 0.0.86
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 +11 -1
- package/dist/adapter.iife.js +1629 -522
- package/dist/adapter.iife.js.map +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/priceline-api.d.ts +3 -1
- package/dist/priceline-api.d.ts.map +1 -1
- package/dist/priceline-api.js +40 -3
- package/dist/priceline-api.js.map +1 -1
- package/dist/tools/find-cheapest-flight-date.d.ts +28 -0
- package/dist/tools/find-cheapest-flight-date.d.ts.map +1 -0
- package/dist/tools/find-cheapest-flight-date.js +77 -0
- package/dist/tools/find-cheapest-flight-date.js.map +1 -0
- package/dist/tools/get-flight-price-calendar.d.ts +30 -0
- package/dist/tools/get-flight-price-calendar.d.ts.map +1 -0
- package/dist/tools/get-flight-price-calendar.js +97 -0
- package/dist/tools/get-flight-price-calendar.js.map +1 -0
- package/dist/tools/list-flight-price-watches.d.ts +17 -0
- package/dist/tools/list-flight-price-watches.d.ts.map +1 -0
- package/dist/tools/list-flight-price-watches.js +54 -0
- package/dist/tools/list-flight-price-watches.js.map +1 -0
- package/dist/tools/navigate-to-flight-search.d.ts +21 -0
- package/dist/tools/navigate-to-flight-search.d.ts.map +1 -0
- package/dist/tools/navigate-to-flight-search.js +43 -0
- package/dist/tools/navigate-to-flight-search.js.map +1 -0
- package/dist/tools/schemas.d.ts +111 -0
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +79 -0
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/search-airports.d.ts +17 -0
- package/dist/tools/search-airports.d.ts.map +1 -0
- package/dist/tools/search-airports.js +25 -0
- package/dist/tools/search-airports.js.map +1 -0
- package/dist/tools.json +534 -1
- package/package.json +4 -4
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAqB/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,CAuB9B;IAEI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAIlC;;AAED,wBAAqC"}
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
|
|
2
2
|
import { isAuthenticated, waitForAuth } from './priceline-api.js';
|
|
3
|
+
import { findCheapestFlightDate } from './tools/find-cheapest-flight-date.js';
|
|
3
4
|
import { getAbandonedItems } from './tools/get-abandoned-items.js';
|
|
4
5
|
import { getCustomerCoupons } from './tools/get-customer-coupons.js';
|
|
5
6
|
import { getCustomerProfile } from './tools/get-customer-profile.js';
|
|
6
7
|
import { getFavoriteHotels } from './tools/get-favorite-hotels.js';
|
|
8
|
+
import { getFlightPriceCalendar } from './tools/get-flight-price-calendar.js';
|
|
7
9
|
import { getHotelDescriptions } from './tools/get-hotel-descriptions.js';
|
|
8
10
|
import { getHotelFilters } from './tools/get-hotel-filters.js';
|
|
9
11
|
import { getMerchandisingBadges } from './tools/get-merchandising-badges.js';
|
|
10
12
|
import { getPriceGuidance } from './tools/get-price-guidance.js';
|
|
13
|
+
import { listFlightPriceWatches } from './tools/list-flight-price-watches.js';
|
|
14
|
+
import { navigateToFlightSearch } from './tools/navigate-to-flight-search.js';
|
|
11
15
|
import { navigateToHotel } from './tools/navigate-to-hotel.js';
|
|
12
16
|
import { navigateToSearch } from './tools/navigate-to-search.js';
|
|
17
|
+
import { searchAirports } from './tools/search-airports.js';
|
|
13
18
|
import { searchHotels } from './tools/search-hotels.js';
|
|
14
19
|
import { searchLocations } from './tools/search-locations.js';
|
|
15
20
|
import { searchPointsOfInterest } from './tools/search-points-of-interest.js';
|
|
@@ -31,6 +36,12 @@ class PricelinePlugin extends OpenTabsPlugin {
|
|
|
31
36
|
getMerchandisingBadges,
|
|
32
37
|
getPriceGuidance,
|
|
33
38
|
navigateToHotel,
|
|
39
|
+
// Flights
|
|
40
|
+
searchAirports,
|
|
41
|
+
getFlightPriceCalendar,
|
|
42
|
+
findCheapestFlightDate,
|
|
43
|
+
listFlightPriceWatches,
|
|
44
|
+
navigateToFlightSearch,
|
|
34
45
|
// Account
|
|
35
46
|
getCustomerProfile,
|
|
36
47
|
getCustomerCoupons,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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"}
|
|
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,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,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,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,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,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,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,cAAc;QACd,sBAAsB;QACtB,sBAAsB;QACtB,sBAAsB;QACtB,sBAAsB;QACtB,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"}
|
package/dist/priceline-api.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ export declare const waitForAuth: () => Promise<boolean>;
|
|
|
3
3
|
export declare const getEmail: () => string;
|
|
4
4
|
export declare const getCguid: () => string;
|
|
5
5
|
export declare const getAuthToken: () => string;
|
|
6
|
-
export declare const graphql: <T>(operationName: string, variables: Record<string, unknown>,
|
|
6
|
+
export declare const graphql: <T>(operationName: string, variables: Record<string, unknown>, queryOrPersistedHash?: string) => Promise<T>;
|
|
7
7
|
export declare const rest: <T>(endpoint: string, query?: Record<string, string | number | boolean | undefined>) => Promise<T>;
|
|
8
|
+
export declare const autocomplete: <T>(product: "flights" | "hotels" | "cars", query: string) => Promise<T[]>;
|
|
9
|
+
export declare const flyGraphql: <T>(operationName: string, variables: Record<string, unknown>, query: string) => Promise<T>;
|
|
8
10
|
//# sourceMappingURL=priceline-api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"priceline-api.d.ts","sourceRoot":"","sources":["../src/priceline-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"priceline-api.d.ts","sourceRoot":"","sources":["../src/priceline-api.ts"],"names":[],"mappings":"AAuEA,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,uBAAuB,MAAM,KAC5B,OAAO,CAAC,CAAC,CA0DX,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;AAYF,eAAO,MAAM,YAAY,GAAU,CAAC,EAAE,SAAS,SAAS,GAAG,QAAQ,GAAG,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,CAAC,CAAC,EAAE,CAKxG,CAAC;AAcF,eAAO,MAAM,UAAU,GAAU,CAAC,EAChC,eAAe,MAAM,EACrB,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,MAAM,KACZ,OAAO,CAAC,CAAC,CAwBX,CAAC"}
|
package/dist/priceline-api.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { ToolError, fetchJSON, getCookie, getAuthCache, setAuthCache, clearAuthCache, getLocalStorage, waitUntil, buildQueryString, } from '@opentabs-dev/plugin-sdk';
|
|
2
2
|
const GRAPH_BASE = 'https://www.priceline.com/pws/v0/pcln-graph/?gqlOp=';
|
|
3
|
+
const FLY_GRAPH_URL = 'https://www.priceline.com/pws/v0/fly/graph/query';
|
|
3
4
|
const REST_BASE = 'https://www.priceline.com/pws/v0';
|
|
5
|
+
const AC_BASE = 'https://www.priceline.com/svcs/ac/index';
|
|
4
6
|
const decodeJwtPayload = (jwt) => {
|
|
5
7
|
try {
|
|
6
8
|
const parts = jwt.split('.');
|
|
@@ -66,18 +68,23 @@ const requireAuth = () => {
|
|
|
66
68
|
export const getEmail = () => requireAuth().email;
|
|
67
69
|
export const getCguid = () => requireAuth().cguid;
|
|
68
70
|
export const getAuthToken = () => requireAuth().authToken;
|
|
69
|
-
export const graphql = async (operationName, variables,
|
|
71
|
+
export const graphql = async (operationName, variables, queryOrPersistedHash) => {
|
|
70
72
|
const auth = requireAuth();
|
|
71
73
|
const url = `${GRAPH_BASE}${operationName}`;
|
|
72
74
|
const reqBody = {
|
|
73
75
|
operationName,
|
|
74
76
|
variables,
|
|
75
77
|
};
|
|
76
|
-
|
|
78
|
+
// Persisted query hashes are 64-char hex strings; anything else is treated as an inline query document.
|
|
79
|
+
const isPersistedHash = typeof queryOrPersistedHash === 'string' && /^[a-f0-9]{64}$/.test(queryOrPersistedHash);
|
|
80
|
+
if (queryOrPersistedHash && isPersistedHash) {
|
|
77
81
|
reqBody.extensions = {
|
|
78
|
-
persistedQuery: { version: 1, sha256Hash:
|
|
82
|
+
persistedQuery: { version: 1, sha256Hash: queryOrPersistedHash },
|
|
79
83
|
};
|
|
80
84
|
}
|
|
85
|
+
else if (queryOrPersistedHash) {
|
|
86
|
+
reqBody.query = queryOrPersistedHash;
|
|
87
|
+
}
|
|
81
88
|
const headers = {
|
|
82
89
|
'Content-Type': 'application/json',
|
|
83
90
|
Authorization: `Bearer ${auth.accessToken}`,
|
|
@@ -117,4 +124,34 @@ export const rest = async (endpoint, query) => {
|
|
|
117
124
|
throw ToolError.internal(`Empty response from ${endpoint}`);
|
|
118
125
|
return data;
|
|
119
126
|
};
|
|
127
|
+
// Fetches from /svcs/ac/index/{product}/{query}/0/9/0/0 — the autocomplete service used
|
|
128
|
+
// by the flight, hotel, and car search widgets. Returns up to 9 results for the given query.
|
|
129
|
+
export const autocomplete = async (product, query) => {
|
|
130
|
+
const encoded = encodeURIComponent(query);
|
|
131
|
+
const url = `${AC_BASE}/${product}/${encoded}/0/9/0/0`;
|
|
132
|
+
const data = await fetchJSON(url);
|
|
133
|
+
return data?.searchItems ?? [];
|
|
134
|
+
};
|
|
135
|
+
export const flyGraphql = async (operationName, variables, query) => {
|
|
136
|
+
const headers = {
|
|
137
|
+
'Content-Type': 'application/json',
|
|
138
|
+
'apollographql-client-name': 'm-fly-search',
|
|
139
|
+
'apollographql-client-version': 'main-0.0.19',
|
|
140
|
+
};
|
|
141
|
+
const resp = (await fetchJSON(FLY_GRAPH_URL, {
|
|
142
|
+
method: 'POST',
|
|
143
|
+
headers,
|
|
144
|
+
body: JSON.stringify({ operationName, variables, query }),
|
|
145
|
+
})) ?? {};
|
|
146
|
+
const errors = resp.errors ?? [];
|
|
147
|
+
if (errors.length > 0 && !resp.data) {
|
|
148
|
+
const first = errors[0] ?? {};
|
|
149
|
+
const code = first.extensions?.code ?? '';
|
|
150
|
+
const message = first.message ?? 'Unknown GraphQL error';
|
|
151
|
+
if (code === 'UNAUTHENTICATED')
|
|
152
|
+
throw ToolError.auth(`Auth error: ${message}`);
|
|
153
|
+
throw ToolError.internal(`GraphQL error (${operationName}): ${message}`);
|
|
154
|
+
}
|
|
155
|
+
return (resp.data ?? {});
|
|
156
|
+
};
|
|
120
157
|
//# sourceMappingURL=priceline-api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"priceline-api.js","sourceRoot":"","sources":["../src/priceline-api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,SAAS,EACT,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,UAAU,GAAG,qDAAqD,CAAC;AACzE,MAAM,SAAS,GAAG,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"priceline-api.js","sourceRoot":"","sources":["../src/priceline-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const findCheapestFlightDate: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
origin: z.ZodString;
|
|
4
|
+
destination: z.ZodString;
|
|
5
|
+
depart_date_from: z.ZodString;
|
|
6
|
+
depart_date_to: z.ZodString;
|
|
7
|
+
top_n: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
cabin_class: z.ZodOptional<z.ZodEnum<{
|
|
9
|
+
ECO: "ECO";
|
|
10
|
+
PREMIUM: "PREMIUM";
|
|
11
|
+
BUS: "BUS";
|
|
12
|
+
FIRST: "FIRST";
|
|
13
|
+
}>>;
|
|
14
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
15
|
+
records: z.ZodArray<z.ZodObject<{
|
|
16
|
+
dates: z.ZodArray<z.ZodString>;
|
|
17
|
+
min_price: z.ZodNumber;
|
|
18
|
+
currency: z.ZodString;
|
|
19
|
+
is_private_fare: z.ZodBoolean;
|
|
20
|
+
stops_by_slice: z.ZodArray<z.ZodObject<{
|
|
21
|
+
slice_id: z.ZodNumber;
|
|
22
|
+
stops: z.ZodNumber;
|
|
23
|
+
}, z.core.$strip>>;
|
|
24
|
+
takeoff_times: z.ZodArray<z.ZodString>;
|
|
25
|
+
landing_times: z.ZodArray<z.ZodString>;
|
|
26
|
+
}, z.core.$strip>>;
|
|
27
|
+
}, z.core.$strip>>;
|
|
28
|
+
//# sourceMappingURL=find-cheapest-flight-date.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-cheapest-flight-date.d.ts","sourceRoot":"","sources":["../../src/tools/find-cheapest-flight-date.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA4BxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;kBAuDjC,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ToolError, defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { graphql } from '../priceline-api.js';
|
|
4
|
+
import { flightFareRecordSchema, mapFlightFareRecord } from './schemas.js';
|
|
5
|
+
const PRICE_CALENDAR_QUERY = `
|
|
6
|
+
query airPriceGuideCalendar($input: AirPriceGuideRequest) {
|
|
7
|
+
airPriceGuide(input: $input) {
|
|
8
|
+
error { type code message }
|
|
9
|
+
records {
|
|
10
|
+
dates
|
|
11
|
+
minimumFare {
|
|
12
|
+
isPrivateFare
|
|
13
|
+
currency
|
|
14
|
+
amtPerPax
|
|
15
|
+
commonAttributes { takeOffTimes landingTimes }
|
|
16
|
+
listOfStops { sliceId stops }
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}`;
|
|
21
|
+
export const findCheapestFlightDate = defineTool({
|
|
22
|
+
name: 'find_cheapest_flight_date',
|
|
23
|
+
displayName: 'Find Cheapest Flight Date',
|
|
24
|
+
description: 'Find the single cheapest date to fly a route within a given date window. Returns the bottom N fares ordered from lowest to highest price, so the caller can pick the best date that fits their schedule. Works for one-way routes; for round-trip price optimization use get_flight_price_calendar with two trips.',
|
|
25
|
+
summary: 'Find the cheapest flight date in a window',
|
|
26
|
+
icon: 'piggy-bank',
|
|
27
|
+
group: 'Flights',
|
|
28
|
+
input: z.object({
|
|
29
|
+
origin: z.string().describe('Origin airport or city code (e.g., JFK, NYC)'),
|
|
30
|
+
destination: z.string().describe('Destination airport or city code (e.g., LAX, LON)'),
|
|
31
|
+
depart_date_from: z.string().describe('Start of departure window in YYYY-MM-DD format'),
|
|
32
|
+
depart_date_to: z.string().describe('End of departure window in YYYY-MM-DD format'),
|
|
33
|
+
top_n: z
|
|
34
|
+
.number()
|
|
35
|
+
.int()
|
|
36
|
+
.min(1)
|
|
37
|
+
.max(30)
|
|
38
|
+
.optional()
|
|
39
|
+
.describe('Number of cheapest dates to return (default 5, max 30)'),
|
|
40
|
+
cabin_class: z.enum(['ECO', 'PREMIUM', 'BUS', 'FIRST']).optional().describe('Cabin class filter (default ECO)'),
|
|
41
|
+
}),
|
|
42
|
+
output: z.object({
|
|
43
|
+
records: z.array(flightFareRecordSchema).describe('Cheapest flight dates in the window, sorted ascending by price'),
|
|
44
|
+
}),
|
|
45
|
+
handle: async (params) => {
|
|
46
|
+
const variables = {
|
|
47
|
+
input: {
|
|
48
|
+
trips: [
|
|
49
|
+
{
|
|
50
|
+
originCity: [params.origin],
|
|
51
|
+
destinationCity: [params.destination],
|
|
52
|
+
departDateRange: { fromDate: params.depart_date_from, toDate: params.depart_date_to },
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
size: 720,
|
|
56
|
+
consumer: 'PCLN-HOME',
|
|
57
|
+
cabinClass: params.cabin_class ?? 'ECO',
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
const data = await graphql('airPriceGuideCalendar', variables, PRICE_CALENDAR_QUERY);
|
|
61
|
+
const guide = data.airPriceGuide;
|
|
62
|
+
if (guide?.error) {
|
|
63
|
+
const msg = guide.error.message ?? '';
|
|
64
|
+
if (msg === 'Zero results')
|
|
65
|
+
return { records: [] };
|
|
66
|
+
throw ToolError.internal(`Flight price calendar error: ${msg}`);
|
|
67
|
+
}
|
|
68
|
+
const raw = guide?.records ?? [];
|
|
69
|
+
const mapped = raw
|
|
70
|
+
.map(mapFlightFareRecord)
|
|
71
|
+
.filter(r => r.min_price > 0)
|
|
72
|
+
.sort((a, b) => a.min_price - b.min_price)
|
|
73
|
+
.slice(0, params.top_n ?? 5);
|
|
74
|
+
return { records: mapped };
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=find-cheapest-flight-date.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-cheapest-flight-date.js","sourceRoot":"","sources":["../../src/tools/find-cheapest-flight-date.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getFlightPriceCalendar: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
trips: z.ZodArray<z.ZodObject<{
|
|
4
|
+
origin: z.ZodString;
|
|
5
|
+
destination: z.ZodString;
|
|
6
|
+
depart_date: z.ZodOptional<z.ZodString>;
|
|
7
|
+
depart_date_from: z.ZodOptional<z.ZodString>;
|
|
8
|
+
depart_date_to: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, z.core.$strip>>;
|
|
10
|
+
cabin_class: z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
ECO: "ECO";
|
|
12
|
+
PREMIUM: "PREMIUM";
|
|
13
|
+
BUS: "BUS";
|
|
14
|
+
FIRST: "FIRST";
|
|
15
|
+
}>>;
|
|
16
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
17
|
+
records: z.ZodArray<z.ZodObject<{
|
|
18
|
+
dates: z.ZodArray<z.ZodString>;
|
|
19
|
+
min_price: z.ZodNumber;
|
|
20
|
+
currency: z.ZodString;
|
|
21
|
+
is_private_fare: z.ZodBoolean;
|
|
22
|
+
stops_by_slice: z.ZodArray<z.ZodObject<{
|
|
23
|
+
slice_id: z.ZodNumber;
|
|
24
|
+
stops: z.ZodNumber;
|
|
25
|
+
}, z.core.$strip>>;
|
|
26
|
+
takeoff_times: z.ZodArray<z.ZodString>;
|
|
27
|
+
landing_times: z.ZodArray<z.ZodString>;
|
|
28
|
+
}, z.core.$strip>>;
|
|
29
|
+
}, z.core.$strip>>;
|
|
30
|
+
//# sourceMappingURL=get-flight-price-calendar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-flight-price-calendar.d.ts","sourceRoot":"","sources":["../../src/tools/get-flight-price-calendar.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAyExB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAsCjC,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { ToolError, defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { graphql } from '../priceline-api.js';
|
|
4
|
+
import { flightFareRecordSchema, mapFlightFareRecord } from './schemas.js';
|
|
5
|
+
const PRICE_CALENDAR_QUERY = `
|
|
6
|
+
query airPriceGuideCalendar($input: AirPriceGuideRequest) {
|
|
7
|
+
airPriceGuide(input: $input) {
|
|
8
|
+
error { type code message }
|
|
9
|
+
records {
|
|
10
|
+
dates
|
|
11
|
+
minimumFare {
|
|
12
|
+
isPrivateFare
|
|
13
|
+
currency
|
|
14
|
+
amtPerPax
|
|
15
|
+
commonAttributes { takeOffTimes landingTimes }
|
|
16
|
+
listOfStops { sliceId stops }
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}`;
|
|
21
|
+
const cabinClassSchema = z
|
|
22
|
+
.enum(['ECO', 'PREMIUM', 'BUS', 'FIRST'])
|
|
23
|
+
.describe('Cabin class — ECO (economy), PREMIUM (premium economy), BUS (business), FIRST (first)');
|
|
24
|
+
const tripSchema = z
|
|
25
|
+
.object({
|
|
26
|
+
origin: z.string().describe('Origin airport/city code (e.g., JFK, NYC)'),
|
|
27
|
+
destination: z.string().describe('Destination airport/city code (e.g., LAX, LON)'),
|
|
28
|
+
depart_date: z
|
|
29
|
+
.string()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('Single departure date in YYYY-MM-DD format. Provide either this or depart_date_range, not both.'),
|
|
32
|
+
depart_date_from: z
|
|
33
|
+
.string()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe('Start of departure date window in YYYY-MM-DD format. Pair with depart_date_to for range searches.'),
|
|
36
|
+
depart_date_to: z
|
|
37
|
+
.string()
|
|
38
|
+
.optional()
|
|
39
|
+
.describe('End of departure date window in YYYY-MM-DD format. Pair with depart_date_from for range searches.'),
|
|
40
|
+
})
|
|
41
|
+
.describe('A single flight slice (leg). For one-way pass one slice; for round-trip pass two (outbound + return).');
|
|
42
|
+
const buildTrip = (t) => {
|
|
43
|
+
const trip = {
|
|
44
|
+
originCity: [t.origin],
|
|
45
|
+
destinationCity: [t.destination],
|
|
46
|
+
};
|
|
47
|
+
if (t.depart_date_from && t.depart_date_to) {
|
|
48
|
+
trip.departDateRange = { fromDate: t.depart_date_from, toDate: t.depart_date_to };
|
|
49
|
+
}
|
|
50
|
+
else if (t.depart_date) {
|
|
51
|
+
trip.departDate = t.depart_date;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
throw ToolError.validation('Each trip must have either depart_date or both depart_date_from and depart_date_to.');
|
|
55
|
+
}
|
|
56
|
+
return trip;
|
|
57
|
+
};
|
|
58
|
+
export const getFlightPriceCalendar = defineTool({
|
|
59
|
+
name: 'get_flight_price_calendar',
|
|
60
|
+
displayName: 'Get Flight Price Calendar',
|
|
61
|
+
description: "Get Priceline's fare forecast for a route over a date range. Returns the cheapest available fare for each date (or date combination for round-trips), along with departure/arrival times and stop counts. Pass a single `trips` entry for one-way, or two entries (outbound + return) for round-trip. Each trip can be a single date (`depart_date`) or a date window (`depart_date_from`/`depart_date_to`). Useful for finding the cheapest date to fly before booking.",
|
|
62
|
+
summary: 'Flight fare forecast for a date range',
|
|
63
|
+
icon: 'calendar-range',
|
|
64
|
+
group: 'Flights',
|
|
65
|
+
input: z.object({
|
|
66
|
+
trips: z
|
|
67
|
+
.array(tripSchema)
|
|
68
|
+
.min(1)
|
|
69
|
+
.max(6)
|
|
70
|
+
.describe('Flight slices — 1 for one-way, 2 for round-trip, up to 6 for multi-city'),
|
|
71
|
+
cabin_class: cabinClassSchema.optional().describe('Cabin class filter (default ECO)'),
|
|
72
|
+
}),
|
|
73
|
+
output: z.object({
|
|
74
|
+
records: z.array(flightFareRecordSchema).describe('Cheapest fares by date combination, sorted by trip dates'),
|
|
75
|
+
}),
|
|
76
|
+
handle: async (params) => {
|
|
77
|
+
const variables = {
|
|
78
|
+
input: {
|
|
79
|
+
trips: params.trips.map(buildTrip),
|
|
80
|
+
size: 720,
|
|
81
|
+
consumer: 'PCLN-HOME',
|
|
82
|
+
cabinClass: params.cabin_class ?? 'ECO',
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
const data = await graphql('airPriceGuideCalendar', variables, PRICE_CALENDAR_QUERY);
|
|
86
|
+
const guide = data.airPriceGuide;
|
|
87
|
+
if (guide?.error) {
|
|
88
|
+
const msg = guide.error.message ?? '';
|
|
89
|
+
if (msg === 'Zero results')
|
|
90
|
+
return { records: [] };
|
|
91
|
+
throw ToolError.internal(`Flight price calendar error: ${msg}`);
|
|
92
|
+
}
|
|
93
|
+
const records = guide?.records ?? [];
|
|
94
|
+
return { records: records.map(mapFlightFareRecord) };
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=get-flight-price-calendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-flight-price-calendar.js","sourceRoot":"","sources":["../../src/tools/get-flight-price-calendar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const listFlightPriceWatches: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
include_inactive: z.ZodOptional<z.ZodBoolean>;
|
|
4
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
5
|
+
price_watches: z.ZodArray<z.ZodObject<{
|
|
6
|
+
origin_code: z.ZodString;
|
|
7
|
+
destination_code: z.ZodString;
|
|
8
|
+
depart_date: z.ZodString;
|
|
9
|
+
return_date: z.ZodString;
|
|
10
|
+
cabin_class: z.ZodString;
|
|
11
|
+
current_price: z.ZodNumber;
|
|
12
|
+
target_price: z.ZodNumber;
|
|
13
|
+
is_active: z.ZodBoolean;
|
|
14
|
+
created_at: z.ZodString;
|
|
15
|
+
}, z.core.$strip>>;
|
|
16
|
+
}, z.core.$strip>>;
|
|
17
|
+
//# sourceMappingURL=list-flight-price-watches.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-flight-price-watches.d.ts","sourceRoot":"","sources":["../../src/tools/list-flight-price-watches.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA+BxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;kBAsCjC,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ToolError, defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { flyGraphql, getEmail } from '../priceline-api.js';
|
|
4
|
+
import { flightPriceWatchSchema, mapFlightPriceWatch } from './schemas.js';
|
|
5
|
+
const PRICE_WATCH_LIST_QUERY = `
|
|
6
|
+
query PriceWatches($input: AirPriceWatchGetListRequest!) {
|
|
7
|
+
airPriceWatchGetListResponse(input: $input) {
|
|
8
|
+
status statusCode statusMessage email
|
|
9
|
+
error { code message }
|
|
10
|
+
priceWatchGetListResp
|
|
11
|
+
}
|
|
12
|
+
}`;
|
|
13
|
+
const generateRequestId = () => {
|
|
14
|
+
return `opentabs-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
15
|
+
};
|
|
16
|
+
export const listFlightPriceWatches = defineTool({
|
|
17
|
+
name: 'list_flight_price_watches',
|
|
18
|
+
displayName: 'List Flight Price Watches',
|
|
19
|
+
description: "List the authenticated user's active Priceline flight price watches. Returns watches the user has set up to track fare changes on specific routes. Each entry includes origin, destination, travel dates, cabin class, current price, and target price.",
|
|
20
|
+
summary: "List user's flight price alerts",
|
|
21
|
+
icon: 'bell',
|
|
22
|
+
group: 'Flights',
|
|
23
|
+
input: z.object({
|
|
24
|
+
include_inactive: z
|
|
25
|
+
.boolean()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Include inactive (paused or expired) watches in addition to active ones (default false)'),
|
|
28
|
+
}),
|
|
29
|
+
output: z.object({
|
|
30
|
+
price_watches: z.array(flightPriceWatchSchema).describe('Active flight price watches for the signed-in user'),
|
|
31
|
+
}),
|
|
32
|
+
handle: async (params) => {
|
|
33
|
+
const email = getEmail();
|
|
34
|
+
const variables = {
|
|
35
|
+
input: {
|
|
36
|
+
email,
|
|
37
|
+
requestId: generateRequestId(),
|
|
38
|
+
includeInactive: params.include_inactive ?? false,
|
|
39
|
+
includeOptedOut: false,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
const data = await flyGraphql('PriceWatches', variables, PRICE_WATCH_LIST_QUERY);
|
|
43
|
+
const resp = data.airPriceWatchGetListResponse;
|
|
44
|
+
if (resp?.status === 'ERROR') {
|
|
45
|
+
throw ToolError.internal(`Price watch list error: ${resp.statusMessage ?? 'unknown error'}`);
|
|
46
|
+
}
|
|
47
|
+
if (resp?.error) {
|
|
48
|
+
throw ToolError.internal(`Price watch list error: ${resp.error.message ?? 'unknown error'}`);
|
|
49
|
+
}
|
|
50
|
+
const list = resp?.priceWatchGetListResp?.priceWatches ?? resp?.priceWatchGetListResp?.optedInData ?? [];
|
|
51
|
+
return { price_watches: list.map(mapFlightPriceWatch) };
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=list-flight-price-watches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-flight-price-watches.js","sourceRoot":"","sources":["../../src/tools/list-flight-price-watches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAA4B,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAErG,MAAM,sBAAsB,GAAG;;;;;;;IAO3B,CAAC;AAgBL,MAAM,iBAAiB,GAAG,GAAW,EAAE;IACrC,OAAO,YAAY,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC;IAC/C,IAAI,EAAE,2BAA2B;IACjC,WAAW,EAAE,2BAA2B;IACxC,WAAW,EACT,yPAAyP;IAC3P,OAAO,EAAE,iCAAiC;IAC1C,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,gBAAgB,EAAE,CAAC;aAChB,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,yFAAyF,CAAC;KACvG,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,QAAQ,CAAC,oDAAoD,CAAC;KAC9G,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG;YAChB,KAAK,EAAE;gBACL,KAAK;gBACL,SAAS,EAAE,iBAAiB,EAAE;gBAC9B,eAAe,EAAE,MAAM,CAAC,gBAAgB,IAAI,KAAK;gBACjD,eAAe,EAAE,KAAK;aACvB;SACF,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAwB,cAAc,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;QACxG,MAAM,IAAI,GAAG,IAAI,CAAC,4BAA4B,CAAC;QAC/C,IAAI,IAAI,EAAE,MAAM,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,CAAC,QAAQ,CAAC,2BAA2B,IAAI,CAAC,aAAa,IAAI,eAAe,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,MAAM,SAAS,CAAC,QAAQ,CAAC,2BAA2B,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,EAAE,qBAAqB,EAAE,YAAY,IAAI,IAAI,EAAE,qBAAqB,EAAE,WAAW,IAAI,EAAE,CAAC;QACzG,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC1D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const navigateToFlightSearch: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
|
|
3
|
+
origin: z.ZodString;
|
|
4
|
+
destination: z.ZodString;
|
|
5
|
+
depart_date: z.ZodString;
|
|
6
|
+
return_date: z.ZodOptional<z.ZodString>;
|
|
7
|
+
trip_type: z.ZodOptional<z.ZodEnum<{
|
|
8
|
+
OW: "OW";
|
|
9
|
+
RT: "RT";
|
|
10
|
+
}>>;
|
|
11
|
+
cabin_class: z.ZodOptional<z.ZodEnum<{
|
|
12
|
+
PREMIUM: "PREMIUM";
|
|
13
|
+
FIRST: "FIRST";
|
|
14
|
+
ECONOMY: "ECONOMY";
|
|
15
|
+
BUSINESS: "BUSINESS";
|
|
16
|
+
}>>;
|
|
17
|
+
passengers: z.ZodOptional<z.ZodNumber>;
|
|
18
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
19
|
+
url: z.ZodString;
|
|
20
|
+
}, z.core.$strip>>;
|
|
21
|
+
//# sourceMappingURL=navigate-to-flight-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigate-to-flight-search.d.ts","sourceRoot":"","sources":["../../src/tools/navigate-to-flight-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;kBAgCjC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { defineTool } from '@opentabs-dev/plugin-sdk';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
const tripTypeSchema = z.enum(['OW', 'RT']).describe('Trip type — OW (one-way) or RT (round-trip)');
|
|
4
|
+
const cabinClassSchema = z.enum(['ECONOMY', 'PREMIUM', 'BUSINESS', 'FIRST']).describe('Cabin class for the search URL');
|
|
5
|
+
const toYmd = (date) => {
|
|
6
|
+
// Accepts YYYY-MM-DD and returns the same format. Validates shape.
|
|
7
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(date);
|
|
8
|
+
if (!match)
|
|
9
|
+
throw new Error(`Invalid date ${date} — expected YYYY-MM-DD`);
|
|
10
|
+
return date;
|
|
11
|
+
};
|
|
12
|
+
export const navigateToFlightSearch = defineTool({
|
|
13
|
+
name: 'navigate_to_flight_search',
|
|
14
|
+
displayName: 'Navigate to Flight Search',
|
|
15
|
+
description: "Open Priceline's flight search results page for a given route and dates in the user's browser. This navigates the current tab so the user can review flights, apply filters, and book in their authenticated session. Use this after get_flight_price_calendar or find_cheapest_flight_date has identified a good route/date — it hands control back to the user for the full search and booking flow. Requires airport/city codes (use search_airports to find them).",
|
|
16
|
+
summary: 'Open Priceline flight search for a route',
|
|
17
|
+
icon: 'plane',
|
|
18
|
+
group: 'Flights',
|
|
19
|
+
input: z.object({
|
|
20
|
+
origin: z.string().describe('Origin airport or city code (e.g., JFK, NYC)'),
|
|
21
|
+
destination: z.string().describe('Destination airport or city code (e.g., LAX, LON)'),
|
|
22
|
+
depart_date: z.string().describe('Departure date in YYYY-MM-DD format'),
|
|
23
|
+
return_date: z.string().optional().describe('Return date in YYYY-MM-DD format (round-trip only; omit for one-way)'),
|
|
24
|
+
trip_type: tripTypeSchema.optional().describe('Trip type (default OW for one-way, RT when return_date is set)'),
|
|
25
|
+
cabin_class: cabinClassSchema.optional().describe('Cabin class (default ECONOMY)'),
|
|
26
|
+
passengers: z.number().int().min(1).max(8).optional().describe('Number of passengers (default 1)'),
|
|
27
|
+
}),
|
|
28
|
+
output: z.object({
|
|
29
|
+
url: z.string().describe('The Priceline flight search URL that was opened'),
|
|
30
|
+
}),
|
|
31
|
+
handle: async (params) => {
|
|
32
|
+
const depart = toYmd(params.depart_date);
|
|
33
|
+
const tripType = params.trip_type ?? (params.return_date ? 'RT' : 'OW');
|
|
34
|
+
const cabin = params.cabin_class ?? 'ECONOMY';
|
|
35
|
+
const pax = params.passengers ?? 1;
|
|
36
|
+
const returnSegment = tripType === 'RT' && params.return_date ? `/${toYmd(params.return_date)}` : '';
|
|
37
|
+
const url = `https://www.priceline.com/m/fly/search/${params.origin}-${params.destination}/${depart}${returnSegment}/` +
|
|
38
|
+
`?tripType=${tripType}&cabinClass=${cabin}&numOfPassengers=${pax}`;
|
|
39
|
+
window.location.href = url;
|
|
40
|
+
return { url };
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=navigate-to-flight-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigate-to-flight-search.js","sourceRoot":"","sources":["../../src/tools/navigate-to-flight-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC,CAAC;AAEpG,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC,CAAC;AAExH,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE;IACrC,mEAAmE;IACnE,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,wBAAwB,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC;IAC/C,IAAI,EAAE,2BAA2B;IACjC,WAAW,EAAE,2BAA2B;IACxC,WAAW,EACT,wcAAwc;IAC1c,OAAO,EAAE,0CAA0C;IACnD,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QAC3E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QACrF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QACvE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sEAAsE,CAAC;QACnH,SAAS,EAAE,cAAc,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;QAC/G,WAAW,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAClF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KACnG,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;KAC5E,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,SAAS,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;QACnC,MAAM,aAAa,GAAG,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrG,MAAM,GAAG,GACP,0CAA0C,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,GAAG,aAAa,GAAG;YAC1G,aAAa,QAAQ,eAAe,KAAK,oBAAoB,GAAG,EAAE,CAAC;QACrE,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC;QAC3B,OAAO,EAAE,GAAG,EAAE,CAAC;IACjB,CAAC;CACF,CAAC,CAAC"}
|