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,32 @@
1
+ import { getAgentAPI } from './_helpers.js';
2
+ import { withSpinner } from '../../ui/spinner.js';
3
+ import { printSuccess } from '../../ui/output.js';
4
+ import { handleError } from '../../utils/errors.js';
5
+ import { shortId } from '../../utils/hints.js';
6
+ // ─── Command Registration ──────────────────────────────────────────────────
7
+ export function registerAgentInterrupt(program) {
8
+ program
9
+ .command('interrupt <agent-id>')
10
+ .description('Interrupt an agent that is currently speaking')
11
+ .option('--profile <name>', 'Use a named config profile')
12
+ .option('--json', 'Output result as JSON')
13
+ .action(async (agentId, opts) => {
14
+ try {
15
+ await interruptAction(agentId, opts);
16
+ }
17
+ catch (error) {
18
+ handleError(error, { json: opts.json });
19
+ }
20
+ });
21
+ }
22
+ // ─── Action ────────────────────────────────────────────────────────────────
23
+ async function interruptAction(agentId, opts) {
24
+ const api = getAgentAPI(opts.profile);
25
+ await withSpinner('Interrupting agent...', () => api.interrupt(agentId));
26
+ if (opts.json) {
27
+ console.log(JSON.stringify({ agent_id: agentId, interrupted: true }, null, 2));
28
+ return;
29
+ }
30
+ printSuccess(`Agent ${shortId(agentId)} interrupted.`);
31
+ }
32
+ //# sourceMappingURL=interrupt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interrupt.js","sourceRoot":"","sources":["../../../../src/commands/agent/interrupt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,8EAA8E;AAE9E,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,kBAAkB,EAAE,4BAA4B,CAAC;SACxD,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAsB,EAAE,EAAE;QACxD,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AASD,8EAA8E;AAE9E,KAAK,UAAU,eAAe,CAC5B,OAAe,EACf,IAAsB;IAEtB,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEtC,MAAM,WAAW,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IAED,YAAY,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAgentJoin(program: Command): void;
@@ -0,0 +1,168 @@
1
+ import { createServer } from 'node:http';
2
+ import { readFileSync } from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname, join } from 'node:path';
5
+ import { execSync } from 'node:child_process';
6
+ import chalk from 'chalk';
7
+ import { getAgentAPI } from './_helpers.js';
8
+ import { resolveConfig } from '../../config/manager.js';
9
+ import { getPreset } from '../../presets/defaults.js';
10
+ import { generateRtcToken } from '../../utils/token.js';
11
+ import { withSpinner } from '../../ui/spinner.js';
12
+ import { printSuccess, printError } from '../../ui/output.js';
13
+ import { printKeyValue } from '../../ui/table.js';
14
+ import { handleError } from '../../utils/errors.js';
15
+ import { shortId } from '../../utils/hints.js';
16
+ // ─── Locate HTML Client ───────────────────────────────────────────────────
17
+ const __filename = fileURLToPath(import.meta.url);
18
+ const __dirname = dirname(__filename);
19
+ function findClientHtml() {
20
+ // Walk up to find src/web/client.html (works from dist/ and src/)
21
+ let dir = __dirname;
22
+ for (let i = 0; i < 6; i++) {
23
+ const candidate = join(dir, 'src', 'web', 'client.html');
24
+ try {
25
+ readFileSync(candidate);
26
+ return candidate;
27
+ }
28
+ catch { /* keep looking */ }
29
+ dir = dirname(dir);
30
+ }
31
+ throw new Error('Could not find web client HTML. Reinstall the package.');
32
+ }
33
+ // ─── Command Registration ──────────────────────────────────────────────────
34
+ export function registerAgentJoin(program) {
35
+ program
36
+ .command('join')
37
+ .description('Start an agent and open voice chat in your browser')
38
+ .requiredOption('-c, --channel <name>', 'Channel name')
39
+ .option('--preset <name>', 'Use a built-in preset')
40
+ .option('--model <model>', 'LLM model name')
41
+ .option('--tts <vendor>', 'TTS vendor (overrides preset)')
42
+ .option('--asr <vendor>', 'ASR vendor (overrides preset)')
43
+ .option('--system-message <msg>', 'System prompt for the LLM')
44
+ .option('--greeting <msg>', 'Greeting message')
45
+ .option('--idle-timeout <seconds>', 'Idle timeout in seconds', '300')
46
+ .option('--port <port>', 'Local server port', '3210')
47
+ .option('--profile <name>', 'Config profile')
48
+ .option('--no-open', 'Do not auto-open the browser')
49
+ .action(async (opts) => {
50
+ try {
51
+ await joinAction(opts);
52
+ }
53
+ catch (error) {
54
+ handleError(error);
55
+ }
56
+ });
57
+ }
58
+ // ─── Action ────────────────────────────────────────────────────────────────
59
+ async function joinAction(opts) {
60
+ const config = resolveConfig(opts.profile);
61
+ const appId = config.app_id;
62
+ if (!appId) {
63
+ printError('App ID not configured. Run `convoai config init` first.');
64
+ process.exit(1);
65
+ }
66
+ // ── 1. Generate tokens ─────────────────────────────────────────────────
67
+ const agentUid = 0;
68
+ const clientUid = 12345;
69
+ const agentToken = await generateRtcToken(opts.channel, agentUid);
70
+ const clientToken = await generateRtcToken(opts.channel, clientUid);
71
+ if (!agentToken) {
72
+ printError('Cannot generate RTC token. Run `convoai config set app_certificate <cert>` first.');
73
+ process.exit(1);
74
+ }
75
+ // ── 2. Start the agent ─────────────────────────────────────────────────
76
+ const presetProps = getPreset(opts.preset);
77
+ const llm = {
78
+ ...config.llm,
79
+ ...presetProps?.llm,
80
+ api_key: config.llm?.api_key ?? presetProps?.llm?.api_key,
81
+ url: config.llm?.url ?? presetProps?.llm?.url,
82
+ };
83
+ if (opts.model)
84
+ llm.model = opts.model;
85
+ if (opts.systemMessage)
86
+ llm.system_messages = [{ role: 'system', content: opts.systemMessage }];
87
+ if (opts.greeting)
88
+ llm.greeting_message = opts.greeting;
89
+ const request = {
90
+ name: `join-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
91
+ properties: {
92
+ channel: opts.channel,
93
+ token: agentToken,
94
+ agent_rtc_uid: String(agentUid),
95
+ remote_rtc_uids: ['*'],
96
+ idle_timeout: parseInt(opts.idleTimeout, 10),
97
+ llm: Object.keys(llm).length > 0 ? llm : undefined,
98
+ tts: opts.tts
99
+ ? { ...config.tts, vendor: opts.tts, params: { ...config.tts?.params } }
100
+ : { ...config.tts, ...presetProps?.tts, params: { ...config.tts?.params, ...presetProps?.tts?.params } },
101
+ asr: opts.asr
102
+ ? { ...config.asr, vendor: opts.asr, params: { ...config.asr?.params } }
103
+ : config.asr?.vendor
104
+ ? config.asr
105
+ : { vendor: 'ares', language: 'zh-CN' },
106
+ },
107
+ };
108
+ const api = getAgentAPI(opts.profile);
109
+ const result = await withSpinner('Starting agent...', () => api.start(request));
110
+ printSuccess('Agent started.');
111
+ printKeyValue([
112
+ ['Agent ID', result.agent_id],
113
+ ['Channel', opts.channel],
114
+ ['Status', result.status],
115
+ ]);
116
+ // ── 3. Start local web server ──────────────────────────────────────────
117
+ const port = parseInt(opts.port, 10);
118
+ const htmlPath = findClientHtml();
119
+ const html = readFileSync(htmlPath, 'utf-8');
120
+ const server = createServer((req, res) => {
121
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
122
+ res.end(html);
123
+ });
124
+ await new Promise((resolve, reject) => {
125
+ server.listen(port, () => resolve());
126
+ server.on('error', reject);
127
+ });
128
+ // ── 4. Open browser ────────────────────────────────────────────────────
129
+ const params = new URLSearchParams({
130
+ appId: appId,
131
+ channel: opts.channel,
132
+ token: clientToken ?? '',
133
+ uid: String(clientUid),
134
+ });
135
+ const url = `http://localhost:${port}?${params}`;
136
+ console.log('');
137
+ console.log(chalk.cyan(' Voice chat: ') + chalk.bold(url));
138
+ console.log('');
139
+ if (opts.open) {
140
+ try {
141
+ const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
142
+ execSync(`${cmd} "${url}"`);
143
+ printSuccess('Browser opened. Allow microphone and start talking!');
144
+ }
145
+ catch {
146
+ console.log(chalk.dim(' Open the URL above in your browser.'));
147
+ }
148
+ }
149
+ console.log(chalk.dim(' Press Ctrl+C to stop the agent and exit.\n'));
150
+ // ── 5. Handle shutdown ─────────────────────────────────────────────────
151
+ const cleanup = async () => {
152
+ console.log('');
153
+ try {
154
+ await withSpinner(`Stopping agent ${shortId(result.agent_id)}...`, () => api.stop(result.agent_id));
155
+ printSuccess('Agent stopped.');
156
+ }
157
+ catch {
158
+ // Agent may have already stopped
159
+ }
160
+ server.close();
161
+ process.exit(0);
162
+ };
163
+ process.on('SIGINT', cleanup);
164
+ process.on('SIGTERM', cleanup);
165
+ // Keep alive
166
+ await new Promise(() => { });
167
+ }
168
+ //# sourceMappingURL=join.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join.js","sourceRoot":"","sources":["../../../../src/commands/agent/join.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAgentList(program: Command): void;
@@ -0,0 +1,67 @@
1
+ import { getAgentAPI, relativeTime } from './_helpers.js';
2
+ import { withSpinner } from '../../ui/spinner.js';
3
+ import { printTable } from '../../ui/table.js';
4
+ import { printHint } from '../../ui/output.js';
5
+ import { colorStatus } from '../../ui/colors.js';
6
+ import { handleError } from '../../utils/errors.js';
7
+ import { hintAfterList, shortId } from '../../utils/hints.js';
8
+ // ─── State Name Mapping ────────────────────────────────────────────────────
9
+ const STATE_MAP = {
10
+ running: 2,
11
+ stopped: 4,
12
+ failed: 6,
13
+ all: undefined,
14
+ };
15
+ // ─── Command Registration ──────────────────────────────────────────────────
16
+ export function registerAgentList(program) {
17
+ program
18
+ .command('list')
19
+ .alias('ls')
20
+ .description('List agents')
21
+ .option('-s, --state <state>', 'Filter by state: running, stopped, failed, all', 'running')
22
+ .option('-c, --channel <name>', 'Filter by channel name')
23
+ .option('-l, --limit <n>', 'Maximum number of agents to return', '20')
24
+ .option('--profile <name>', 'Config profile to use')
25
+ .option('--json', 'Output result as JSON')
26
+ .action(async (opts) => {
27
+ try {
28
+ const stateName = opts.state.toLowerCase();
29
+ if (!(stateName in STATE_MAP)) {
30
+ throw new Error(`Invalid state "${opts.state}". Choose from: running, stopped, failed, all`);
31
+ }
32
+ const params = {
33
+ state: STATE_MAP[stateName],
34
+ limit: parseInt(opts.limit, 10),
35
+ };
36
+ if (opts.channel) {
37
+ params.channel = opts.channel;
38
+ }
39
+ const api = getAgentAPI(opts.profile);
40
+ const response = await withSpinner('Fetching agents...', () => api.list(params));
41
+ if (opts.json) {
42
+ console.log(JSON.stringify(response, null, 2));
43
+ return;
44
+ }
45
+ const agents = response.data.list;
46
+ const total = response.meta.total ?? response.data.count;
47
+ if (agents.length === 0) {
48
+ console.log(`No ${stateName === 'all' ? '' : stateName + ' '}agents found.`);
49
+ printHint(hintAfterList());
50
+ return;
51
+ }
52
+ const rows = agents.map((agent) => [
53
+ shortId(agent.agent_id),
54
+ colorStatus(agent.status),
55
+ agent.channel ?? '—',
56
+ relativeTime(agent.start_ts),
57
+ ]);
58
+ printTable(['AGENT_ID', 'STATUS', 'CHANNEL', 'CREATED'], rows);
59
+ console.log(`\nShowing ${agents.length} of ${total} agents`);
60
+ printHint(hintAfterList());
61
+ }
62
+ catch (error) {
63
+ handleError(error, { json: opts.json });
64
+ }
65
+ });
66
+ }
67
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/agent/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAgentSpeak(program: Command): void;
@@ -0,0 +1,48 @@
1
+ import { getAgentAPI } from './_helpers.js';
2
+ import { withSpinner } from '../../ui/spinner.js';
3
+ import { printSuccess } from '../../ui/output.js';
4
+ import { handleError } from '../../utils/errors.js';
5
+ import { shortId } from '../../utils/hints.js';
6
+ // ─── Command Registration ──────────────────────────────────────────────────
7
+ export function registerAgentSpeak(program) {
8
+ program
9
+ .command('speak <agent-id> <text>')
10
+ .description('Instruct an agent to speak the given text')
11
+ .option('--priority <priority>', 'Message priority: INTERRUPT, APPEND, or IGNORE', 'INTERRUPT')
12
+ .option('--no-interrupt', 'Prevent user from voice-interrupting this message')
13
+ .option('--profile <name>', 'Use a named config profile')
14
+ .option('--json', 'Output result as JSON')
15
+ .action(async (agentId, text, opts) => {
16
+ try {
17
+ await speakAction(agentId, text, opts);
18
+ }
19
+ catch (error) {
20
+ handleError(error, { json: opts.json });
21
+ }
22
+ });
23
+ }
24
+ // ─── Action ────────────────────────────────────────────────────────────────
25
+ async function speakAction(agentId, text, opts) {
26
+ const priority = validatePriority(opts.priority);
27
+ const api = getAgentAPI(opts.profile);
28
+ const response = await withSpinner('Sending message...', () => api.speak(agentId, {
29
+ text,
30
+ priority,
31
+ interrupt: opts.interrupt,
32
+ }));
33
+ if (opts.json) {
34
+ console.log(JSON.stringify(response, null, 2));
35
+ return;
36
+ }
37
+ printSuccess(`Message sent to agent ${shortId(agentId)}`);
38
+ }
39
+ // ─── Helpers ───────────────────────────────────────────────────────────────
40
+ const VALID_PRIORITIES = ['INTERRUPT', 'APPEND', 'IGNORE'];
41
+ function validatePriority(value) {
42
+ const upper = value.toUpperCase();
43
+ if (!VALID_PRIORITIES.includes(upper)) {
44
+ throw new Error(`Invalid priority "${value}". Must be one of: ${VALID_PRIORITIES.join(', ')}`);
45
+ }
46
+ return upper;
47
+ }
48
+ //# sourceMappingURL=speak.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speak.js","sourceRoot":"","sources":["../../../../src/commands/agent/speak.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,8EAA8E;AAE9E,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,yBAAyB,CAAC;SAClC,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CACL,uBAAuB,EACvB,gDAAgD,EAChD,WAAW,CACZ;SACA,MAAM,CACL,gBAAgB,EAChB,mDAAmD,CACpD;SACA,MAAM,CAAC,kBAAkB,EAAE,4BAA4B,CAAC;SACxD,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAY,EAAE,IAAkB,EAAE,EAAE;QAClE,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAWD,8EAA8E;AAE9E,KAAK,UAAU,WAAW,CACxB,OAAe,EACf,IAAY,EACZ,IAAkB;IAElB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAC5D,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE;QACjB,IAAI;QACJ,QAAQ;QACR,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CACH,CAAC;IAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,YAAY,CAAC,yBAAyB,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,8EAA8E;AAE9E,MAAM,gBAAgB,GAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAE5E,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAmB,CAAC;IACnD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,qBAAqB,KAAK,sBAAsB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAgentStart(program: Command): void;
@@ -0,0 +1,212 @@
1
+ import { getAgentAPI, formatTimestamp } from './_helpers.js';
2
+ import { resolveConfig } from '../../config/manager.js';
3
+ import { getPreset } from '../../presets/defaults.js';
4
+ import { generateRtcToken } from '../../utils/token.js';
5
+ import { withSpinner } from '../../ui/spinner.js';
6
+ import { printKeyValue } from '../../ui/table.js';
7
+ import { printSuccess, printError, 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
+ async function promptForMissing(opts) {
17
+ // Dynamic import so inquirer is only loaded when needed
18
+ const { default: inquirer } = await import('inquirer');
19
+ const questions = [];
20
+ if (!opts.channel) {
21
+ questions.push({
22
+ type: 'input',
23
+ name: 'channel',
24
+ message: 'Channel name:',
25
+ });
26
+ }
27
+ if (!opts.preset) {
28
+ questions.push({
29
+ type: 'input',
30
+ name: 'preset',
31
+ message: 'Preset (leave empty for none):',
32
+ });
33
+ }
34
+ if (!opts.model) {
35
+ questions.push({
36
+ type: 'input',
37
+ name: 'model',
38
+ message: 'LLM model (leave empty for config default):',
39
+ });
40
+ }
41
+ if (questions.length === 0) {
42
+ return {
43
+ channel: opts.channel,
44
+ preset: opts.preset,
45
+ model: opts.model,
46
+ };
47
+ }
48
+ const answers = await inquirer.prompt(questions);
49
+ return {
50
+ channel: opts.channel ?? answers.channel,
51
+ preset: (opts.preset ?? answers.preset) || undefined,
52
+ model: (opts.model ?? answers.model) || undefined,
53
+ };
54
+ }
55
+ // ─── Request Builder ───────────────────────────────────────────────────────
56
+ function buildRequest(opts) {
57
+ const config = resolveConfig(opts.profile);
58
+ // Start with preset properties if specified
59
+ const presetProps = opts.preset ? getPreset(opts.preset) : undefined;
60
+ // Build LLM config by layering: config defaults -> preset -> CLI flags
61
+ // Deep merge so config api_key/url are preserved when preset sets vendor/model
62
+ const llm = {
63
+ ...config.llm,
64
+ ...presetProps?.llm,
65
+ // Preserve config credentials that presets don't provide
66
+ api_key: config.llm?.api_key ?? presetProps?.llm?.api_key,
67
+ url: config.llm?.url ?? presetProps?.llm?.url,
68
+ };
69
+ if (opts.model) {
70
+ llm.model = opts.model;
71
+ }
72
+ if (opts.llmUrl) {
73
+ llm.url = opts.llmUrl;
74
+ }
75
+ if (opts.llmKey) {
76
+ llm.api_key = opts.llmKey;
77
+ }
78
+ if (opts.systemMessage) {
79
+ llm.system_messages = [{ role: 'system', content: opts.systemMessage }];
80
+ }
81
+ if (opts.greeting) {
82
+ llm.greeting_message = opts.greeting;
83
+ }
84
+ // Build the agent properties
85
+ const properties = {
86
+ ...presetProps,
87
+ channel: opts.channel,
88
+ token: opts.token,
89
+ agent_rtc_uid: opts.uid ?? presetProps?.agent_rtc_uid ?? '0',
90
+ remote_rtc_uids: opts.remoteUids
91
+ ? opts.remoteUids.split(',').map((u) => u.trim())
92
+ : presetProps?.remote_rtc_uids ?? ['*'],
93
+ idle_timeout: opts.idleTimeout
94
+ ? parseInt(opts.idleTimeout, 10)
95
+ : presetProps?.idle_timeout ?? 30,
96
+ llm: Object.keys(llm).length > 0 ? llm : undefined,
97
+ };
98
+ // Apply TTS: deep merge config + preset + CLI flag (config keys preserved)
99
+ if (opts.tts) {
100
+ properties.tts = { ...config.tts, vendor: opts.tts, params: { ...config.tts?.params } };
101
+ }
102
+ else {
103
+ properties.tts = {
104
+ ...config.tts,
105
+ ...presetProps?.tts,
106
+ params: { ...config.tts?.params, ...presetProps?.tts?.params },
107
+ };
108
+ }
109
+ // Apply ASR: deep merge config + preset + CLI flag
110
+ if (opts.asr) {
111
+ properties.asr = { ...config.asr, vendor: opts.asr, params: { ...config.asr?.params } };
112
+ }
113
+ else {
114
+ properties.asr = {
115
+ ...config.asr,
116
+ ...presetProps?.asr,
117
+ params: { ...config.asr?.params, ...presetProps?.asr?.params },
118
+ };
119
+ }
120
+ const request = {
121
+ name: opts.name ?? generateAgentName(),
122
+ properties,
123
+ };
124
+ return request;
125
+ }
126
+ // ─── Command Registration ──────────────────────────────────────────────────
127
+ export function registerAgentStart(program) {
128
+ program
129
+ .command('start')
130
+ .description('Start a new conversational AI agent')
131
+ .option('-c, --channel <name>', 'RTC channel name (required)')
132
+ .option('-n, --name <name>', 'Agent name (auto-generated if omitted)')
133
+ .option('--preset <name>', 'Use a built-in preset configuration')
134
+ .option('--model <model>', 'LLM model name (e.g. gpt-4o-mini)')
135
+ .option('--llm-url <url>', 'LLM API URL')
136
+ .option('--llm-key <key>', 'LLM API key')
137
+ .option('--tts <vendor>', 'TTS vendor')
138
+ .option('--asr <vendor>', 'ASR vendor')
139
+ .option('--system-message <msg>', 'System prompt for the LLM')
140
+ .option('--greeting <msg>', 'Greeting message spoken on join')
141
+ .option('--uid <uid>', 'Agent RTC UID (default: "0" for random assignment)')
142
+ .option('--remote-uids <uids>', 'Comma-separated remote UIDs (default: "*")')
143
+ .option('--idle-timeout <seconds>', 'Idle timeout in seconds (default: 30)')
144
+ .option('--token <token>', 'RTC token (auto-generated if app_certificate is configured)')
145
+ .option('--profile <name>', 'Config profile to use')
146
+ .option('--json', 'Output result as JSON')
147
+ .option('--dry-run', 'Show the request payload without sending it')
148
+ .action(async (opts) => {
149
+ try {
150
+ let channel = opts.channel;
151
+ let model = opts.model;
152
+ let preset = opts.preset;
153
+ // Interactive prompts if running in a TTY and channel is missing
154
+ if (!channel && process.stdin.isTTY) {
155
+ const answers = await promptForMissing({ channel, preset, model });
156
+ channel = answers.channel;
157
+ preset = answers.preset ?? preset;
158
+ model = answers.model ?? model;
159
+ }
160
+ if (!channel) {
161
+ printError('--channel is required. Provide it as a flag or run interactively in a TTY.');
162
+ process.exit(1);
163
+ }
164
+ // Auto-generate RTC token if not provided and certificate is configured
165
+ let token = opts.token;
166
+ if (!token) {
167
+ const uid = opts.uid ? parseInt(opts.uid, 10) : 0;
168
+ token = await generateRtcToken(channel, uid);
169
+ }
170
+ const request = buildRequest({
171
+ channel,
172
+ name: opts.name,
173
+ preset,
174
+ model,
175
+ llmUrl: opts.llmUrl,
176
+ llmKey: opts.llmKey,
177
+ tts: opts.tts,
178
+ asr: opts.asr,
179
+ systemMessage: opts.systemMessage,
180
+ greeting: opts.greeting,
181
+ uid: opts.uid,
182
+ remoteUids: opts.remoteUids,
183
+ idleTimeout: opts.idleTimeout,
184
+ token,
185
+ profile: opts.profile,
186
+ });
187
+ // Dry-run mode: print request and exit
188
+ if (opts.dryRun) {
189
+ console.log(JSON.stringify(request, null, 2));
190
+ return;
191
+ }
192
+ const api = getAgentAPI(opts.profile);
193
+ const result = await withSpinner('Starting agent...', () => api.start(request));
194
+ if (opts.json) {
195
+ console.log(JSON.stringify(result, null, 2));
196
+ return;
197
+ }
198
+ printSuccess(`Agent started successfully.`);
199
+ printKeyValue([
200
+ ['Agent ID', result.agent_id],
201
+ ['Status', result.status],
202
+ ['Channel', channel],
203
+ ['Created', formatTimestamp(result.create_ts)],
204
+ ]);
205
+ printHint(hintAfterStart(result.agent_id));
206
+ }
207
+ catch (error) {
208
+ handleError(error, { json: opts.json });
209
+ }
210
+ });
211
+ }
212
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/commands/agent/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAgentStatus(program: Command): void;
@@ -0,0 +1,42 @@
1
+ import { getAgentAPI, formatTimestamp } from './_helpers.js';
2
+ import { withSpinner } from '../../ui/spinner.js';
3
+ import { printKeyValue } from '../../ui/table.js';
4
+ import { colorStatus } from '../../ui/colors.js';
5
+ import { handleError } from '../../utils/errors.js';
6
+ // ─── Command Registration ──────────────────────────────────────────────────
7
+ export function registerAgentStatus(program) {
8
+ program
9
+ .command('status <agent-id>')
10
+ .description('Query the status of an agent')
11
+ .option('--profile <name>', 'Config profile to use')
12
+ .option('--json', 'Output result as JSON')
13
+ .action(async (agentId, opts) => {
14
+ try {
15
+ const api = getAgentAPI(opts.profile);
16
+ const result = await withSpinner('Fetching agent status...', () => api.status(agentId));
17
+ if (opts.json) {
18
+ console.log(JSON.stringify(result, null, 2));
19
+ return;
20
+ }
21
+ const pairs = [
22
+ ['Agent ID', result.agent_id],
23
+ ['Status', colorStatus(result.status)],
24
+ ];
25
+ if (result.channel) {
26
+ pairs.push(['Channel', result.channel]);
27
+ }
28
+ pairs.push(['Started', formatTimestamp(result.start_ts)]);
29
+ if (result.stop_ts) {
30
+ pairs.push(['Stopped', formatTimestamp(result.stop_ts)]);
31
+ }
32
+ if (result.message) {
33
+ pairs.push(['Message', result.message]);
34
+ }
35
+ printKeyValue(pairs);
36
+ }
37
+ catch (error) {
38
+ handleError(error, { json: opts.json });
39
+ }
40
+ });
41
+ }
42
+ //# sourceMappingURL=status.js.map