@opentabs-dev/opentabs-plugin-zillow 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 (65) hide show
  1. package/README.md +159 -0
  2. package/dist/adapter.iife.js +15211 -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 +47 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/tools/get-current-user.d.ts +14 -0
  9. package/dist/tools/get-current-user.d.ts.map +1 -0
  10. package/dist/tools/get-current-user.js +19 -0
  11. package/dist/tools/get-current-user.js.map +1 -0
  12. package/dist/tools/get-market-overview.d.ts +10 -0
  13. package/dist/tools/get-market-overview.d.ts.map +1 -0
  14. package/dist/tools/get-market-overview.js +70 -0
  15. package/dist/tools/get-market-overview.js.map +1 -0
  16. package/dist/tools/get-saved-homes.d.ts +6 -0
  17. package/dist/tools/get-saved-homes.d.ts.map +1 -0
  18. package/dist/tools/get-saved-homes.js +30 -0
  19. package/dist/tools/get-saved-homes.js.map +1 -0
  20. package/dist/tools/schemas.d.ts +99 -0
  21. package/dist/tools/schemas.d.ts.map +1 -0
  22. package/dist/tools/schemas.js +101 -0
  23. package/dist/tools/schemas.js.map +1 -0
  24. package/dist/tools/search-by-address.d.ts +32 -0
  25. package/dist/tools/search-by-address.d.ts.map +1 -0
  26. package/dist/tools/search-by-address.js +49 -0
  27. package/dist/tools/search-by-address.js.map +1 -0
  28. package/dist/tools/search-by-owner.d.ts +51 -0
  29. package/dist/tools/search-by-owner.d.ts.map +1 -0
  30. package/dist/tools/search-by-owner.js +78 -0
  31. package/dist/tools/search-by-owner.js.map +1 -0
  32. package/dist/tools/search-for-rent.d.ts +56 -0
  33. package/dist/tools/search-for-rent.d.ts.map +1 -0
  34. package/dist/tools/search-for-rent.js +86 -0
  35. package/dist/tools/search-for-rent.js.map +1 -0
  36. package/dist/tools/search-for-sale.d.ts +68 -0
  37. package/dist/tools/search-for-sale.d.ts.map +1 -0
  38. package/dist/tools/search-for-sale.js +98 -0
  39. package/dist/tools/search-for-sale.js.map +1 -0
  40. package/dist/tools/search-foreclosures.d.ts +49 -0
  41. package/dist/tools/search-foreclosures.d.ts.map +1 -0
  42. package/dist/tools/search-foreclosures.js +75 -0
  43. package/dist/tools/search-foreclosures.js.map +1 -0
  44. package/dist/tools/search-locations.d.ts +18 -0
  45. package/dist/tools/search-locations.d.ts.map +1 -0
  46. package/dist/tools/search-locations.js +23 -0
  47. package/dist/tools/search-locations.js.map +1 -0
  48. package/dist/tools/search-new-construction.d.ts +51 -0
  49. package/dist/tools/search-new-construction.d.ts.map +1 -0
  50. package/dist/tools/search-new-construction.js +78 -0
  51. package/dist/tools/search-new-construction.js.map +1 -0
  52. package/dist/tools/search-open-houses.d.ts +41 -0
  53. package/dist/tools/search-open-houses.d.ts.map +1 -0
  54. package/dist/tools/search-open-houses.js +59 -0
  55. package/dist/tools/search-open-houses.js.map +1 -0
  56. package/dist/tools/search-recently-sold.d.ts +52 -0
  57. package/dist/tools/search-recently-sold.d.ts.map +1 -0
  58. package/dist/tools/search-recently-sold.js +82 -0
  59. package/dist/tools/search-recently-sold.js.map +1 -0
  60. package/dist/tools.json +2056 -0
  61. package/dist/zillow-api.d.ts +143 -0
  62. package/dist/zillow-api.d.ts.map +1 -0
  63. package/dist/zillow-api.js +82 -0
  64. package/dist/zillow-api.js.map +1 -0
  65. package/package.json +55 -0
@@ -0,0 +1,14 @@
1
+ import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
2
+ import type { ToolDefinition } from '@opentabs-dev/plugin-sdk';
3
+ declare class ZillowPlugin extends OpenTabsPlugin {
4
+ readonly name = "zillow";
5
+ readonly description = "OpenTabs plugin for Zillow real estate search";
6
+ readonly displayName = "Zillow";
7
+ readonly urlPatterns: string[];
8
+ readonly homepage = "https://www.zillow.com";
9
+ readonly tools: ToolDefinition[];
10
+ isReady(): Promise<boolean>;
11
+ }
12
+ declare const _default: ZillowPlugin;
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;AAe/D,cAAM,YAAa,SAAQ,cAAc;IACvC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,mDAAmD;IACvE,SAAkB,WAAW,YAAY;IACzC,QAAQ,CAAC,WAAW,WAA0B;IAC9C,SAAkB,QAAQ,4BAA4B;IACtD,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAkB9B;IAEI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAIlC;;AAED,wBAAkC"}
package/dist/index.js ADDED
@@ -0,0 +1,47 @@
1
+ import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
2
+ import { isAuthenticated, waitForAuth } from './zillow-api.js';
3
+ import { getCurrentUser } from './tools/get-current-user.js';
4
+ import { getMarketOverview } from './tools/get-market-overview.js';
5
+ import { getSavedHomes } from './tools/get-saved-homes.js';
6
+ import { searchByAddress } from './tools/search-by-address.js';
7
+ import { searchByOwner } from './tools/search-by-owner.js';
8
+ import { searchForRent } from './tools/search-for-rent.js';
9
+ import { searchForSale } from './tools/search-for-sale.js';
10
+ import { searchForeclosures } from './tools/search-foreclosures.js';
11
+ import { searchLocations } from './tools/search-locations.js';
12
+ import { searchNewConstruction } from './tools/search-new-construction.js';
13
+ import { searchOpenHouses } from './tools/search-open-houses.js';
14
+ import { searchRecentlySold } from './tools/search-recently-sold.js';
15
+ class ZillowPlugin extends OpenTabsPlugin {
16
+ name = 'zillow';
17
+ description = 'OpenTabs plugin for Zillow real estate search';
18
+ displayName = 'Zillow';
19
+ urlPatterns = ['*://*.zillow.com/*'];
20
+ homepage = 'https://www.zillow.com';
21
+ tools = [
22
+ // Account
23
+ getCurrentUser,
24
+ // Search
25
+ searchLocations,
26
+ searchForSale,
27
+ searchForRent,
28
+ searchRecentlySold,
29
+ searchOpenHouses,
30
+ searchNewConstruction,
31
+ searchForeclosures,
32
+ searchByOwner,
33
+ // Properties
34
+ searchByAddress,
35
+ // Saved Homes
36
+ getSavedHomes,
37
+ // Market
38
+ getMarketOverview,
39
+ ];
40
+ async isReady() {
41
+ if (isAuthenticated())
42
+ return true;
43
+ return waitForAuth();
44
+ }
45
+ }
46
+ export default new ZillowPlugin();
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,iBAAiB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,MAAM,YAAa,SAAQ,cAAc;IAC9B,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,+CAA+C,CAAC;IACrD,WAAW,GAAG,QAAQ,CAAC;IAChC,WAAW,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC5B,QAAQ,GAAG,wBAAwB,CAAC;IAC7C,KAAK,GAAqB;QACjC,UAAU;QACV,cAAc;QACd,SAAS;QACT,eAAe;QACf,aAAa;QACb,aAAa;QACb,kBAAkB;QAClB,gBAAgB;QAChB,qBAAqB;QACrB,kBAAkB;QAClB,aAAa;QACb,aAAa;QACb,eAAe;QACf,cAAc;QACd,aAAa;QACb,SAAS;QACT,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,YAAY,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ export declare const getCurrentUser: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
3
+ user: z.ZodObject<{
4
+ is_logged_in: z.ZodBoolean;
5
+ email: z.ZodString;
6
+ display_name: z.ZodString;
7
+ full_name: z.ZodString;
8
+ guid: z.ZodString;
9
+ zuid: z.ZodString;
10
+ saved_homes_count: z.ZodNumber;
11
+ is_agent: z.ZodBoolean;
12
+ }, z.core.$strip>;
13
+ }, z.core.$strip>>;
14
+ //# sourceMappingURL=get-current-user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-current-user.d.ts","sourceRoot":"","sources":["../../src/tools/get-current-user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,cAAc;;;;;;;;;;;kBAczB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { getUserFromSearchResponse } from '../zillow-api.js';
4
+ import { mapUser, userSchema } from './schemas.js';
5
+ export const getCurrentUser = defineTool({
6
+ name: 'get_current_user',
7
+ displayName: 'Get Current User',
8
+ description: 'Get the currently authenticated Zillow user profile including email, name, saved homes count, and agent status.',
9
+ summary: 'Get the current Zillow user profile',
10
+ icon: 'user',
11
+ group: 'Account',
12
+ input: z.object({}),
13
+ output: z.object({ user: userSchema }),
14
+ handle: async () => {
15
+ const raw = await getUserFromSearchResponse();
16
+ return { user: mapUser(raw) };
17
+ },
18
+ });
19
+ //# sourceMappingURL=get-current-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-current-user.js","sourceRoot":"","sources":["../../src/tools/get-current-user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,kBAAkB;IAC/B,WAAW,EACT,iHAAiH;IACnH,OAAO,EAAE,qCAAqC;IAC9C,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACtC,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAG,MAAM,yBAAyB,EAAE,CAAC;QAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAChC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ export declare const getMarketOverview: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ region_id: z.ZodNumber;
4
+ region_type: z.ZodOptional<z.ZodString>;
5
+ }, z.core.$strip>, z.ZodObject<{
6
+ for_sale_total: z.ZodNumber;
7
+ for_rent_total: z.ZodNumber;
8
+ recently_sold_total: z.ZodNumber;
9
+ }, z.core.$strip>>;
10
+ //# sourceMappingURL=get-market-overview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-market-overview.d.ts","sourceRoot":"","sources":["../../src/tools/get-market-overview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,iBAAiB;;;;;;;kBA+E5B,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { search, REGION_TYPE_MAP } from '../zillow-api.js';
4
+ export const getMarketOverview = defineTool({
5
+ name: 'get_market_overview',
6
+ displayName: 'Get Market Overview',
7
+ description: 'Get a market overview for a location showing total listings counts across categories: for sale, for rent, and recently sold. Useful for understanding market activity in a specific area.',
8
+ summary: 'Get market listing counts for an area',
9
+ icon: 'bar-chart-3',
10
+ group: 'Market',
11
+ input: z.object({
12
+ region_id: z.number().int().describe('Zillow region ID (from search_locations)'),
13
+ region_type: z
14
+ .string()
15
+ .optional()
16
+ .describe('Region type: "city", "county", "zipcode", "neighborhood" (default "city")'),
17
+ }),
18
+ output: z.object({
19
+ for_sale_total: z.number().describe('Total properties for sale'),
20
+ for_rent_total: z.number().describe('Total rental listings'),
21
+ recently_sold_total: z.number().describe('Total recently sold properties'),
22
+ }),
23
+ handle: async (params) => {
24
+ const regionType = REGION_TYPE_MAP[params.region_type ?? 'city'] ?? 6;
25
+ const defaultBounds = { west: -180, east: 180, south: -90, north: 90 };
26
+ // Fetch for-sale count
27
+ const forSaleData = await search({
28
+ mapBounds: defaultBounds,
29
+ regionSelection: [{ regionId: params.region_id, regionType }],
30
+ filterState: {},
31
+ isMapVisible: false,
32
+ }, { cat1: ['total'] });
33
+ // Fetch rental count
34
+ const rentalData = await search({
35
+ mapBounds: defaultBounds,
36
+ regionSelection: [{ regionId: params.region_id, regionType }],
37
+ filterState: {
38
+ isForRent: { value: true },
39
+ isForSaleByAgent: { value: false },
40
+ isForSaleByOwner: { value: false },
41
+ isNewConstruction: { value: false },
42
+ isComingSoon: { value: false },
43
+ isAuction: { value: false },
44
+ isForSaleForeclosure: { value: false },
45
+ },
46
+ isMapVisible: false,
47
+ }, { cat1: ['total'] });
48
+ // Fetch recently sold count
49
+ const soldData = await search({
50
+ mapBounds: defaultBounds,
51
+ regionSelection: [{ regionId: params.region_id, regionType }],
52
+ filterState: {
53
+ isRecentlySold: { value: true },
54
+ isForSaleByAgent: { value: false },
55
+ isForSaleByOwner: { value: false },
56
+ isNewConstruction: { value: false },
57
+ isComingSoon: { value: false },
58
+ isAuction: { value: false },
59
+ isForSaleForeclosure: { value: false },
60
+ },
61
+ isMapVisible: false,
62
+ }, { cat1: ['total'] });
63
+ return {
64
+ for_sale_total: forSaleData.categoryTotals?.cat1?.totalResultCount ?? 0,
65
+ for_rent_total: rentalData.categoryTotals?.cat1?.totalResultCount ?? 0,
66
+ recently_sold_total: soldData.categoryTotals?.cat1?.totalResultCount ?? 0,
67
+ };
68
+ },
69
+ });
70
+ //# sourceMappingURL=get-market-overview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-market-overview.js","sourceRoot":"","sources":["../../src/tools/get-market-overview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod';
2
+ export declare const getSavedHomes: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
3
+ saved_home_zpids: z.ZodArray<z.ZodString>;
4
+ total: z.ZodNumber;
5
+ }, z.core.$strip>>;
6
+ //# sourceMappingURL=get-saved-homes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-saved-homes.d.ts","sourceRoot":"","sources":["../../src/tools/get-saved-homes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,aAAa;;;kBA+BxB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { defineTool, ToolError, getPageGlobal } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { getUserFromSearchResponse } from '../zillow-api.js';
4
+ export const getSavedHomes = defineTool({
5
+ name: 'get_saved_homes',
6
+ displayName: 'Get Saved Homes',
7
+ description: 'Get the list of Zillow property IDs (zpids) that the current user has saved to their favorites. Returns the zpid list and total count. Use search_by_address or search_for_sale with specific zpids to get full property details for saved homes.',
8
+ summary: 'Get saved/favorited home zpids',
9
+ icon: 'heart',
10
+ group: 'Saved Homes',
11
+ input: z.object({}),
12
+ output: z.object({
13
+ saved_home_zpids: z.array(z.string()).describe('Zillow property IDs of saved homes'),
14
+ total: z.number().describe('Total number of saved homes'),
15
+ }),
16
+ handle: async () => {
17
+ const user = await getUserFromSearchResponse();
18
+ if (!user.isLoggedIn) {
19
+ throw ToolError.auth('Not logged in — please log in to Zillow to view saved homes.');
20
+ }
21
+ // savedHomeIds is only available from the full page __NEXT_DATA__, not from the search API response
22
+ const pageUser = getPageGlobal('__NEXT_DATA__.props.pageProps.searchPageState.user');
23
+ const zpids = pageUser?.savedHomeIds ?? [];
24
+ return {
25
+ saved_home_zpids: zpids,
26
+ total: user.savedHomesCount ?? zpids.length,
27
+ };
28
+ },
29
+ });
30
+ //# sourceMappingURL=get-saved-homes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-saved-homes.js","sourceRoot":"","sources":["../../src/tools/get-saved-homes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EACT,mPAAmP;IACrP,OAAO,EAAE,gCAAgC;IACzC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,aAAa;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACpF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC1D,CAAC;IACF,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,MAAM,yBAAyB,EAAE,CAAC;QAE/C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,SAAS,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QACvF,CAAC;QAED,oGAAoG;QACpG,MAAM,QAAQ,GAAG,aAAa,CAAC,oDAAoD,CAEtE,CAAC;QACd,MAAM,KAAK,GAAG,QAAQ,EAAE,YAAY,IAAI,EAAE,CAAC;QAE3C,OAAO;YACL,gBAAgB,EAAE,KAAK;YACvB,KAAK,EAAE,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,MAAM;SAC5C,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { z } from 'zod';
2
+ import type { RawListing, RawSearchUser, AutocompleteResult } from '../zillow-api.js';
3
+ export declare const listingSchema: z.ZodObject<{
4
+ zpid: z.ZodString;
5
+ address: z.ZodString;
6
+ street: z.ZodString;
7
+ city: z.ZodString;
8
+ state: z.ZodString;
9
+ zipcode: z.ZodString;
10
+ price: z.ZodString;
11
+ price_raw: z.ZodNumber;
12
+ beds: z.ZodNumber;
13
+ baths: z.ZodNumber;
14
+ sqft: z.ZodNumber;
15
+ status: z.ZodString;
16
+ status_text: z.ZodString;
17
+ home_type: z.ZodString;
18
+ days_on_zillow: z.ZodNumber;
19
+ zestimate: z.ZodNumber;
20
+ rent_zestimate: z.ZodNumber;
21
+ tax_assessed_value: z.ZodNumber;
22
+ latitude: z.ZodNumber;
23
+ longitude: z.ZodNumber;
24
+ image_url: z.ZodString;
25
+ detail_url: z.ZodString;
26
+ is_saved: z.ZodBoolean;
27
+ has_3d_model: z.ZodBoolean;
28
+ }, z.core.$strip>;
29
+ export declare const mapListing: (l: RawListing) => {
30
+ zpid: string;
31
+ address: string;
32
+ street: string;
33
+ city: string;
34
+ state: string;
35
+ zipcode: string;
36
+ price: string;
37
+ price_raw: number;
38
+ beds: number;
39
+ baths: number;
40
+ sqft: number;
41
+ status: string;
42
+ status_text: string;
43
+ home_type: string;
44
+ days_on_zillow: number;
45
+ zestimate: number;
46
+ rent_zestimate: number;
47
+ tax_assessed_value: number;
48
+ latitude: number;
49
+ longitude: number;
50
+ image_url: string;
51
+ detail_url: string;
52
+ is_saved: boolean;
53
+ has_3d_model: boolean;
54
+ };
55
+ export declare const userSchema: z.ZodObject<{
56
+ is_logged_in: z.ZodBoolean;
57
+ email: z.ZodString;
58
+ display_name: z.ZodString;
59
+ full_name: z.ZodString;
60
+ guid: z.ZodString;
61
+ zuid: z.ZodString;
62
+ saved_homes_count: z.ZodNumber;
63
+ is_agent: z.ZodBoolean;
64
+ }, z.core.$strip>;
65
+ export declare const mapUser: (u: RawSearchUser) => {
66
+ is_logged_in: boolean;
67
+ email: string;
68
+ display_name: string;
69
+ full_name: string;
70
+ guid: string;
71
+ zuid: string;
72
+ saved_homes_count: number;
73
+ is_agent: boolean;
74
+ };
75
+ export declare const locationSchema: z.ZodObject<{
76
+ display: z.ZodString;
77
+ type: z.ZodString;
78
+ city: z.ZodString;
79
+ state: z.ZodString;
80
+ county: z.ZodString;
81
+ region_id: z.ZodNumber;
82
+ region_type: z.ZodString;
83
+ latitude: z.ZodNumber;
84
+ longitude: z.ZodNumber;
85
+ zpid: z.ZodNumber;
86
+ }, z.core.$strip>;
87
+ export declare const mapLocation: (r: AutocompleteResult) => {
88
+ display: string;
89
+ type: string;
90
+ city: string;
91
+ state: string;
92
+ county: string;
93
+ region_id: number;
94
+ region_type: string;
95
+ latitude: number;
96
+ longitude: number;
97
+ zpid: number;
98
+ };
99
+ //# 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;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAItF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;iBAyBxB,CAAC;AAEH,eAAO,MAAM,UAAU,GAAI,GAAG,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;CAyBtC,CAAC;AAIH,eAAO,MAAM,UAAU;;;;;;;;;iBASrB,CAAC;AAEH,eAAO,MAAM,OAAO,GAAI,GAAG,aAAa;;;;;;;;;CAStC,CAAC;AAIH,eAAO,MAAM,cAAc;;;;;;;;;;;iBAWzB,CAAC;AAEH,eAAO,MAAM,WAAW,GAAI,GAAG,kBAAkB;;;;;;;;;;;CAW/C,CAAC"}
@@ -0,0 +1,101 @@
1
+ import { z } from 'zod';
2
+ // --- Listing schema ---
3
+ export const listingSchema = z.object({
4
+ zpid: z.string().describe('Zillow property ID'),
5
+ address: z.string().describe('Full address'),
6
+ street: z.string().describe('Street address'),
7
+ city: z.string().describe('City'),
8
+ state: z.string().describe('State abbreviation'),
9
+ zipcode: z.string().describe('ZIP code'),
10
+ price: z.string().describe('Formatted price (e.g., "$500,000" or "$4,085/mo")'),
11
+ price_raw: z.number().describe('Numeric price in dollars'),
12
+ beds: z.number().describe('Number of bedrooms'),
13
+ baths: z.number().describe('Number of bathrooms'),
14
+ sqft: z.number().describe('Living area in square feet'),
15
+ status: z.string().describe('Listing status (FOR_SALE, FOR_RENT, RECENTLY_SOLD)'),
16
+ status_text: z.string().describe('Human-readable status (e.g., "Condo for sale")'),
17
+ home_type: z.string().describe('Property type (SINGLE_FAMILY, CONDO, TOWNHOUSE, etc.)'),
18
+ days_on_zillow: z.number().describe('Days listed on Zillow'),
19
+ zestimate: z.number().describe('Zillow Zestimate value in dollars (0 if unavailable)'),
20
+ rent_zestimate: z.number().describe('Estimated monthly rent in dollars (0 if unavailable)'),
21
+ tax_assessed_value: z.number().describe('Tax assessed value in dollars (0 if unavailable)'),
22
+ latitude: z.number().describe('Latitude coordinate'),
23
+ longitude: z.number().describe('Longitude coordinate'),
24
+ image_url: z.string().describe('Primary listing photo URL'),
25
+ detail_url: z.string().describe('URL to the property detail page on Zillow'),
26
+ is_saved: z.boolean().describe("Whether the property is saved to the user's favorites"),
27
+ has_3d_model: z.boolean().describe('Whether a 3D virtual tour is available'),
28
+ });
29
+ export const mapListing = (l) => ({
30
+ zpid: l.zpid ?? '',
31
+ address: l.address ?? '',
32
+ street: l.addressStreet ?? '',
33
+ city: l.addressCity ?? l.hdpData?.homeInfo?.city ?? '',
34
+ state: l.addressState ?? l.hdpData?.homeInfo?.state ?? '',
35
+ zipcode: l.addressZipcode ?? l.hdpData?.homeInfo?.zipcode ?? '',
36
+ price: l.price ?? '',
37
+ price_raw: l.unformattedPrice ?? l.hdpData?.homeInfo?.price ?? 0,
38
+ beds: l.beds ?? l.hdpData?.homeInfo?.bedrooms ?? 0,
39
+ baths: l.baths ?? l.hdpData?.homeInfo?.bathrooms ?? 0,
40
+ sqft: l.area ?? l.hdpData?.homeInfo?.livingArea ?? 0,
41
+ status: l.statusType ?? l.hdpData?.homeInfo?.homeStatus ?? '',
42
+ status_text: l.statusText ?? '',
43
+ home_type: l.hdpData?.homeInfo?.homeType ?? '',
44
+ days_on_zillow: l.hdpData?.homeInfo?.daysOnZillow ?? 0,
45
+ zestimate: l.zestimate ?? l.hdpData?.homeInfo?.zestimate ?? 0,
46
+ rent_zestimate: l.hdpData?.homeInfo?.rentZestimate ?? 0,
47
+ tax_assessed_value: l.hdpData?.homeInfo?.taxAssessedValue ?? 0,
48
+ latitude: l.latLong?.latitude ?? l.hdpData?.homeInfo?.latitude ?? 0,
49
+ longitude: l.latLong?.longitude ?? l.hdpData?.homeInfo?.longitude ?? 0,
50
+ image_url: l.imgSrc ?? '',
51
+ detail_url: l.detailUrl ?? '',
52
+ is_saved: l.isSaved ?? false,
53
+ has_3d_model: l.has3DModel ?? false,
54
+ });
55
+ // --- User schema ---
56
+ export const userSchema = z.object({
57
+ is_logged_in: z.boolean().describe('Whether the user is logged in'),
58
+ email: z.string().describe('User email address'),
59
+ display_name: z.string().describe('User display name'),
60
+ full_name: z.string().describe('User full name'),
61
+ guid: z.string().describe('Global user ID'),
62
+ zuid: z.string().describe('Zillow user ID'),
63
+ saved_homes_count: z.number().describe('Number of saved homes'),
64
+ is_agent: z.boolean().describe('Whether the user is a real estate agent'),
65
+ });
66
+ export const mapUser = (u) => ({
67
+ is_logged_in: u.isLoggedIn ?? false,
68
+ email: u.email ?? '',
69
+ display_name: u.displayName ?? '',
70
+ full_name: u.fullName ?? '',
71
+ guid: u.guid ?? '',
72
+ zuid: u.zuid ?? '',
73
+ saved_homes_count: u.savedHomesCount ?? 0,
74
+ is_agent: u.isAgent ?? false,
75
+ });
76
+ // --- Location schema ---
77
+ export const locationSchema = z.object({
78
+ display: z.string().describe('Display text for the location'),
79
+ type: z.string().describe('Result type (Region, Address)'),
80
+ city: z.string().describe('City name'),
81
+ state: z.string().describe('State abbreviation'),
82
+ county: z.string().describe('County name'),
83
+ region_id: z.number().describe('Zillow region ID (use with search tools)'),
84
+ region_type: z.string().describe('Region type (city, zipcode, neighborhood, county)'),
85
+ latitude: z.number().describe('Latitude coordinate'),
86
+ longitude: z.number().describe('Longitude coordinate'),
87
+ zpid: z.number().describe('Zillow property ID (for address results, 0 otherwise)'),
88
+ });
89
+ export const mapLocation = (r) => ({
90
+ display: r.display ?? '',
91
+ type: r.resultType ?? '',
92
+ city: r.metaData?.city ?? '',
93
+ state: r.metaData?.state ?? '',
94
+ county: r.metaData?.county ?? '',
95
+ region_id: r.metaData?.regionId ?? 0,
96
+ region_type: r.metaData?.regionType ?? '',
97
+ latitude: r.metaData?.lat ?? 0,
98
+ longitude: r.metaData?.lng ?? 0,
99
+ zpid: r.metaData?.zpid ?? 0,
100
+ });
101
+ //# 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,32 @@
1
+ import { z } from 'zod';
2
+ export declare const searchByAddress: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ address: z.ZodString;
4
+ }, z.core.$strip>, z.ZodObject<{
5
+ listings: z.ZodArray<z.ZodObject<{
6
+ zpid: z.ZodString;
7
+ address: z.ZodString;
8
+ street: z.ZodString;
9
+ city: z.ZodString;
10
+ state: z.ZodString;
11
+ zipcode: z.ZodString;
12
+ price: z.ZodString;
13
+ price_raw: z.ZodNumber;
14
+ beds: z.ZodNumber;
15
+ baths: z.ZodNumber;
16
+ sqft: z.ZodNumber;
17
+ status: z.ZodString;
18
+ status_text: z.ZodString;
19
+ home_type: z.ZodString;
20
+ days_on_zillow: z.ZodNumber;
21
+ zestimate: z.ZodNumber;
22
+ rent_zestimate: z.ZodNumber;
23
+ tax_assessed_value: z.ZodNumber;
24
+ latitude: z.ZodNumber;
25
+ longitude: z.ZodNumber;
26
+ image_url: z.ZodString;
27
+ detail_url: z.ZodString;
28
+ is_saved: z.ZodBoolean;
29
+ has_3d_model: z.ZodBoolean;
30
+ }, z.core.$strip>>;
31
+ }, z.core.$strip>>;
32
+ //# sourceMappingURL=search-by-address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-by-address.d.ts","sourceRoot":"","sources":["../../src/tools/search-by-address.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqD1B,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { defineTool, ToolError } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { autocomplete, search } from '../zillow-api.js';
4
+ import { listingSchema, mapListing } from './schemas.js';
5
+ export const searchByAddress = defineTool({
6
+ name: 'search_by_address',
7
+ displayName: 'Search by Address',
8
+ description: 'Look up a specific property by its street address. First resolves the address to coordinates via autocomplete, then searches for matching properties nearby. Returns the closest matching listing with full details including Zestimate, tax assessment, and rental estimate.',
9
+ summary: 'Look up a property by street address',
10
+ icon: 'map-pin',
11
+ group: 'Properties',
12
+ input: z.object({
13
+ address: z.string().min(1).describe('Street address to look up (e.g., "123 Main St, San Francisco, CA")'),
14
+ }),
15
+ output: z.object({
16
+ listings: z.array(listingSchema).describe('Matching properties (usually 1 for exact address match)'),
17
+ }),
18
+ handle: async (params) => {
19
+ const results = await autocomplete(params.address);
20
+ const addressResult = results.find(r => r.resultType === 'Address');
21
+ if (!addressResult?.metaData?.lat || !addressResult?.metaData?.lng) {
22
+ throw ToolError.notFound(`No property found for address: ${params.address}`);
23
+ }
24
+ const lat = addressResult.metaData.lat;
25
+ const lng = addressResult.metaData.lng;
26
+ const delta = 0.005;
27
+ const data = await search({
28
+ mapBounds: {
29
+ west: lng - delta,
30
+ east: lng + delta,
31
+ south: lat - delta,
32
+ north: lat + delta,
33
+ },
34
+ filterState: {},
35
+ isMapVisible: true,
36
+ }, { cat1: ['listResults'] });
37
+ const listings = data.cat1?.searchResults?.listResults ?? [];
38
+ // If autocomplete returned a zpid, filter to that specific property
39
+ if (addressResult.metaData.zpid) {
40
+ const zpidStr = String(addressResult.metaData.zpid);
41
+ const match = listings.filter(l => l.zpid === zpidStr);
42
+ if (match.length > 0) {
43
+ return { listings: match.map(mapListing) };
44
+ }
45
+ }
46
+ return { listings: listings.slice(0, 5).map(mapListing) };
47
+ },
48
+ });
49
+ //# sourceMappingURL=search-by-address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-by-address.js","sourceRoot":"","sources":["../../src/tools/search-by-address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;IACxC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,mBAAmB;IAChC,WAAW,EACT,+QAA+Q;IACjR,OAAO,EAAE,sCAAsC;IAC/C,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oEAAoE,CAAC;KAC1G,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,yDAAyD,CAAC;KACrG,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;QAEpE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;YACnE,MAAM,SAAS,CAAC,QAAQ,CAAC,kCAAkC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;QACvC,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC;QAEpB,MAAM,IAAI,GAAG,MAAM,MAAM,CACvB;YACE,SAAS,EAAE;gBACT,IAAI,EAAE,GAAG,GAAG,KAAK;gBACjB,IAAI,EAAE,GAAG,GAAG,KAAK;gBACjB,KAAK,EAAE,GAAG,GAAG,KAAK;gBAClB,KAAK,EAAE,GAAG,GAAG,KAAK;aACnB;YACD,WAAW,EAAE,EAAE;YACf,YAAY,EAAE,IAAI;SACnB,EACD,EAAE,IAAI,EAAE,CAAC,aAAa,CAAC,EAAE,CAC1B,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,IAAI,EAAE,CAAC;QAE7D,oEAAoE;QACpE,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;IAC5D,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { z } from 'zod';
2
+ export declare const searchByOwner: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ region_id: z.ZodOptional<z.ZodNumber>;
4
+ region_type: z.ZodOptional<z.ZodString>;
5
+ map_bounds: z.ZodOptional<z.ZodObject<{
6
+ west: z.ZodNumber;
7
+ east: z.ZodNumber;
8
+ south: z.ZodNumber;
9
+ north: z.ZodNumber;
10
+ }, z.core.$strip>>;
11
+ min_price: z.ZodOptional<z.ZodNumber>;
12
+ max_price: z.ZodOptional<z.ZodNumber>;
13
+ min_beds: z.ZodOptional<z.ZodNumber>;
14
+ sort: z.ZodOptional<z.ZodEnum<{
15
+ globalrelevanceex: "globalrelevanceex";
16
+ days: "days";
17
+ pricea: "pricea";
18
+ priced: "priced";
19
+ size: "size";
20
+ }>>;
21
+ page: z.ZodOptional<z.ZodNumber>;
22
+ }, z.core.$strip>, z.ZodObject<{
23
+ total: z.ZodNumber;
24
+ listings: z.ZodArray<z.ZodObject<{
25
+ zpid: z.ZodString;
26
+ address: z.ZodString;
27
+ street: z.ZodString;
28
+ city: z.ZodString;
29
+ state: z.ZodString;
30
+ zipcode: z.ZodString;
31
+ price: z.ZodString;
32
+ price_raw: z.ZodNumber;
33
+ beds: z.ZodNumber;
34
+ baths: z.ZodNumber;
35
+ sqft: z.ZodNumber;
36
+ status: z.ZodString;
37
+ status_text: z.ZodString;
38
+ home_type: z.ZodString;
39
+ days_on_zillow: z.ZodNumber;
40
+ zestimate: z.ZodNumber;
41
+ rent_zestimate: z.ZodNumber;
42
+ tax_assessed_value: z.ZodNumber;
43
+ latitude: z.ZodNumber;
44
+ longitude: z.ZodNumber;
45
+ image_url: z.ZodString;
46
+ detail_url: z.ZodString;
47
+ is_saved: z.ZodBoolean;
48
+ has_3d_model: z.ZodBoolean;
49
+ }, z.core.$strip>>;
50
+ }, z.core.$strip>>;
51
+ //# sourceMappingURL=search-by-owner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-by-owner.d.ts","sourceRoot":"","sources":["../../src/tools/search-by-owner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8ExB,CAAC"}