convoai 1.0.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 (170) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +862 -0
  3. package/bin/convoai.ts +3 -0
  4. package/dist/bin/convoai.d.ts +2 -0
  5. package/dist/bin/convoai.js +4 -0
  6. package/dist/bin/convoai.js.map +1 -0
  7. package/dist/src/api/agents.d.ts +24 -0
  8. package/dist/src/api/agents.js +51 -0
  9. package/dist/src/api/agents.js.map +1 -0
  10. package/dist/src/api/calls.d.ts +53 -0
  11. package/dist/src/api/calls.js +22 -0
  12. package/dist/src/api/calls.js.map +1 -0
  13. package/dist/src/api/client.d.ts +10 -0
  14. package/dist/src/api/client.js +63 -0
  15. package/dist/src/api/client.js.map +1 -0
  16. package/dist/src/api/types.d.ts +207 -0
  17. package/dist/src/api/types.js +20 -0
  18. package/dist/src/api/types.js.map +1 -0
  19. package/dist/src/commands/agent/_helpers.d.ts +7 -0
  20. package/dist/src/commands/agent/_helpers.js +32 -0
  21. package/dist/src/commands/agent/_helpers.js.map +1 -0
  22. package/dist/src/commands/agent/history.d.ts +2 -0
  23. package/dist/src/commands/agent/history.js +78 -0
  24. package/dist/src/commands/agent/history.js.map +1 -0
  25. package/dist/src/commands/agent/interrupt.d.ts +2 -0
  26. package/dist/src/commands/agent/interrupt.js +32 -0
  27. package/dist/src/commands/agent/interrupt.js.map +1 -0
  28. package/dist/src/commands/agent/join.d.ts +2 -0
  29. package/dist/src/commands/agent/join.js +168 -0
  30. package/dist/src/commands/agent/join.js.map +1 -0
  31. package/dist/src/commands/agent/list.d.ts +2 -0
  32. package/dist/src/commands/agent/list.js +67 -0
  33. package/dist/src/commands/agent/list.js.map +1 -0
  34. package/dist/src/commands/agent/speak.d.ts +2 -0
  35. package/dist/src/commands/agent/speak.js +48 -0
  36. package/dist/src/commands/agent/speak.js.map +1 -0
  37. package/dist/src/commands/agent/start.d.ts +2 -0
  38. package/dist/src/commands/agent/start.js +212 -0
  39. package/dist/src/commands/agent/start.js.map +1 -0
  40. package/dist/src/commands/agent/status.d.ts +2 -0
  41. package/dist/src/commands/agent/status.js +42 -0
  42. package/dist/src/commands/agent/status.js.map +1 -0
  43. package/dist/src/commands/agent/stop.d.ts +2 -0
  44. package/dist/src/commands/agent/stop.js +107 -0
  45. package/dist/src/commands/agent/stop.js.map +1 -0
  46. package/dist/src/commands/agent/turns.d.ts +2 -0
  47. package/dist/src/commands/agent/turns.js +99 -0
  48. package/dist/src/commands/agent/turns.js.map +1 -0
  49. package/dist/src/commands/agent/update.d.ts +2 -0
  50. package/dist/src/commands/agent/update.js +74 -0
  51. package/dist/src/commands/agent/update.js.map +1 -0
  52. package/dist/src/commands/agent/watch.d.ts +2 -0
  53. package/dist/src/commands/agent/watch.js +291 -0
  54. package/dist/src/commands/agent/watch.js.map +1 -0
  55. package/dist/src/commands/auth/login.d.ts +2 -0
  56. package/dist/src/commands/auth/login.js +118 -0
  57. package/dist/src/commands/auth/login.js.map +1 -0
  58. package/dist/src/commands/auth/logout.d.ts +2 -0
  59. package/dist/src/commands/auth/logout.js +84 -0
  60. package/dist/src/commands/auth/logout.js.map +1 -0
  61. package/dist/src/commands/auth/status.d.ts +2 -0
  62. package/dist/src/commands/auth/status.js +114 -0
  63. package/dist/src/commands/auth/status.js.map +1 -0
  64. package/dist/src/commands/call/_helpers.d.ts +7 -0
  65. package/dist/src/commands/call/_helpers.js +32 -0
  66. package/dist/src/commands/call/_helpers.js.map +1 -0
  67. package/dist/src/commands/call/hangup.d.ts +2 -0
  68. package/dist/src/commands/call/hangup.js +29 -0
  69. package/dist/src/commands/call/hangup.js.map +1 -0
  70. package/dist/src/commands/call/initiate.d.ts +2 -0
  71. package/dist/src/commands/call/initiate.js +137 -0
  72. package/dist/src/commands/call/initiate.js.map +1 -0
  73. package/dist/src/commands/call/status.d.ts +2 -0
  74. package/dist/src/commands/call/status.js +50 -0
  75. package/dist/src/commands/call/status.js.map +1 -0
  76. package/dist/src/commands/completion.d.ts +2 -0
  77. package/dist/src/commands/completion.js +542 -0
  78. package/dist/src/commands/completion.js.map +1 -0
  79. package/dist/src/commands/config/get.d.ts +2 -0
  80. package/dist/src/commands/config/get.js +79 -0
  81. package/dist/src/commands/config/get.js.map +1 -0
  82. package/dist/src/commands/config/init.d.ts +2 -0
  83. package/dist/src/commands/config/init.js +176 -0
  84. package/dist/src/commands/config/init.js.map +1 -0
  85. package/dist/src/commands/config/path.d.ts +2 -0
  86. package/dist/src/commands/config/path.js +22 -0
  87. package/dist/src/commands/config/path.js.map +1 -0
  88. package/dist/src/commands/config/set.d.ts +2 -0
  89. package/dist/src/commands/config/set.js +115 -0
  90. package/dist/src/commands/config/set.js.map +1 -0
  91. package/dist/src/commands/config/show.d.ts +2 -0
  92. package/dist/src/commands/config/show.js +147 -0
  93. package/dist/src/commands/config/show.js.map +1 -0
  94. package/dist/src/commands/preset/list.d.ts +2 -0
  95. package/dist/src/commands/preset/list.js +39 -0
  96. package/dist/src/commands/preset/list.js.map +1 -0
  97. package/dist/src/commands/preset/use.d.ts +2 -0
  98. package/dist/src/commands/preset/use.js +89 -0
  99. package/dist/src/commands/preset/use.js.map +1 -0
  100. package/dist/src/commands/quickstart.d.ts +2 -0
  101. package/dist/src/commands/quickstart.js +595 -0
  102. package/dist/src/commands/quickstart.js.map +1 -0
  103. package/dist/src/commands/repl.d.ts +2 -0
  104. package/dist/src/commands/repl.js +391 -0
  105. package/dist/src/commands/repl.js.map +1 -0
  106. package/dist/src/commands/template/delete.d.ts +2 -0
  107. package/dist/src/commands/template/delete.js +54 -0
  108. package/dist/src/commands/template/delete.js.map +1 -0
  109. package/dist/src/commands/template/list.d.ts +2 -0
  110. package/dist/src/commands/template/list.js +48 -0
  111. package/dist/src/commands/template/list.js.map +1 -0
  112. package/dist/src/commands/template/save.d.ts +2 -0
  113. package/dist/src/commands/template/save.js +86 -0
  114. package/dist/src/commands/template/save.js.map +1 -0
  115. package/dist/src/commands/template/show.d.ts +2 -0
  116. package/dist/src/commands/template/show.js +98 -0
  117. package/dist/src/commands/template/show.js.map +1 -0
  118. package/dist/src/commands/template/use.d.ts +2 -0
  119. package/dist/src/commands/template/use.js +109 -0
  120. package/dist/src/commands/template/use.js.map +1 -0
  121. package/dist/src/commands/token.d.ts +2 -0
  122. package/dist/src/commands/token.js +75 -0
  123. package/dist/src/commands/token.js.map +1 -0
  124. package/dist/src/config/manager.d.ts +22 -0
  125. package/dist/src/config/manager.js +130 -0
  126. package/dist/src/config/manager.js.map +1 -0
  127. package/dist/src/config/paths.d.ts +9 -0
  128. package/dist/src/config/paths.js +28 -0
  129. package/dist/src/config/paths.js.map +1 -0
  130. package/dist/src/config/schema.d.ts +396 -0
  131. package/dist/src/config/schema.js +57 -0
  132. package/dist/src/config/schema.js.map +1 -0
  133. package/dist/src/index.d.ts +1 -0
  134. package/dist/src/index.js +157 -0
  135. package/dist/src/index.js.map +1 -0
  136. package/dist/src/presets/defaults.d.ts +20 -0
  137. package/dist/src/presets/defaults.js +195 -0
  138. package/dist/src/presets/defaults.js.map +1 -0
  139. package/dist/src/providers/catalog.d.ts +103 -0
  140. package/dist/src/providers/catalog.js +247 -0
  141. package/dist/src/providers/catalog.js.map +1 -0
  142. package/dist/src/templates/manager.d.ts +24 -0
  143. package/dist/src/templates/manager.js +77 -0
  144. package/dist/src/templates/manager.js.map +1 -0
  145. package/dist/src/ui/colors.d.ts +9 -0
  146. package/dist/src/ui/colors.js +36 -0
  147. package/dist/src/ui/colors.js.map +1 -0
  148. package/dist/src/ui/output.d.ts +17 -0
  149. package/dist/src/ui/output.js +27 -0
  150. package/dist/src/ui/output.js.map +1 -0
  151. package/dist/src/ui/spinner.d.ts +5 -0
  152. package/dist/src/ui/spinner.js +23 -0
  153. package/dist/src/ui/spinner.js.map +1 -0
  154. package/dist/src/ui/table.d.ts +8 -0
  155. package/dist/src/ui/table.js +38 -0
  156. package/dist/src/ui/table.js.map +1 -0
  157. package/dist/src/utils/errors.d.ts +11 -0
  158. package/dist/src/utils/errors.js +38 -0
  159. package/dist/src/utils/errors.js.map +1 -0
  160. package/dist/src/utils/format.d.ts +16 -0
  161. package/dist/src/utils/format.js +87 -0
  162. package/dist/src/utils/format.js.map +1 -0
  163. package/dist/src/utils/hints.d.ts +7 -0
  164. package/dist/src/utils/hints.js +22 -0
  165. package/dist/src/utils/hints.js.map +1 -0
  166. package/dist/src/utils/token.d.ts +6 -0
  167. package/dist/src/utils/token.js +26 -0
  168. package/dist/src/utils/token.js.map +1 -0
  169. package/package.json +65 -0
  170. package/src/web/client.html +136 -0
@@ -0,0 +1,98 @@
1
+ import chalk from 'chalk';
2
+ import { loadTemplate } from '../../templates/manager.js';
3
+ import { printKeyValue } from '../../ui/table.js';
4
+ import { handleError } from '../../utils/errors.js';
5
+ // ─── Action ─────────────────────────────────────────────────────────────────
6
+ function showAction(name, opts) {
7
+ const template = loadTemplate(name);
8
+ if (!template) {
9
+ throw new Error(`Template "${name}" not found. Run \`convoai template list\` to see available templates.`);
10
+ }
11
+ // --raw: output only the properties object as JSON (useful for piping)
12
+ if (opts.raw) {
13
+ console.log(JSON.stringify(template.properties, null, 2));
14
+ return;
15
+ }
16
+ // --json: output the full template as JSON
17
+ if (opts.json) {
18
+ console.log(JSON.stringify(template, null, 2));
19
+ return;
20
+ }
21
+ // Human-readable detail view
22
+ console.log();
23
+ console.log(chalk.bold(` Template: ${template.name}`));
24
+ console.log();
25
+ const pairs = [
26
+ ['Name', template.name],
27
+ ['Description', template.description ?? '—'],
28
+ ['Created', new Date(template.created_at).toLocaleString()],
29
+ ['Updated', new Date(template.updated_at).toLocaleString()],
30
+ ];
31
+ // Agent properties
32
+ const props = template.properties;
33
+ if (props.channel) {
34
+ pairs.push(['Channel', props.channel]);
35
+ }
36
+ if (props.llm) {
37
+ if (props.llm.vendor)
38
+ pairs.push(['LLM Vendor', props.llm.vendor]);
39
+ if (props.llm.model)
40
+ pairs.push(['LLM Model', props.llm.model]);
41
+ if (props.llm.style)
42
+ pairs.push(['LLM Style', props.llm.style]);
43
+ if (props.llm.greeting_message)
44
+ pairs.push(['Greeting', props.llm.greeting_message]);
45
+ if (props.llm.system_messages?.length) {
46
+ const firstMsg = props.llm.system_messages[0];
47
+ const content = firstMsg.content ?? '';
48
+ pairs.push(['System Message', content]);
49
+ }
50
+ if (props.llm.max_history !== undefined) {
51
+ pairs.push(['Max History', String(props.llm.max_history)]);
52
+ }
53
+ if (props.llm.params?.temperature !== undefined) {
54
+ pairs.push(['Temperature', String(props.llm.params.temperature)]);
55
+ }
56
+ if (props.llm.params?.max_tokens !== undefined) {
57
+ pairs.push(['Max Tokens', String(props.llm.params.max_tokens)]);
58
+ }
59
+ }
60
+ if (props.tts) {
61
+ if (props.tts.vendor)
62
+ pairs.push(['TTS Vendor', props.tts.vendor]);
63
+ if (props.tts.params?.voice_name)
64
+ pairs.push(['TTS Voice', props.tts.params.voice_name]);
65
+ if (props.tts.params?.speed !== undefined)
66
+ pairs.push(['TTS Speed', String(props.tts.params.speed)]);
67
+ }
68
+ if (props.asr) {
69
+ if (props.asr.vendor)
70
+ pairs.push(['ASR Vendor', props.asr.vendor]);
71
+ if (props.asr.language)
72
+ pairs.push(['ASR Language', props.asr.language]);
73
+ if (props.asr.params?.model)
74
+ pairs.push(['ASR Model', props.asr.params.model]);
75
+ }
76
+ if (props.idle_timeout !== undefined) {
77
+ pairs.push(['Idle Timeout', `${props.idle_timeout}s`]);
78
+ }
79
+ printKeyValue(pairs);
80
+ console.log();
81
+ }
82
+ // ─── Command Registration ─────────────────────────────────────────────────
83
+ export function registerTemplateShow(program) {
84
+ program
85
+ .command('show <name>')
86
+ .description('Show full details of a saved template')
87
+ .option('--json', 'Output as JSON')
88
+ .option('--raw', 'Output only the properties object as raw JSON (useful for piping)')
89
+ .action((name, opts) => {
90
+ try {
91
+ showAction(name, opts);
92
+ }
93
+ catch (error) {
94
+ handleError(error, { json: opts.json });
95
+ }
96
+ });
97
+ }
98
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../../../src/commands/template/show.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTemplateUse(program: Command): void;
@@ -0,0 +1,109 @@
1
+ import chalk from 'chalk';
2
+ import { loadTemplate } from '../../templates/manager.js';
3
+ import { getAgentAPI, formatTimestamp } from '../agent/_helpers.js';
4
+ import { resolveConfig } from '../../config/manager.js';
5
+ import { withSpinner } from '../../ui/spinner.js';
6
+ import { printKeyValue } from '../../ui/table.js';
7
+ import { printSuccess, printHint } from '../../ui/output.js';
8
+ import { handleError } from '../../utils/errors.js';
9
+ import { hintAfterStart } from '../../utils/hints.js';
10
+ // ─── Name Generation ────────────────────────────────────────────────────────
11
+ function generateAgentName() {
12
+ const timestamp = Date.now();
13
+ const random = Math.random().toString(36).substring(2, 6);
14
+ return `agent-${timestamp}-${random}`;
15
+ }
16
+ // ─── Action ─────────────────────────────────────────────────────────────────
17
+ async function useAction(name, opts) {
18
+ const template = loadTemplate(name);
19
+ if (!template) {
20
+ throw new Error(`Template "${name}" not found. Run \`convoai template list\` to see available templates.`);
21
+ }
22
+ // Determine channel: CLI flag > template default > interactive prompt
23
+ let channel = opts.channel ?? template.properties.channel;
24
+ if (!channel && process.stdin.isTTY) {
25
+ const { default: inquirer } = await import('inquirer');
26
+ const answers = await inquirer.prompt([
27
+ {
28
+ type: 'input',
29
+ name: 'channel',
30
+ message: 'Channel name:',
31
+ },
32
+ ]);
33
+ channel = answers.channel;
34
+ }
35
+ if (!channel) {
36
+ throw new Error('--channel is required. Provide it as a flag or run interactively in a TTY.');
37
+ }
38
+ // Merge template properties with resolved config
39
+ const config = resolveConfig(opts.profile);
40
+ const llm = {
41
+ ...config.llm,
42
+ ...template.properties.llm,
43
+ };
44
+ const properties = {
45
+ ...template.properties,
46
+ channel,
47
+ agent_rtc_uid: template.properties.agent_rtc_uid ?? 'Agent',
48
+ remote_rtc_uids: template.properties.remote_rtc_uids ?? ['*'],
49
+ idle_timeout: template.properties.idle_timeout ?? 30,
50
+ llm: Object.keys(llm).length > 0 ? llm : undefined,
51
+ };
52
+ // Apply TTS: template > config
53
+ if (template.properties.tts) {
54
+ properties.tts = template.properties.tts;
55
+ }
56
+ else if (config.tts) {
57
+ properties.tts = config.tts;
58
+ }
59
+ // Apply ASR: template > config
60
+ if (template.properties.asr) {
61
+ properties.asr = template.properties.asr;
62
+ }
63
+ else if (config.asr) {
64
+ properties.asr = config.asr;
65
+ }
66
+ const request = {
67
+ name: generateAgentName(),
68
+ properties,
69
+ };
70
+ // Dry-run: print the request and exit
71
+ if (opts.dryRun) {
72
+ console.log(JSON.stringify(request, null, 2));
73
+ return;
74
+ }
75
+ const api = getAgentAPI(opts.profile);
76
+ const result = await withSpinner(`Starting agent from template "${chalk.bold(name)}"...`, () => api.start(request));
77
+ if (opts.json) {
78
+ console.log(JSON.stringify(result, null, 2));
79
+ return;
80
+ }
81
+ printSuccess(`Agent started from template "${name}".`);
82
+ printKeyValue([
83
+ ['Agent ID', result.agent_id],
84
+ ['Status', result.status],
85
+ ['Channel', channel],
86
+ ['Template', name],
87
+ ['Created', formatTimestamp(result.create_ts)],
88
+ ]);
89
+ printHint(hintAfterStart(result.agent_id));
90
+ }
91
+ // ─── Command Registration ─────────────────────────────────────────────────
92
+ export function registerTemplateUse(program) {
93
+ program
94
+ .command('use <name>')
95
+ .description('Start an agent using a saved template')
96
+ .option('-c, --channel <name>', 'RTC channel name')
97
+ .option('--profile <name>', 'Config profile to use')
98
+ .option('--json', 'Output result as JSON')
99
+ .option('--dry-run', 'Show the request payload without sending it')
100
+ .action(async (name, opts) => {
101
+ try {
102
+ await useAction(name, opts);
103
+ }
104
+ catch (error) {
105
+ handleError(error, { json: opts.json });
106
+ }
107
+ });
108
+ }
109
+ //# sourceMappingURL=use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.js","sourceRoot":"","sources":["../../../../src/commands/template/use.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerToken(program: Command): void;
@@ -0,0 +1,75 @@
1
+ import { loadConfig } from '../config/manager.js';
2
+ import { printSuccess, printError, printHint } from '../ui/output.js';
3
+ import { printKeyValue } from '../ui/table.js';
4
+ import { handleError } from '../utils/errors.js';
5
+ // ─── Command Registration ──────────────────────────────────────────────────
6
+ export function registerToken(program) {
7
+ program
8
+ .command('token')
9
+ .description('Generate an RTC token for agent authentication')
10
+ .requiredOption('-c, --channel <name>', 'Channel name')
11
+ .option('--uid <uid>', 'UID for the token (default: 0)', '0')
12
+ .option('--expire <seconds>', 'Token expiry in seconds (default: 86400)', '86400')
13
+ .option('--certificate <cert>', 'App Certificate (or set via config/env)')
14
+ .option('--profile <name>', 'Config profile to use')
15
+ .option('--json', 'Output as JSON')
16
+ .action(async (opts) => {
17
+ try {
18
+ await tokenAction(opts);
19
+ }
20
+ catch (error) {
21
+ handleError(error, { json: opts.json });
22
+ }
23
+ });
24
+ }
25
+ // ─── Action ────────────────────────────────────────────────────────────────
26
+ async function tokenAction(opts) {
27
+ // Load agora-token dynamically
28
+ let RtcTokenBuilder;
29
+ let RtcRole;
30
+ try {
31
+ const pkg = await import('agora-token');
32
+ const mod = pkg.default ?? pkg;
33
+ RtcTokenBuilder = mod.RtcTokenBuilder;
34
+ RtcRole = mod.RtcRole;
35
+ }
36
+ catch {
37
+ printError('agora-token package not found. Run: npm install agora-token');
38
+ process.exit(1);
39
+ }
40
+ const config = loadConfig();
41
+ const appId = config.app_id;
42
+ const certificate = opts.certificate
43
+ ?? process.env.AGORA_APP_CERTIFICATE
44
+ ?? config.app_certificate;
45
+ if (!appId) {
46
+ printError('App ID not configured. Run `convoai auth login` first.');
47
+ process.exit(1);
48
+ }
49
+ if (!certificate) {
50
+ printError('App Certificate is required. Provide via --certificate flag, AGORA_APP_CERTIFICATE env var, or `convoai config set app_certificate <value>`.');
51
+ process.exit(1);
52
+ }
53
+ const uid = parseInt(opts.uid, 10);
54
+ const expireSeconds = parseInt(opts.expire, 10);
55
+ const expireTs = Math.floor(Date.now() / 1000) + expireSeconds;
56
+ const token = RtcTokenBuilder.buildTokenWithUid(appId, certificate, opts.channel, uid, RtcRole.PUBLISHER, expireTs, expireTs);
57
+ if (opts.json) {
58
+ console.log(JSON.stringify({
59
+ token,
60
+ channel: opts.channel,
61
+ uid,
62
+ expires_at: new Date(expireTs * 1000).toISOString(),
63
+ }, null, 2));
64
+ return;
65
+ }
66
+ printSuccess('Token generated.');
67
+ printKeyValue([
68
+ ['Token', token],
69
+ ['Channel', opts.channel],
70
+ ['UID', String(uid)],
71
+ ['Expires', new Date(expireTs * 1000).toLocaleString()],
72
+ ]);
73
+ printHint(`Use it: convoai agent start --channel ${opts.channel} --token "${token}"`);
74
+ }
75
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/commands/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ConvoAIConfig, ProfileConfig } from '../api/types.js';
2
+ export interface ResolvedProfile extends ProfileConfig {
3
+ app_id: string;
4
+ customer_id: string;
5
+ customer_secret: string;
6
+ }
7
+ /** Load the global config file. Returns an empty config if the file is missing or unreadable. */
8
+ export declare function loadConfig(): ConvoAIConfig;
9
+ /** Persist the config object to disk. */
10
+ export declare function saveConfig(config: ConvoAIConfig): void;
11
+ /** Load a project-local .convoai.json if it exists. Returns null otherwise. */
12
+ export declare function loadProjectConfig(): Partial<ProfileConfig> | null;
13
+ /**
14
+ * Get the active profile, merging base config fields with the named (or default) profile.
15
+ * Throws if required credentials (app_id, customer_id, customer_secret) are missing.
16
+ */
17
+ export declare function getActiveProfile(profileName?: string): ResolvedProfile;
18
+ /**
19
+ * Fully resolved config: project config > profile config > base config.
20
+ * Returns a merged ProfileConfig (credentials may still be absent if unconfigured).
21
+ */
22
+ export declare function resolveConfig(profileName?: string): ProfileConfig;
@@ -0,0 +1,130 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
+ import { getConfigPath, getProjectConfigPath, getConfigDir } from './paths.js';
3
+ import { validateConfig } from './schema.js';
4
+ // ─── Load / Save ────────────────────────────────────────────────────────────
5
+ /** Load the global config file. Returns an empty config if the file is missing or unreadable. */
6
+ export function loadConfig() {
7
+ const configPath = getConfigPath();
8
+ if (!existsSync(configPath)) {
9
+ return {};
10
+ }
11
+ try {
12
+ const raw = readFileSync(configPath, 'utf-8');
13
+ const parsed = JSON.parse(raw);
14
+ return validateConfig(parsed);
15
+ }
16
+ catch {
17
+ return {};
18
+ }
19
+ }
20
+ /** Persist the config object to disk. */
21
+ export function saveConfig(config) {
22
+ // Ensure the directory exists before writing
23
+ getConfigDir();
24
+ const configPath = getConfigPath();
25
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', { encoding: 'utf-8', mode: 0o600 });
26
+ }
27
+ // ─── Project Config ─────────────────────────────────────────────────────────
28
+ /** Load a project-local .convoai.json if it exists. Returns null otherwise. */
29
+ export function loadProjectConfig() {
30
+ const projectPath = getProjectConfigPath();
31
+ if (!existsSync(projectPath)) {
32
+ return null;
33
+ }
34
+ try {
35
+ const raw = readFileSync(projectPath, 'utf-8');
36
+ return JSON.parse(raw);
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ // ─── Deep Merge Helper ──────────────────────────────────────────────────────
43
+ function deepMerge(...sources) {
44
+ const result = {};
45
+ for (const source of sources) {
46
+ if (!source)
47
+ continue;
48
+ for (const [key, value] of Object.entries(source)) {
49
+ if (value !== undefined && value !== null) {
50
+ if (typeof value === 'object' && !Array.isArray(value) && typeof result[key] === 'object' && result[key] !== null && !Array.isArray(result[key])) {
51
+ result[key] = deepMerge(result[key], value);
52
+ }
53
+ else {
54
+ result[key] = value;
55
+ }
56
+ }
57
+ }
58
+ }
59
+ return result;
60
+ }
61
+ // ─── Profile Resolution ─────────────────────────────────────────────────────
62
+ /**
63
+ * Get the active profile, merging base config fields with the named (or default) profile.
64
+ * Throws if required credentials (app_id, customer_id, customer_secret) are missing.
65
+ */
66
+ export function getActiveProfile(profileName) {
67
+ const config = loadConfig();
68
+ // Environment variables (highest priority after flags)
69
+ const env = {
70
+ app_id: process.env.CONVOAI_APP_ID,
71
+ customer_id: process.env.CONVOAI_CUSTOMER_ID,
72
+ customer_secret: process.env.CONVOAI_CUSTOMER_SECRET,
73
+ base_url: process.env.CONVOAI_BASE_URL,
74
+ region: process.env.CONVOAI_REGION,
75
+ };
76
+ // Determine which profile to use
77
+ const name = profileName ?? config.default_profile;
78
+ const profile = (name && config.profiles?.[name]) ? config.profiles[name] : {};
79
+ // Merge: env > profile fields > base config fields
80
+ const merged = {
81
+ app_id: env.app_id ?? profile.app_id ?? config.app_id,
82
+ customer_id: env.customer_id ?? profile.customer_id ?? config.customer_id,
83
+ customer_secret: env.customer_secret ?? profile.customer_secret ?? config.customer_secret,
84
+ base_url: env.base_url ?? profile.base_url ?? config.base_url,
85
+ region: env.region ?? profile.region ?? config.region,
86
+ llm: profile.llm,
87
+ tts: profile.tts,
88
+ asr: profile.asr,
89
+ };
90
+ if (!merged.app_id || !merged.customer_id || !merged.customer_secret) {
91
+ const missing = [];
92
+ if (!merged.app_id)
93
+ missing.push('app_id');
94
+ if (!merged.customer_id)
95
+ missing.push('customer_id');
96
+ if (!merged.customer_secret)
97
+ missing.push('customer_secret');
98
+ throw new Error(`Missing required credentials: ${missing.join(', ')}. Run "convoai auth login" to configure.`);
99
+ }
100
+ return merged;
101
+ }
102
+ /**
103
+ * Fully resolved config: project config > profile config > base config.
104
+ * Returns a merged ProfileConfig (credentials may still be absent if unconfigured).
105
+ */
106
+ export function resolveConfig(profileName) {
107
+ const config = loadConfig();
108
+ // Environment variables (highest priority after flags)
109
+ const env = {
110
+ app_id: process.env.CONVOAI_APP_ID,
111
+ customer_id: process.env.CONVOAI_CUSTOMER_ID,
112
+ customer_secret: process.env.CONVOAI_CUSTOMER_SECRET,
113
+ base_url: process.env.CONVOAI_BASE_URL,
114
+ region: process.env.CONVOAI_REGION,
115
+ };
116
+ const name = profileName ?? config.default_profile;
117
+ const profile = (name && config.profiles?.[name]) ? config.profiles[name] : {};
118
+ const project = loadProjectConfig();
119
+ return {
120
+ app_id: env.app_id ?? project?.app_id ?? profile.app_id ?? config.app_id,
121
+ customer_id: env.customer_id ?? project?.customer_id ?? profile.customer_id ?? config.customer_id,
122
+ customer_secret: env.customer_secret ?? project?.customer_secret ?? profile.customer_secret ?? config.customer_secret,
123
+ base_url: env.base_url ?? project?.base_url ?? profile.base_url ?? config.base_url,
124
+ region: env.region ?? project?.region ?? profile.region ?? config.region,
125
+ llm: deepMerge(profile.llm, project?.llm),
126
+ tts: deepMerge(profile.tts, project?.tts),
127
+ asr: deepMerge(profile.asr, project?.asr),
128
+ };
129
+ }
130
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/config/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Returns the config directory, respecting XDG_CONFIG_HOME.
3
+ * Creates the directory if it does not exist.
4
+ */
5
+ export declare function getConfigDir(): string;
6
+ /** Returns the full path to the global config file. */
7
+ export declare function getConfigPath(): string;
8
+ /** Returns the full path to a project-local config file in the CWD. */
9
+ export declare function getProjectConfigPath(): string;
@@ -0,0 +1,28 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join, resolve } from 'node:path';
4
+ // ─── Constants ──────────────────────────────────────────────────────────────
5
+ const CONFIG_DIR_NAME = 'convoai';
6
+ const CONFIG_FILE_NAME = 'config.json';
7
+ const PROJECT_CONFIG_NAME = '.convoai.json';
8
+ // ─── XDG-Compliant Config Paths ────────────────────────────────────────────
9
+ /**
10
+ * Returns the config directory, respecting XDG_CONFIG_HOME.
11
+ * Creates the directory if it does not exist.
12
+ */
13
+ export function getConfigDir() {
14
+ const xdgHome = process.env.XDG_CONFIG_HOME;
15
+ const base = xdgHome || join(homedir(), '.config');
16
+ const dir = join(base, CONFIG_DIR_NAME);
17
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
18
+ return dir;
19
+ }
20
+ /** Returns the full path to the global config file. */
21
+ export function getConfigPath() {
22
+ return join(getConfigDir(), CONFIG_FILE_NAME);
23
+ }
24
+ /** Returns the full path to a project-local config file in the CWD. */
25
+ export function getProjectConfigPath() {
26
+ return resolve(process.cwd(), PROJECT_CONFIG_NAME);
27
+ }
28
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,+EAA+E;AAE/E,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AACvC,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAE5C,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC5C,MAAM,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAExC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAChD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,oBAAoB;IAClC,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;AACrD,CAAC"}