@skillhq/concierge 1.5.0 → 1.7.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.
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +6 -0
- package/dist/cli/program.js.map +1 -1
- package/dist/commands/check-availability.d.ts +4 -0
- package/dist/commands/check-availability.d.ts.map +1 -0
- package/dist/commands/check-availability.js +93 -0
- package/dist/commands/check-availability.js.map +1 -0
- package/dist/commands/flightqueue.d.ts +4 -0
- package/dist/commands/flightqueue.d.ts.map +1 -0
- package/dist/commands/flightqueue.js +100 -0
- package/dist/commands/flightqueue.js.map +1 -0
- package/dist/commands/search.d.ts +4 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +55 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/lib/browser/agent-browser-client.d.ts +65 -0
- package/dist/lib/browser/agent-browser-client.d.ts.map +1 -0
- package/dist/lib/browser/agent-browser-client.js +155 -0
- package/dist/lib/browser/agent-browser-client.js.map +1 -0
- package/dist/lib/browser/booking-scraper.d.ts +7 -0
- package/dist/lib/browser/booking-scraper.d.ts.map +1 -0
- package/dist/lib/browser/booking-scraper.js +237 -0
- package/dist/lib/browser/booking-scraper.js.map +1 -0
- package/dist/lib/browser/types.d.ts +33 -0
- package/dist/lib/browser/types.d.ts.map +1 -0
- package/dist/lib/browser/types.js +2 -0
- package/dist/lib/browser/types.js.map +1 -0
- package/dist/lib/call/call-server.d.ts.map +1 -1
- package/dist/lib/call/call-server.js +5 -1
- package/dist/lib/call/call-server.js.map +1 -1
- package/dist/lib/call/call-session.d.ts.map +1 -1
- package/dist/lib/call/call-session.js +3 -1
- package/dist/lib/call/call-session.js.map +1 -1
- package/dist/lib/flightqueue-client.d.ts +38 -0
- package/dist/lib/flightqueue-client.d.ts.map +1 -0
- package/dist/lib/flightqueue-client.js +346 -0
- package/dist/lib/flightqueue-client.js.map +1 -0
- package/dist/lib/flightqueue-types.d.ts +42 -0
- package/dist/lib/flightqueue-types.d.ts.map +1 -0
- package/dist/lib/flightqueue-types.js +2 -0
- package/dist/lib/flightqueue-types.js.map +1 -0
- package/dist/lib/goplaces.d.ts +43 -0
- package/dist/lib/goplaces.d.ts.map +1 -0
- package/dist/lib/goplaces.js +142 -0
- package/dist/lib/goplaces.js.map +1 -0
- package/dist/lib/output.d.ts +4 -0
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +134 -0
- package/dist/lib/output.js.map +1 -1
- 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;
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC,wBAAgB,aAAa,IAAI,OAAO,CA+BvC"}
|
package/dist/cli/program.js
CHANGED
|
@@ -2,8 +2,11 @@ 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 { flightqueueCommand } from '../commands/flightqueue.js';
|
|
9
|
+
import { searchCommand } from '../commands/search.js';
|
|
7
10
|
import { serverCommand } from '../commands/server.js';
|
|
8
11
|
const require = createRequire(import.meta.url);
|
|
9
12
|
const pkg = require('../../package.json');
|
|
@@ -38,9 +41,12 @@ export function createProgram() {
|
|
|
38
41
|
};
|
|
39
42
|
// Register commands
|
|
40
43
|
findContactCommand(program, getContext);
|
|
44
|
+
flightqueueCommand(program, getContext);
|
|
41
45
|
configCommand(program, getContext);
|
|
42
46
|
serverCommand(program, getContext);
|
|
43
47
|
callCommand(program, getContext);
|
|
48
|
+
searchCommand(program, getContext);
|
|
49
|
+
checkAvailabilityCommand(program, getContext);
|
|
44
50
|
return program;
|
|
45
51
|
}
|
|
46
52
|
//# sourceMappingURL=program.js.map
|
package/dist/cli/program.js.map
CHANGED
|
@@ -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;
|
|
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,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,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,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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"flightqueue.d.ts","sourceRoot":"","sources":["../../src/commands/flightqueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAqGnD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,GAAG,IAAI,CAwBvF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { FlightQueueClient } from '../lib/flightqueue-client.js';
|
|
2
|
+
import { formatError, formatVerbose } from '../lib/output.js';
|
|
3
|
+
function formatWaitTimeLevel(level) {
|
|
4
|
+
switch (level) {
|
|
5
|
+
case 'fast':
|
|
6
|
+
return 'Fast';
|
|
7
|
+
case 'moderate':
|
|
8
|
+
return 'Moderate';
|
|
9
|
+
case 'busy':
|
|
10
|
+
return 'Busy';
|
|
11
|
+
case 'very_busy':
|
|
12
|
+
return 'Very Busy';
|
|
13
|
+
default:
|
|
14
|
+
return 'Unknown';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function formatFlightQueueData(data, ctx) {
|
|
18
|
+
if (ctx.json) {
|
|
19
|
+
return JSON.stringify(data, null, 2);
|
|
20
|
+
}
|
|
21
|
+
const { colors } = ctx;
|
|
22
|
+
const lines = [];
|
|
23
|
+
// Header
|
|
24
|
+
lines.push('');
|
|
25
|
+
lines.push(colors.highlight('═══════════════════════════════════════════════════════════'));
|
|
26
|
+
lines.push(colors.highlight(` AIRPORT WAIT TIMES: ${data.airport.code}`));
|
|
27
|
+
lines.push(colors.highlight('═══════════════════════════════════════════════════════════'));
|
|
28
|
+
lines.push('');
|
|
29
|
+
// Airport Info
|
|
30
|
+
lines.push(colors.primary('▸ Airport Information'));
|
|
31
|
+
lines.push(` ${colors.muted('Code:')} ${data.airport.code}`);
|
|
32
|
+
lines.push(` ${colors.muted('Name:')} ${data.airport.name}`);
|
|
33
|
+
if (data.airport.city) {
|
|
34
|
+
lines.push(` ${colors.muted('City:')} ${data.airport.city}`);
|
|
35
|
+
}
|
|
36
|
+
if (data.airport.country) {
|
|
37
|
+
lines.push(` ${colors.muted('Country:')} ${data.airport.country}`);
|
|
38
|
+
}
|
|
39
|
+
lines.push('');
|
|
40
|
+
// Wait Times
|
|
41
|
+
lines.push(colors.primary('▸ Current Wait Times'));
|
|
42
|
+
// Security
|
|
43
|
+
const securityColor = data.security.level === 'fast'
|
|
44
|
+
? colors.success
|
|
45
|
+
: data.security.level === 'moderate'
|
|
46
|
+
? colors.warning
|
|
47
|
+
: colors.error;
|
|
48
|
+
const securityTime = data.security.minutes ? `${data.security.minutes} min` : 'N/A';
|
|
49
|
+
lines.push(` ${colors.muted('Security:')} ${securityColor(formatWaitTimeLevel(data.security.level))} (${securityTime})`);
|
|
50
|
+
// Immigration
|
|
51
|
+
const immigrationColor = data.immigration.level === 'fast'
|
|
52
|
+
? colors.success
|
|
53
|
+
: data.immigration.level === 'moderate'
|
|
54
|
+
? colors.warning
|
|
55
|
+
: colors.error;
|
|
56
|
+
const immigrationTime = data.immigration.minutes ? `${data.immigration.minutes} min` : 'N/A';
|
|
57
|
+
lines.push(` ${colors.muted('Immigration:')} ${immigrationColor(formatWaitTimeLevel(data.immigration.level))} (${immigrationTime})`);
|
|
58
|
+
if (data.trafficScore !== null) {
|
|
59
|
+
lines.push(` ${colors.muted('Traffic Score:')} ${data.trafficScore}`);
|
|
60
|
+
}
|
|
61
|
+
lines.push('');
|
|
62
|
+
// Recommended Arrival
|
|
63
|
+
if (data.recommendedArrival.domestic || data.recommendedArrival.international) {
|
|
64
|
+
lines.push(colors.primary('▸ Recommended Arrival'));
|
|
65
|
+
if (data.recommendedArrival.domestic) {
|
|
66
|
+
lines.push(` ${colors.muted('Domestic:')} ${data.recommendedArrival.domestic} min before departure`);
|
|
67
|
+
}
|
|
68
|
+
if (data.recommendedArrival.international) {
|
|
69
|
+
lines.push(` ${colors.muted('International:')} ${data.recommendedArrival.international} min before departure`);
|
|
70
|
+
}
|
|
71
|
+
lines.push('');
|
|
72
|
+
}
|
|
73
|
+
// Footer
|
|
74
|
+
lines.push(colors.muted(`Source: ${data.url}`));
|
|
75
|
+
lines.push(colors.muted(`Fetched: ${data.fetchedAt}`));
|
|
76
|
+
lines.push('');
|
|
77
|
+
return lines.join('\n');
|
|
78
|
+
}
|
|
79
|
+
export function flightqueueCommand(program, getContext) {
|
|
80
|
+
program
|
|
81
|
+
.command('flightqueue')
|
|
82
|
+
.alias('fq')
|
|
83
|
+
.alias('queue')
|
|
84
|
+
.description('Get airport wait times from FlightQueue.com')
|
|
85
|
+
.argument('<airport>', 'Airport code (e.g., HKT) or city name (e.g., Phuket)')
|
|
86
|
+
.action(async (airport) => {
|
|
87
|
+
const ctx = getContext();
|
|
88
|
+
const client = new FlightQueueClient({ verbose: ctx.verbose });
|
|
89
|
+
const verboseMsg = formatVerbose(`Looking up wait times for: ${airport}`, ctx);
|
|
90
|
+
if (verboseMsg)
|
|
91
|
+
console.log(verboseMsg);
|
|
92
|
+
const result = await client.getWaitTimes(airport);
|
|
93
|
+
if (!result.success) {
|
|
94
|
+
console.log(formatError(result.error, ctx));
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
console.log(formatFlightQueueData(result.data, ctx));
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=flightqueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flightqueue.js","sourceRoot":"","sources":["../../src/commands/flightqueue.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|