@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.
Files changed (138) hide show
  1. package/README.md +91 -0
  2. package/dist/cli/program.d.ts +3 -0
  3. package/dist/cli/program.d.ts.map +1 -0
  4. package/dist/cli/program.js +46 -0
  5. package/dist/cli/program.js.map +1 -0
  6. package/dist/cli/shared.d.ts +18 -0
  7. package/dist/cli/shared.d.ts.map +1 -0
  8. package/dist/cli/shared.js +2 -0
  9. package/dist/cli/shared.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +5 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/call.d.ts +7 -0
  15. package/dist/commands/call.d.ts.map +1 -0
  16. package/dist/commands/call.js +409 -0
  17. package/dist/commands/call.js.map +1 -0
  18. package/dist/commands/config.d.ts +4 -0
  19. package/dist/commands/config.d.ts.map +1 -0
  20. package/dist/commands/config.js +120 -0
  21. package/dist/commands/config.js.map +1 -0
  22. package/dist/commands/find-contact.d.ts +4 -0
  23. package/dist/commands/find-contact.d.ts.map +1 -0
  24. package/dist/commands/find-contact.js +57 -0
  25. package/dist/commands/find-contact.js.map +1 -0
  26. package/dist/commands/server.d.ts +7 -0
  27. package/dist/commands/server.d.ts.map +1 -0
  28. package/dist/commands/server.js +212 -0
  29. package/dist/commands/server.js.map +1 -0
  30. package/dist/index.d.ts +4 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +3 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/lib/call/audio/mulaw.d.ts +35 -0
  35. package/dist/lib/call/audio/mulaw.d.ts.map +1 -0
  36. package/dist/lib/call/audio/mulaw.js +109 -0
  37. package/dist/lib/call/audio/mulaw.js.map +1 -0
  38. package/dist/lib/call/audio/pcm-utils.d.ts +62 -0
  39. package/dist/lib/call/audio/pcm-utils.d.ts.map +1 -0
  40. package/dist/lib/call/audio/pcm-utils.js +149 -0
  41. package/dist/lib/call/audio/pcm-utils.js.map +1 -0
  42. package/dist/lib/call/audio/resample.d.ts +34 -0
  43. package/dist/lib/call/audio/resample.d.ts.map +1 -0
  44. package/dist/lib/call/audio/resample.js +97 -0
  45. package/dist/lib/call/audio/resample.js.map +1 -0
  46. package/dist/lib/call/audio/streaming-decoder.d.ts +45 -0
  47. package/dist/lib/call/audio/streaming-decoder.d.ts.map +1 -0
  48. package/dist/lib/call/audio/streaming-decoder.js +110 -0
  49. package/dist/lib/call/audio/streaming-decoder.js.map +1 -0
  50. package/dist/lib/call/call-server.d.ts +110 -0
  51. package/dist/lib/call/call-server.d.ts.map +1 -0
  52. package/dist/lib/call/call-server.js +681 -0
  53. package/dist/lib/call/call-server.js.map +1 -0
  54. package/dist/lib/call/call-session.d.ts +133 -0
  55. package/dist/lib/call/call-session.d.ts.map +1 -0
  56. package/dist/lib/call/call-session.js +890 -0
  57. package/dist/lib/call/call-session.js.map +1 -0
  58. package/dist/lib/call/call-types.d.ts +133 -0
  59. package/dist/lib/call/call-types.d.ts.map +1 -0
  60. package/dist/lib/call/call-types.js +16 -0
  61. package/dist/lib/call/call-types.js.map +1 -0
  62. package/dist/lib/call/conversation-ai.d.ts +56 -0
  63. package/dist/lib/call/conversation-ai.d.ts.map +1 -0
  64. package/dist/lib/call/conversation-ai.js +276 -0
  65. package/dist/lib/call/conversation-ai.js.map +1 -0
  66. package/dist/lib/call/eval/codec-test.d.ts +45 -0
  67. package/dist/lib/call/eval/codec-test.d.ts.map +1 -0
  68. package/dist/lib/call/eval/codec-test.js +169 -0
  69. package/dist/lib/call/eval/codec-test.js.map +1 -0
  70. package/dist/lib/call/eval/conversation-scripts.d.ts +55 -0
  71. package/dist/lib/call/eval/conversation-scripts.d.ts.map +1 -0
  72. package/dist/lib/call/eval/conversation-scripts.js +359 -0
  73. package/dist/lib/call/eval/conversation-scripts.js.map +1 -0
  74. package/dist/lib/call/eval/eval-runner.d.ts +64 -0
  75. package/dist/lib/call/eval/eval-runner.d.ts.map +1 -0
  76. package/dist/lib/call/eval/eval-runner.js +369 -0
  77. package/dist/lib/call/eval/eval-runner.js.map +1 -0
  78. package/dist/lib/call/eval/index.d.ts +9 -0
  79. package/dist/lib/call/eval/index.d.ts.map +1 -0
  80. package/dist/lib/call/eval/index.js +9 -0
  81. package/dist/lib/call/eval/index.js.map +1 -0
  82. package/dist/lib/call/eval/integration-test-suite.d.ts +71 -0
  83. package/dist/lib/call/eval/integration-test-suite.d.ts.map +1 -0
  84. package/dist/lib/call/eval/integration-test-suite.js +519 -0
  85. package/dist/lib/call/eval/integration-test-suite.js.map +1 -0
  86. package/dist/lib/call/eval/turn-taking-test.d.ts +84 -0
  87. package/dist/lib/call/eval/turn-taking-test.d.ts.map +1 -0
  88. package/dist/lib/call/eval/turn-taking-test.js +260 -0
  89. package/dist/lib/call/eval/turn-taking-test.js.map +1 -0
  90. package/dist/lib/call/index.d.ts +12 -0
  91. package/dist/lib/call/index.d.ts.map +1 -0
  92. package/dist/lib/call/index.js +17 -0
  93. package/dist/lib/call/index.js.map +1 -0
  94. package/dist/lib/call/providers/deepgram.d.ts +81 -0
  95. package/dist/lib/call/providers/deepgram.d.ts.map +1 -0
  96. package/dist/lib/call/providers/deepgram.js +279 -0
  97. package/dist/lib/call/providers/deepgram.js.map +1 -0
  98. package/dist/lib/call/providers/elevenlabs.d.ts +78 -0
  99. package/dist/lib/call/providers/elevenlabs.d.ts.map +1 -0
  100. package/dist/lib/call/providers/elevenlabs.js +272 -0
  101. package/dist/lib/call/providers/elevenlabs.js.map +1 -0
  102. package/dist/lib/call/providers/local-deps.d.ts +18 -0
  103. package/dist/lib/call/providers/local-deps.d.ts.map +1 -0
  104. package/dist/lib/call/providers/local-deps.js +114 -0
  105. package/dist/lib/call/providers/local-deps.js.map +1 -0
  106. package/dist/lib/call/providers/twilio.d.ts +53 -0
  107. package/dist/lib/call/providers/twilio.d.ts.map +1 -0
  108. package/dist/lib/call/providers/twilio.js +173 -0
  109. package/dist/lib/call/providers/twilio.js.map +1 -0
  110. package/dist/lib/concierge-client-types.d.ts +68 -0
  111. package/dist/lib/concierge-client-types.d.ts.map +1 -0
  112. package/dist/lib/concierge-client-types.js +2 -0
  113. package/dist/lib/concierge-client-types.js.map +1 -0
  114. package/dist/lib/concierge-client.d.ts +29 -0
  115. package/dist/lib/concierge-client.d.ts.map +1 -0
  116. package/dist/lib/concierge-client.js +534 -0
  117. package/dist/lib/concierge-client.js.map +1 -0
  118. package/dist/lib/config.d.ts +9 -0
  119. package/dist/lib/config.d.ts.map +1 -0
  120. package/dist/lib/config.js +66 -0
  121. package/dist/lib/config.js.map +1 -0
  122. package/dist/lib/output.d.ts +7 -0
  123. package/dist/lib/output.d.ts.map +1 -0
  124. package/dist/lib/output.js +114 -0
  125. package/dist/lib/output.js.map +1 -0
  126. package/dist/lib/utils/contact-extractor.d.ts +12 -0
  127. package/dist/lib/utils/contact-extractor.d.ts.map +1 -0
  128. package/dist/lib/utils/contact-extractor.js +159 -0
  129. package/dist/lib/utils/contact-extractor.js.map +1 -0
  130. package/dist/lib/utils/formatters.d.ts +15 -0
  131. package/dist/lib/utils/formatters.d.ts.map +1 -0
  132. package/dist/lib/utils/formatters.js +107 -0
  133. package/dist/lib/utils/formatters.js.map +1 -0
  134. package/dist/lib/utils/url-parser.d.ts +11 -0
  135. package/dist/lib/utils/url-parser.d.ts.map +1 -0
  136. package/dist/lib/utils/url-parser.js +103 -0
  137. package/dist/lib/utils/url-parser.js.map +1 -0
  138. 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,4 @@
1
+ import type { Command } from 'commander';
2
+ import type { CliContext } from '../cli/shared.js';
3
+ export declare function findContactCommand(program: Command, getContext: () => CliContext): void;
4
+ //# sourceMappingURL=find-contact.d.ts.map
@@ -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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"}
@@ -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,3 @@
1
+ // Library exports
2
+ export { ConciergeClient } from './lib/concierge-client.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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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"}