@skillhq/concierge 1.5.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/README.md +91 -0
- package/dist/cli/program.d.ts +3 -0
- package/dist/cli/program.d.ts.map +1 -0
- package/dist/cli/program.js +46 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/shared.d.ts +18 -0
- package/dist/cli/shared.d.ts.map +1 -0
- package/dist/cli/shared.js +2 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/call.d.ts +7 -0
- package/dist/commands/call.d.ts.map +1 -0
- package/dist/commands/call.js +409 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +120 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/find-contact.d.ts +4 -0
- package/dist/commands/find-contact.d.ts.map +1 -0
- package/dist/commands/find-contact.js +57 -0
- package/dist/commands/find-contact.js.map +1 -0
- package/dist/commands/server.d.ts +7 -0
- package/dist/commands/server.d.ts.map +1 -0
- package/dist/commands/server.js +212 -0
- package/dist/commands/server.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/call/audio/mulaw.d.ts +35 -0
- package/dist/lib/call/audio/mulaw.d.ts.map +1 -0
- package/dist/lib/call/audio/mulaw.js +109 -0
- package/dist/lib/call/audio/mulaw.js.map +1 -0
- package/dist/lib/call/audio/pcm-utils.d.ts +62 -0
- package/dist/lib/call/audio/pcm-utils.d.ts.map +1 -0
- package/dist/lib/call/audio/pcm-utils.js +149 -0
- package/dist/lib/call/audio/pcm-utils.js.map +1 -0
- package/dist/lib/call/audio/resample.d.ts +34 -0
- package/dist/lib/call/audio/resample.d.ts.map +1 -0
- package/dist/lib/call/audio/resample.js +97 -0
- package/dist/lib/call/audio/resample.js.map +1 -0
- package/dist/lib/call/audio/streaming-decoder.d.ts +45 -0
- package/dist/lib/call/audio/streaming-decoder.d.ts.map +1 -0
- package/dist/lib/call/audio/streaming-decoder.js +110 -0
- package/dist/lib/call/audio/streaming-decoder.js.map +1 -0
- package/dist/lib/call/call-server.d.ts +110 -0
- package/dist/lib/call/call-server.d.ts.map +1 -0
- package/dist/lib/call/call-server.js +681 -0
- package/dist/lib/call/call-server.js.map +1 -0
- package/dist/lib/call/call-session.d.ts +133 -0
- package/dist/lib/call/call-session.d.ts.map +1 -0
- package/dist/lib/call/call-session.js +890 -0
- package/dist/lib/call/call-session.js.map +1 -0
- package/dist/lib/call/call-types.d.ts +133 -0
- package/dist/lib/call/call-types.d.ts.map +1 -0
- package/dist/lib/call/call-types.js +16 -0
- package/dist/lib/call/call-types.js.map +1 -0
- package/dist/lib/call/conversation-ai.d.ts +56 -0
- package/dist/lib/call/conversation-ai.d.ts.map +1 -0
- package/dist/lib/call/conversation-ai.js +276 -0
- package/dist/lib/call/conversation-ai.js.map +1 -0
- package/dist/lib/call/eval/codec-test.d.ts +45 -0
- package/dist/lib/call/eval/codec-test.d.ts.map +1 -0
- package/dist/lib/call/eval/codec-test.js +169 -0
- package/dist/lib/call/eval/codec-test.js.map +1 -0
- package/dist/lib/call/eval/conversation-scripts.d.ts +55 -0
- package/dist/lib/call/eval/conversation-scripts.d.ts.map +1 -0
- package/dist/lib/call/eval/conversation-scripts.js +359 -0
- package/dist/lib/call/eval/conversation-scripts.js.map +1 -0
- package/dist/lib/call/eval/eval-runner.d.ts +64 -0
- package/dist/lib/call/eval/eval-runner.d.ts.map +1 -0
- package/dist/lib/call/eval/eval-runner.js +369 -0
- package/dist/lib/call/eval/eval-runner.js.map +1 -0
- package/dist/lib/call/eval/index.d.ts +9 -0
- package/dist/lib/call/eval/index.d.ts.map +1 -0
- package/dist/lib/call/eval/index.js +9 -0
- package/dist/lib/call/eval/index.js.map +1 -0
- package/dist/lib/call/eval/integration-test-suite.d.ts +71 -0
- package/dist/lib/call/eval/integration-test-suite.d.ts.map +1 -0
- package/dist/lib/call/eval/integration-test-suite.js +519 -0
- package/dist/lib/call/eval/integration-test-suite.js.map +1 -0
- package/dist/lib/call/eval/turn-taking-test.d.ts +84 -0
- package/dist/lib/call/eval/turn-taking-test.d.ts.map +1 -0
- package/dist/lib/call/eval/turn-taking-test.js +260 -0
- package/dist/lib/call/eval/turn-taking-test.js.map +1 -0
- package/dist/lib/call/index.d.ts +12 -0
- package/dist/lib/call/index.d.ts.map +1 -0
- package/dist/lib/call/index.js +17 -0
- package/dist/lib/call/index.js.map +1 -0
- package/dist/lib/call/providers/deepgram.d.ts +81 -0
- package/dist/lib/call/providers/deepgram.d.ts.map +1 -0
- package/dist/lib/call/providers/deepgram.js +279 -0
- package/dist/lib/call/providers/deepgram.js.map +1 -0
- package/dist/lib/call/providers/elevenlabs.d.ts +78 -0
- package/dist/lib/call/providers/elevenlabs.d.ts.map +1 -0
- package/dist/lib/call/providers/elevenlabs.js +272 -0
- package/dist/lib/call/providers/elevenlabs.js.map +1 -0
- package/dist/lib/call/providers/local-deps.d.ts +18 -0
- package/dist/lib/call/providers/local-deps.d.ts.map +1 -0
- package/dist/lib/call/providers/local-deps.js +114 -0
- package/dist/lib/call/providers/local-deps.js.map +1 -0
- package/dist/lib/call/providers/twilio.d.ts +53 -0
- package/dist/lib/call/providers/twilio.d.ts.map +1 -0
- package/dist/lib/call/providers/twilio.js +173 -0
- package/dist/lib/call/providers/twilio.js.map +1 -0
- package/dist/lib/concierge-client-types.d.ts +68 -0
- package/dist/lib/concierge-client-types.d.ts.map +1 -0
- package/dist/lib/concierge-client-types.js +2 -0
- package/dist/lib/concierge-client-types.js.map +1 -0
- package/dist/lib/concierge-client.d.ts +29 -0
- package/dist/lib/concierge-client.d.ts.map +1 -0
- package/dist/lib/concierge-client.js +534 -0
- package/dist/lib/concierge-client.js.map +1 -0
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +66 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/output.d.ts +7 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +114 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/utils/contact-extractor.d.ts +12 -0
- package/dist/lib/utils/contact-extractor.d.ts.map +1 -0
- package/dist/lib/utils/contact-extractor.js +159 -0
- package/dist/lib/utils/contact-extractor.js.map +1 -0
- package/dist/lib/utils/formatters.d.ts +15 -0
- package/dist/lib/utils/formatters.d.ts.map +1 -0
- package/dist/lib/utils/formatters.js +107 -0
- package/dist/lib/utils/formatters.js.map +1 -0
- package/dist/lib/utils/url-parser.d.ts +11 -0
- package/dist/lib/utils/url-parser.d.ts.map +1 -0
- package/dist/lib/utils/url-parser.js +103 -0
- package/dist/lib/utils/url-parser.js.map +1 -0
- package/package.json +67 -0
package/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Travel Concierge
|
|
2
|
+
|
|
3
|
+
Find accommodation contact details and place AI-powered booking calls.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
skill install @skillhq/concierge
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Contact Extraction**: Find phone, email, WhatsApp, and social media contacts from Airbnb, Booking.com, VRBO, and Expedia listings
|
|
14
|
+
- **AI Phone Calls**: Place autonomous phone calls with a goal-driven AI agent that handles the conversation until the goal is achieved
|
|
15
|
+
|
|
16
|
+
## System Dependencies (AI Calls)
|
|
17
|
+
|
|
18
|
+
AI calls require local binaries in addition to API keys:
|
|
19
|
+
|
|
20
|
+
- `ffmpeg` (must include MP3 decode support)
|
|
21
|
+
- `ngrok` (used when `call` auto-starts infrastructure)
|
|
22
|
+
|
|
23
|
+
Install examples:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# macOS
|
|
27
|
+
brew install ffmpeg ngrok
|
|
28
|
+
|
|
29
|
+
# Ubuntu/Debian (including ARM VPS)
|
|
30
|
+
sudo apt-get update
|
|
31
|
+
sudo apt-get install -y ffmpeg
|
|
32
|
+
# install ngrok from ngrok docs, then verify `ngrok version`
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Verify locally:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
ffmpeg -version
|
|
39
|
+
ffmpeg -decoders | rg -i mp3
|
|
40
|
+
ngrok version
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The call preflight now fails fast with a clear error if these dependencies are missing or if ffmpeg cannot decode MP3.
|
|
44
|
+
|
|
45
|
+
## Quick Start
|
|
46
|
+
|
|
47
|
+
### Find contacts for a listing
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
concierge find-contact "https://www.airbnb.com/rooms/12345"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Place an AI booking call
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
concierge call "+1-555-123-4567" \
|
|
57
|
+
--goal "Book a room for March 12-14" \
|
|
58
|
+
--name "John Smith" \
|
|
59
|
+
--email "john@example.com" \
|
|
60
|
+
--customer-phone "+1-555-000-1111"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Configuration
|
|
64
|
+
|
|
65
|
+
Configuration is stored in `~/.config/concierge/config.json5`.
|
|
66
|
+
|
|
67
|
+
### For contact lookup (optional)
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
concierge config set googlePlacesApiKey "your-key"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### For AI phone calls (required)
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
concierge config set twilioAccountSid "<sid>"
|
|
77
|
+
concierge config set twilioAuthToken "<token>"
|
|
78
|
+
concierge config set twilioPhoneNumber "+14155551234"
|
|
79
|
+
concierge config set deepgramApiKey "<key>"
|
|
80
|
+
concierge config set elevenLabsApiKey "<key>"
|
|
81
|
+
concierge config set elevenLabsVoiceId "EXAVITQu4vr4xnSDxMaL"
|
|
82
|
+
concierge config set anthropicApiKey "<key>"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Documentation
|
|
86
|
+
|
|
87
|
+
See [SKILL.md](./SKILL.md) and [CALL-SETUP.md](./CALL-SETUP.md) for full setup and troubleshooting.
|
|
88
|
+
|
|
89
|
+
## License
|
|
90
|
+
|
|
91
|
+
MIT
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import kleur from 'kleur';
|
|
4
|
+
import { callCommand } from '../commands/call.js';
|
|
5
|
+
import { configCommand } from '../commands/config.js';
|
|
6
|
+
import { findContactCommand } from '../commands/find-contact.js';
|
|
7
|
+
import { serverCommand } from '../commands/server.js';
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
const pkg = require('../../package.json');
|
|
10
|
+
function createColors() {
|
|
11
|
+
return {
|
|
12
|
+
primary: kleur.cyan,
|
|
13
|
+
secondary: kleur.magenta,
|
|
14
|
+
success: kleur.green,
|
|
15
|
+
error: kleur.red,
|
|
16
|
+
warning: kleur.yellow,
|
|
17
|
+
info: kleur.blue,
|
|
18
|
+
muted: kleur.gray,
|
|
19
|
+
highlight: kleur.bold,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function createProgram() {
|
|
23
|
+
const program = new Command();
|
|
24
|
+
program
|
|
25
|
+
.name('concierge')
|
|
26
|
+
.description('Find contact details for accommodation listings (Airbnb, Booking.com, VRBO, Expedia)')
|
|
27
|
+
.version(pkg.version);
|
|
28
|
+
// Global options
|
|
29
|
+
program.option('--json', 'Output as JSON').option('-v, --verbose', 'Verbose output');
|
|
30
|
+
// Create shared context
|
|
31
|
+
const getContext = () => {
|
|
32
|
+
const opts = program.opts();
|
|
33
|
+
return {
|
|
34
|
+
colors: createColors(),
|
|
35
|
+
json: opts.json ?? false,
|
|
36
|
+
verbose: opts.verbose ?? false,
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
// Register commands
|
|
40
|
+
findContactCommand(program, getContext);
|
|
41
|
+
configCommand(program, getContext);
|
|
42
|
+
serverCommand(program, getContext);
|
|
43
|
+
callCommand(program, getContext);
|
|
44
|
+
return program;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=program.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type ColorFn = (text: string | number) => string;
|
|
2
|
+
export interface CliColors {
|
|
3
|
+
primary: ColorFn;
|
|
4
|
+
secondary: ColorFn;
|
|
5
|
+
success: ColorFn;
|
|
6
|
+
error: ColorFn;
|
|
7
|
+
warning: ColorFn;
|
|
8
|
+
info: ColorFn;
|
|
9
|
+
muted: ColorFn;
|
|
10
|
+
highlight: ColorFn;
|
|
11
|
+
}
|
|
12
|
+
export interface CliContext {
|
|
13
|
+
colors: CliColors;
|
|
14
|
+
json: boolean;
|
|
15
|
+
verbose: boolean;
|
|
16
|
+
}
|
|
17
|
+
export type OutputMode = 'text' | 'json';
|
|
18
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/cli/shared.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/cli/shared.ts"],"names":[],"mappings":""}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;AAChC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call command - Make phone calls via the voice call server
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
import type { CliContext } from '../cli/shared.js';
|
|
6
|
+
export declare function callCommand(program: Command, getContext: () => CliContext): void;
|
|
7
|
+
//# sourceMappingURL=call.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/commands/call.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA8XnD,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,GAAG,IAAI,CAqEhF"}
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call command - Make phone calls via the voice call server
|
|
3
|
+
*/
|
|
4
|
+
import { spawn } from 'node:child_process';
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
6
|
+
import { once } from 'node:events';
|
|
7
|
+
import { createWriteStream, mkdirSync } from 'node:fs';
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
import { join, resolve } from 'node:path';
|
|
10
|
+
import * as readline from 'node:readline';
|
|
11
|
+
import { WebSocket } from 'ws';
|
|
12
|
+
import { preflightNgrok } from '../lib/call/providers/local-deps.js';
|
|
13
|
+
import { loadConfig } from '../lib/config.js';
|
|
14
|
+
const NGROK_START_TIMEOUT_MS = 20000;
|
|
15
|
+
const SERVER_START_TIMEOUT_MS = 25000;
|
|
16
|
+
const PUBLIC_WEBHOOK_STABILITY_WINDOW_MS = 25000;
|
|
17
|
+
const PUBLIC_WEBHOOK_STABILITY_PROBE_INTERVAL_MS = 2500;
|
|
18
|
+
function delay(ms) {
|
|
19
|
+
return new Promise((resolveDelay) => setTimeout(resolveDelay, ms));
|
|
20
|
+
}
|
|
21
|
+
function getCliEntryPath() {
|
|
22
|
+
if (process.argv[1]) {
|
|
23
|
+
return resolve(process.argv[1]);
|
|
24
|
+
}
|
|
25
|
+
return resolve(process.cwd(), 'dist', 'cli.js');
|
|
26
|
+
}
|
|
27
|
+
function createInfraLogPaths() {
|
|
28
|
+
const runId = `${new Date().toISOString().replace(/[:.]/g, '-')}-${randomUUID().slice(0, 8)}`;
|
|
29
|
+
const logDir = join(homedir(), '.config', 'concierge', 'call-runs', runId);
|
|
30
|
+
mkdirSync(logDir, { recursive: true });
|
|
31
|
+
return {
|
|
32
|
+
logDir,
|
|
33
|
+
ngrokLogPath: join(logDir, 'ngrok.log'),
|
|
34
|
+
serverLogPath: join(logDir, 'server.log'),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function pipeProcessLogs(processRef, logPath) {
|
|
38
|
+
const stream = createWriteStream(logPath, { flags: 'a' });
|
|
39
|
+
if (processRef.stdout) {
|
|
40
|
+
processRef.stdout.on('data', (chunk) => stream.write(chunk));
|
|
41
|
+
}
|
|
42
|
+
if (processRef.stderr) {
|
|
43
|
+
processRef.stderr.on('data', (chunk) => stream.write(chunk));
|
|
44
|
+
}
|
|
45
|
+
processRef.on('close', () => {
|
|
46
|
+
stream.end();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function waitForExit(processRef) {
|
|
50
|
+
if (processRef.exitCode !== null)
|
|
51
|
+
return;
|
|
52
|
+
await once(processRef, 'exit');
|
|
53
|
+
}
|
|
54
|
+
async function stopProcess(processRef, timeoutMs) {
|
|
55
|
+
if (!processRef || processRef.exitCode !== null)
|
|
56
|
+
return;
|
|
57
|
+
processRef.kill('SIGTERM');
|
|
58
|
+
await Promise.race([waitForExit(processRef), delay(timeoutMs)]);
|
|
59
|
+
if (processRef.exitCode === null) {
|
|
60
|
+
processRef.kill('SIGKILL');
|
|
61
|
+
await waitForExit(processRef);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function isServerReachable(port, timeoutMs) {
|
|
65
|
+
const controller = new AbortController();
|
|
66
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
67
|
+
try {
|
|
68
|
+
const response = await fetch(`http://localhost:${port}/health`, {
|
|
69
|
+
signal: controller.signal,
|
|
70
|
+
});
|
|
71
|
+
return response.ok;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
clearTimeout(timer);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async function waitForServerReady(port, processRef, timeoutMs) {
|
|
81
|
+
const deadline = Date.now() + timeoutMs;
|
|
82
|
+
while (Date.now() < deadline) {
|
|
83
|
+
if (processRef.exitCode !== null) {
|
|
84
|
+
throw new Error(`Server process exited early with code ${processRef.exitCode}.`);
|
|
85
|
+
}
|
|
86
|
+
if (await isServerReachable(port, 1200)) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
await delay(300);
|
|
90
|
+
}
|
|
91
|
+
throw new Error(`Timed out waiting for local call server on port ${port}.`);
|
|
92
|
+
}
|
|
93
|
+
async function waitForNgrokPublicUrl(processRef, timeoutMs) {
|
|
94
|
+
const deadline = Date.now() + timeoutMs;
|
|
95
|
+
while (Date.now() < deadline) {
|
|
96
|
+
if (processRef.exitCode !== null) {
|
|
97
|
+
throw new Error(`ngrok process exited early with code ${processRef.exitCode}.`);
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const response = await fetch('http://127.0.0.1:4040/api/tunnels');
|
|
101
|
+
if (response.ok) {
|
|
102
|
+
const payload = (await response.json());
|
|
103
|
+
const httpsTunnel = payload.tunnels?.find((tunnel) => tunnel.proto === 'https' && !!tunnel.public_url);
|
|
104
|
+
if (httpsTunnel?.public_url) {
|
|
105
|
+
return httpsTunnel.public_url;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Keep polling until timeout.
|
|
111
|
+
}
|
|
112
|
+
await delay(300);
|
|
113
|
+
}
|
|
114
|
+
throw new Error('Timed out waiting for ngrok tunnel URL.');
|
|
115
|
+
}
|
|
116
|
+
async function startManagedInfra(port, ngrokAuthToken) {
|
|
117
|
+
const runtime = { enabled: true };
|
|
118
|
+
const { logDir, ngrokLogPath, serverLogPath } = createInfraLogPaths();
|
|
119
|
+
runtime.logDir = logDir;
|
|
120
|
+
runtime.ngrokLogPath = ngrokLogPath;
|
|
121
|
+
runtime.serverLogPath = serverLogPath;
|
|
122
|
+
try {
|
|
123
|
+
const ngrokEnv = { ...process.env };
|
|
124
|
+
if (ngrokAuthToken) {
|
|
125
|
+
ngrokEnv.NGROK_AUTHTOKEN = ngrokAuthToken;
|
|
126
|
+
}
|
|
127
|
+
runtime.ngrok = spawn('ngrok', ['http', String(port), '--log', 'stdout'], {
|
|
128
|
+
env: ngrokEnv,
|
|
129
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
130
|
+
});
|
|
131
|
+
pipeProcessLogs(runtime.ngrok, ngrokLogPath);
|
|
132
|
+
const publicUrl = await waitForNgrokPublicUrl(runtime.ngrok, NGROK_START_TIMEOUT_MS);
|
|
133
|
+
runtime.server = spawn(process.execPath, [getCliEntryPath(), 'server', 'start', '--port', String(port), '--public-url', publicUrl], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
134
|
+
pipeProcessLogs(runtime.server, serverLogPath);
|
|
135
|
+
await waitForServerReady(port, runtime.server, SERVER_START_TIMEOUT_MS);
|
|
136
|
+
await verifyPublicWebhookStability(publicUrl, PUBLIC_WEBHOOK_STABILITY_WINDOW_MS);
|
|
137
|
+
return { ...runtime, publicUrl };
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
await stopProcess(runtime.server, 2000);
|
|
141
|
+
await stopProcess(runtime.ngrok, 2000);
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async function verifyPublicWebhookStability(publicUrl, durationMs) {
|
|
146
|
+
const deadline = Date.now() + durationMs;
|
|
147
|
+
let probe = 0;
|
|
148
|
+
while (Date.now() < deadline) {
|
|
149
|
+
probe += 1;
|
|
150
|
+
const healthResponse = await fetch(`${publicUrl}/health`);
|
|
151
|
+
if (!healthResponse.ok) {
|
|
152
|
+
throw new Error(`Public webhook stability check failed: ${publicUrl}/health returned ${healthResponse.status}.`);
|
|
153
|
+
}
|
|
154
|
+
const statusResponse = await fetch(`${publicUrl}/twilio/status?callId=preflight-stability-${probe}`, {
|
|
155
|
+
method: 'POST',
|
|
156
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
157
|
+
body: 'CallSid=CApreflight&CallStatus=ringing',
|
|
158
|
+
});
|
|
159
|
+
if (!statusResponse.ok) {
|
|
160
|
+
throw new Error(`Public webhook stability check failed: ${publicUrl}/twilio/status returned ${statusResponse.status}.`);
|
|
161
|
+
}
|
|
162
|
+
await delay(PUBLIC_WEBHOOK_STABILITY_PROBE_INTERVAL_MS);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function stopManagedInfra(runtime) {
|
|
166
|
+
if (!runtime.enabled)
|
|
167
|
+
return;
|
|
168
|
+
await stopProcess(runtime.server, 3000);
|
|
169
|
+
await stopProcess(runtime.ngrok, 3000);
|
|
170
|
+
}
|
|
171
|
+
function runCallOverControlSocket(phone, options, port, ctx) {
|
|
172
|
+
const { colors } = ctx;
|
|
173
|
+
const ws = new WebSocket(`ws://localhost:${port}/control`);
|
|
174
|
+
let callId = null;
|
|
175
|
+
let callEnded = false;
|
|
176
|
+
let opened = false;
|
|
177
|
+
let done = false;
|
|
178
|
+
let rlInterface = null;
|
|
179
|
+
return new Promise((resolve, reject) => {
|
|
180
|
+
const cleanup = () => {
|
|
181
|
+
if (done)
|
|
182
|
+
return;
|
|
183
|
+
done = true;
|
|
184
|
+
if (rlInterface) {
|
|
185
|
+
rlInterface.close();
|
|
186
|
+
rlInterface = null;
|
|
187
|
+
}
|
|
188
|
+
if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
|
|
189
|
+
ws.close();
|
|
190
|
+
}
|
|
191
|
+
process.off('SIGINT', onSigint);
|
|
192
|
+
};
|
|
193
|
+
const safeResolve = () => {
|
|
194
|
+
if (!done) {
|
|
195
|
+
cleanup();
|
|
196
|
+
}
|
|
197
|
+
resolve();
|
|
198
|
+
};
|
|
199
|
+
const safeReject = (error) => {
|
|
200
|
+
if (!done) {
|
|
201
|
+
cleanup();
|
|
202
|
+
}
|
|
203
|
+
reject(error);
|
|
204
|
+
};
|
|
205
|
+
ws.on('open', () => {
|
|
206
|
+
opened = true;
|
|
207
|
+
console.log(colors.success('Connected to server'));
|
|
208
|
+
console.log('');
|
|
209
|
+
console.log(colors.highlight('Call Details:'));
|
|
210
|
+
console.log(colors.muted(` Phone: ${phone}`));
|
|
211
|
+
console.log(colors.muted(` Goal: ${options.goal}`));
|
|
212
|
+
console.log(colors.muted(` Customer: ${options.name}`));
|
|
213
|
+
console.log(colors.muted(` Email: ${options.email}`));
|
|
214
|
+
console.log(colors.muted(` Customer Phone: ${options.customerPhone}`));
|
|
215
|
+
if (options.context) {
|
|
216
|
+
console.log(colors.muted(` Context: ${options.context}`));
|
|
217
|
+
}
|
|
218
|
+
console.log('');
|
|
219
|
+
const customerContext = `Customer: ${options.name}
|
|
220
|
+
Email: ${options.email}
|
|
221
|
+
Phone: ${options.customerPhone}${options.context ? `\n${options.context}` : ''}`;
|
|
222
|
+
const msg = {
|
|
223
|
+
type: 'initiate_call',
|
|
224
|
+
phoneNumber: phone,
|
|
225
|
+
goal: options.goal,
|
|
226
|
+
context: customerContext,
|
|
227
|
+
};
|
|
228
|
+
ws.send(JSON.stringify(msg));
|
|
229
|
+
});
|
|
230
|
+
ws.on('message', (data) => {
|
|
231
|
+
try {
|
|
232
|
+
const msg = JSON.parse(data.toString());
|
|
233
|
+
switch (msg.type) {
|
|
234
|
+
case 'call_started':
|
|
235
|
+
callId = msg.callId;
|
|
236
|
+
console.log(colors.info(`Call initiated (ID: ${msg.callId})`));
|
|
237
|
+
console.log(colors.muted('Waiting for answer...'));
|
|
238
|
+
break;
|
|
239
|
+
case 'call_ringing':
|
|
240
|
+
console.log(colors.info('Phone ringing...'));
|
|
241
|
+
break;
|
|
242
|
+
case 'call_connected':
|
|
243
|
+
console.log(colors.success('Call connected!'));
|
|
244
|
+
console.log('');
|
|
245
|
+
if (options.interactive) {
|
|
246
|
+
console.log(colors.highlight('Interactive mode - type messages to speak'));
|
|
247
|
+
console.log(colors.muted('Commands: /hangup, /status'));
|
|
248
|
+
console.log('');
|
|
249
|
+
rlInterface = readline.createInterface({
|
|
250
|
+
input: process.stdin,
|
|
251
|
+
output: process.stdout,
|
|
252
|
+
prompt: colors.muted('> '),
|
|
253
|
+
});
|
|
254
|
+
rlInterface.prompt();
|
|
255
|
+
rlInterface.on('line', (line) => {
|
|
256
|
+
const input = line.trim();
|
|
257
|
+
if (!input) {
|
|
258
|
+
rlInterface?.prompt();
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (input === '/hangup') {
|
|
262
|
+
if (callId) {
|
|
263
|
+
ws.send(JSON.stringify({ type: 'hangup', callId }));
|
|
264
|
+
console.log(colors.info('Hanging up...'));
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else if (input === '/status') {
|
|
268
|
+
console.log(colors.info(`Call ID: ${callId}`));
|
|
269
|
+
}
|
|
270
|
+
else if (input.startsWith('/')) {
|
|
271
|
+
console.log(colors.warning(`Unknown command: ${input}`));
|
|
272
|
+
}
|
|
273
|
+
else if (callId) {
|
|
274
|
+
ws.send(JSON.stringify({ type: 'speak', callId, text: input }));
|
|
275
|
+
}
|
|
276
|
+
rlInterface?.prompt();
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
console.log(colors.highlight('Transcript:'));
|
|
281
|
+
console.log(colors.muted('─'.repeat(50)));
|
|
282
|
+
}
|
|
283
|
+
break;
|
|
284
|
+
case 'transcript':
|
|
285
|
+
if (msg.isFinal) {
|
|
286
|
+
const label = msg.role === 'assistant' ? colors.primary('AI') : colors.secondary('Human');
|
|
287
|
+
console.log(`${label}: ${msg.text}`);
|
|
288
|
+
}
|
|
289
|
+
break;
|
|
290
|
+
case 'call_ended':
|
|
291
|
+
callEnded = true;
|
|
292
|
+
console.log('');
|
|
293
|
+
console.log(colors.muted('─'.repeat(50)));
|
|
294
|
+
console.log(colors.info(`Call ended (status: ${msg.status})`));
|
|
295
|
+
console.log('');
|
|
296
|
+
console.log(colors.highlight('Summary:'));
|
|
297
|
+
console.log(msg.summary);
|
|
298
|
+
safeResolve();
|
|
299
|
+
break;
|
|
300
|
+
case 'error':
|
|
301
|
+
console.log(colors.error(`Error: ${msg.message}`));
|
|
302
|
+
if (!callId) {
|
|
303
|
+
safeReject(new Error(msg.message));
|
|
304
|
+
}
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
console.error(colors.error('Failed to parse server message'));
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
ws.on('close', () => {
|
|
313
|
+
if (!callEnded && opened) {
|
|
314
|
+
console.log(colors.warning('Connection closed'));
|
|
315
|
+
if (callId) {
|
|
316
|
+
safeReject(new Error('Lost connection to call server before call ended.'));
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
safeResolve();
|
|
321
|
+
});
|
|
322
|
+
ws.on('error', (err) => {
|
|
323
|
+
if (!opened) {
|
|
324
|
+
safeReject(err instanceof Error ? err : new Error(String(err)));
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
console.error(colors.error(`Connection error: ${err instanceof Error ? err.message : String(err)}`));
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
const onSigint = () => {
|
|
331
|
+
console.log('');
|
|
332
|
+
if (callId && !callEnded && ws.readyState === WebSocket.OPEN) {
|
|
333
|
+
console.log(colors.info('Hanging up...'));
|
|
334
|
+
ws.send(JSON.stringify({ type: 'hangup', callId }));
|
|
335
|
+
setTimeout(() => safeResolve(), 2000);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
safeResolve();
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
process.on('SIGINT', onSigint);
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
export function callCommand(program, getContext) {
|
|
345
|
+
program
|
|
346
|
+
.command('call')
|
|
347
|
+
.description('Make a phone call with AI voice')
|
|
348
|
+
.argument('<phone>', 'Phone number to call (E.164 format preferred, e.g., +1-555-123-4567)')
|
|
349
|
+
.requiredOption('-g, --goal <goal>', 'Goal for the call (e.g., "Book a hotel room for Feb 15")')
|
|
350
|
+
.requiredOption('-n, --name <name>', 'Customer name (e.g., "John Smith")')
|
|
351
|
+
.requiredOption('-e, --email <email>', 'Customer email for confirmations')
|
|
352
|
+
.requiredOption('--customer-phone <customerPhone>', 'Customer phone number for callbacks')
|
|
353
|
+
.option('-c, --context <context>', 'Additional context (e.g., "2 nights, king bed preferred")')
|
|
354
|
+
.option('-p, --port <port>', 'Server port')
|
|
355
|
+
.option('--interactive', 'Interactive mode - type responses manually', false)
|
|
356
|
+
.option('--no-auto-infra', 'Do not auto-start ngrok + server when server is unavailable')
|
|
357
|
+
.action(async (phone, options) => {
|
|
358
|
+
const ctx = getContext();
|
|
359
|
+
const { colors } = ctx;
|
|
360
|
+
const config = loadConfig();
|
|
361
|
+
const port = options.port ? Number.parseInt(options.port, 10) : (config.callServerPort ?? 3000);
|
|
362
|
+
if (Number.isNaN(port) || port < 1 || port > 65535) {
|
|
363
|
+
console.log(colors.error(`Invalid port: ${options.port}`));
|
|
364
|
+
process.exit(1);
|
|
365
|
+
}
|
|
366
|
+
let runtime = { enabled: false };
|
|
367
|
+
try {
|
|
368
|
+
let serverReady = await isServerReachable(port, 1000);
|
|
369
|
+
if (!serverReady) {
|
|
370
|
+
if (!options.autoInfra) {
|
|
371
|
+
console.log(colors.error('Call server is not running and auto-infra is disabled.'));
|
|
372
|
+
console.log(colors.info('Start manually with:'));
|
|
373
|
+
console.log(colors.muted(' concierge server start --public-url <ngrok-url>'));
|
|
374
|
+
process.exit(1);
|
|
375
|
+
}
|
|
376
|
+
const ngrokPreflight = await preflightNgrok();
|
|
377
|
+
if (!ngrokPreflight.ok) {
|
|
378
|
+
throw new Error(ngrokPreflight.message);
|
|
379
|
+
}
|
|
380
|
+
console.log(colors.info(`[Preflight] ${ngrokPreflight.message}`));
|
|
381
|
+
console.log(colors.info('Starting managed infrastructure (ngrok + server)...'));
|
|
382
|
+
runtime = await startManagedInfra(port, config.ngrokAuthToken);
|
|
383
|
+
serverReady = true;
|
|
384
|
+
console.log(colors.highlight('Infrastructure Logs:'));
|
|
385
|
+
if (runtime.serverLogPath) {
|
|
386
|
+
console.log(colors.muted(` Server: ${runtime.serverLogPath}`));
|
|
387
|
+
}
|
|
388
|
+
if (runtime.ngrokLogPath) {
|
|
389
|
+
console.log(colors.muted(` Ngrok: ${runtime.ngrokLogPath}`));
|
|
390
|
+
}
|
|
391
|
+
console.log('');
|
|
392
|
+
}
|
|
393
|
+
if (!serverReady) {
|
|
394
|
+
throw new Error(`Unable to reach call server on port ${port}`);
|
|
395
|
+
}
|
|
396
|
+
console.log(colors.info('Connecting to call server...'));
|
|
397
|
+
await runCallOverControlSocket(phone, options, port, ctx);
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
401
|
+
console.error(colors.error(`Call failed: ${message}`));
|
|
402
|
+
process.exitCode = 1;
|
|
403
|
+
}
|
|
404
|
+
finally {
|
|
405
|
+
await stopManagedInfra(runtime);
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/commands/call.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAG/B,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,sBAAsB,GAAG,KAAK,CAAC;AACrC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AACtC,MAAM,kCAAkC,GAAG,KAAK,CAAC;AACjD,MAAM,0CAA0C,GAAG,IAAI,CAAC;AAWxD,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,KAAK,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC9F,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAC3E,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,OAAO;QACL,MAAM;QACN,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;QACvC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,UAAwB,EAAE,OAAe;IAChE,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,GAAG,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,UAAwB;IACjD,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO;IACzC,MAAM,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,UAAoC,EAAE,SAAiB;IAChF,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO;IACxD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3B,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACjC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,SAAiB;IAC9D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,SAAS,EAAE;YAC9D,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,UAAwB,EAAE,SAAiB;IACzF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,yCAAyC,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,mDAAmD,IAAI,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,UAAwB,EAAE,SAAiB;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAClE,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAErC,CAAC;gBACF,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACvG,IAAI,WAAW,EAAE,UAAU,EAAE,CAAC;oBAC5B,OAAO,WAAW,CAAC,UAAU,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;QACD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAY,EACZ,cAAkC;IAElC,MAAM,OAAO,GAAwB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACtE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;IACpC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,cAAc,EAAE,CAAC;YACnB,QAAQ,CAAC,eAAe,GAAG,cAAc,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;YACxE,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;QACrF,OAAO,CAAC,MAAM,GAAG,KAAK,CACpB,OAAO,CAAC,QAAQ,EAChB,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,EACzF,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACtC,CAAC;QACF,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAC/C,MAAM,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;QACxE,MAAM,4BAA4B,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;QAElF,OAAO,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,SAAiB,EAAE,UAAkB;IAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,CAAC;QACX,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,SAAS,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,0CAA0C,SAAS,oBAAoB,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QACnH,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,6CAA6C,KAAK,EAAE,EAAE;YACnG,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,wCAAwC;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,0CAA0C,SAAS,2BAA2B,cAAc,CAAC,MAAM,GAAG,CACvG,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAA4B;IAC1D,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO;IAC7B,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAaD,SAAS,wBAAwB,CAAC,KAAa,EAAE,OAAoB,EAAE,IAAY,EAAE,GAAe;IAClG,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,kBAAkB,IAAI,UAAU,CAAC,CAAC;IAE3D,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,WAAW,GAA8B,IAAI,CAAC;IAElD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,KAAK,EAAE,CAAC;gBACpB,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;YACD,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC/E,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,KAAY,EAAE,EAAE;YAClC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;QAEF,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACjB,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YACxE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,MAAM,eAAe,GAAG,aAAa,OAAO,CAAC,IAAI;SAC9C,OAAO,CAAC,KAAK;SACb,OAAO,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAE3E,MAAM,GAAG,GAAkB;gBACzB,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,KAAK;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE,eAAe;aACzB,CAAC;YACF,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAkB,CAAC;gBACzD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;oBACjB,KAAK,cAAc;wBACjB,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;wBACpB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAC/D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;wBACnD,MAAM;oBACR,KAAK,cAAc;wBACjB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;wBAC7C,MAAM;oBACR,KAAK,gBAAgB;wBACnB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;wBAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAChB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;4BACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,2CAA2C,CAAC,CAAC,CAAC;4BAC3E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;4BACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;4BAChB,WAAW,GAAG,QAAQ,CAAC,eAAe,CAAC;gCACrC,KAAK,EAAE,OAAO,CAAC,KAAK;gCACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gCACtB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;6BAC3B,CAAC,CAAC;4BACH,WAAW,CAAC,MAAM,EAAE,CAAC;4BACrB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gCACtC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gCAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;oCACX,WAAW,EAAE,MAAM,EAAE,CAAC;oCACtB,OAAO;gCACT,CAAC;gCACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oCACxB,IAAI,MAAM,EAAE,CAAC;wCACX,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAA0B,CAAC,CAAC,CAAC;wCAC5E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;oCAC5C,CAAC;gCACH,CAAC;qCAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oCAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC;gCACjD,CAAC;qCAAM,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oCACjC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC,CAAC;gCAC3D,CAAC;qCAAM,IAAI,MAAM,EAAE,CAAC;oCAClB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAA0B,CAAC,CAAC,CAAC;gCAC1F,CAAC;gCACD,WAAW,EAAE,MAAM,EAAE,CAAC;4BACxB,CAAC,CAAC,CAAC;wBACL,CAAC;6BAAM,CAAC;4BACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;4BAC7C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;wBAC5C,CAAC;wBACD,MAAM;oBACR,KAAK,YAAY;wBACf,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;4BAChB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;4BAC1F,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;wBACvC,CAAC;wBACD,MAAM;oBACR,KAAK,YAAY;wBACf,SAAS,GAAG,IAAI,CAAC;wBACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;wBAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;wBAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBACzB,WAAW,EAAE,CAAC;wBACd,MAAM;oBACR,KAAK,OAAO;wBACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;wBACnD,IAAI,CAAC,MAAM,EAAE,CAAC;4BACZ,UAAU,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;wBACrC,CAAC;wBACD,MAAM;gBACV,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAChE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,IAAI,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACjD,IAAI,MAAM,EAAE,CAAC;oBACX,UAAU,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;oBAC3E,OAAO;gBACT,CAAC;YACH,CAAC;YACD,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACrB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACvG,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,IAAI,MAAM,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC7D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;gBAC1C,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAA0B,CAAC,CAAC,CAAC;gBAC5E,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,UAA4B;IACxE,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iCAAiC,CAAC;SAC9C,QAAQ,CAAC,SAAS,EAAE,sEAAsE,CAAC;SAC3F,cAAc,CAAC,mBAAmB,EAAE,0DAA0D,CAAC;SAC/F,cAAc,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;SACzE,cAAc,CAAC,qBAAqB,EAAE,kCAAkC,CAAC;SACzE,cAAc,CAAC,kCAAkC,EAAE,qCAAqC,CAAC;SACzF,MAAM,CAAC,yBAAyB,EAAE,2DAA2D,CAAC;SAC9F,MAAM,CAAC,mBAAmB,EAAE,aAAa,CAAC;SAC1C,MAAM,CAAC,eAAe,EAAE,4CAA4C,EAAE,KAAK,CAAC;SAC5E,MAAM,CAAC,iBAAiB,EAAE,6DAA6D,CAAC;SACxF,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAAoB,EAAE,EAAE;QACpD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;QACvB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC;QAEhG,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,OAAO,GAAwB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,IAAI,WAAW,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;oBACvB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAC;oBACpF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;oBACjD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;oBAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,MAAM,cAAc,GAAG,MAAM,cAAc,EAAE,CAAC;gBAC9C,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBAC1C,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAElE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;gBAChF,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;gBAC/D,WAAW,GAAG,IAAI,CAAC;gBAEnB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBACtD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBAClE,CAAC;gBACD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;gBACjE,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACzD,MAAM,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAmBnD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,GAAG,IAAI,CA6GlF"}
|