@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
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { deleteConfigValue, getConfigPath, loadConfig, setConfigValue } from '../lib/config.js';
|
|
2
|
+
const VALID_KEYS = [
|
|
3
|
+
'googlePlacesApiKey',
|
|
4
|
+
'instagramSessionId',
|
|
5
|
+
'timeoutMs',
|
|
6
|
+
'twilioAccountSid',
|
|
7
|
+
'twilioAuthToken',
|
|
8
|
+
'twilioPhoneNumber',
|
|
9
|
+
'deepgramApiKey',
|
|
10
|
+
'elevenLabsApiKey',
|
|
11
|
+
'elevenLabsVoiceId',
|
|
12
|
+
'ngrokAuthToken',
|
|
13
|
+
'callServerPort',
|
|
14
|
+
'anthropicApiKey',
|
|
15
|
+
];
|
|
16
|
+
export function configCommand(program, getContext) {
|
|
17
|
+
const config = program.command('config').description('Manage configuration');
|
|
18
|
+
// Show config
|
|
19
|
+
config
|
|
20
|
+
.command('show')
|
|
21
|
+
.description('Show current configuration')
|
|
22
|
+
.action(() => {
|
|
23
|
+
const ctx = getContext();
|
|
24
|
+
const current = loadConfig();
|
|
25
|
+
if (ctx.json) {
|
|
26
|
+
console.log(JSON.stringify(current, null, 2));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const { colors } = ctx;
|
|
30
|
+
console.log('');
|
|
31
|
+
console.log(colors.highlight('Configuration'));
|
|
32
|
+
console.log(colors.muted(`Path: ${getConfigPath()}`));
|
|
33
|
+
console.log('');
|
|
34
|
+
for (const key of VALID_KEYS) {
|
|
35
|
+
const value = current[key];
|
|
36
|
+
if (value !== undefined) {
|
|
37
|
+
// Mask sensitive values
|
|
38
|
+
const displayValue = key.toLowerCase().includes('key') || key.toLowerCase().includes('session')
|
|
39
|
+
? maskValue(String(value))
|
|
40
|
+
: String(value);
|
|
41
|
+
console.log(` ${colors.primary(key)}: ${displayValue}`);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
console.log(` ${colors.primary(key)}: ${colors.muted('(not set)')}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
console.log('');
|
|
48
|
+
});
|
|
49
|
+
// Set config value
|
|
50
|
+
config
|
|
51
|
+
.command('set')
|
|
52
|
+
.description('Set a configuration value')
|
|
53
|
+
.argument('<key>', `Configuration key (${VALID_KEYS.join(', ')})`)
|
|
54
|
+
.argument('<value>', 'Value to set')
|
|
55
|
+
.action((key, value) => {
|
|
56
|
+
const ctx = getContext();
|
|
57
|
+
if (!VALID_KEYS.includes(key)) {
|
|
58
|
+
console.log(ctx.colors.error(`Invalid key: ${key}`));
|
|
59
|
+
console.log(ctx.colors.muted(`Valid keys: ${VALID_KEYS.join(', ')}`));
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
const typedKey = key;
|
|
63
|
+
// Type coercion for numeric values
|
|
64
|
+
let typedValue = value;
|
|
65
|
+
if (typedKey === 'timeoutMs' || typedKey === 'callServerPort') {
|
|
66
|
+
typedValue = Number.parseInt(value, 10);
|
|
67
|
+
if (Number.isNaN(typedValue)) {
|
|
68
|
+
console.log(ctx.colors.error(`Invalid number: ${value}`));
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
setConfigValue(typedKey, typedValue);
|
|
73
|
+
if (ctx.json) {
|
|
74
|
+
console.log(JSON.stringify({ success: true, key, value: typedValue }));
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log(ctx.colors.success(`Set ${key}`));
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Unset config value
|
|
81
|
+
config
|
|
82
|
+
.command('unset')
|
|
83
|
+
.description('Remove a configuration value')
|
|
84
|
+
.argument('<key>', 'Configuration key to remove')
|
|
85
|
+
.action((key) => {
|
|
86
|
+
const ctx = getContext();
|
|
87
|
+
if (!VALID_KEYS.includes(key)) {
|
|
88
|
+
console.log(ctx.colors.error(`Invalid key: ${key}`));
|
|
89
|
+
console.log(ctx.colors.muted(`Valid keys: ${VALID_KEYS.join(', ')}`));
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
deleteConfigValue(key);
|
|
93
|
+
if (ctx.json) {
|
|
94
|
+
console.log(JSON.stringify({ success: true, key, deleted: true }));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.log(ctx.colors.success(`Removed ${key}`));
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
// Get config path
|
|
101
|
+
config
|
|
102
|
+
.command('path')
|
|
103
|
+
.description('Show configuration file path')
|
|
104
|
+
.action(() => {
|
|
105
|
+
const ctx = getContext();
|
|
106
|
+
if (ctx.json) {
|
|
107
|
+
console.log(JSON.stringify({ path: getConfigPath() }));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
console.log(getConfigPath());
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function maskValue(value) {
|
|
115
|
+
if (value.length <= 8) {
|
|
116
|
+
return '****';
|
|
117
|
+
}
|
|
118
|
+
return `${value.slice(0, 4)}****${value.slice(-4)}`;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-contact.d.ts","sourceRoot":"","sources":["../../src/commands/find-contact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKnD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,GAAG,IAAI,CA2DvF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ConciergeClient } from '../lib/concierge-client.js';
|
|
2
|
+
import { formatDossier, formatError, formatVerbose } from '../lib/output.js';
|
|
3
|
+
import { isValidUrl, parseListingUrl } from '../lib/utils/url-parser.js';
|
|
4
|
+
export function findContactCommand(program, getContext) {
|
|
5
|
+
program
|
|
6
|
+
.command('find-contact')
|
|
7
|
+
.alias('find')
|
|
8
|
+
.alias('fc')
|
|
9
|
+
.description('Find contact details for an accommodation listing')
|
|
10
|
+
.argument('<url>', 'Listing URL (Airbnb, Booking.com, VRBO, or Expedia)')
|
|
11
|
+
.option('--html <file>', 'Path to saved HTML file (for offline/pre-fetched content)')
|
|
12
|
+
.action(async (url, options) => {
|
|
13
|
+
const ctx = getContext();
|
|
14
|
+
// Validate URL
|
|
15
|
+
if (!isValidUrl(url)) {
|
|
16
|
+
console.log(formatError('Invalid URL provided', ctx));
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
// Detect platform
|
|
20
|
+
const parsed = parseListingUrl(url);
|
|
21
|
+
if (parsed.platform === 'unknown') {
|
|
22
|
+
const msg = formatVerbose('URL detected as unknown platform. Supported: Airbnb, Booking.com, VRBO, Expedia', ctx);
|
|
23
|
+
if (msg)
|
|
24
|
+
console.log(msg);
|
|
25
|
+
}
|
|
26
|
+
// Read HTML from file if provided
|
|
27
|
+
let html;
|
|
28
|
+
if (options.html) {
|
|
29
|
+
const fs = await import('node:fs');
|
|
30
|
+
try {
|
|
31
|
+
html = fs.readFileSync(options.html, 'utf-8');
|
|
32
|
+
const msg = formatVerbose(`Loaded HTML from ${options.html}`, ctx);
|
|
33
|
+
if (msg)
|
|
34
|
+
console.log(msg);
|
|
35
|
+
}
|
|
36
|
+
catch (_error) {
|
|
37
|
+
console.log(formatError(`Failed to read HTML file: ${options.html}`, ctx));
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Create client and find contacts
|
|
42
|
+
const client = new ConciergeClient();
|
|
43
|
+
const verboseMsg = formatVerbose(`Searching for contacts for: ${url}`, ctx);
|
|
44
|
+
if (verboseMsg)
|
|
45
|
+
console.log(verboseMsg);
|
|
46
|
+
const result = await client.findContacts(url, {
|
|
47
|
+
html,
|
|
48
|
+
verbose: ctx.verbose,
|
|
49
|
+
});
|
|
50
|
+
if (!result.success) {
|
|
51
|
+
console.log(formatError(result.error, ctx));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
console.log(formatDossier(result.data, ctx));
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=find-contact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-contact.js","sourceRoot":"","sources":["../../src/commands/find-contact.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAAC,OAAgB,EAAE,UAA4B;IAC/E,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,KAAK,CAAC,MAAM,CAAC;SACb,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,mDAAmD,CAAC;SAChE,QAAQ,CAAC,OAAO,EAAE,qDAAqD,CAAC;SACxE,MAAM,CAAC,eAAe,EAAE,2DAA2D,CAAC;SACpF,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,OAA0B,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QAEzB,eAAe;QACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,kBAAkB;QAClB,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,aAAa,CACvB,iFAAiF,EACjF,GAAG,CACJ,CAAC;YACF,IAAI,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;QAED,kCAAkC;QAClC,IAAI,IAAwB,CAAC;QAC7B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YACnC,IAAI,CAAC;gBACH,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC9C,MAAM,GAAG,GAAG,aAAa,CAAC,oBAAoB,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;gBACnE,IAAI,GAAG;oBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,6BAA6B,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAErC,MAAM,UAAU,GAAG,aAAa,CAAC,+BAA+B,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5E,IAAI,UAAU;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAExC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE;YAC5C,IAAI;YACJ,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server command - Start/stop/status the call server
|
|
3
|
+
*/
|
|
4
|
+
import type { Command } from 'commander';
|
|
5
|
+
import type { CliContext } from '../cli/shared.js';
|
|
6
|
+
export declare function serverCommand(program: Command, getContext: () => CliContext): void;
|
|
7
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,GAAG,IAAI,CAsNlF"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server command - Start/stop/status the call server
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { createCallServer, validateCallConfig } from '../lib/call/index.js';
|
|
8
|
+
import { loadConfig } from '../lib/config.js';
|
|
9
|
+
const PID_FILE = join(homedir(), '.config', 'concierge', 'server.pid');
|
|
10
|
+
export function serverCommand(program, getContext) {
|
|
11
|
+
const server = program.command('server').description('Manage the voice call server');
|
|
12
|
+
// Start server
|
|
13
|
+
server
|
|
14
|
+
.command('start')
|
|
15
|
+
.description('Start the voice call server')
|
|
16
|
+
.option('-p, --port <port>', 'Server port')
|
|
17
|
+
.option('--public-url <url>', 'Public URL (ngrok URL)')
|
|
18
|
+
.action(async (options) => {
|
|
19
|
+
const ctx = getContext();
|
|
20
|
+
const { colors } = ctx;
|
|
21
|
+
const config = loadConfig();
|
|
22
|
+
const port = options.port ? Number.parseInt(options.port, 10) : (config.callServerPort ?? 3000);
|
|
23
|
+
// Validate port number
|
|
24
|
+
if (Number.isNaN(port) || port < 1 || port > 65535) {
|
|
25
|
+
console.log(colors.error(`Invalid port number: ${options.port}. Must be between 1 and 65535.`));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
// Check if already running
|
|
29
|
+
if (existsSync(PID_FILE)) {
|
|
30
|
+
const pid = readFileSync(PID_FILE, 'utf-8').trim();
|
|
31
|
+
try {
|
|
32
|
+
process.kill(Number(pid), 0);
|
|
33
|
+
console.log(colors.warning(`Server already running (PID: ${pid})`));
|
|
34
|
+
console.log(colors.muted('Use "concierge server stop" to stop it first'));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Process not running, clean up stale PID file
|
|
39
|
+
unlinkSync(PID_FILE);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Validate config
|
|
43
|
+
const callConfig = {
|
|
44
|
+
twilioAccountSid: config.twilioAccountSid,
|
|
45
|
+
twilioAuthToken: config.twilioAuthToken,
|
|
46
|
+
twilioPhoneNumber: config.twilioPhoneNumber,
|
|
47
|
+
deepgramApiKey: config.deepgramApiKey,
|
|
48
|
+
elevenLabsApiKey: config.elevenLabsApiKey,
|
|
49
|
+
elevenLabsVoiceId: config.elevenLabsVoiceId,
|
|
50
|
+
anthropicApiKey: config.anthropicApiKey,
|
|
51
|
+
serverPort: port,
|
|
52
|
+
publicUrl: options.publicUrl ?? '',
|
|
53
|
+
};
|
|
54
|
+
// Check for missing config
|
|
55
|
+
const missing = [];
|
|
56
|
+
if (!callConfig.twilioAccountSid)
|
|
57
|
+
missing.push('twilioAccountSid');
|
|
58
|
+
if (!callConfig.twilioAuthToken)
|
|
59
|
+
missing.push('twilioAuthToken');
|
|
60
|
+
if (!callConfig.twilioPhoneNumber)
|
|
61
|
+
missing.push('twilioPhoneNumber');
|
|
62
|
+
if (!callConfig.deepgramApiKey)
|
|
63
|
+
missing.push('deepgramApiKey');
|
|
64
|
+
if (!callConfig.elevenLabsApiKey)
|
|
65
|
+
missing.push('elevenLabsApiKey');
|
|
66
|
+
if (!callConfig.elevenLabsVoiceId)
|
|
67
|
+
missing.push('elevenLabsVoiceId');
|
|
68
|
+
if (!callConfig.anthropicApiKey)
|
|
69
|
+
missing.push('anthropicApiKey');
|
|
70
|
+
if (!callConfig.publicUrl)
|
|
71
|
+
missing.push('publicUrl (use --public-url or set ngrokAuthToken)');
|
|
72
|
+
if (missing.length > 0) {
|
|
73
|
+
console.log(colors.error('Missing required configuration:'));
|
|
74
|
+
for (const key of missing) {
|
|
75
|
+
console.log(colors.muted(` - ${key}`));
|
|
76
|
+
}
|
|
77
|
+
console.log('');
|
|
78
|
+
console.log(colors.info('Set them with:'));
|
|
79
|
+
console.log(colors.muted(' concierge config set <key> <value>'));
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
if (!validateCallConfig(callConfig)) {
|
|
83
|
+
console.log(colors.error('Invalid configuration'));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
console.log(colors.info('Starting voice call server...'));
|
|
87
|
+
console.log(colors.muted(`Port: ${port}`));
|
|
88
|
+
console.log(colors.muted(`Public URL: ${callConfig.publicUrl}`));
|
|
89
|
+
try {
|
|
90
|
+
const callServer = createCallServer(callConfig, port, callConfig.publicUrl);
|
|
91
|
+
// Save PID
|
|
92
|
+
writeFileSync(PID_FILE, String(process.pid));
|
|
93
|
+
await callServer.start();
|
|
94
|
+
console.log('');
|
|
95
|
+
console.log(colors.success('Server started successfully!'));
|
|
96
|
+
console.log('');
|
|
97
|
+
console.log(colors.highlight('Endpoints:'));
|
|
98
|
+
console.log(colors.muted(` Health: http://localhost:${port}/health`));
|
|
99
|
+
console.log(colors.muted(` Status: http://localhost:${port}/status`));
|
|
100
|
+
console.log(colors.muted(` Control: ws://localhost:${port}/control`));
|
|
101
|
+
console.log('');
|
|
102
|
+
console.log(colors.info('Press Ctrl+C to stop'));
|
|
103
|
+
// Handle shutdown
|
|
104
|
+
const shutdown = async () => {
|
|
105
|
+
console.log('');
|
|
106
|
+
console.log(colors.info('Shutting down...'));
|
|
107
|
+
await callServer.stop();
|
|
108
|
+
if (existsSync(PID_FILE)) {
|
|
109
|
+
unlinkSync(PID_FILE);
|
|
110
|
+
}
|
|
111
|
+
process.exit(0);
|
|
112
|
+
};
|
|
113
|
+
process.on('SIGINT', shutdown);
|
|
114
|
+
process.on('SIGTERM', shutdown);
|
|
115
|
+
// Keep process running
|
|
116
|
+
await new Promise(() => { });
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
if (existsSync(PID_FILE)) {
|
|
120
|
+
unlinkSync(PID_FILE);
|
|
121
|
+
}
|
|
122
|
+
console.log(colors.error(`Failed to start server: ${err instanceof Error ? err.message : 'Unknown error'}`));
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
// Stop server
|
|
127
|
+
server
|
|
128
|
+
.command('stop')
|
|
129
|
+
.description('Stop the voice call server')
|
|
130
|
+
.action(() => {
|
|
131
|
+
const ctx = getContext();
|
|
132
|
+
const { colors } = ctx;
|
|
133
|
+
if (!existsSync(PID_FILE)) {
|
|
134
|
+
console.log(colors.warning('Server is not running'));
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const pid = readFileSync(PID_FILE, 'utf-8').trim();
|
|
138
|
+
try {
|
|
139
|
+
process.kill(Number(pid), 'SIGTERM');
|
|
140
|
+
console.log(colors.success(`Server stopped (PID: ${pid})`));
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
console.log(colors.warning('Server process not found, cleaning up'));
|
|
144
|
+
}
|
|
145
|
+
unlinkSync(PID_FILE);
|
|
146
|
+
});
|
|
147
|
+
// Server status
|
|
148
|
+
server
|
|
149
|
+
.command('status')
|
|
150
|
+
.description('Check server status')
|
|
151
|
+
.action(async () => {
|
|
152
|
+
const ctx = getContext();
|
|
153
|
+
const { colors } = ctx;
|
|
154
|
+
const config = loadConfig();
|
|
155
|
+
const port = config.callServerPort ?? 3000;
|
|
156
|
+
if (!existsSync(PID_FILE)) {
|
|
157
|
+
if (ctx.json) {
|
|
158
|
+
console.log(JSON.stringify({ running: false }));
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
console.log(colors.warning('Server is not running'));
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const pid = readFileSync(PID_FILE, 'utf-8').trim();
|
|
166
|
+
// Check if process is alive
|
|
167
|
+
let processRunning = false;
|
|
168
|
+
try {
|
|
169
|
+
process.kill(Number(pid), 0);
|
|
170
|
+
processRunning = true;
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Process not running
|
|
174
|
+
}
|
|
175
|
+
if (!processRunning) {
|
|
176
|
+
if (ctx.json) {
|
|
177
|
+
console.log(JSON.stringify({ running: false, stalePid: pid }));
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
console.log(colors.warning('Server process not found (stale PID file)'));
|
|
181
|
+
console.log(colors.muted('Run "concierge server stop" to clean up'));
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// Try to get status from server
|
|
186
|
+
try {
|
|
187
|
+
const response = await fetch(`http://localhost:${port}/status`);
|
|
188
|
+
const status = (await response.json());
|
|
189
|
+
if (ctx.json) {
|
|
190
|
+
console.log(JSON.stringify({ running: true, pid, ...status }));
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
console.log(colors.success('Server is running'));
|
|
194
|
+
console.log(colors.muted(` PID: ${pid}`));
|
|
195
|
+
console.log(colors.muted(` Port: ${port}`));
|
|
196
|
+
console.log(colors.muted(` Active calls: ${status.activeCalls}`));
|
|
197
|
+
console.log(colors.muted(` Control clients: ${status.controlClients}`));
|
|
198
|
+
console.log(colors.muted(` Public URL: ${status.publicUrl}`));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
if (ctx.json) {
|
|
203
|
+
console.log(JSON.stringify({ running: true, pid, reachable: false }));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
console.log(colors.success(`Server process running (PID: ${pid})`));
|
|
207
|
+
console.log(colors.warning(' Unable to reach HTTP endpoint'));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { FindContactOptions } from './lib/concierge-client.js';
|
|
2
|
+
export { ConciergeClient } from './lib/concierge-client.js';
|
|
3
|
+
export type { ConciergeConfig, ContactDossier, ContactInfo, Platform, PropertyInfo, Result, SourceInfo, } from './lib/concierge-client-types.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EACV,eAAe,EACf,cAAc,EACd,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,UAAU,GACX,MAAM,iCAAiC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAGlB,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* µ-law (mulaw) audio codec utilities
|
|
3
|
+
* Twilio sends/receives 8kHz mulaw audio
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert µ-law encoded buffer to 16-bit PCM
|
|
7
|
+
* @param mulaw - Buffer containing µ-law audio
|
|
8
|
+
* @returns Buffer containing 16-bit little-endian PCM
|
|
9
|
+
*/
|
|
10
|
+
export declare function mulawToPcm(mulaw: Buffer): Buffer;
|
|
11
|
+
/**
|
|
12
|
+
* Convert 16-bit PCM to µ-law encoded buffer
|
|
13
|
+
* @param pcm - Buffer containing 16-bit little-endian PCM
|
|
14
|
+
* @returns Buffer containing µ-law audio
|
|
15
|
+
*/
|
|
16
|
+
export declare function pcmToMulaw(pcm: Buffer): Buffer;
|
|
17
|
+
/**
|
|
18
|
+
* Convert µ-law to 32-bit float PCM (for Web Audio API compatibility)
|
|
19
|
+
* @param mulaw - Buffer containing µ-law audio
|
|
20
|
+
* @returns Float32Array with samples normalized to [-1, 1]
|
|
21
|
+
*/
|
|
22
|
+
export declare function mulawToFloat32(mulaw: Buffer): Float32Array;
|
|
23
|
+
/**
|
|
24
|
+
* Convert base64-encoded µ-law to PCM
|
|
25
|
+
* @param base64 - Base64-encoded µ-law audio
|
|
26
|
+
* @returns Buffer containing 16-bit little-endian PCM
|
|
27
|
+
*/
|
|
28
|
+
export declare function base64MulawToPcm(base64: string): Buffer;
|
|
29
|
+
/**
|
|
30
|
+
* Convert PCM to base64-encoded µ-law
|
|
31
|
+
* @param pcm - Buffer containing 16-bit little-endian PCM
|
|
32
|
+
* @returns Base64-encoded µ-law audio
|
|
33
|
+
*/
|
|
34
|
+
export declare function pcmToBase64Mulaw(pcm: Buffer): string;
|
|
35
|
+
//# sourceMappingURL=mulaw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mulaw.d.ts","sourceRoot":"","sources":["../../../../src/lib/call/audio/mulaw.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyDH;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAS9C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAM1D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGpD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* µ-law (mulaw) audio codec utilities
|
|
3
|
+
* Twilio sends/receives 8kHz mulaw audio
|
|
4
|
+
*/
|
|
5
|
+
// µ-law to linear PCM lookup table
|
|
6
|
+
const MULAW_TO_LINEAR = new Int16Array(256);
|
|
7
|
+
const LINEAR_TO_MULAW = new Uint8Array(65536);
|
|
8
|
+
// Bias for µ-law encoding
|
|
9
|
+
const MULAW_BIAS = 0x84;
|
|
10
|
+
const MULAW_MAX = 0x7fff;
|
|
11
|
+
// Initialize lookup tables
|
|
12
|
+
function initTables() {
|
|
13
|
+
// Build mulaw to linear table
|
|
14
|
+
// µ-law decoding: bytes are stored inverted, so we must invert first
|
|
15
|
+
for (let i = 0; i < 256; i++) {
|
|
16
|
+
// Step 1: Invert all bits (µ-law convention)
|
|
17
|
+
const mulaw = ~i & 0xff;
|
|
18
|
+
// Step 2: Extract components from inverted byte
|
|
19
|
+
const sign = mulaw & 0x80; // Bit 7 = sign
|
|
20
|
+
const exponent = (mulaw >> 4) & 0x07; // Bits 4-6 = exponent
|
|
21
|
+
const mantissa = mulaw & 0x0f; // Bits 0-3 = mantissa
|
|
22
|
+
// Step 3: Decode to linear
|
|
23
|
+
// Formula: ((mantissa << 4) + bias) << (exponent + 1) - bias
|
|
24
|
+
let sample = ((mantissa << 4) + MULAW_BIAS) << (exponent + 1);
|
|
25
|
+
sample -= MULAW_BIAS;
|
|
26
|
+
// Step 4: Apply sign
|
|
27
|
+
MULAW_TO_LINEAR[i] = sign ? -sample : sample;
|
|
28
|
+
}
|
|
29
|
+
// Build linear to mulaw table (16-bit signed to 8-bit mulaw)
|
|
30
|
+
for (let i = 0; i < 65536; i++) {
|
|
31
|
+
const sample = i < 32768 ? i : i - 65536; // Convert to signed
|
|
32
|
+
LINEAR_TO_MULAW[i] = linearToMulawSample(sample);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function linearToMulawSample(sample) {
|
|
36
|
+
const sign = sample < 0 ? 0x00 : 0x80;
|
|
37
|
+
if (sample < 0)
|
|
38
|
+
sample = -sample;
|
|
39
|
+
if (sample > MULAW_MAX)
|
|
40
|
+
sample = MULAW_MAX;
|
|
41
|
+
sample += MULAW_BIAS;
|
|
42
|
+
let exponent = 7;
|
|
43
|
+
for (let mask = 0x4000; !(sample & mask) && exponent > 0; mask >>= 1) {
|
|
44
|
+
exponent--;
|
|
45
|
+
}
|
|
46
|
+
const mantissa = (sample >> (exponent + 3)) & 0x0f;
|
|
47
|
+
return ~(sign | (exponent << 4) | mantissa) & 0xff;
|
|
48
|
+
}
|
|
49
|
+
// Initialize on load
|
|
50
|
+
initTables();
|
|
51
|
+
/**
|
|
52
|
+
* Convert µ-law encoded buffer to 16-bit PCM
|
|
53
|
+
* @param mulaw - Buffer containing µ-law audio
|
|
54
|
+
* @returns Buffer containing 16-bit little-endian PCM
|
|
55
|
+
*/
|
|
56
|
+
export function mulawToPcm(mulaw) {
|
|
57
|
+
const pcm = Buffer.alloc(mulaw.length * 2);
|
|
58
|
+
for (let i = 0; i < mulaw.length; i++) {
|
|
59
|
+
const sample = MULAW_TO_LINEAR[mulaw[i]];
|
|
60
|
+
pcm.writeInt16LE(sample, i * 2);
|
|
61
|
+
}
|
|
62
|
+
return pcm;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Convert 16-bit PCM to µ-law encoded buffer
|
|
66
|
+
* @param pcm - Buffer containing 16-bit little-endian PCM
|
|
67
|
+
* @returns Buffer containing µ-law audio
|
|
68
|
+
*/
|
|
69
|
+
export function pcmToMulaw(pcm) {
|
|
70
|
+
const mulaw = Buffer.alloc(pcm.length / 2);
|
|
71
|
+
for (let i = 0; i < mulaw.length; i++) {
|
|
72
|
+
const sample = pcm.readInt16LE(i * 2);
|
|
73
|
+
// Convert signed 16-bit to unsigned index for lookup
|
|
74
|
+
const index = sample < 0 ? sample + 65536 : sample;
|
|
75
|
+
mulaw[i] = LINEAR_TO_MULAW[index];
|
|
76
|
+
}
|
|
77
|
+
return mulaw;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Convert µ-law to 32-bit float PCM (for Web Audio API compatibility)
|
|
81
|
+
* @param mulaw - Buffer containing µ-law audio
|
|
82
|
+
* @returns Float32Array with samples normalized to [-1, 1]
|
|
83
|
+
*/
|
|
84
|
+
export function mulawToFloat32(mulaw) {
|
|
85
|
+
const float32 = new Float32Array(mulaw.length);
|
|
86
|
+
for (let i = 0; i < mulaw.length; i++) {
|
|
87
|
+
float32[i] = MULAW_TO_LINEAR[mulaw[i]] / 32768;
|
|
88
|
+
}
|
|
89
|
+
return float32;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Convert base64-encoded µ-law to PCM
|
|
93
|
+
* @param base64 - Base64-encoded µ-law audio
|
|
94
|
+
* @returns Buffer containing 16-bit little-endian PCM
|
|
95
|
+
*/
|
|
96
|
+
export function base64MulawToPcm(base64) {
|
|
97
|
+
const mulaw = Buffer.from(base64, 'base64');
|
|
98
|
+
return mulawToPcm(mulaw);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Convert PCM to base64-encoded µ-law
|
|
102
|
+
* @param pcm - Buffer containing 16-bit little-endian PCM
|
|
103
|
+
* @returns Base64-encoded µ-law audio
|
|
104
|
+
*/
|
|
105
|
+
export function pcmToBase64Mulaw(pcm) {
|
|
106
|
+
const mulaw = pcmToMulaw(pcm);
|
|
107
|
+
return mulaw.toString('base64');
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=mulaw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mulaw.js","sourceRoot":"","sources":["../../../../src/lib/call/audio/mulaw.ts"],"names":[],"mappings":"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"}
|