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,391 @@
1
+ import chalk from 'chalk';
2
+ import * as readline from 'node:readline';
3
+ import { getAgentAPI, formatTimestamp, relativeTime } from './agent/_helpers.js';
4
+ import { colorStatus } from '../ui/colors.js';
5
+ import { printTable, printKeyValue } from '../ui/table.js';
6
+ import { shortId } from '../utils/hints.js';
7
+ import { formatApiError } from '../utils/errors.js';
8
+ import { resolveConfig } from '../config/manager.js';
9
+ // ─── Constants ─────────────────────────────────────────────────────────────
10
+ const PROMPT = chalk.cyan('convoai> ');
11
+ const COMMANDS = [
12
+ 'help',
13
+ 'exit',
14
+ 'quit',
15
+ 'start',
16
+ 'stop',
17
+ 'status',
18
+ 'list',
19
+ 'ls',
20
+ 'speak',
21
+ 'interrupt',
22
+ 'history',
23
+ 'watch',
24
+ 'config',
25
+ 'clear',
26
+ ];
27
+ const BANNER = `
28
+ ${chalk.cyan('╔═══════════════════════════════════════╗')}
29
+ ${chalk.cyan('║')} ${chalk.bold.cyan('ConvoAI Interactive Shell')} ${chalk.cyan('║')}
30
+ ${chalk.cyan('║')} Type ${chalk.white('"help"')} for commands, ${chalk.white('"exit"')} to ${chalk.cyan('║')}
31
+ ${chalk.cyan('║')} quit. Tab-complete available. ${chalk.cyan('║')}
32
+ ${chalk.cyan('╚═══════════════════════════════════════╝')}
33
+ `;
34
+ // ─── Hints ─────────────────────────────────────────────────────────────────
35
+ const HINTS = {
36
+ start: `Try ${chalk.dim('status <id>')} to check your new agent, or ${chalk.dim('list')} to see all agents.`,
37
+ stop: `Use ${chalk.dim('list')} to see remaining agents.`,
38
+ status: `Try ${chalk.dim('history <id>')} for conversation logs, or ${chalk.dim('speak <id> <text>')} to send a message.`,
39
+ list: `Use ${chalk.dim('status <id>')} to inspect an agent, or ${chalk.dim('start <channel>')} to create one.`,
40
+ speak: `Use ${chalk.dim('interrupt <id>')} to cut the agent off, or ${chalk.dim('history <id>')} to review the conversation.`,
41
+ interrupt: `Try ${chalk.dim('speak <id> <text>')} to send a new message.`,
42
+ history: `Try ${chalk.dim('status <id>')} for agent details, or ${chalk.dim('speak <id> <text>')} to continue.`,
43
+ watch: `Use ${chalk.dim('stop <id>')} to stop the agent, or ${chalk.dim('history <id>')} for conversation logs.`,
44
+ config: `Use ${chalk.dim('start <channel>')} to launch an agent with this configuration.`,
45
+ };
46
+ function printHint(command) {
47
+ const hint = HINTS[command];
48
+ if (hint) {
49
+ console.log(chalk.dim(' Hint: ') + hint);
50
+ }
51
+ }
52
+ // ─── Help Text ─────────────────────────────────────────────────────────────
53
+ function printHelp() {
54
+ console.log();
55
+ console.log(chalk.bold(' Available commands:'));
56
+ console.log();
57
+ const cmds = [
58
+ ['help', 'Show this help message'],
59
+ ['exit / quit', 'Exit the REPL'],
60
+ ['start <channel> [--preset name]', 'Start a new agent on a channel'],
61
+ ['stop <id>', 'Stop a running agent'],
62
+ ['status <id>', 'Show agent status details'],
63
+ ['list / ls', 'List running agents'],
64
+ ['speak <id> <text>', 'Send a TTS message to an agent'],
65
+ ['interrupt <id>', 'Interrupt a speaking agent'],
66
+ ['history <id>', 'Show conversation history'],
67
+ ['watch <id>', 'Poll agent status (single shot)'],
68
+ ['config', 'Show current configuration summary'],
69
+ ['clear', 'Clear the screen'],
70
+ ];
71
+ const maxCmd = Math.max(...cmds.map(([c]) => c.length));
72
+ for (const [cmd, desc] of cmds) {
73
+ console.log(` ${chalk.cyan(cmd.padEnd(maxCmd + 2))} ${chalk.dim(desc)}`);
74
+ }
75
+ console.log();
76
+ console.log(chalk.dim(' Keyboard: Up/Down for history, Tab for completion, Ctrl+C to exit.'));
77
+ console.log();
78
+ }
79
+ // ─── Command Handlers ──────────────────────────────────────────────────────
80
+ async function handleStart(args) {
81
+ const channel = args[0];
82
+ if (!channel) {
83
+ console.log(chalk.red(' Usage: start <channel> [--preset name]'));
84
+ return;
85
+ }
86
+ // Parse optional --preset flag
87
+ let preset;
88
+ const presetIdx = args.indexOf('--preset');
89
+ if (presetIdx !== -1 && args[presetIdx + 1]) {
90
+ preset = args[presetIdx + 1];
91
+ }
92
+ const api = getAgentAPI();
93
+ // Build a minimal start request
94
+ const { getPreset } = await import('../presets/defaults.js');
95
+ const presetProps = preset ? getPreset(preset) : undefined;
96
+ const config = resolveConfig();
97
+ const request = {
98
+ name: `repl-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
99
+ properties: {
100
+ channel,
101
+ agent_rtc_uid: 'Agent',
102
+ remote_rtc_uids: ['*'],
103
+ idle_timeout: 30,
104
+ ...presetProps,
105
+ ...(config.llm ? { llm: { ...config.llm, ...presetProps?.llm } } : presetProps?.llm ? { llm: presetProps.llm } : {}),
106
+ ...(config.tts ? { tts: config.tts } : {}),
107
+ ...(config.asr ? { asr: config.asr } : {}),
108
+ },
109
+ ...(preset ? { preset } : {}),
110
+ };
111
+ console.log(chalk.dim(' Starting agent...'));
112
+ const result = await api.start(request);
113
+ console.log(chalk.green(' \u2714 Agent started'));
114
+ printKeyValue([
115
+ ['Agent ID', result.agent_id],
116
+ ['Status', result.status],
117
+ ['Channel', channel],
118
+ ['Created', formatTimestamp(result.create_ts)],
119
+ ]);
120
+ }
121
+ async function handleStop(args) {
122
+ const agentId = args[0];
123
+ if (!agentId) {
124
+ console.log(chalk.red(' Usage: stop <agent-id>'));
125
+ return;
126
+ }
127
+ const api = getAgentAPI();
128
+ console.log(chalk.dim(` Stopping ${shortId(agentId)}...`));
129
+ await api.stop(agentId);
130
+ console.log(chalk.green(` \u2714 Agent ${shortId(agentId)} stopped.`));
131
+ }
132
+ async function handleStatus(args) {
133
+ const agentId = args[0];
134
+ if (!agentId) {
135
+ console.log(chalk.red(' Usage: status <agent-id>'));
136
+ return;
137
+ }
138
+ const api = getAgentAPI();
139
+ console.log(chalk.dim(' Fetching status...'));
140
+ const result = await api.status(agentId);
141
+ const pairs = [
142
+ ['Agent ID', result.agent_id],
143
+ ['Status', colorStatus(result.status)],
144
+ ];
145
+ if (result.channel) {
146
+ pairs.push(['Channel', result.channel]);
147
+ }
148
+ pairs.push(['Started', formatTimestamp(result.start_ts)]);
149
+ if (result.stop_ts) {
150
+ pairs.push(['Stopped', formatTimestamp(result.stop_ts)]);
151
+ }
152
+ if (result.message) {
153
+ pairs.push(['Message', result.message]);
154
+ }
155
+ printKeyValue(pairs);
156
+ }
157
+ async function handleList() {
158
+ const api = getAgentAPI();
159
+ console.log(chalk.dim(' Fetching agents...'));
160
+ const response = await api.list({ state: 2, limit: 20 });
161
+ const agents = response.data.list;
162
+ const total = response.meta.total ?? response.data.count;
163
+ if (agents.length === 0) {
164
+ console.log(chalk.dim(' No running agents found.'));
165
+ return;
166
+ }
167
+ const rows = agents.map((agent) => [
168
+ shortId(agent.agent_id),
169
+ colorStatus(agent.status),
170
+ agent.channel ?? '\u2014',
171
+ relativeTime(agent.start_ts),
172
+ ]);
173
+ printTable(['AGENT_ID', 'STATUS', 'CHANNEL', 'CREATED'], rows);
174
+ console.log(chalk.dim(`\n Showing ${agents.length} of ${total} agents`));
175
+ }
176
+ async function handleSpeak(args) {
177
+ const agentId = args[0];
178
+ const text = args.slice(1).join(' ');
179
+ if (!agentId || !text) {
180
+ console.log(chalk.red(' Usage: speak <agent-id> <text>'));
181
+ return;
182
+ }
183
+ const api = getAgentAPI();
184
+ console.log(chalk.dim(' Sending message...'));
185
+ await api.speak(agentId, { text, priority: 'INTERRUPT', interrupt: true });
186
+ console.log(chalk.green(` \u2714 Message sent to ${shortId(agentId)}`));
187
+ }
188
+ async function handleInterrupt(args) {
189
+ const agentId = args[0];
190
+ if (!agentId) {
191
+ console.log(chalk.red(' Usage: interrupt <agent-id>'));
192
+ return;
193
+ }
194
+ const api = getAgentAPI();
195
+ console.log(chalk.dim(' Interrupting agent...'));
196
+ await api.interrupt(agentId);
197
+ console.log(chalk.green(` \u2714 Agent ${shortId(agentId)} interrupted.`));
198
+ }
199
+ async function handleHistory(args) {
200
+ const agentId = args[0];
201
+ if (!agentId) {
202
+ console.log(chalk.red(' Usage: history <agent-id>'));
203
+ return;
204
+ }
205
+ const api = getAgentAPI();
206
+ console.log(chalk.dim(' Fetching history...'));
207
+ const data = await api.history(agentId);
208
+ console.log();
209
+ console.log(` Agent: ${chalk.bold(shortId(data.agent_id))} | Status: ${colorStatus(data.status)} | Since: ${formatTimestamp(data.start_ts)}`);
210
+ console.log();
211
+ if (data.contents.length === 0) {
212
+ console.log(chalk.dim(' No conversation history yet.'));
213
+ }
214
+ else {
215
+ for (const entry of data.contents) {
216
+ const roleTag = formatRole(entry.role);
217
+ const content = entry.content || chalk.dim('(empty)');
218
+ console.log(` ${roleTag} ${content}`);
219
+ }
220
+ }
221
+ console.log();
222
+ console.log(chalk.dim(` ${data.contents.length} entries total.`));
223
+ }
224
+ function formatRole(role) {
225
+ const padded = `[${role}]`.padEnd(13);
226
+ return role === 'user' ? chalk.cyan(padded) : chalk.green(padded);
227
+ }
228
+ async function handleWatch(args) {
229
+ const agentId = args[0];
230
+ if (!agentId) {
231
+ console.log(chalk.red(' Usage: watch <agent-id>'));
232
+ return;
233
+ }
234
+ const api = getAgentAPI();
235
+ console.log(chalk.dim(' Polling agent status...'));
236
+ const result = await api.status(agentId);
237
+ const statusLine = colorStatus(result.status);
238
+ const channel = result.channel ?? '\u2014';
239
+ const uptime = relativeTime(result.start_ts);
240
+ console.log();
241
+ console.log(` ${chalk.bold(shortId(result.agent_id))} ${statusLine} ${chalk.dim('ch:')}${channel} ${chalk.dim('up:')}${uptime}`);
242
+ if (result.message) {
243
+ console.log(` ${chalk.dim('msg:')} ${result.message}`);
244
+ }
245
+ console.log();
246
+ }
247
+ function handleConfig() {
248
+ const config = resolveConfig();
249
+ const mask = (val) => {
250
+ if (!val)
251
+ return chalk.dim('(not set)');
252
+ if (val.length <= 4)
253
+ return '****';
254
+ return val.slice(0, 4) + '****';
255
+ };
256
+ console.log();
257
+ printKeyValue([
258
+ ['App ID', config.app_id ?? chalk.dim('(not set)')],
259
+ ['Customer ID', config.customer_id ?? chalk.dim('(not set)')],
260
+ ['Customer Secret', mask(config.customer_secret)],
261
+ ['Region', config.region ?? 'global'],
262
+ ['Base URL', config.base_url ?? chalk.dim('(default)')],
263
+ ['LLM Model', config.llm?.model ?? chalk.dim('(not set)')],
264
+ ['TTS Vendor', config.tts?.vendor ?? chalk.dim('(not set)')],
265
+ ['ASR Vendor', config.asr?.vendor ?? chalk.dim('(not set)')],
266
+ ]);
267
+ console.log();
268
+ }
269
+ // ─── Command Dispatcher ───────────────────────────────────────────────────
270
+ async function dispatch(line) {
271
+ const trimmed = line.trim();
272
+ if (!trimmed)
273
+ return;
274
+ const parts = trimmed.split(/\s+/);
275
+ const command = parts[0].toLowerCase();
276
+ const args = parts.slice(1);
277
+ switch (command) {
278
+ case 'help':
279
+ printHelp();
280
+ break;
281
+ case 'exit':
282
+ case 'quit':
283
+ // Handled by the caller
284
+ break;
285
+ case 'start':
286
+ await handleStart(args);
287
+ printHint('start');
288
+ break;
289
+ case 'stop':
290
+ await handleStop(args);
291
+ printHint('stop');
292
+ break;
293
+ case 'status':
294
+ await handleStatus(args);
295
+ printHint('status');
296
+ break;
297
+ case 'list':
298
+ case 'ls':
299
+ await handleList();
300
+ printHint('list');
301
+ break;
302
+ case 'speak':
303
+ await handleSpeak(args);
304
+ printHint('speak');
305
+ break;
306
+ case 'interrupt':
307
+ await handleInterrupt(args);
308
+ printHint('interrupt');
309
+ break;
310
+ case 'history':
311
+ await handleHistory(args);
312
+ printHint('history');
313
+ break;
314
+ case 'watch':
315
+ await handleWatch(args);
316
+ printHint('watch');
317
+ break;
318
+ case 'config':
319
+ handleConfig();
320
+ printHint('config');
321
+ break;
322
+ case 'clear':
323
+ process.stdout.write('\x1B[2J\x1B[3J\x1B[H');
324
+ break;
325
+ default:
326
+ console.log(chalk.red(` Unknown command: "${command}". Type ${chalk.white('"help"')} for a list of commands.`));
327
+ break;
328
+ }
329
+ }
330
+ // ─── REPL Loop ─────────────────────────────────────────────────────────────
331
+ function startRepl() {
332
+ console.log(BANNER);
333
+ const rl = readline.createInterface({
334
+ input: process.stdin,
335
+ output: process.stdout,
336
+ prompt: PROMPT,
337
+ terminal: true,
338
+ completer: (line) => {
339
+ const trimmed = line.trimStart();
340
+ const hits = COMMANDS.filter((c) => c.startsWith(trimmed.toLowerCase()));
341
+ return [hits.length ? hits : COMMANDS, trimmed];
342
+ },
343
+ });
344
+ let ctrlCCount = 0;
345
+ rl.prompt();
346
+ rl.on('line', async (line) => {
347
+ // Reset Ctrl+C counter on any input
348
+ ctrlCCount = 0;
349
+ const trimmed = line.trim();
350
+ // Exit commands
351
+ if (trimmed.toLowerCase() === 'exit' || trimmed.toLowerCase() === 'quit') {
352
+ console.log(chalk.dim(' Goodbye!'));
353
+ rl.close();
354
+ return;
355
+ }
356
+ // Dispatch the command, catching errors per-command
357
+ try {
358
+ await dispatch(trimmed);
359
+ }
360
+ catch (err) {
361
+ const message = formatApiError(err);
362
+ console.log(chalk.red(` Error: ${message}`));
363
+ }
364
+ rl.prompt();
365
+ });
366
+ rl.on('close', () => {
367
+ console.log();
368
+ process.exit(0);
369
+ });
370
+ rl.on('SIGINT', () => {
371
+ ctrlCCount++;
372
+ if (ctrlCCount >= 2) {
373
+ console.log(chalk.dim('\n Goodbye!'));
374
+ rl.close();
375
+ return;
376
+ }
377
+ // First Ctrl+C: cancel current input
378
+ console.log(chalk.dim('\n (Press Ctrl+C again to exit)'));
379
+ rl.prompt();
380
+ });
381
+ }
382
+ // ─── Command Registration ─────────────────────────────────────────────────
383
+ export function registerRepl(program) {
384
+ program
385
+ .command('repl')
386
+ .description('Start an interactive shell for managing agents')
387
+ .action(() => {
388
+ startRepl();
389
+ });
390
+ }
391
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../../src/commands/repl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTemplateDelete(program: Command): void;
@@ -0,0 +1,54 @@
1
+ import chalk from 'chalk';
2
+ import { deleteTemplate, templateExists } from '../../templates/manager.js';
3
+ import { printSuccess } from '../../ui/output.js';
4
+ import { handleError } from '../../utils/errors.js';
5
+ // ─── Action ─────────────────────────────────────────────────────────────────
6
+ async function deleteAction(name, opts) {
7
+ if (!templateExists(name)) {
8
+ throw new Error(`Template "${name}" not found. Run \`convoai template list\` to see available templates.`);
9
+ }
10
+ // Confirm deletion unless --force is set
11
+ if (!opts.force) {
12
+ if (!process.stdin.isTTY) {
13
+ throw new Error('Cannot confirm deletion in non-interactive mode. Use --force to skip confirmation.');
14
+ }
15
+ const { default: inquirer } = await import('inquirer');
16
+ const { confirmed } = await inquirer.prompt([
17
+ {
18
+ type: 'confirm',
19
+ name: 'confirmed',
20
+ message: `Delete template "${chalk.bold(name)}"?`,
21
+ default: false,
22
+ },
23
+ ]);
24
+ if (!confirmed) {
25
+ console.log('Cancelled.');
26
+ return;
27
+ }
28
+ }
29
+ const deleted = deleteTemplate(name);
30
+ if (opts.json) {
31
+ console.log(JSON.stringify({ deleted: name, success: deleted }, null, 2));
32
+ return;
33
+ }
34
+ if (deleted) {
35
+ printSuccess(`Template "${name}" deleted.`);
36
+ }
37
+ }
38
+ // ─── Command Registration ─────────────────────────────────────────────────
39
+ export function registerTemplateDelete(program) {
40
+ program
41
+ .command('delete <name>')
42
+ .description('Delete a saved template')
43
+ .option('--force', 'Skip confirmation prompt')
44
+ .option('--json', 'Output result as JSON')
45
+ .action(async (name, opts) => {
46
+ try {
47
+ await deleteAction(name, opts);
48
+ }
49
+ catch (error) {
50
+ handleError(error, { json: opts.json });
51
+ }
52
+ });
53
+ }
54
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../src/commands/template/delete.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AASpD,+EAA+E;AAE/E,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,IAAmB;IAC3D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,wEAAwE,CAAC,CAAC;IAC7G,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC;QACxG,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YAC1C;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBACjD,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,YAAY,CAAC,aAAa,IAAI,YAAY,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,6EAA6E;AAE7E,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC;SAC7C,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAmB,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjC,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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTemplateList(program: Command): void;
@@ -0,0 +1,48 @@
1
+ import { listTemplates } from '../../templates/manager.js';
2
+ import { printTable } from '../../ui/table.js';
3
+ import { printHint } from '../../ui/output.js';
4
+ import { handleError } from '../../utils/errors.js';
5
+ // ─── Action ─────────────────────────────────────────────────────────────────
6
+ function listAction(opts) {
7
+ const templates = listTemplates();
8
+ if (opts.json) {
9
+ console.log(JSON.stringify(templates, null, 2));
10
+ return;
11
+ }
12
+ if (templates.length === 0) {
13
+ console.log('No templates saved yet.');
14
+ printHint('Run `convoai template save <name>` to create one.');
15
+ return;
16
+ }
17
+ const headers = ['NAME', 'DESCRIPTION', 'MODEL', 'TTS', 'CREATED'];
18
+ const rows = templates.map((t) => [
19
+ t.name,
20
+ t.description ?? '—',
21
+ t.properties.llm?.model ?? '—',
22
+ t.properties.tts?.vendor ?? '—',
23
+ new Date(t.created_at).toLocaleDateString('en-US', {
24
+ year: 'numeric',
25
+ month: 'short',
26
+ day: 'numeric',
27
+ }),
28
+ ]);
29
+ printTable(headers, rows);
30
+ console.log();
31
+ printHint('Run `convoai template show <name>` to see full details.');
32
+ }
33
+ // ─── Command Registration ─────────────────────────────────────────────────
34
+ export function registerTemplateList(program) {
35
+ program
36
+ .command('list')
37
+ .description('List all saved agent templates')
38
+ .option('--json', 'Output result as JSON')
39
+ .action((opts) => {
40
+ try {
41
+ listAction(opts);
42
+ }
43
+ catch (error) {
44
+ handleError(error, { json: opts.json });
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/template/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAQpD,+EAA+E;AAE/E,SAAS,UAAU,CAAC,IAAiB;IACnC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAElC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,SAAS,CAAC,mDAAmD,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAEnE,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAChC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,WAAW,IAAI,GAAG;QACpB,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,IAAI,GAAG;QAC9B,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG;QAC/B,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACjD,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;SACf,CAAC;KACH,CAAC,CAAC;IAEH,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE1B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,SAAS,CAAC,yDAAyD,CAAC,CAAC;AACvE,CAAC;AAED,6EAA6E;AAE7E,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,CAAC,IAAiB,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTemplateSave(program: Command): void;
@@ -0,0 +1,86 @@
1
+ import chalk from 'chalk';
2
+ import { saveTemplate, templateExists } from '../../templates/manager.js';
3
+ import { resolveConfig } from '../../config/manager.js';
4
+ import { printSuccess, printHint } from '../../ui/output.js';
5
+ import { handleError } from '../../utils/errors.js';
6
+ // ─── Action ─────────────────────────────────────────────────────────────────
7
+ function saveAction(name, opts) {
8
+ // Guard against overwriting without --force
9
+ if (templateExists(name) && !opts.force) {
10
+ throw new Error(`Template "${name}" already exists. Use ${chalk.bold('--force')} to overwrite.`);
11
+ }
12
+ // Start from the resolved config defaults
13
+ const config = resolveConfig(opts.profile);
14
+ const properties = {};
15
+ // Seed LLM, TTS, ASR from resolved config
16
+ if (config.llm) {
17
+ properties.llm = { ...config.llm };
18
+ }
19
+ if (config.tts) {
20
+ properties.tts = { ...config.tts };
21
+ }
22
+ if (config.asr) {
23
+ properties.asr = { ...config.asr };
24
+ }
25
+ // Apply CLI flag overrides
26
+ if (opts.channel) {
27
+ properties.channel = opts.channel;
28
+ }
29
+ if (opts.model) {
30
+ if (!properties.llm)
31
+ properties.llm = {};
32
+ properties.llm.model = opts.model;
33
+ }
34
+ if (opts.tts) {
35
+ properties.tts = { vendor: opts.tts };
36
+ }
37
+ if (opts.asr) {
38
+ properties.asr = { vendor: opts.asr };
39
+ }
40
+ if (opts.systemMessage) {
41
+ if (!properties.llm)
42
+ properties.llm = {};
43
+ properties.llm.system_messages = [{ role: 'system', content: opts.systemMessage }];
44
+ }
45
+ if (opts.greeting) {
46
+ if (!properties.llm)
47
+ properties.llm = {};
48
+ properties.llm.greeting_message = opts.greeting;
49
+ }
50
+ const now = new Date().toISOString();
51
+ const template = {
52
+ name,
53
+ description: opts.description,
54
+ created_at: now,
55
+ updated_at: now,
56
+ properties,
57
+ };
58
+ saveTemplate(template);
59
+ printSuccess(`Template "${name}" saved.`);
60
+ printHint(`Run \`convoai template use ${name} --channel <name>\` to start an agent from this template.`);
61
+ }
62
+ // ─── Command Registration ─────────────────────────────────────────────────
63
+ export function registerTemplateSave(program) {
64
+ program
65
+ .command('save <name>')
66
+ .description('Save current config as a reusable agent template')
67
+ .option('--from-agent <id>', 'Reference a running agent (uses resolved config defaults)')
68
+ .option('--description <desc>', 'Description for the template')
69
+ .option('-c, --channel <name>', 'Default channel name')
70
+ .option('--model <model>', 'LLM model name')
71
+ .option('--tts <vendor>', 'TTS vendor')
72
+ .option('--asr <vendor>', 'ASR vendor')
73
+ .option('--system-message <msg>', 'System prompt for the LLM')
74
+ .option('--greeting <msg>', 'Greeting message spoken on join')
75
+ .option('--force', 'Overwrite an existing template with the same name')
76
+ .option('--profile <name>', 'Config profile to use')
77
+ .action((name, opts) => {
78
+ try {
79
+ saveAction(name, opts);
80
+ }
81
+ catch (error) {
82
+ handleError(error);
83
+ }
84
+ });
85
+ }
86
+ //# sourceMappingURL=save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.js","sourceRoot":"","sources":["../../../../src/commands/template/save.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTemplateShow(program: Command): void;