@skillhq/concierge 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/cli/program.d.ts.map +1 -1
  2. package/dist/cli/program.js +4 -0
  3. package/dist/cli/program.js.map +1 -1
  4. package/dist/commands/check-availability.d.ts +4 -0
  5. package/dist/commands/check-availability.d.ts.map +1 -0
  6. package/dist/commands/check-availability.js +93 -0
  7. package/dist/commands/check-availability.js.map +1 -0
  8. package/dist/commands/search.d.ts +4 -0
  9. package/dist/commands/search.d.ts.map +1 -0
  10. package/dist/commands/search.js +55 -0
  11. package/dist/commands/search.js.map +1 -0
  12. package/dist/lib/browser/agent-browser-client.d.ts +65 -0
  13. package/dist/lib/browser/agent-browser-client.d.ts.map +1 -0
  14. package/dist/lib/browser/agent-browser-client.js +155 -0
  15. package/dist/lib/browser/agent-browser-client.js.map +1 -0
  16. package/dist/lib/browser/booking-scraper.d.ts +7 -0
  17. package/dist/lib/browser/booking-scraper.d.ts.map +1 -0
  18. package/dist/lib/browser/booking-scraper.js +237 -0
  19. package/dist/lib/browser/booking-scraper.js.map +1 -0
  20. package/dist/lib/browser/types.d.ts +33 -0
  21. package/dist/lib/browser/types.d.ts.map +1 -0
  22. package/dist/lib/browser/types.js +2 -0
  23. package/dist/lib/browser/types.js.map +1 -0
  24. package/dist/lib/call/call-server.d.ts.map +1 -1
  25. package/dist/lib/call/call-server.js +5 -1
  26. package/dist/lib/call/call-server.js.map +1 -1
  27. package/dist/lib/call/call-session.d.ts.map +1 -1
  28. package/dist/lib/call/call-session.js +3 -1
  29. package/dist/lib/call/call-session.js.map +1 -1
  30. package/dist/lib/goplaces.d.ts +43 -0
  31. package/dist/lib/goplaces.d.ts.map +1 -0
  32. package/dist/lib/goplaces.js +142 -0
  33. package/dist/lib/goplaces.js.map +1 -0
  34. package/dist/lib/output.d.ts +4 -0
  35. package/dist/lib/output.d.ts.map +1 -1
  36. package/dist/lib/output.js +134 -0
  37. package/dist/lib/output.js.map +1 -1
  38. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,wBAAgB,aAAa,IAAI,OAAO,CA4BvC"}
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BpC,wBAAgB,aAAa,IAAI,OAAO,CA8BvC"}
@@ -2,8 +2,10 @@ import { createRequire } from 'node:module';
2
2
  import { Command } from 'commander';
3
3
  import kleur from 'kleur';
4
4
  import { callCommand } from '../commands/call.js';
5
+ import { checkAvailabilityCommand } from '../commands/check-availability.js';
5
6
  import { configCommand } from '../commands/config.js';
6
7
  import { findContactCommand } from '../commands/find-contact.js';
8
+ import { searchCommand } from '../commands/search.js';
7
9
  import { serverCommand } from '../commands/server.js';
8
10
  const require = createRequire(import.meta.url);
9
11
  const pkg = require('../../package.json');
@@ -41,6 +43,8 @@ export function createProgram() {
41
43
  configCommand(program, getContext);
42
44
  serverCommand(program, getContext);
43
45
  callCommand(program, getContext);
46
+ searchCommand(program, getContext);
47
+ checkAvailabilityCommand(program, getContext);
44
48
  return program;
45
49
  }
46
50
  //# sourceMappingURL=program.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEjE,SAAS,YAAY;IACnB,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,IAAI;QACnB,SAAS,EAAE,KAAK,CAAC,OAAO;QACxB,OAAO,EAAE,KAAK,CAAC,KAAK;QACpB,KAAK,EAAE,KAAK,CAAC,GAAG;QAChB,OAAO,EAAE,KAAK,CAAC,MAAM;QACrB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,SAAS,EAAE,KAAK,CAAC,IAAI;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,sFAAsF,CAAC;SACnG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAExB,iBAAiB;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IAErF,wBAAwB;IACxB,MAAM,UAAU,GAAG,GAAe,EAAE;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO;YACL,MAAM,EAAE,YAAY,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;YACxB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;SAC/B,CAAC;IACJ,CAAC,CAAC;IAEF,oBAAoB;IACpB,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACxC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEjC,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEjE,SAAS,YAAY;IACnB,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,IAAI;QACnB,SAAS,EAAE,KAAK,CAAC,OAAO;QACxB,OAAO,EAAE,KAAK,CAAC,KAAK;QACpB,KAAK,EAAE,KAAK,CAAC,GAAG;QAChB,OAAO,EAAE,KAAK,CAAC,MAAM;QACrB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,SAAS,EAAE,KAAK,CAAC,IAAI;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,sFAAsF,CAAC;SACnG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAExB,iBAAiB;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IAErF,wBAAwB;IACxB,MAAM,UAAU,GAAG,GAAe,EAAE;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO;YACL,MAAM,EAAE,YAAY,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;YACxB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;SAC/B,CAAC;IACJ,CAAC,CAAC;IAEF,oBAAoB;IACpB,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACxC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACjC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACnC,wBAAwB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAE9C,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import type { CliContext } from '../cli/shared.js';
3
+ export declare function checkAvailabilityCommand(program: Command, getContext: () => CliContext): void;
4
+ //# sourceMappingURL=check-availability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-availability.d.ts","sourceRoot":"","sources":["../../src/commands/check-availability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAsCnD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,GAAG,IAAI,CAiF7F"}
@@ -0,0 +1,93 @@
1
+ import { isAgentBrowserInstalled } from '../lib/browser/agent-browser-client.js';
2
+ import { checkAvailability } from '../lib/browser/booking-scraper.js';
3
+ import { formatAvailabilityResult, formatError, formatVerbose } from '../lib/output.js';
4
+ /**
5
+ * Validate date format (YYYY-MM-DD)
6
+ */
7
+ function isValidDateFormat(dateStr) {
8
+ return /^\d{4}-\d{2}-\d{2}$/.test(dateStr);
9
+ }
10
+ /**
11
+ * Validate date is not in the past
12
+ */
13
+ function isNotPastDate(dateStr) {
14
+ const date = new Date(dateStr);
15
+ const today = new Date();
16
+ today.setHours(0, 0, 0, 0);
17
+ return date >= today;
18
+ }
19
+ /**
20
+ * Validate checkout is after checkin
21
+ */
22
+ function isCheckoutAfterCheckin(checkIn, checkOut) {
23
+ return new Date(checkOut) > new Date(checkIn);
24
+ }
25
+ export function checkAvailabilityCommand(program, getContext) {
26
+ program
27
+ .command('check-availability')
28
+ .alias('ca')
29
+ .alias('availability')
30
+ .description('Check hotel availability and prices on Booking.com')
31
+ .argument('<query>', 'Hotel name or Booking.com URL')
32
+ .requiredOption('-i, --check-in <date>', 'Check-in date (YYYY-MM-DD)')
33
+ .requiredOption('-o, --check-out <date>', 'Check-out date (YYYY-MM-DD)')
34
+ .option('-g, --guests <n>', 'Number of guests (default: 2)')
35
+ .option('-r, --rooms <n>', 'Number of rooms (default: 1)')
36
+ .option('-s, --screenshot <path>', 'Save screenshot of results')
37
+ .option('--headed', 'Show browser window (for debugging)')
38
+ .action(async (query, options) => {
39
+ const ctx = getContext();
40
+ // Check if agent-browser is installed
41
+ if (!isAgentBrowserInstalled()) {
42
+ console.log(formatError('agent-browser CLI is not installed. Install it to use availability checking.', ctx));
43
+ process.exit(1);
44
+ }
45
+ // Validate dates
46
+ if (!isValidDateFormat(options.checkIn)) {
47
+ console.log(formatError('Check-in date must be in YYYY-MM-DD format', ctx));
48
+ process.exit(1);
49
+ }
50
+ if (!isValidDateFormat(options.checkOut)) {
51
+ console.log(formatError('Check-out date must be in YYYY-MM-DD format', ctx));
52
+ process.exit(1);
53
+ }
54
+ if (!isNotPastDate(options.checkIn)) {
55
+ console.log(formatError('Check-in date cannot be in the past', ctx));
56
+ process.exit(1);
57
+ }
58
+ if (!isCheckoutAfterCheckin(options.checkIn, options.checkOut)) {
59
+ console.log(formatError('Check-out date must be after check-in date', ctx));
60
+ process.exit(1);
61
+ }
62
+ // Parse options
63
+ const guests = options.guests ? parseInt(options.guests, 10) : 2;
64
+ const rooms = options.rooms ? parseInt(options.rooms, 10) : 1;
65
+ if (options.guests && (Number.isNaN(guests) || guests < 1)) {
66
+ console.log(formatError('Guests must be a positive number', ctx));
67
+ process.exit(1);
68
+ }
69
+ if (options.rooms && (Number.isNaN(rooms) || rooms < 1)) {
70
+ console.log(formatError('Rooms must be a positive number', ctx));
71
+ process.exit(1);
72
+ }
73
+ const verboseMsg = formatVerbose(`Checking availability for: ${query} (${options.checkIn} to ${options.checkOut})`, ctx);
74
+ if (verboseMsg)
75
+ console.log(verboseMsg);
76
+ // Check availability
77
+ const result = await checkAvailability({
78
+ query,
79
+ checkIn: options.checkIn,
80
+ checkOut: options.checkOut,
81
+ guests,
82
+ rooms,
83
+ screenshot: options.screenshot,
84
+ headed: options.headed,
85
+ });
86
+ if (!result.success) {
87
+ console.log(formatError(result.error, ctx));
88
+ process.exit(1);
89
+ }
90
+ console.log(formatAvailabilityResult(result.data, ctx));
91
+ });
92
+ }
93
+ //# sourceMappingURL=check-availability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-availability.js","sourceRoot":"","sources":["../../src/commands/check-availability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ import type { CliContext } from '../cli/shared.js';
3
+ export declare function searchCommand(program: Command, getContext: () => CliContext): void;
4
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAWnD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,GAAG,IAAI,CA4DlF"}
@@ -0,0 +1,55 @@
1
+ import { isGoplacesInstalled, searchWithDetails } from '../lib/goplaces.js';
2
+ import { formatError, formatSearchResults } from '../lib/output.js';
3
+ export function searchCommand(program, getContext) {
4
+ program
5
+ .command('search')
6
+ .alias('s')
7
+ .description('Search for accommodations using Google Places')
8
+ .argument('<location>', 'Location to search (text query or "lat,lng" coordinates)')
9
+ .option('-l, --limit <n>', 'Maximum number of results (default: 10, max: 20)')
10
+ .option('--min-rating <n>', 'Minimum rating filter (0-5)')
11
+ .option('--type <type>', 'Place type: lodging, hotel, resort_hotel (default: lodging)')
12
+ .option('--radius-m <meters>', 'Search radius in meters (for coordinate searches)')
13
+ .action(async (location, options) => {
14
+ const ctx = getContext();
15
+ // Check if goplaces is installed
16
+ if (!isGoplacesInstalled()) {
17
+ console.log(formatError('goplaces CLI is not installed. No other providers are currently supported.', ctx));
18
+ process.exit(1);
19
+ }
20
+ // Parse options
21
+ const limit = options.limit ? parseInt(options.limit, 10) : 10;
22
+ const minRating = options.minRating ? parseFloat(options.minRating) : undefined;
23
+ const radiusMeters = options.radiusM ? parseInt(options.radiusM, 10) : undefined;
24
+ // Validate options
25
+ if (options.limit && (Number.isNaN(limit) || limit < 1 || limit > 20)) {
26
+ console.log(formatError('Limit must be between 1 and 20', ctx));
27
+ process.exit(1);
28
+ }
29
+ if (options.minRating && (Number.isNaN(minRating) || minRating < 0 || minRating > 5)) {
30
+ console.log(formatError('Minimum rating must be between 0 and 5', ctx));
31
+ process.exit(1);
32
+ }
33
+ if (options.radiusM && (Number.isNaN(radiusMeters) || radiusMeters < 1)) {
34
+ console.log(formatError('Radius must be a positive number', ctx));
35
+ process.exit(1);
36
+ }
37
+ // Search for places
38
+ const result = await searchWithDetails(location, {
39
+ limit,
40
+ minRating,
41
+ type: options.type,
42
+ radiusMeters,
43
+ });
44
+ if (!result.success) {
45
+ console.log(formatError(result.error, ctx));
46
+ process.exit(1);
47
+ }
48
+ if (result.data.length === 0) {
49
+ console.log(formatError('No accommodations found matching your criteria', ctx));
50
+ process.exit(0);
51
+ }
52
+ console.log(formatSearchResults(result.data, ctx));
53
+ });
54
+ }
55
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import type { Result } from '../concierge-client-types.js';
2
+ export interface SnapshotElement {
3
+ ref: string;
4
+ role: string;
5
+ name: string;
6
+ }
7
+ export interface BrowserSnapshot {
8
+ url: string;
9
+ title: string;
10
+ elements: SnapshotElement[];
11
+ raw: string;
12
+ }
13
+ /**
14
+ * Check if agent-browser CLI is installed
15
+ */
16
+ export declare function isAgentBrowserInstalled(): boolean;
17
+ /**
18
+ * Set whether to use headed mode for browser automation
19
+ */
20
+ export declare function setHeadedMode(headed: boolean): void;
21
+ /**
22
+ * Open a URL in the browser
23
+ */
24
+ export declare function openUrl(url: string): Result<string>;
25
+ /**
26
+ * Take a snapshot of the current page (interactive elements)
27
+ */
28
+ export declare function snapshot(): Result<BrowserSnapshot>;
29
+ /**
30
+ * Click an element by ref
31
+ */
32
+ export declare function click(ref: string): Result<string>;
33
+ /**
34
+ * Fill an input by ref
35
+ */
36
+ export declare function fill(ref: string, text: string): Result<string>;
37
+ /**
38
+ * Press a key
39
+ */
40
+ export declare function pressKey(key: string): Result<string>;
41
+ /**
42
+ * Take a screenshot
43
+ */
44
+ export declare function screenshot(path?: string): Result<string>;
45
+ /**
46
+ * Close the browser
47
+ */
48
+ export declare function closeBrowser(): Result<string>;
49
+ /**
50
+ * Wait for the page to load or for an element
51
+ */
52
+ export declare function wait(msOrSelector?: number | string): Result<string>;
53
+ /**
54
+ * Synchronous sleep helper
55
+ */
56
+ export declare function sleep(ms: number): void;
57
+ /**
58
+ * Find an element by partial text match in the snapshot
59
+ */
60
+ export declare function findElementByText(snap: BrowserSnapshot, text: string, role?: string): SnapshotElement | undefined;
61
+ /**
62
+ * Find all elements matching criteria
63
+ */
64
+ export declare function findElements(snap: BrowserSnapshot, predicate: (el: SnapshotElement) => boolean): SnapshotElement[];
65
+ //# sourceMappingURL=agent-browser-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-browser-client.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/agent-browser-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAGjD;AAKD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAEnD;AA6BD;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAEnD;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAAC,eAAe,CAAC,CAgClD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAEjD;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAEpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAMxD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,CAE7C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CASnE;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAKtC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAOjH;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,eAAe,KAAK,OAAO,GAAG,eAAe,EAAE,CAElH"}
@@ -0,0 +1,155 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ /**
3
+ * Check if agent-browser CLI is installed
4
+ */
5
+ export function isAgentBrowserInstalled() {
6
+ const result = spawnSync('which', ['agent-browser'], { stdio: 'pipe' });
7
+ return result.status === 0;
8
+ }
9
+ const SESSION_NAME = 'concierge';
10
+ let useHeadedMode = false;
11
+ /**
12
+ * Set whether to use headed mode for browser automation
13
+ */
14
+ export function setHeadedMode(headed) {
15
+ useHeadedMode = headed;
16
+ }
17
+ /**
18
+ * Run agent-browser command and get output
19
+ */
20
+ function runAgentBrowser(args, timeout = 30000) {
21
+ const baseArgs = ['--session', SESSION_NAME];
22
+ // Add --headed for 'open' command if headed mode is enabled
23
+ if (useHeadedMode && args[0] === 'open') {
24
+ baseArgs.push('--headed');
25
+ }
26
+ const result = spawnSync('agent-browser', [...baseArgs, ...args], {
27
+ stdio: 'pipe',
28
+ encoding: 'utf-8',
29
+ timeout,
30
+ });
31
+ if (result.error) {
32
+ return { success: false, error: `Failed to run agent-browser: ${result.error.message}` };
33
+ }
34
+ if (result.status !== 0) {
35
+ const stderr = result.stderr?.trim() || result.stdout?.trim() || 'Unknown error';
36
+ return { success: false, error: `agent-browser failed: ${stderr}` };
37
+ }
38
+ return { success: true, data: result.stdout };
39
+ }
40
+ /**
41
+ * Open a URL in the browser
42
+ */
43
+ export function openUrl(url) {
44
+ return runAgentBrowser(['open', url], 60000);
45
+ }
46
+ /**
47
+ * Take a snapshot of the current page (interactive elements)
48
+ */
49
+ export function snapshot() {
50
+ const result = runAgentBrowser(['snapshot', '-i'], 30000);
51
+ if (!result.success)
52
+ return result;
53
+ // Parse snapshot output to extract URL and elements
54
+ const lines = result.data.split('\n');
55
+ let url = '';
56
+ let title = '';
57
+ const elements = [];
58
+ for (const line of lines) {
59
+ if (line.startsWith('URL:')) {
60
+ url = line.replace('URL:', '').trim();
61
+ }
62
+ else if (line.startsWith('Title:')) {
63
+ title = line.replace('Title:', '').trim();
64
+ }
65
+ else if (line.match(/^@\w+/)) {
66
+ // Parse element lines like "@e1 button 'Sign in'"
67
+ const match = line.match(/^(@\w+)\s+(\w+)\s+(?:'([^']*)'|"([^"]*)")?/);
68
+ if (match) {
69
+ elements.push({
70
+ ref: match[1],
71
+ role: match[2],
72
+ name: match[3] || match[4] || '',
73
+ });
74
+ }
75
+ }
76
+ }
77
+ return {
78
+ success: true,
79
+ data: { url, title, elements, raw: result.data },
80
+ };
81
+ }
82
+ /**
83
+ * Click an element by ref
84
+ */
85
+ export function click(ref) {
86
+ return runAgentBrowser(['click', ref], 30000);
87
+ }
88
+ /**
89
+ * Fill an input by ref
90
+ */
91
+ export function fill(ref, text) {
92
+ return runAgentBrowser(['fill', ref, text], 30000);
93
+ }
94
+ /**
95
+ * Press a key
96
+ */
97
+ export function pressKey(key) {
98
+ return runAgentBrowser(['key', key], 15000);
99
+ }
100
+ /**
101
+ * Take a screenshot
102
+ */
103
+ export function screenshot(path) {
104
+ const args = ['screenshot'];
105
+ if (path) {
106
+ args.push('-o', path);
107
+ }
108
+ return runAgentBrowser(args, 30000);
109
+ }
110
+ /**
111
+ * Close the browser
112
+ */
113
+ export function closeBrowser() {
114
+ return runAgentBrowser(['close'], 15000);
115
+ }
116
+ /**
117
+ * Wait for the page to load or for an element
118
+ */
119
+ export function wait(msOrSelector) {
120
+ if (typeof msOrSelector === 'number') {
121
+ // Simple delay
122
+ return new Promise((resolve) => {
123
+ setTimeout(() => resolve({ success: true, data: 'waited' }), msOrSelector);
124
+ });
125
+ }
126
+ // Wait for selector (if supported by agent-browser)
127
+ return runAgentBrowser(['wait', msOrSelector?.toString() || '2000'], 60000);
128
+ }
129
+ /**
130
+ * Synchronous sleep helper
131
+ */
132
+ export function sleep(ms) {
133
+ const end = Date.now() + ms;
134
+ while (Date.now() < end) {
135
+ // Busy wait
136
+ }
137
+ }
138
+ /**
139
+ * Find an element by partial text match in the snapshot
140
+ */
141
+ export function findElementByText(snap, text, role) {
142
+ const textLower = text.toLowerCase();
143
+ return snap.elements.find((el) => {
144
+ const nameMatch = el.name.toLowerCase().includes(textLower);
145
+ const roleMatch = !role || el.role === role;
146
+ return nameMatch && roleMatch;
147
+ });
148
+ }
149
+ /**
150
+ * Find all elements matching criteria
151
+ */
152
+ export function findElements(snap, predicate) {
153
+ return snap.elements.filter(predicate);
154
+ }
155
+ //# sourceMappingURL=agent-browser-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-browser-client.js","sourceRoot":"","sources":["../../../src/lib/browser/agent-browser-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAgB/C;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAc,EAAE,OAAO,GAAG,KAAK;IACtD,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC7C,4DAA4D;IAC5D,IAAI,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,eAAe,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE;QAChE,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,OAAO;QACjB,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;IAC3F,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,eAAe,CAAC;QACjF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,MAAM,EAAE,EAAE,CAAC;IACtE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,eAAe,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAEnC,oDAAoD;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,kDAAkD;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YACvE,IAAI,KAAK,EAAE,CAAC;gBACV,QAAQ,CAAC,IAAI,CAAC;oBACZ,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;oBACb,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;oBACd,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;iBACjC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;KACjD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,OAAO,eAAe,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,GAAW,EAAE,IAAY;IAC5C,OAAO,eAAe,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,eAAe,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,MAAM,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,YAA8B;IACjD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACrC,eAAe;QACf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAC7E,CAAC,CAA8B,CAAC;IAClC,CAAC;IACD,oDAAoD;IACpD,OAAO,eAAe,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC5B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;QACxB,YAAY;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAqB,EAAE,IAAY,EAAE,IAAa;IAClF,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;QAC/B,MAAM,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;QAC5C,OAAO,SAAS,IAAI,SAAS,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAqB,EAAE,SAA2C;IAC7F,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Result } from '../concierge-client-types.js';
2
+ import type { AvailabilityResult, AvailabilitySearchParams } from './types.js';
3
+ /**
4
+ * Check availability for a hotel on Booking.com
5
+ */
6
+ export declare function checkAvailability(params: AvailabilitySearchParams): Promise<Result<AvailabilityResult>>;
7
+ //# sourceMappingURL=booking-scraper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booking-scraper.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/booking-scraper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAW3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,wBAAwB,EAAY,MAAM,YAAY,CAAC;AAuLzF;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CA4G7G"}