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,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerCompletion(program: Command): void;
@@ -0,0 +1,542 @@
1
+ import { writeFileSync, appendFileSync, mkdirSync, existsSync, readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { printSuccess, printError, printHint } from '../ui/output.js';
5
+ import { handleError } from '../utils/errors.js';
6
+ // ─── Completion Data ──────────────────────────────────────────────────────
7
+ const TOP_LEVEL_COMMANDS = ['auth', 'agent', 'call', 'config', 'preset', 'template', 'completion', 'repl'];
8
+ const SUBCOMMANDS = {
9
+ agent: ['start', 'stop', 'status', 'list', 'update', 'speak', 'interrupt', 'history', 'turns', 'watch'],
10
+ auth: ['login', 'logout', 'status'],
11
+ call: ['initiate', 'hangup', 'status'],
12
+ config: ['init', 'set', 'get', 'show', 'path'],
13
+ preset: ['list', 'use'],
14
+ template: ['save', 'list', 'show', 'delete', 'use'],
15
+ completion: ['bash', 'zsh', 'fish', 'install'],
16
+ };
17
+ const AGENT_START_FLAGS = [
18
+ '--channel', '--preset', '--model', '--tts', '--asr',
19
+ '--json', '--dry-run', '--profile',
20
+ ];
21
+ const PRESET_NAMES = [
22
+ 'openai-gpt4o', 'openai-mini', 'anthropic-claude', 'gemini', 'realtime-openai',
23
+ ];
24
+ // ─── Bash Completion Script ───────────────────────────────────────────────
25
+ function generateBashScript() {
26
+ return `# convoai bash completion
27
+ # Generated by: convoai completion bash
28
+ _convoai_completions() {
29
+ local cur prev words cword
30
+ _init_completion || return
31
+
32
+ local toplevel="${TOP_LEVEL_COMMANDS.join(' ')}"
33
+ local agent_cmds="${SUBCOMMANDS.agent.join(' ')}"
34
+ local auth_cmds="${SUBCOMMANDS.auth.join(' ')}"
35
+ local call_cmds="${SUBCOMMANDS.call.join(' ')}"
36
+ local config_cmds="${SUBCOMMANDS.config.join(' ')}"
37
+ local preset_cmds="${SUBCOMMANDS.preset.join(' ')}"
38
+ local template_cmds="${SUBCOMMANDS.template.join(' ')}"
39
+ local completion_cmds="${SUBCOMMANDS.completion.join(' ')}"
40
+ local agent_start_flags="${AGENT_START_FLAGS.join(' ')}"
41
+ local preset_names="${PRESET_NAMES.join(' ')}"
42
+
43
+ # Determine position: find the subcommand level
44
+ local cmd=""
45
+ local subcmd=""
46
+ local i
47
+ for (( i=1; i < cword; i++ )); do
48
+ case "\${words[i]}" in
49
+ agent|auth|call|config|preset|template|completion|repl)
50
+ cmd="\${words[i]}"
51
+ ;;
52
+ start|stop|status|list|update|speak|interrupt|history|turns|watch|login|logout|initiate|hangup|init|set|get|show|path|use|save|delete|bash|zsh|fish|install)
53
+ if [[ -n "$cmd" ]]; then
54
+ subcmd="\${words[i]}"
55
+ fi
56
+ ;;
57
+ esac
58
+ done
59
+
60
+ # Complete flags for specific subcommands
61
+ if [[ "$cur" == -* ]]; then
62
+ if [[ "$cmd" == "agent" && "$subcmd" == "start" ]]; then
63
+ COMPREPLY=( $(compgen -W "$agent_start_flags" -- "$cur") )
64
+ return
65
+ fi
66
+ fi
67
+
68
+ # Complete flag values
69
+ if [[ -n "$prev" ]]; then
70
+ case "$prev" in
71
+ --preset)
72
+ COMPREPLY=( $(compgen -W "$preset_names" -- "$cur") )
73
+ return
74
+ ;;
75
+ esac
76
+ fi
77
+
78
+ # Complete subcommands
79
+ if [[ -n "$cmd" && -z "$subcmd" ]]; then
80
+ case "$cmd" in
81
+ agent)
82
+ COMPREPLY=( $(compgen -W "$agent_cmds" -- "$cur") )
83
+ return
84
+ ;;
85
+ auth)
86
+ COMPREPLY=( $(compgen -W "$auth_cmds" -- "$cur") )
87
+ return
88
+ ;;
89
+ call)
90
+ COMPREPLY=( $(compgen -W "$call_cmds" -- "$cur") )
91
+ return
92
+ ;;
93
+ config)
94
+ COMPREPLY=( $(compgen -W "$config_cmds" -- "$cur") )
95
+ return
96
+ ;;
97
+ preset)
98
+ COMPREPLY=( $(compgen -W "$preset_cmds" -- "$cur") )
99
+ return
100
+ ;;
101
+ template)
102
+ COMPREPLY=( $(compgen -W "$template_cmds" -- "$cur") )
103
+ return
104
+ ;;
105
+ completion)
106
+ COMPREPLY=( $(compgen -W "$completion_cmds" -- "$cur") )
107
+ return
108
+ ;;
109
+ esac
110
+ fi
111
+
112
+ # Complete top-level commands
113
+ if [[ -z "$cmd" ]]; then
114
+ COMPREPLY=( $(compgen -W "$toplevel" -- "$cur") )
115
+ return
116
+ fi
117
+ }
118
+
119
+ complete -F _convoai_completions convoai
120
+ `;
121
+ }
122
+ // ─── Zsh Completion Script ────────────────────────────────────────────────
123
+ function generateZshScript() {
124
+ return `#compdef convoai
125
+ # convoai zsh completion
126
+ # Generated by: convoai completion zsh
127
+
128
+ _convoai() {
129
+ local -a toplevel_commands
130
+ toplevel_commands=(
131
+ 'auth:Manage authentication credentials'
132
+ 'agent:Manage ConvoAI agents'
133
+ 'call:Manage phone calls (telephony)'
134
+ 'config:Manage CLI configuration'
135
+ 'preset:Manage agent presets'
136
+ 'template:Save and manage agent templates'
137
+ 'completion:Generate shell completion scripts'
138
+ 'repl:Start interactive shell'
139
+ )
140
+
141
+ local -a agent_commands
142
+ agent_commands=(
143
+ 'start:Start a new ConvoAI agent'
144
+ 'stop:Stop a running agent'
145
+ 'status:Show agent status'
146
+ 'list:List running agents'
147
+ 'update:Update a running agent'
148
+ 'speak:Send text for the agent to speak'
149
+ 'interrupt:Interrupt the agent'
150
+ 'history:Show conversation history'
151
+ 'turns:Show conversation turns'
152
+ 'watch:Watch agent status in real time'
153
+ )
154
+
155
+ local -a auth_commands
156
+ auth_commands=(
157
+ 'login:Authenticate with the Agora ConvoAI platform'
158
+ 'logout:Remove stored credentials'
159
+ 'status:Show current authentication status'
160
+ )
161
+
162
+ local -a call_commands
163
+ call_commands=(
164
+ 'initiate:Initiate a phone call'
165
+ 'hangup:Hang up a phone call'
166
+ 'status:Show call status'
167
+ )
168
+
169
+ local -a config_commands
170
+ config_commands=(
171
+ 'init:Initialize configuration'
172
+ 'set:Set a configuration value'
173
+ 'get:Get a configuration value'
174
+ 'show:Show full configuration'
175
+ 'path:Show config file path'
176
+ )
177
+
178
+ local -a preset_commands
179
+ preset_commands=(
180
+ 'list:List available presets'
181
+ 'use:Use a preset configuration'
182
+ )
183
+
184
+ local -a template_commands
185
+ template_commands=(
186
+ 'save:Save an agent template'
187
+ 'list:List saved templates'
188
+ 'show:Show template details'
189
+ 'delete:Delete a template'
190
+ 'use:Use a saved template'
191
+ )
192
+
193
+ local -a completion_commands
194
+ completion_commands=(
195
+ 'bash:Generate bash completion script'
196
+ 'zsh:Generate zsh completion script'
197
+ 'fish:Generate fish completion script'
198
+ 'install:Auto-detect shell and install completions'
199
+ )
200
+
201
+ local -a preset_names
202
+ preset_names=(${PRESET_NAMES.map((n) => `'${n}'`).join(' ')})
203
+
204
+ _arguments -C \\
205
+ '(-v --version)'{-v,--version}'[Show version]' \\
206
+ '(-h --help)'{-h,--help}'[Show help]' \\
207
+ '1:command:->command' \\
208
+ '*::arg:->args'
209
+
210
+ case $state in
211
+ command)
212
+ _describe -t commands 'convoai command' toplevel_commands
213
+ ;;
214
+ args)
215
+ case $words[1] in
216
+ agent)
217
+ _arguments -C \\
218
+ '1:subcommand:->subcmd' \\
219
+ '*::arg:->subargs'
220
+ case $state in
221
+ subcmd)
222
+ _describe -t commands 'agent subcommand' agent_commands
223
+ ;;
224
+ subargs)
225
+ case $words[1] in
226
+ start)
227
+ _arguments \\
228
+ '(-c --channel)'{-c,--channel}'[RTC channel name]:channel name' \\
229
+ '--preset[Use a built-in preset]:preset name:(${PRESET_NAMES.join(' ')})' \\
230
+ '--model[LLM model name]:model name' \\
231
+ '--tts[TTS vendor]:vendor name' \\
232
+ '--asr[ASR vendor]:vendor name' \\
233
+ '--json[Output as JSON]' \\
234
+ '--dry-run[Show request without sending]' \\
235
+ '--profile[Config profile to use]:profile name'
236
+ ;;
237
+ esac
238
+ ;;
239
+ esac
240
+ ;;
241
+ auth)
242
+ _arguments -C \\
243
+ '1:subcommand:->subcmd' \\
244
+ '*::arg:->subargs'
245
+ case $state in
246
+ subcmd)
247
+ _describe -t commands 'auth subcommand' auth_commands
248
+ ;;
249
+ esac
250
+ ;;
251
+ call)
252
+ _arguments -C \\
253
+ '1:subcommand:->subcmd' \\
254
+ '*::arg:->subargs'
255
+ case $state in
256
+ subcmd)
257
+ _describe -t commands 'call subcommand' call_commands
258
+ ;;
259
+ esac
260
+ ;;
261
+ config)
262
+ _arguments -C \\
263
+ '1:subcommand:->subcmd' \\
264
+ '*::arg:->subargs'
265
+ case $state in
266
+ subcmd)
267
+ _describe -t commands 'config subcommand' config_commands
268
+ ;;
269
+ esac
270
+ ;;
271
+ preset)
272
+ _arguments -C \\
273
+ '1:subcommand:->subcmd' \\
274
+ '*::arg:->subargs'
275
+ case $state in
276
+ subcmd)
277
+ _describe -t commands 'preset subcommand' preset_commands
278
+ ;;
279
+ subargs)
280
+ case $words[1] in
281
+ use)
282
+ _arguments \\
283
+ '1:preset name:(${PRESET_NAMES.join(' ')})'
284
+ ;;
285
+ esac
286
+ ;;
287
+ esac
288
+ ;;
289
+ template)
290
+ _arguments -C \\
291
+ '1:subcommand:->subcmd' \\
292
+ '*::arg:->subargs'
293
+ case $state in
294
+ subcmd)
295
+ _describe -t commands 'template subcommand' template_commands
296
+ ;;
297
+ esac
298
+ ;;
299
+ completion)
300
+ _arguments -C \\
301
+ '1:subcommand:->subcmd'
302
+ case $state in
303
+ subcmd)
304
+ _describe -t commands 'completion subcommand' completion_commands
305
+ ;;
306
+ esac
307
+ ;;
308
+ esac
309
+ ;;
310
+ esac
311
+ }
312
+
313
+ _convoai "$@"
314
+ `;
315
+ }
316
+ // ─── Fish Completion Script ───────────────────────────────────────────────
317
+ function generateFishScript() {
318
+ const lines = [
319
+ '# convoai fish completion',
320
+ '# Generated by: convoai completion fish',
321
+ '',
322
+ '# Disable file completions by default',
323
+ 'complete -c convoai -f',
324
+ '',
325
+ '# Helper: no subcommand entered yet',
326
+ "function __convoai_no_subcommand",
327
+ " set -l cmd (commandline -opc)",
328
+ ' if test (count $cmd) -eq 1',
329
+ ' return 0',
330
+ ' end',
331
+ ' return 1',
332
+ 'end',
333
+ '',
334
+ '# Helper: check if current command group matches',
335
+ 'function __convoai_using_command',
336
+ ' set -l cmd (commandline -opc)',
337
+ ' if test (count $cmd) -lt 2',
338
+ ' return 1',
339
+ ' end',
340
+ ' if test "$cmd[2]" = "$argv[1]"',
341
+ ' return 0',
342
+ ' end',
343
+ ' return 1',
344
+ 'end',
345
+ '',
346
+ '# Helper: check if current subcommand matches',
347
+ 'function __convoai_using_subcommand',
348
+ ' set -l cmd (commandline -opc)',
349
+ ' if test (count $cmd) -lt 3',
350
+ ' return 1',
351
+ ' end',
352
+ ' if test "$cmd[2]" = "$argv[1]" -a "$cmd[3]" = "$argv[2]"',
353
+ ' return 0',
354
+ ' end',
355
+ ' return 1',
356
+ 'end',
357
+ '',
358
+ '# ── Top-level commands ──────────────────────────────────────',
359
+ 'complete -c convoai -n __convoai_no_subcommand -a auth -d "Manage authentication credentials"',
360
+ 'complete -c convoai -n __convoai_no_subcommand -a agent -d "Manage ConvoAI agents"',
361
+ 'complete -c convoai -n __convoai_no_subcommand -a call -d "Manage phone calls (telephony)"',
362
+ 'complete -c convoai -n __convoai_no_subcommand -a config -d "Manage CLI configuration"',
363
+ 'complete -c convoai -n __convoai_no_subcommand -a preset -d "Manage agent presets"',
364
+ 'complete -c convoai -n __convoai_no_subcommand -a template -d "Save and manage agent templates"',
365
+ 'complete -c convoai -n __convoai_no_subcommand -a completion -d "Generate shell completion scripts"',
366
+ 'complete -c convoai -n __convoai_no_subcommand -a repl -d "Start interactive shell"',
367
+ '',
368
+ '# ── agent subcommands ──────────────────────────────────────',
369
+ 'complete -c convoai -n "__convoai_using_command agent" -a start -d "Start a new ConvoAI agent"',
370
+ 'complete -c convoai -n "__convoai_using_command agent" -a stop -d "Stop a running agent"',
371
+ 'complete -c convoai -n "__convoai_using_command agent" -a status -d "Show agent status"',
372
+ 'complete -c convoai -n "__convoai_using_command agent" -a list -d "List running agents"',
373
+ 'complete -c convoai -n "__convoai_using_command agent" -a update -d "Update a running agent"',
374
+ 'complete -c convoai -n "__convoai_using_command agent" -a speak -d "Send text for the agent to speak"',
375
+ 'complete -c convoai -n "__convoai_using_command agent" -a interrupt -d "Interrupt the agent"',
376
+ 'complete -c convoai -n "__convoai_using_command agent" -a history -d "Show conversation history"',
377
+ 'complete -c convoai -n "__convoai_using_command agent" -a turns -d "Show conversation turns"',
378
+ 'complete -c convoai -n "__convoai_using_command agent" -a watch -d "Watch agent status in real time"',
379
+ '',
380
+ '# ── call subcommands ───────────────────────────────────────',
381
+ 'complete -c convoai -n "__convoai_using_command call" -a initiate -d "Initiate a phone call"',
382
+ 'complete -c convoai -n "__convoai_using_command call" -a hangup -d "Hang up a phone call"',
383
+ 'complete -c convoai -n "__convoai_using_command call" -a status -d "Show call status"',
384
+ '',
385
+ '# ── agent start flags ──────────────────────────────────────',
386
+ 'complete -c convoai -n "__convoai_using_subcommand agent start" -l channel -s c -d "RTC channel name" -r',
387
+ 'complete -c convoai -n "__convoai_using_subcommand agent start" -l preset -d "Use a built-in preset" -r -a "' + PRESET_NAMES.join(' ') + '"',
388
+ 'complete -c convoai -n "__convoai_using_subcommand agent start" -l model -d "LLM model name" -r',
389
+ 'complete -c convoai -n "__convoai_using_subcommand agent start" -l tts -d "TTS vendor" -r',
390
+ 'complete -c convoai -n "__convoai_using_subcommand agent start" -l asr -d "ASR vendor" -r',
391
+ 'complete -c convoai -n "__convoai_using_subcommand agent start" -l json -d "Output as JSON"',
392
+ 'complete -c convoai -n "__convoai_using_subcommand agent start" -l dry-run -d "Show request without sending"',
393
+ 'complete -c convoai -n "__convoai_using_subcommand agent start" -l profile -d "Config profile to use" -r',
394
+ '',
395
+ '# ── auth subcommands ──────────────────────────────────────',
396
+ 'complete -c convoai -n "__convoai_using_command auth" -a login -d "Authenticate with the Agora ConvoAI platform"',
397
+ 'complete -c convoai -n "__convoai_using_command auth" -a logout -d "Remove stored credentials"',
398
+ 'complete -c convoai -n "__convoai_using_command auth" -a status -d "Show current authentication status"',
399
+ '',
400
+ '# ── config subcommands ─────────────────────────────────────',
401
+ 'complete -c convoai -n "__convoai_using_command config" -a init -d "Initialize configuration"',
402
+ 'complete -c convoai -n "__convoai_using_command config" -a set -d "Set a configuration value"',
403
+ 'complete -c convoai -n "__convoai_using_command config" -a get -d "Get a configuration value"',
404
+ 'complete -c convoai -n "__convoai_using_command config" -a show -d "Show full configuration"',
405
+ 'complete -c convoai -n "__convoai_using_command config" -a path -d "Show config file path"',
406
+ '',
407
+ '# ── template subcommands ───────────────────────────────────',
408
+ 'complete -c convoai -n "__convoai_using_command template" -a save -d "Save an agent template"',
409
+ 'complete -c convoai -n "__convoai_using_command template" -a list -d "List saved templates"',
410
+ 'complete -c convoai -n "__convoai_using_command template" -a show -d "Show template details"',
411
+ 'complete -c convoai -n "__convoai_using_command template" -a delete -d "Delete a template"',
412
+ 'complete -c convoai -n "__convoai_using_command template" -a use -d "Use a saved template"',
413
+ '',
414
+ '# ── preset subcommands ─────────────────────────────────────',
415
+ 'complete -c convoai -n "__convoai_using_command preset" -a list -d "List available presets"',
416
+ 'complete -c convoai -n "__convoai_using_command preset" -a use -d "Use a preset configuration"',
417
+ '',
418
+ '# ── preset use: complete preset names ──────────────────────',
419
+ 'complete -c convoai -n "__convoai_using_subcommand preset use" -a "' + PRESET_NAMES.join(' ') + '" -d "Preset name"',
420
+ '',
421
+ '# ── completion subcommands ─────────────────────────────────',
422
+ 'complete -c convoai -n "__convoai_using_command completion" -a bash -d "Generate bash completion script"',
423
+ 'complete -c convoai -n "__convoai_using_command completion" -a zsh -d "Generate zsh completion script"',
424
+ 'complete -c convoai -n "__convoai_using_command completion" -a fish -d "Generate fish completion script"',
425
+ 'complete -c convoai -n "__convoai_using_command completion" -a install -d "Auto-detect shell and install completions"',
426
+ ];
427
+ return lines.join('\n') + '\n';
428
+ }
429
+ // ─── Install Logic ────────────────────────────────────────────────────────
430
+ const COMPLETION_MARKER = '# convoai shell completions';
431
+ function detectShell() {
432
+ const shell = process.env.SHELL ?? '';
433
+ if (shell.endsWith('/zsh'))
434
+ return 'zsh';
435
+ if (shell.endsWith('/bash'))
436
+ return 'bash';
437
+ if (shell.endsWith('/fish'))
438
+ return 'fish';
439
+ return null;
440
+ }
441
+ function installCompletions() {
442
+ const shell = detectShell();
443
+ if (!shell) {
444
+ printError(`Could not detect shell from $SHELL (${process.env.SHELL ?? 'unset'}).`);
445
+ printHint('Run `convoai completion bash`, `convoai completion zsh`, or `convoai completion fish` and install manually.');
446
+ process.exitCode = 1;
447
+ return;
448
+ }
449
+ const home = homedir();
450
+ switch (shell) {
451
+ case 'bash': {
452
+ const rcFile = join(home, '.bashrc');
453
+ const snippet = `\n${COMPLETION_MARKER}\neval "$(convoai completion bash)"\n`;
454
+ if (alreadyInstalled(rcFile)) {
455
+ printSuccess('Bash completions are already installed in ~/.bashrc');
456
+ return;
457
+ }
458
+ appendFileSync(rcFile, snippet, 'utf-8');
459
+ printSuccess('Bash completions installed to ~/.bashrc');
460
+ printHint('Restart your shell or run `source ~/.bashrc` to activate.');
461
+ break;
462
+ }
463
+ case 'zsh': {
464
+ const rcFile = join(home, '.zshrc');
465
+ const snippet = `\n${COMPLETION_MARKER}\neval "$(convoai completion zsh)"\n`;
466
+ if (alreadyInstalled(rcFile)) {
467
+ printSuccess('Zsh completions are already installed in ~/.zshrc');
468
+ return;
469
+ }
470
+ appendFileSync(rcFile, snippet, 'utf-8');
471
+ printSuccess('Zsh completions installed to ~/.zshrc');
472
+ printHint('Restart your shell or run `source ~/.zshrc` to activate.');
473
+ break;
474
+ }
475
+ case 'fish': {
476
+ const fishDir = join(home, '.config', 'fish', 'completions');
477
+ const fishFile = join(fishDir, 'convoai.fish');
478
+ mkdirSync(fishDir, { recursive: true });
479
+ writeFileSync(fishFile, generateFishScript(), 'utf-8');
480
+ printSuccess(`Fish completions installed to ${fishFile}`);
481
+ printHint('Restart your shell to activate. Fish loads completions automatically.');
482
+ break;
483
+ }
484
+ }
485
+ }
486
+ function alreadyInstalled(rcFile) {
487
+ if (!existsSync(rcFile))
488
+ return false;
489
+ const content = readFileSync(rcFile, 'utf-8');
490
+ return content.includes(COMPLETION_MARKER);
491
+ }
492
+ // ─── Command Registration ─────────────────────────────────────────────────
493
+ export function registerCompletion(program) {
494
+ const completion = program
495
+ .command('completion')
496
+ .description('Generate shell completion scripts');
497
+ completion
498
+ .command('bash')
499
+ .description('Output bash completion script')
500
+ .action(() => {
501
+ try {
502
+ process.stdout.write(generateBashScript());
503
+ }
504
+ catch (error) {
505
+ handleError(error);
506
+ }
507
+ });
508
+ completion
509
+ .command('zsh')
510
+ .description('Output zsh completion script')
511
+ .action(() => {
512
+ try {
513
+ process.stdout.write(generateZshScript());
514
+ }
515
+ catch (error) {
516
+ handleError(error);
517
+ }
518
+ });
519
+ completion
520
+ .command('fish')
521
+ .description('Output fish completion script')
522
+ .action(() => {
523
+ try {
524
+ process.stdout.write(generateFishScript());
525
+ }
526
+ catch (error) {
527
+ handleError(error);
528
+ }
529
+ });
530
+ completion
531
+ .command('install')
532
+ .description('Auto-detect shell and install completions to the appropriate rc file')
533
+ .action(() => {
534
+ try {
535
+ installCompletions();
536
+ }
537
+ catch (error) {
538
+ handleError(error);
539
+ }
540
+ });
541
+ }
542
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/commands/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerConfigGet(program: Command): void;
@@ -0,0 +1,79 @@
1
+ import { loadConfig, getActiveProfile } from '../../config/manager.js';
2
+ import { printError } from '../../ui/output.js';
3
+ import { handleError } from '../../utils/errors.js';
4
+ // ─── Command Registration ──────────────────────────────────────────────────
5
+ export function registerConfigGet(program) {
6
+ program
7
+ .command('get <key>')
8
+ .description('Get a configuration value (supports dot notation, e.g. llm.model)')
9
+ .option('--profile <name>', 'Read value from a named profile')
10
+ .action(async (key, opts) => {
11
+ try {
12
+ getAction(key, opts);
13
+ }
14
+ catch (error) {
15
+ handleError(error);
16
+ }
17
+ });
18
+ }
19
+ // ─── Helpers ───────────────────────────────────────────────────────────────
20
+ function getNestedValue(obj, keyPath) {
21
+ const parts = keyPath.split('.');
22
+ let current = obj;
23
+ for (const part of parts) {
24
+ if (current === null || current === undefined || typeof current !== 'object') {
25
+ return undefined;
26
+ }
27
+ current = current[part];
28
+ }
29
+ return current;
30
+ }
31
+ // ─── Action ────────────────────────────────────────────────────────────────
32
+ function getAction(key, opts) {
33
+ const config = loadConfig();
34
+ let source;
35
+ if (opts.profile) {
36
+ const profile = config.profiles?.[opts.profile];
37
+ if (!profile) {
38
+ printError(`Profile "${opts.profile}" not found.`);
39
+ process.exit(1);
40
+ }
41
+ source = profile;
42
+ }
43
+ else {
44
+ // For top-level keys, read from root config; for nested keys like llm.*,
45
+ // merge with the active profile so we pick up profile-level settings too.
46
+ source = config;
47
+ // If the key starts with llm/tts/asr, also check active profile
48
+ const topSegment = key.split('.')[0];
49
+ if (['llm', 'tts', 'asr'].includes(topSegment)) {
50
+ try {
51
+ const profile = getActiveProfile();
52
+ const profileValue = getNestedValue(profile, key);
53
+ const rootValue = getNestedValue(source, key);
54
+ if (rootValue === undefined && profileValue !== undefined) {
55
+ outputValue(profileValue);
56
+ return;
57
+ }
58
+ }
59
+ catch {
60
+ // Credentials not configured — just fall through to root config
61
+ }
62
+ }
63
+ }
64
+ const value = getNestedValue(source, key);
65
+ if (value === undefined) {
66
+ printError(`Key "${key}" is not set.`);
67
+ process.exit(1);
68
+ }
69
+ outputValue(value);
70
+ }
71
+ function outputValue(value) {
72
+ if (typeof value === 'object' && value !== null) {
73
+ console.log(JSON.stringify(value, null, 2));
74
+ }
75
+ else {
76
+ console.log(String(value));
77
+ }
78
+ }
79
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/commands/config/get.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerConfigInit(program: Command): void;