@opentabs-dev/opentabs-plugin-panda-express 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.
Files changed (89) hide show
  1. package/README.md +140 -0
  2. package/dist/adapter.iife.js +15117 -0
  3. package/dist/adapter.iife.js.map +7 -0
  4. package/dist/index.d.ts +14 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +58 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/panda-api.d.ts +9 -0
  9. package/dist/panda-api.d.ts.map +1 -0
  10. package/dist/panda-api.js +88 -0
  11. package/dist/panda-api.js.map +1 -0
  12. package/dist/tools/add-product-to-basket.d.ts +21 -0
  13. package/dist/tools/add-product-to-basket.d.ts.map +1 -0
  14. package/dist/tools/add-product-to-basket.js +39 -0
  15. package/dist/tools/add-product-to-basket.js.map +1 -0
  16. package/dist/tools/apply-coupon.d.ts +19 -0
  17. package/dist/tools/apply-coupon.d.ts.map +1 -0
  18. package/dist/tools/apply-coupon.js +27 -0
  19. package/dist/tools/apply-coupon.js.map +1 -0
  20. package/dist/tools/cancel-order.d.ts +7 -0
  21. package/dist/tools/cancel-order.d.ts.map +1 -0
  22. package/dist/tools/cancel-order.js +25 -0
  23. package/dist/tools/cancel-order.js.map +1 -0
  24. package/dist/tools/create-basket.d.ts +19 -0
  25. package/dist/tools/create-basket.d.ts.map +1 -0
  26. package/dist/tools/create-basket.js +30 -0
  27. package/dist/tools/create-basket.js.map +1 -0
  28. package/dist/tools/find-restaurants.d.ts +28 -0
  29. package/dist/tools/find-restaurants.d.ts.map +1 -0
  30. package/dist/tools/find-restaurants.js +33 -0
  31. package/dist/tools/find-restaurants.js.map +1 -0
  32. package/dist/tools/get-basket.d.ts +25 -0
  33. package/dist/tools/get-basket.d.ts.map +1 -0
  34. package/dist/tools/get-basket.js +27 -0
  35. package/dist/tools/get-basket.js.map +1 -0
  36. package/dist/tools/get-billing-accounts.d.ts +11 -0
  37. package/dist/tools/get-billing-accounts.d.ts.map +1 -0
  38. package/dist/tools/get-billing-accounts.js +35 -0
  39. package/dist/tools/get-billing-accounts.js.map +1 -0
  40. package/dist/tools/get-checkout-summary.d.ts +13 -0
  41. package/dist/tools/get-checkout-summary.d.ts.map +1 -0
  42. package/dist/tools/get-checkout-summary.js +40 -0
  43. package/dist/tools/get-checkout-summary.js.map +1 -0
  44. package/dist/tools/get-favorites.d.ts +9 -0
  45. package/dist/tools/get-favorites.d.ts.map +1 -0
  46. package/dist/tools/get-favorites.js +22 -0
  47. package/dist/tools/get-favorites.js.map +1 -0
  48. package/dist/tools/get-loyalty-rewards.d.ts +12 -0
  49. package/dist/tools/get-loyalty-rewards.d.ts.map +1 -0
  50. package/dist/tools/get-loyalty-rewards.js +33 -0
  51. package/dist/tools/get-loyalty-rewards.js.map +1 -0
  52. package/dist/tools/get-product-modifiers.d.ts +17 -0
  53. package/dist/tools/get-product-modifiers.d.ts.map +1 -0
  54. package/dist/tools/get-product-modifiers.js +45 -0
  55. package/dist/tools/get-product-modifiers.js.map +1 -0
  56. package/dist/tools/get-recent-orders.d.ts +17 -0
  57. package/dist/tools/get-recent-orders.d.ts.map +1 -0
  58. package/dist/tools/get-recent-orders.js +22 -0
  59. package/dist/tools/get-recent-orders.js.map +1 -0
  60. package/dist/tools/get-restaurant-menu.d.ts +22 -0
  61. package/dist/tools/get-restaurant-menu.d.ts.map +1 -0
  62. package/dist/tools/get-restaurant-menu.js +27 -0
  63. package/dist/tools/get-restaurant-menu.js.map +1 -0
  64. package/dist/tools/get-restaurant.d.ts +26 -0
  65. package/dist/tools/get-restaurant.d.ts.map +1 -0
  66. package/dist/tools/get-restaurant.js +34 -0
  67. package/dist/tools/get-restaurant.js.map +1 -0
  68. package/dist/tools/get-user-profile.d.ts +11 -0
  69. package/dist/tools/get-user-profile.d.ts.map +1 -0
  70. package/dist/tools/get-user-profile.js +48 -0
  71. package/dist/tools/get-user-profile.js.map +1 -0
  72. package/dist/tools/navigate-to-checkout.d.ts +32 -0
  73. package/dist/tools/navigate-to-checkout.d.ts.map +1 -0
  74. package/dist/tools/navigate-to-checkout.js +112 -0
  75. package/dist/tools/navigate-to-checkout.js.map +1 -0
  76. package/dist/tools/remove-coupon.d.ts +18 -0
  77. package/dist/tools/remove-coupon.d.ts.map +1 -0
  78. package/dist/tools/remove-coupon.js +25 -0
  79. package/dist/tools/remove-coupon.js.map +1 -0
  80. package/dist/tools/schemas.d.ts +241 -0
  81. package/dist/tools/schemas.d.ts.map +1 -0
  82. package/dist/tools/schemas.js +168 -0
  83. package/dist/tools/schemas.js.map +1 -0
  84. package/dist/tools/update-product-quantity.d.ts +20 -0
  85. package/dist/tools/update-product-quantity.d.ts.map +1 -0
  86. package/dist/tools/update-product-quantity.js +34 -0
  87. package/dist/tools/update-product-quantity.js.map +1 -0
  88. package/dist/tools.json +1584 -0
  89. package/package.json +54 -0
@@ -0,0 +1,112 @@
1
+ import { defineTool, ToolError } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../panda-api.js';
4
+ /**
5
+ * Key used to stash the pending basket state across page navigations.
6
+ * The problem: writing to `persist:root` before navigating is unreliable because
7
+ * the SPA's in-memory Redux store flushes back to localStorage during page teardown,
8
+ * overwriting our write. The solution: store the desired state in a separate key,
9
+ * navigate to the bag page, then apply it on the new page before Redux hydrates.
10
+ * See `applyPendingBasket()` which runs at adapter IIFE load time in `index.ts`.
11
+ */
12
+ export const PENDING_BASKET_KEY = '__opentabs_pending_basket';
13
+ /**
14
+ * Apply a pending basket stashed by `navigate_to_checkout`.
15
+ * Called at adapter IIFE load time on every page load.
16
+ *
17
+ * The adapter runs at `document_idle` — after the SPA's scripts have already
18
+ * hydrated Redux from `persist:root`. Writing to `persist:root` at this point
19
+ * is useless because the SPA's in-memory store will overwrite it on the next flush.
20
+ *
21
+ * To handle this reliably: write the basket into `persist:root`, remove the
22
+ * pending key, then reload the page. The second load has no pending key so
23
+ * the reload doesn't loop, and the SPA hydrates with the correct basket data.
24
+ */
25
+ export const applyPendingBasket = () => {
26
+ if (typeof localStorage === 'undefined')
27
+ return;
28
+ const pending = localStorage.getItem(PENDING_BASKET_KEY);
29
+ if (!pending)
30
+ return;
31
+ // Remove the stash first to prevent reload loops
32
+ localStorage.removeItem(PENDING_BASKET_KEY);
33
+ try {
34
+ const { basket, restaurantExtRef, restaurantName, productCount } = JSON.parse(pending);
35
+ const raw = localStorage.getItem('persist:root');
36
+ if (!raw)
37
+ return;
38
+ const root = JSON.parse(raw);
39
+ const appState = JSON.parse(root.appState ?? '{}');
40
+ appState.basket = { ...basket, restaurantExtRef };
41
+ appState.basketItemCount = productCount;
42
+ if (restaurantName)
43
+ appState.vendorName = restaurantName;
44
+ root.appState = JSON.stringify(appState);
45
+ localStorage.setItem('persist:root', JSON.stringify(root));
46
+ }
47
+ catch {
48
+ return;
49
+ }
50
+ // Reload the page so the SPA hydrates from the updated persist:root.
51
+ // The pending key is already removed so this won't loop.
52
+ window.location.reload();
53
+ };
54
+ export const navigateToCheckout = defineTool({
55
+ name: 'navigate_to_checkout',
56
+ displayName: 'Navigate to Checkout',
57
+ description: 'Sync a basket into the browser session and navigate to the checkout page. The user sees the payment page with their order ready — they only need to select a payment method and place the order. Call this after building a basket with add_product_to_basket.',
58
+ summary: 'Open the checkout page for a basket',
59
+ icon: 'credit-card',
60
+ group: 'Orders',
61
+ input: z.object({
62
+ basket_id: z.string().describe('Basket ID (UUID) to check out'),
63
+ restaurant_name: z.string().optional().describe('Restaurant name for display (auto-detected if omitted)'),
64
+ restaurant_ext_ref: z
65
+ .string()
66
+ .optional()
67
+ .describe('Restaurant external reference number (auto-detected if omitted)'),
68
+ }),
69
+ output: z.object({
70
+ navigated: z.boolean().describe('Whether the checkout page was opened'),
71
+ url: z.string().describe('The checkout page URL'),
72
+ }),
73
+ handle: async (params) => {
74
+ // Fetch the full basket from the API
75
+ const basket = await api(`/baskets/${params.basket_id}`);
76
+ if (!basket.id)
77
+ throw ToolError.notFound('Basket not found');
78
+ const productCount = Array.isArray(basket.products) ? basket.products.length : 0;
79
+ if (productCount === 0)
80
+ throw ToolError.validation('Basket is empty — add products before checking out.');
81
+ // Resolve restaurant name and extref if not provided
82
+ let restaurantName = params.restaurant_name ?? '';
83
+ let restaurantExtRef = params.restaurant_ext_ref ?? '';
84
+ if (!restaurantName || !restaurantExtRef) {
85
+ try {
86
+ const data = await api(`/restaurants/${basket.vendorid}?includealiases=true`);
87
+ const restaurant = data.restaurants?.[0];
88
+ if (restaurant) {
89
+ if (!restaurantName)
90
+ restaurantName = restaurant.name ?? '';
91
+ if (!restaurantExtRef)
92
+ restaurantExtRef = restaurant.extref ?? '';
93
+ }
94
+ }
95
+ catch {
96
+ // Non-critical — continue without restaurant metadata
97
+ }
98
+ }
99
+ // Stash the basket in a separate localStorage key that survives page navigation.
100
+ // The SPA's Redux persist flushes in-memory state to `persist:root` during page
101
+ // teardown, which would overwrite a direct write. By using a separate key, we
102
+ // avoid the race. `applyPendingBasket()` applies it on the next page load
103
+ // before Redux hydrates.
104
+ localStorage.setItem(PENDING_BASKET_KEY, JSON.stringify({ basket, restaurantExtRef, restaurantName, productCount }));
105
+ // Navigate to the bag page. The SPA requires going through /order/my-bag
106
+ // before /order/checkout because the checkout component depends on bag-page
107
+ // initialization. After the bag page loads, the user clicks CHECKOUT to pay.
108
+ window.location.href = 'https://www.pandaexpress.com/order/my-bag';
109
+ return { navigated: true, url: 'https://www.pandaexpress.com/order/my-bag' };
110
+ },
111
+ });
112
+ //# sourceMappingURL=navigate-to-checkout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate-to-checkout.js","sourceRoot":"","sources":["../../src/tools/navigate-to-checkout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ export declare const removeCoupon: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ basket_id: z.ZodString;
4
+ }, z.core.$strip>, z.ZodObject<{
5
+ basket: z.ZodObject<{
6
+ id: z.ZodString;
7
+ vendor_id: z.ZodNumber;
8
+ subtotal: z.ZodNumber;
9
+ sales_tax: z.ZodNumber;
10
+ total: z.ZodNumber;
11
+ product_count: z.ZodNumber;
12
+ delivery_mode: z.ZodString;
13
+ earliest_ready_time: z.ZodString;
14
+ lead_time_minutes: z.ZodNumber;
15
+ coupon_discount: z.ZodNumber;
16
+ }, z.core.$strip>;
17
+ }, z.core.$strip>>;
18
+ //# sourceMappingURL=remove-coupon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-coupon.d.ts","sourceRoot":"","sources":["../../src/tools/remove-coupon.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;kBAmBvB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../panda-api.js';
4
+ import { basketSchema, mapBasket } from './schemas.js';
5
+ export const removeCoupon = defineTool({
6
+ name: 'remove_coupon',
7
+ displayName: 'Remove Coupon',
8
+ description: 'Remove a previously applied coupon from the basket.',
9
+ summary: 'Remove a coupon from your order',
10
+ icon: 'ticket-x',
11
+ group: 'Orders',
12
+ input: z.object({
13
+ basket_id: z.string().describe('Basket ID (UUID)'),
14
+ }),
15
+ output: z.object({
16
+ basket: basketSchema.describe('Updated basket after coupon removal'),
17
+ }),
18
+ handle: async (params) => {
19
+ const data = await api(`/baskets/${params.basket_id}/coupon`, {
20
+ method: 'DELETE',
21
+ });
22
+ return { basket: mapBasket(data) };
23
+ },
24
+ });
25
+ //# sourceMappingURL=remove-coupon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-coupon.js","sourceRoot":"","sources":["../../src/tools/remove-coupon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAkB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEvE,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;IACrC,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,qDAAqD;IAClE,OAAO,EAAE,iCAAiC;IAC1C,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KACnD,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KACrE,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAY,YAAY,MAAM,CAAC,SAAS,SAAS,EAAE;YACvE,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IACrC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,241 @@
1
+ import { z } from 'zod';
2
+ export declare const restaurantSchema: z.ZodObject<{
3
+ id: z.ZodNumber;
4
+ name: z.ZodString;
5
+ slug: z.ZodString;
6
+ street_address: z.ZodString;
7
+ city: z.ZodString;
8
+ state: z.ZodString;
9
+ zip: z.ZodString;
10
+ phone: z.ZodString;
11
+ latitude: z.ZodNumber;
12
+ longitude: z.ZodNumber;
13
+ distance: z.ZodNumber;
14
+ is_available: z.ZodBoolean;
15
+ is_open: z.ZodBoolean;
16
+ can_deliver: z.ZodBoolean;
17
+ can_pickup: z.ZodBoolean;
18
+ delivery_fee: z.ZodString;
19
+ ext_ref: z.ZodString;
20
+ }, z.core.$strip>;
21
+ export interface RawRestaurant {
22
+ id?: number;
23
+ name?: string;
24
+ slug?: string;
25
+ streetaddress?: string;
26
+ city?: string;
27
+ state?: string;
28
+ zip?: string;
29
+ telephone?: string;
30
+ latitude?: number;
31
+ longitude?: number;
32
+ distance?: number;
33
+ isavailable?: boolean;
34
+ isopen?: boolean;
35
+ candeliver?: boolean;
36
+ canpickup?: boolean;
37
+ deliveryfee?: string;
38
+ extref?: string;
39
+ }
40
+ export declare const mapRestaurant: (r: RawRestaurant) => {
41
+ id: number;
42
+ name: string;
43
+ slug: string;
44
+ street_address: string;
45
+ city: string;
46
+ state: string;
47
+ zip: string;
48
+ phone: string;
49
+ latitude: number;
50
+ longitude: number;
51
+ distance: number;
52
+ is_available: boolean;
53
+ is_open: boolean;
54
+ can_deliver: boolean;
55
+ can_pickup: boolean;
56
+ delivery_fee: string;
57
+ ext_ref: string;
58
+ };
59
+ export declare const menuCategorySchema: z.ZodObject<{
60
+ id: z.ZodNumber;
61
+ name: z.ZodString;
62
+ description: z.ZodString;
63
+ product_count: z.ZodNumber;
64
+ }, z.core.$strip>;
65
+ export interface RawMenuCategory {
66
+ id?: number;
67
+ name?: string;
68
+ description?: string;
69
+ products?: unknown[];
70
+ }
71
+ export declare const mapMenuCategory: (c: RawMenuCategory) => {
72
+ id: number;
73
+ name: string;
74
+ description: string;
75
+ product_count: number;
76
+ };
77
+ export declare const menuProductSchema: z.ZodObject<{
78
+ id: z.ZodNumber;
79
+ name: z.ZodString;
80
+ description: z.ZodString;
81
+ cost: z.ZodNumber;
82
+ base_calories: z.ZodString;
83
+ max_calories: z.ZodString;
84
+ image_url: z.ZodString;
85
+ category: z.ZodString;
86
+ }, z.core.$strip>;
87
+ export interface RawMenuProduct {
88
+ id?: number;
89
+ name?: string;
90
+ description?: string;
91
+ cost?: number;
92
+ basecalories?: string;
93
+ maxcalories?: string;
94
+ imagefilename?: string;
95
+ images?: Array<{
96
+ filename?: string;
97
+ }>;
98
+ }
99
+ export declare const mapMenuProduct: (p: RawMenuProduct, categoryName: string, imagePath: string) => {
100
+ id: number;
101
+ name: string;
102
+ description: string;
103
+ cost: number;
104
+ base_calories: string;
105
+ max_calories: string;
106
+ image_url: string;
107
+ category: string;
108
+ };
109
+ export declare const basketSchema: z.ZodObject<{
110
+ id: z.ZodString;
111
+ vendor_id: z.ZodNumber;
112
+ subtotal: z.ZodNumber;
113
+ sales_tax: z.ZodNumber;
114
+ total: z.ZodNumber;
115
+ product_count: z.ZodNumber;
116
+ delivery_mode: z.ZodString;
117
+ earliest_ready_time: z.ZodString;
118
+ lead_time_minutes: z.ZodNumber;
119
+ coupon_discount: z.ZodNumber;
120
+ }, z.core.$strip>;
121
+ export interface RawBasket {
122
+ id?: string;
123
+ vendorid?: number;
124
+ subtotal?: number;
125
+ salestax?: number;
126
+ total?: number;
127
+ products?: unknown[];
128
+ deliverymode?: string;
129
+ earliestreadytime?: string;
130
+ leadtimeestimateminutes?: number;
131
+ coupondiscount?: number;
132
+ }
133
+ export declare const mapBasket: (b: RawBasket) => {
134
+ id: string;
135
+ vendor_id: number;
136
+ subtotal: number;
137
+ sales_tax: number;
138
+ total: number;
139
+ product_count: number;
140
+ delivery_mode: string;
141
+ earliest_ready_time: string;
142
+ lead_time_minutes: number;
143
+ coupon_discount: number;
144
+ };
145
+ export declare const basketProductSchema: z.ZodObject<{
146
+ id: z.ZodNumber;
147
+ product_id: z.ZodNumber;
148
+ name: z.ZodString;
149
+ quantity: z.ZodNumber;
150
+ total_cost: z.ZodNumber;
151
+ }, z.core.$strip>;
152
+ export interface RawBasketProduct {
153
+ id?: number;
154
+ productId?: number;
155
+ name?: string;
156
+ quantity?: number;
157
+ totalcost?: number;
158
+ }
159
+ export declare const mapBasketProduct: (p: RawBasketProduct) => {
160
+ id: number;
161
+ product_id: number;
162
+ name: string;
163
+ quantity: number;
164
+ total_cost: number;
165
+ };
166
+ export declare const orderSchema: z.ZodObject<{
167
+ id: z.ZodString;
168
+ vendor_id: z.ZodNumber;
169
+ vendor_name: z.ZodString;
170
+ status: z.ZodString;
171
+ subtotal: z.ZodNumber;
172
+ sales_tax: z.ZodNumber;
173
+ total: z.ZodNumber;
174
+ delivery_mode: z.ZodString;
175
+ time_placed: z.ZodString;
176
+ time_ready: z.ZodString;
177
+ product_count: z.ZodNumber;
178
+ }, z.core.$strip>;
179
+ export interface RawOrder {
180
+ id?: string;
181
+ vendorid?: number;
182
+ vendorname?: string;
183
+ status?: string;
184
+ subtotal?: number;
185
+ salestax?: number;
186
+ total?: number;
187
+ deliverymode?: string;
188
+ timeplaced?: string;
189
+ timeready?: string;
190
+ products?: unknown[];
191
+ }
192
+ export declare const mapOrder: (o: RawOrder) => {
193
+ id: string;
194
+ vendor_id: number;
195
+ vendor_name: string;
196
+ status: string;
197
+ subtotal: number;
198
+ sales_tax: number;
199
+ total: number;
200
+ delivery_mode: string;
201
+ time_placed: string;
202
+ time_ready: string;
203
+ product_count: number;
204
+ };
205
+ export declare const favoriteSchema: z.ZodObject<{
206
+ id: z.ZodNumber;
207
+ name: z.ZodString;
208
+ vendor_id: z.ZodNumber;
209
+ }, z.core.$strip>;
210
+ export interface RawFavorite {
211
+ id?: number;
212
+ description?: string;
213
+ vendorid?: number;
214
+ }
215
+ export declare const mapFavorite: (f: RawFavorite) => {
216
+ id: number;
217
+ name: string;
218
+ vendor_id: number;
219
+ };
220
+ export declare const loyaltyRewardSchema: z.ZodObject<{
221
+ id: z.ZodNumber;
222
+ name: z.ZodString;
223
+ description: z.ZodString;
224
+ image_url: z.ZodString;
225
+ points_required: z.ZodNumber;
226
+ }, z.core.$strip>;
227
+ export interface RawLoyaltyReward {
228
+ redeemable_id?: number;
229
+ redeemable_name?: string;
230
+ redeemable_description?: string;
231
+ redeemable_image_url?: string;
232
+ points_required_to_redeem?: number;
233
+ }
234
+ export declare const mapLoyaltyReward: (r: RawLoyaltyReward) => {
235
+ id: number;
236
+ name: string;
237
+ description: string;
238
+ image_url: string;
239
+ points_required: number;
240
+ };
241
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;iBAkB3B,CAAC;AAEH,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,GAAI,GAAG,aAAa;;;;;;;;;;;;;;;;;;CAkB5C,CAAC;AAIH,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,eAAe,GAAI,GAAG,eAAe;;;;;CAKhD,CAAC;AAIH,eAAO,MAAM,iBAAiB;;;;;;;;;iBAS5B,CAAC;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,cAAc,GAAI,GAAG,cAAc,EAAE,cAAc,MAAM,EAAE,WAAW,MAAM;;;;;;;;;CASvF,CAAC;AAIH,eAAO,MAAM,YAAY;;;;;;;;;;;iBAWvB,CAAC;AAEH,MAAM,WAAW,SAAS;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,SAAS,GAAI,GAAG,SAAS;;;;;;;;;;;CAWpC,CAAC;AAIH,eAAO,MAAM,mBAAmB;;;;;;iBAM9B,CAAC;AAEH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,gBAAgB,GAAI,GAAG,gBAAgB;;;;;;CAMlD,CAAC;AAIH,eAAO,MAAM,WAAW;;;;;;;;;;;;iBAYtB,CAAC;AAEH,MAAM,WAAW,QAAQ;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,QAAQ,GAAI,GAAG,QAAQ;;;;;;;;;;;;CAYlC,CAAC;AAIH,eAAO,MAAM,cAAc;;;;iBAIzB,CAAC;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,WAAW,GAAI,GAAG,WAAW;;;;CAIxC,CAAC;AAIH,eAAO,MAAM,mBAAmB;;;;;;iBAM9B,CAAC;AAEH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,eAAO,MAAM,gBAAgB,GAAI,GAAG,gBAAgB;;;;;;CAMlD,CAAC"}
@@ -0,0 +1,168 @@
1
+ import { z } from 'zod';
2
+ // --- Restaurant ---
3
+ export const restaurantSchema = z.object({
4
+ id: z.number().describe('Restaurant ID'),
5
+ name: z.string().describe('Restaurant name'),
6
+ slug: z.string().describe('URL-friendly slug'),
7
+ street_address: z.string().describe('Street address'),
8
+ city: z.string().describe('City'),
9
+ state: z.string().describe('State abbreviation'),
10
+ zip: z.string().describe('ZIP code'),
11
+ phone: z.string().describe('Phone number'),
12
+ latitude: z.number().describe('Latitude coordinate'),
13
+ longitude: z.number().describe('Longitude coordinate'),
14
+ distance: z.number().describe('Distance from search point in miles'),
15
+ is_available: z.boolean().describe('Whether the restaurant is currently available for orders'),
16
+ is_open: z.boolean().describe('Whether the restaurant is currently open'),
17
+ can_deliver: z.boolean().describe('Whether delivery is available'),
18
+ can_pickup: z.boolean().describe('Whether pickup is available'),
19
+ delivery_fee: z.string().describe('Delivery fee amount'),
20
+ ext_ref: z.string().describe('External reference number'),
21
+ });
22
+ export const mapRestaurant = (r) => ({
23
+ id: r.id ?? 0,
24
+ name: r.name ?? '',
25
+ slug: r.slug ?? '',
26
+ street_address: r.streetaddress ?? '',
27
+ city: r.city ?? '',
28
+ state: r.state ?? '',
29
+ zip: r.zip ?? '',
30
+ phone: r.telephone ?? '',
31
+ latitude: r.latitude ?? 0,
32
+ longitude: r.longitude ?? 0,
33
+ distance: r.distance ?? 0,
34
+ is_available: r.isavailable ?? false,
35
+ is_open: r.isopen ?? false,
36
+ can_deliver: r.candeliver ?? false,
37
+ can_pickup: r.canpickup ?? false,
38
+ delivery_fee: r.deliveryfee ?? '0',
39
+ ext_ref: r.extref ?? '',
40
+ });
41
+ // --- Menu Category ---
42
+ export const menuCategorySchema = z.object({
43
+ id: z.number().describe('Category ID'),
44
+ name: z.string().describe('Category name (e.g., "Bigger Plates", "Sides")'),
45
+ description: z.string().describe('Category description'),
46
+ product_count: z.number().int().describe('Number of products in this category'),
47
+ });
48
+ export const mapMenuCategory = (c) => ({
49
+ id: c.id ?? 0,
50
+ name: c.name ?? '',
51
+ description: c.description ?? '',
52
+ product_count: c.products?.length ?? 0,
53
+ });
54
+ // --- Menu Product ---
55
+ export const menuProductSchema = z.object({
56
+ id: z.number().describe('Product ID'),
57
+ name: z.string().describe('Product name (e.g., "Orange Chicken", "Chow Mein")'),
58
+ description: z.string().describe('Product description'),
59
+ cost: z.number().describe('Base cost in dollars'),
60
+ base_calories: z.string().describe('Base calorie count'),
61
+ max_calories: z.string().describe('Maximum calorie count'),
62
+ image_url: z.string().describe('Product image URL'),
63
+ category: z.string().describe('Category name this product belongs to'),
64
+ });
65
+ export const mapMenuProduct = (p, categoryName, imagePath) => ({
66
+ id: p.id ?? 0,
67
+ name: p.name ?? '',
68
+ description: p.description ?? '',
69
+ cost: p.cost ?? 0,
70
+ base_calories: p.basecalories ?? '',
71
+ max_calories: p.maxcalories ?? '',
72
+ image_url: p.images?.[0]?.filename ? `${imagePath}${p.images[0].filename}` : '',
73
+ category: categoryName,
74
+ });
75
+ // --- Basket ---
76
+ export const basketSchema = z.object({
77
+ id: z.string().describe('Basket ID (UUID)'),
78
+ vendor_id: z.number().describe('Restaurant ID'),
79
+ subtotal: z.number().describe('Subtotal before tax'),
80
+ sales_tax: z.number().describe('Sales tax amount'),
81
+ total: z.number().describe('Total amount including tax and fees'),
82
+ product_count: z.number().int().describe('Number of products in the basket'),
83
+ delivery_mode: z.string().describe('Delivery mode (e.g., "pickup", "delivery")'),
84
+ earliest_ready_time: z.string().describe('Earliest ready time as ISO 8601 timestamp'),
85
+ lead_time_minutes: z.number().describe('Estimated lead time in minutes'),
86
+ coupon_discount: z.number().describe('Coupon discount amount'),
87
+ });
88
+ export const mapBasket = (b) => ({
89
+ id: b.id ?? '',
90
+ vendor_id: b.vendorid ?? 0,
91
+ subtotal: b.subtotal ?? 0,
92
+ sales_tax: b.salestax ?? 0,
93
+ total: b.total ?? 0,
94
+ product_count: Array.isArray(b.products) ? b.products.length : 0,
95
+ delivery_mode: b.deliverymode ?? '',
96
+ earliest_ready_time: b.earliestreadytime ?? '',
97
+ lead_time_minutes: b.leadtimeestimateminutes ?? 0,
98
+ coupon_discount: b.coupondiscount ?? 0,
99
+ });
100
+ // --- Basket Product ---
101
+ export const basketProductSchema = z.object({
102
+ id: z.number().describe('Basket product instance ID'),
103
+ product_id: z.number().describe('Product ID from the menu'),
104
+ name: z.string().describe('Product name'),
105
+ quantity: z.number().int().describe('Quantity in basket'),
106
+ total_cost: z.number().describe('Total cost for this line item'),
107
+ });
108
+ export const mapBasketProduct = (p) => ({
109
+ id: p.id ?? 0,
110
+ product_id: p.productId ?? 0,
111
+ name: p.name ?? '',
112
+ quantity: p.quantity ?? 0,
113
+ total_cost: p.totalcost ?? 0,
114
+ });
115
+ // --- Order ---
116
+ export const orderSchema = z.object({
117
+ id: z.string().describe('Order ID'),
118
+ vendor_id: z.number().describe('Restaurant ID'),
119
+ vendor_name: z.string().describe('Restaurant name'),
120
+ status: z.string().describe('Order status'),
121
+ subtotal: z.number().describe('Subtotal before tax'),
122
+ sales_tax: z.number().describe('Sales tax'),
123
+ total: z.number().describe('Total amount'),
124
+ delivery_mode: z.string().describe('Delivery mode (e.g., "pickup", "delivery")'),
125
+ time_placed: z.string().describe('Time order was placed as ISO 8601 timestamp'),
126
+ time_ready: z.string().describe('Estimated ready time'),
127
+ product_count: z.number().int().describe('Number of products in the order'),
128
+ });
129
+ export const mapOrder = (o) => ({
130
+ id: o.id ?? '',
131
+ vendor_id: o.vendorid ?? 0,
132
+ vendor_name: o.vendorname ?? '',
133
+ status: o.status ?? '',
134
+ subtotal: o.subtotal ?? 0,
135
+ sales_tax: o.salestax ?? 0,
136
+ total: o.total ?? 0,
137
+ delivery_mode: o.deliverymode ?? '',
138
+ time_placed: o.timeplaced ?? '',
139
+ time_ready: o.timeready ?? '',
140
+ product_count: Array.isArray(o.products) ? o.products.length : 0,
141
+ });
142
+ // --- Favorite ---
143
+ export const favoriteSchema = z.object({
144
+ id: z.number().describe('Favorite ID'),
145
+ name: z.string().describe('Favorite name'),
146
+ vendor_id: z.number().describe('Restaurant ID'),
147
+ });
148
+ export const mapFavorite = (f) => ({
149
+ id: f.id ?? 0,
150
+ name: f.description ?? '',
151
+ vendor_id: f.vendorid ?? 0,
152
+ });
153
+ // --- Loyalty Reward ---
154
+ export const loyaltyRewardSchema = z.object({
155
+ id: z.number().describe('Reward ID'),
156
+ name: z.string().describe('Reward name'),
157
+ description: z.string().describe('Reward description'),
158
+ image_url: z.string().describe('Reward image URL'),
159
+ points_required: z.number().int().describe('Points required to redeem'),
160
+ });
161
+ export const mapLoyaltyReward = (r) => ({
162
+ id: r.redeemable_id ?? 0,
163
+ name: r.redeemable_name ?? '',
164
+ description: r.redeemable_description ?? '',
165
+ image_url: r.redeemable_image_url ?? '',
166
+ points_required: r.points_required_to_redeem ?? 0,
167
+ });
168
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { z } from 'zod';
2
+ export declare const updateProductQuantity: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ basket_id: z.ZodString;
4
+ basket_product_id: z.ZodNumber;
5
+ quantity: z.ZodNumber;
6
+ }, z.core.$strip>, z.ZodObject<{
7
+ basket: z.ZodObject<{
8
+ id: z.ZodString;
9
+ vendor_id: z.ZodNumber;
10
+ subtotal: z.ZodNumber;
11
+ sales_tax: z.ZodNumber;
12
+ total: z.ZodNumber;
13
+ product_count: z.ZodNumber;
14
+ delivery_mode: z.ZodString;
15
+ earliest_ready_time: z.ZodString;
16
+ lead_time_minutes: z.ZodNumber;
17
+ coupon_discount: z.ZodNumber;
18
+ }, z.core.$strip>;
19
+ }, z.core.$strip>>;
20
+ //# sourceMappingURL=update-product-quantity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-product-quantity.d.ts","sourceRoot":"","sources":["../../src/tools/update-product-quantity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;kBA6BhC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../panda-api.js';
4
+ import { basketSchema, mapBasket } from './schemas.js';
5
+ export const updateProductQuantity = defineTool({
6
+ name: 'update_product_quantity',
7
+ displayName: 'Update Product Quantity',
8
+ description: 'Change the quantity of a product already in the basket. Use the basket product instance ID (from get_basket products list), not the menu product ID. Set quantity to 0 to remove the item.',
9
+ summary: 'Change quantity of an item in your order',
10
+ icon: 'hash',
11
+ group: 'Orders',
12
+ input: z.object({
13
+ basket_id: z.string().describe('Basket ID (UUID)'),
14
+ basket_product_id: z.number().describe('Basket product instance ID (from get_basket products list)'),
15
+ quantity: z.number().int().min(0).describe('New quantity (0 to remove the item)'),
16
+ }),
17
+ output: z.object({
18
+ basket: basketSchema.describe('Updated basket'),
19
+ }),
20
+ handle: async (params) => {
21
+ if (params.quantity === 0) {
22
+ const data = await api(`/baskets/${params.basket_id}/products/${params.basket_product_id}`, {
23
+ method: 'DELETE',
24
+ });
25
+ return { basket: mapBasket(data) };
26
+ }
27
+ const data = await api(`/baskets/${params.basket_id}/products/${params.basket_product_id}`, {
28
+ method: 'PUT',
29
+ body: { quantity: params.quantity },
30
+ });
31
+ return { basket: mapBasket(data) };
32
+ },
33
+ });
34
+ //# sourceMappingURL=update-product-quantity.js.map