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
package/bin/convoai.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { run } from '../src/index.js';
3
+ run();
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { run } from '../src/index.js';
3
+ run();
4
+ //# sourceMappingURL=convoai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convoai.js","sourceRoot":"","sources":["../../bin/convoai.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,GAAG,EAAE,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { AxiosInstance } from 'axios';
2
+ import type { StartAgentRequest, StartAgentResponse, QueryAgentResponse, ListAgentsParams, ListAgentsResponse, UpdateAgentRequest, UpdateAgentResponse, SpeakRequest, SpeakResponse, HistoryResponse, TurnsResponse } from './types.js';
3
+ export declare class AgentAPI {
4
+ private readonly client;
5
+ constructor(client: AxiosInstance);
6
+ /** Start (join) a new conversational AI agent. */
7
+ start(req: StartAgentRequest): Promise<StartAgentResponse>;
8
+ /** Stop (leave) a running agent. */
9
+ stop(agentId: string): Promise<void>;
10
+ /** Query the current status of an agent. */
11
+ status(agentId: string): Promise<QueryAgentResponse>;
12
+ /** List agents with optional filters. */
13
+ list(params?: ListAgentsParams): Promise<ListAgentsResponse>;
14
+ /** Update a running agent's properties (e.g. token, LLM config). */
15
+ update(agentId: string, req: UpdateAgentRequest): Promise<UpdateAgentResponse>;
16
+ /** Instruct an agent to speak the given text. */
17
+ speak(agentId: string, req: SpeakRequest): Promise<SpeakResponse>;
18
+ /** Interrupt an agent that is currently speaking. */
19
+ interrupt(agentId: string): Promise<void>;
20
+ /** Retrieve conversation history for an agent. */
21
+ history(agentId: string): Promise<HistoryResponse>;
22
+ /** Retrieve turn-level analytics for an agent. */
23
+ turns(agentId: string): Promise<TurnsResponse>;
24
+ }
@@ -0,0 +1,51 @@
1
+ // ─── Agent API ──────────────────────────────────────────────────────────────
2
+ export class AgentAPI {
3
+ client;
4
+ constructor(client) {
5
+ this.client = client;
6
+ }
7
+ /** Start (join) a new conversational AI agent. */
8
+ async start(req) {
9
+ const { data } = await this.client.post('/join', req);
10
+ return data;
11
+ }
12
+ /** Stop (leave) a running agent. */
13
+ async stop(agentId) {
14
+ await this.client.post(`/agents/${agentId}/leave`);
15
+ }
16
+ /** Query the current status of an agent. */
17
+ async status(agentId) {
18
+ const { data } = await this.client.get(`/agents/${agentId}`);
19
+ return data;
20
+ }
21
+ /** List agents with optional filters. */
22
+ async list(params) {
23
+ const { data } = await this.client.get('/agents', { params });
24
+ return data;
25
+ }
26
+ /** Update a running agent's properties (e.g. token, LLM config). */
27
+ async update(agentId, req) {
28
+ const { data } = await this.client.post(`/agents/${agentId}/update`, req);
29
+ return data;
30
+ }
31
+ /** Instruct an agent to speak the given text. */
32
+ async speak(agentId, req) {
33
+ const { data } = await this.client.post(`/agents/${agentId}/speak`, req);
34
+ return data;
35
+ }
36
+ /** Interrupt an agent that is currently speaking. */
37
+ async interrupt(agentId) {
38
+ await this.client.post(`/agents/${agentId}/interrupt`);
39
+ }
40
+ /** Retrieve conversation history for an agent. */
41
+ async history(agentId) {
42
+ const { data } = await this.client.get(`/agents/${agentId}/history`);
43
+ return data;
44
+ }
45
+ /** Retrieve turn-level analytics for an agent. */
46
+ async turns(agentId) {
47
+ const { data } = await this.client.get(`/agents/${agentId}/turns`);
48
+ return data;
49
+ }
50
+ }
51
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/api/agents.ts"],"names":[],"mappings":"AAeA,+EAA+E;AAE/E,MAAM,OAAO,QAAQ;IACU;IAA7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,kDAAkD;IAClD,KAAK,CAAC,KAAK,CAAC,GAAsB;QAChC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAqB,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAqB,WAAW,OAAO,EAAE,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,IAAI,CAAC,MAAyB;QAClC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAqB,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,GAAuB;QACnD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,WAAW,OAAO,SAAS,EAC3B,GAAG,CACJ,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iDAAiD;IACjD,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,GAAiB;QAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,WAAW,OAAO,QAAQ,EAC1B,GAAG,CACJ,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,SAAS,CAAC,OAAe;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,YAAY,CAAC,CAAC;IACzD,CAAC;IAED,kDAAkD;IAClD,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,WAAW,OAAO,UAAU,CAC7B,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,KAAK,CAAC,KAAK,CAAC,OAAe;QACzB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAgB,WAAW,OAAO,QAAQ,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,53 @@
1
+ import type { AxiosInstance } from 'axios';
2
+ export interface InitiateCallRequest {
3
+ name: string;
4
+ properties: {
5
+ channel: string;
6
+ phone_number: string;
7
+ agent_rtc_uid?: string;
8
+ idle_timeout?: number;
9
+ llm?: {
10
+ url?: string;
11
+ api_key?: string;
12
+ system_messages?: Array<{
13
+ role: string;
14
+ content: string;
15
+ }>;
16
+ greeting_message?: string;
17
+ params?: {
18
+ model?: string;
19
+ max_tokens?: number;
20
+ temperature?: number;
21
+ };
22
+ };
23
+ tts?: {
24
+ vendor?: string;
25
+ params?: Record<string, unknown>;
26
+ };
27
+ asr?: {
28
+ language?: string;
29
+ vendor?: string;
30
+ };
31
+ };
32
+ }
33
+ export interface CallStatusResponse {
34
+ agent_id: string;
35
+ status: string;
36
+ direction: 'inbound' | 'outbound';
37
+ phone_number?: string;
38
+ start_ts: number;
39
+ end_ts?: number;
40
+ }
41
+ export declare class CallAPI {
42
+ private readonly client;
43
+ constructor(client: AxiosInstance);
44
+ /** Initiate an outbound phone call. */
45
+ initiate(req: InitiateCallRequest): Promise<{
46
+ agent_id: string;
47
+ status: string;
48
+ }>;
49
+ /** Hang up an active call. */
50
+ hangup(agentId: string): Promise<void>;
51
+ /** Get the current status of a call. */
52
+ status(agentId: string): Promise<CallStatusResponse>;
53
+ }
@@ -0,0 +1,22 @@
1
+ // ─── Call API ───────────────────────────────────────────────────────────────
2
+ export class CallAPI {
3
+ client;
4
+ constructor(client) {
5
+ this.client = client;
6
+ }
7
+ /** Initiate an outbound phone call. */
8
+ async initiate(req) {
9
+ const { data } = await this.client.post('/call', req);
10
+ return data;
11
+ }
12
+ /** Hang up an active call. */
13
+ async hangup(agentId) {
14
+ await this.client.post(`/calls/${agentId}/hangup`);
15
+ }
16
+ /** Get the current status of a call. */
17
+ async status(agentId) {
18
+ const { data } = await this.client.get(`/calls/${agentId}`);
19
+ return data;
20
+ }
21
+ }
22
+ //# sourceMappingURL=calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.js","sourceRoot":"","sources":["../../../src/api/calls.ts"],"names":[],"mappings":"AAgCA,+EAA+E;AAE/E,MAAM,OAAO,OAAO;IACW;IAA7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,uCAAuC;IACvC,KAAK,CAAC,QAAQ,CAAC,GAAwB;QACrC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAuC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAqB,UAAU,OAAO,EAAE,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import { type AxiosInstance } from 'axios';
2
+ export interface ClientConfig {
3
+ appId: string;
4
+ customerId: string;
5
+ customerSecret: string;
6
+ baseUrl?: string;
7
+ region?: 'global' | 'cn';
8
+ }
9
+ export declare function resolveBaseUrl(appId: string, region?: string, customBaseUrl?: string): string;
10
+ export declare function createClient(config: ClientConfig): AxiosInstance;
@@ -0,0 +1,63 @@
1
+ import axios from 'axios';
2
+ // ─── Base URL Resolution ────────────────────────────────────────────────────
3
+ const BASE_URLS = {
4
+ global: 'https://api.agora.io/api/conversational-ai-agent/v2/projects',
5
+ cn: 'https://api.agora.io/cn/api/conversational-ai-agent/v2/projects',
6
+ };
7
+ export function resolveBaseUrl(appId, region, customBaseUrl) {
8
+ if (customBaseUrl) {
9
+ // If custom URL already contains the appId path segment, use as-is
10
+ return customBaseUrl.replace(/\/$/, '');
11
+ }
12
+ const base = BASE_URLS[region ?? 'global'] ?? BASE_URLS.global;
13
+ return `${base}/${appId}`;
14
+ }
15
+ // ─── Retry Helpers ─────────────────────────────────────────────────────────
16
+ const RETRY_STATUS_CODES = new Set([429, 500, 502, 503, 504]);
17
+ const MAX_RETRIES = 3;
18
+ const BASE_DELAY_MS = 1000;
19
+ async function sleep(ms) {
20
+ return new Promise((resolve) => setTimeout(resolve, ms));
21
+ }
22
+ // ─── Client Factory ─────────────────────────────────────────────────────────
23
+ export function createClient(config) {
24
+ const { appId, customerId, customerSecret, baseUrl, region } = config;
25
+ const resolvedUrl = resolveBaseUrl(appId, region, baseUrl);
26
+ const credentials = Buffer.from(`${customerId}:${customerSecret}`).toString('base64');
27
+ const client = axios.create({
28
+ baseURL: resolvedUrl,
29
+ headers: {
30
+ 'Content-Type': 'application/json',
31
+ Authorization: `Basic ${credentials}`,
32
+ },
33
+ timeout: 60_000,
34
+ });
35
+ // ── Response interceptor: retry + normalize API errors ───────────────────
36
+ client.interceptors.response.use((res) => res, async (error) => {
37
+ const config = error.config;
38
+ const status = error.response?.status;
39
+ // Retry on retryable status codes
40
+ if (config && status && RETRY_STATUS_CODES.has(status)) {
41
+ const retryCount = (config.__retryCount ?? 0);
42
+ if (retryCount < MAX_RETRIES) {
43
+ config.__retryCount = retryCount + 1;
44
+ const delay = BASE_DELAY_MS * Math.pow(2, retryCount);
45
+ await sleep(delay);
46
+ return client.request(config);
47
+ }
48
+ }
49
+ // Format the error
50
+ if (error.response?.data) {
51
+ const { detail, reason } = error.response.data;
52
+ const message = detail || reason || error.message;
53
+ const formatted = new Error(`API Error ${status}: ${message}`);
54
+ formatted.status = status;
55
+ formatted.detail = detail;
56
+ formatted.reason = reason;
57
+ return Promise.reject(formatted);
58
+ }
59
+ return Promise.reject(error);
60
+ });
61
+ return client;
62
+ }
63
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,207 @@
1
+ export type AgentStatus = 'IDLE' | 'STARTING' | 'RUNNING' | 'STOPPING' | 'STOPPED' | 'RECOVERING' | 'FAILED';
2
+ export declare const AgentStatusCode: Record<number, AgentStatus>;
3
+ export declare const AgentStatusNumber: Record<AgentStatus, number>;
4
+ export interface TurnDetection {
5
+ type?: 'agora_vad' | 'server_vad' | 'semantic_vad';
6
+ interrupt_mode?: 'interrupt' | 'append' | 'ignore' | 'adaptive';
7
+ silence_duration_ms?: number;
8
+ interrupt_duration_ms?: number;
9
+ prefix_padding_ms?: number;
10
+ threshold?: number;
11
+ }
12
+ export interface LLMConfig {
13
+ url?: string;
14
+ api_key?: string;
15
+ vendor?: string;
16
+ style?: 'openai' | 'gemini' | 'anthropic' | 'dify';
17
+ model?: string;
18
+ headers?: string;
19
+ system_messages?: Array<Record<string, unknown>>;
20
+ greeting_message?: string;
21
+ failure_message?: string;
22
+ max_history?: number;
23
+ input_modalities?: string[];
24
+ output_modalities?: string[];
25
+ params?: {
26
+ model?: string;
27
+ max_tokens?: number;
28
+ temperature?: number;
29
+ top_p?: number;
30
+ [key: string]: unknown;
31
+ };
32
+ }
33
+ export interface TTSConfig {
34
+ vendor?: string;
35
+ params?: {
36
+ key?: string;
37
+ region?: string;
38
+ voice_name?: string;
39
+ speed?: number;
40
+ volume?: number;
41
+ sample_rate?: number;
42
+ [key: string]: unknown;
43
+ };
44
+ }
45
+ export interface ASRConfig {
46
+ language?: string;
47
+ vendor?: string;
48
+ params?: {
49
+ key?: string;
50
+ model?: string;
51
+ language?: string;
52
+ [key: string]: unknown;
53
+ };
54
+ }
55
+ export interface AdvancedFeatures {
56
+ enable_aivad?: boolean;
57
+ enable_rtm?: boolean;
58
+ enable_mllm?: boolean;
59
+ enable_sal?: boolean;
60
+ enable_mcp?: boolean;
61
+ }
62
+ export interface SilenceConfig {
63
+ timeout_ms?: number;
64
+ action?: 'speak' | 'leave';
65
+ content?: string;
66
+ }
67
+ export interface AgentParameters {
68
+ silence_config?: SilenceConfig;
69
+ data_channel?: string;
70
+ enable_metrics?: boolean;
71
+ enable_error_message?: boolean;
72
+ }
73
+ export interface AgentProperties {
74
+ channel: string;
75
+ token?: string;
76
+ agent_rtc_uid?: string;
77
+ remote_rtc_uids?: string[];
78
+ enable_string_uid?: boolean;
79
+ idle_timeout?: number;
80
+ llm?: LLMConfig;
81
+ tts?: TTSConfig;
82
+ asr?: ASRConfig;
83
+ turn_detection?: TurnDetection;
84
+ parameters?: AgentParameters;
85
+ advanced_features?: AdvancedFeatures;
86
+ labels?: Record<string, string>;
87
+ }
88
+ export interface StartAgentRequest {
89
+ name: string;
90
+ properties?: AgentProperties;
91
+ preset?: string;
92
+ pipeline_id?: string;
93
+ }
94
+ export interface StartAgentResponse {
95
+ agent_id: string;
96
+ create_ts: number;
97
+ status: AgentStatus;
98
+ }
99
+ export interface QueryAgentResponse {
100
+ agent_id: string;
101
+ status: AgentStatus;
102
+ start_ts: number;
103
+ stop_ts?: number;
104
+ message?: string;
105
+ channel?: string;
106
+ }
107
+ export interface ListAgentsParams {
108
+ state?: number;
109
+ limit?: number;
110
+ channel?: string;
111
+ from_time?: number;
112
+ to_time?: number;
113
+ cursor?: string;
114
+ }
115
+ export interface ListAgentsResponse {
116
+ data: {
117
+ count: number;
118
+ list: Array<{
119
+ agent_id: string;
120
+ status: AgentStatus;
121
+ start_ts: number;
122
+ stop_ts?: number;
123
+ channel?: string;
124
+ }>;
125
+ };
126
+ meta: {
127
+ cursor?: string;
128
+ total?: number;
129
+ };
130
+ status: string;
131
+ }
132
+ export interface UpdateAgentRequest {
133
+ properties: Partial<Pick<AgentProperties, 'token' | 'llm'>>;
134
+ }
135
+ export interface UpdateAgentResponse {
136
+ agent_id: string;
137
+ create_ts: number;
138
+ status: AgentStatus;
139
+ }
140
+ export type SpeakPriority = 'INTERRUPT' | 'APPEND' | 'IGNORE';
141
+ export interface SpeakRequest {
142
+ text: string;
143
+ priority?: SpeakPriority;
144
+ interrupt?: boolean;
145
+ }
146
+ export interface SpeakResponse {
147
+ agent_id: string;
148
+ channel: string;
149
+ start_ts: number;
150
+ }
151
+ export interface HistoryEntry {
152
+ role: 'user' | 'assistant';
153
+ content: string;
154
+ turn_id?: string;
155
+ timestamp?: number;
156
+ metadata?: {
157
+ source?: string;
158
+ interrupted?: boolean;
159
+ };
160
+ }
161
+ export interface HistoryResponse {
162
+ agent_id: string;
163
+ start_ts: number;
164
+ status: AgentStatus;
165
+ contents: HistoryEntry[];
166
+ }
167
+ export interface TurnEntry {
168
+ turn_id: string;
169
+ start_ts: number;
170
+ end_ts: number;
171
+ type: 'voice_input' | 'greeting' | 'silence_timeout' | 'api_speak';
172
+ end_reason: 'ok' | 'interrupted' | 'ignored' | 'error';
173
+ e2e_latency_ms?: number;
174
+ segmented_latency_ms?: {
175
+ asr_ms?: number;
176
+ llm_ms?: number;
177
+ tts_ms?: number;
178
+ };
179
+ }
180
+ export interface TurnsResponse {
181
+ agent_id: string;
182
+ turns: TurnEntry[];
183
+ }
184
+ export interface ApiErrorResponse {
185
+ detail: string;
186
+ reason: string;
187
+ }
188
+ export interface ConvoAIConfig {
189
+ app_id?: string;
190
+ app_certificate?: string;
191
+ customer_id?: string;
192
+ customer_secret?: string;
193
+ base_url?: string;
194
+ region?: 'global' | 'cn';
195
+ default_profile?: string;
196
+ profiles?: Record<string, ProfileConfig>;
197
+ }
198
+ export interface ProfileConfig {
199
+ app_id?: string;
200
+ customer_id?: string;
201
+ customer_secret?: string;
202
+ base_url?: string;
203
+ region?: 'global' | 'cn';
204
+ llm?: Partial<LLMConfig>;
205
+ tts?: Partial<TTSConfig>;
206
+ asr?: Partial<ASRConfig>;
207
+ }
@@ -0,0 +1,20 @@
1
+ // ─── Agent Status ────────────────────────────────────────────────────────────
2
+ export const AgentStatusCode = {
3
+ 0: 'IDLE',
4
+ 1: 'STARTING',
5
+ 2: 'RUNNING',
6
+ 3: 'STOPPING',
7
+ 4: 'STOPPED',
8
+ 5: 'RECOVERING',
9
+ 6: 'FAILED',
10
+ };
11
+ export const AgentStatusNumber = {
12
+ IDLE: 0,
13
+ STARTING: 1,
14
+ RUNNING: 2,
15
+ STOPPING: 3,
16
+ STOPPED: 4,
17
+ RECOVERING: 5,
18
+ FAILED: 6,
19
+ };
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAWhF,MAAM,CAAC,MAAM,eAAe,GAAgC;IAC1D,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,QAAQ;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAgC;IAC5D,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,CAAC;IACb,MAAM,EAAE,CAAC;CACV,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { AgentAPI } from '../../api/agents.js';
2
+ /**
3
+ * Resolve config for the given profile, create an authenticated HTTP client,
4
+ * and return a ready-to-use AgentAPI instance.
5
+ */
6
+ export declare function getAgentAPI(profileName?: string): AgentAPI;
7
+ export { formatTimestamp, relativeTime } from '../../utils/format.js';
@@ -0,0 +1,32 @@
1
+ import { resolveConfig } from '../../config/manager.js';
2
+ import { createClient } from '../../api/client.js';
3
+ import { AgentAPI } from '../../api/agents.js';
4
+ // ─── Agent API Factory ─────────────────────────────────────────────────────
5
+ /**
6
+ * Resolve config for the given profile, create an authenticated HTTP client,
7
+ * and return a ready-to-use AgentAPI instance.
8
+ */
9
+ export function getAgentAPI(profileName) {
10
+ const config = resolveConfig(profileName);
11
+ if (!config.app_id || !config.customer_id || !config.customer_secret) {
12
+ const missing = [];
13
+ if (!config.app_id)
14
+ missing.push('app_id');
15
+ if (!config.customer_id)
16
+ missing.push('customer_id');
17
+ if (!config.customer_secret)
18
+ missing.push('customer_secret');
19
+ throw new Error(`Missing required credentials: ${missing.join(', ')}. Run "convoai auth login" to configure.`);
20
+ }
21
+ const client = createClient({
22
+ appId: config.app_id,
23
+ customerId: config.customer_id,
24
+ customerSecret: config.customer_secret,
25
+ baseUrl: config.base_url,
26
+ region: config.region,
27
+ });
28
+ return new AgentAPI(client);
29
+ }
30
+ // ─── Timestamp Formatting (re-exported from shared utils) ─────────────────
31
+ export { formatTimestamp, relativeTime } from '../../utils/format.js';
32
+ //# sourceMappingURL=_helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_helpers.js","sourceRoot":"","sources":["../../../../src/commands/agent/_helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,WAAoB;IAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QACrE,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,eAAe;YAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7D,MAAM,IAAI,KAAK,CACb,iCAAiC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C,CAC9F,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,UAAU,EAAE,MAAM,CAAC,WAAW;QAC9B,cAAc,EAAE,MAAM,CAAC,eAAe;QACtC,OAAO,EAAE,MAAM,CAAC,QAAQ;QACxB,MAAM,EAAE,MAAM,CAAC,MAAqC;KACrD,CAAC,CAAC;IACH,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,6EAA6E;AAE7E,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAgentHistory(program: Command): void;
@@ -0,0 +1,78 @@
1
+ import chalk from 'chalk';
2
+ import { getAgentAPI, formatTimestamp } from './_helpers.js';
3
+ import { withSpinner } from '../../ui/spinner.js';
4
+ import { handleError } from '../../utils/errors.js';
5
+ import { hintAfterHistory, shortId } from '../../utils/hints.js';
6
+ import { printHint } from '../../ui/output.js';
7
+ import { colorStatus, dim } from '../../ui/colors.js';
8
+ // ─── Command Registration ──────────────────────────────────────────────────
9
+ export function registerAgentHistory(program) {
10
+ program
11
+ .command('history <agent-id>')
12
+ .description('View conversation history for an agent')
13
+ .option('--profile <name>', 'Use a named config profile')
14
+ .option('--json', 'Output result as JSON')
15
+ .option('--limit <n>', 'Show only the last N entries', parseInt)
16
+ .action(async (agentId, opts) => {
17
+ try {
18
+ await historyAction(agentId, opts);
19
+ }
20
+ catch (error) {
21
+ handleError(error, { json: opts.json });
22
+ }
23
+ });
24
+ }
25
+ // ─── Action ────────────────────────────────────────────────────────────────
26
+ async function historyAction(agentId, opts) {
27
+ const api = getAgentAPI(opts.profile);
28
+ const data = await withSpinner('Fetching history...', () => api.history(agentId));
29
+ const allContents = data.contents ?? [];
30
+ if (opts.json) {
31
+ const output = opts.limit
32
+ ? { ...data, contents: allContents.slice(-opts.limit) }
33
+ : data;
34
+ console.log(JSON.stringify(output, null, 2));
35
+ return;
36
+ }
37
+ const entries = opts.limit
38
+ ? allContents.slice(-opts.limit)
39
+ : allContents;
40
+ // ── Header ──────────────────────────────────────────────────────────────
41
+ console.log();
42
+ console.log(`Agent: ${chalk.bold(shortId(data.agent_id))} | Status: ${colorStatus(data.status)} | Since: ${formatTimestamp(data.start_ts)}`);
43
+ console.log();
44
+ // ── Conversation ────────────────────────────────────────────────────────
45
+ if (entries.length === 0) {
46
+ console.log(dim(' No conversation history yet.'));
47
+ }
48
+ else {
49
+ for (const entry of entries) {
50
+ printEntry(entry);
51
+ }
52
+ }
53
+ // ── Footer ──────────────────────────────────────────────────────────────
54
+ console.log();
55
+ const totalCount = allContents.length;
56
+ const shownCount = entries.length;
57
+ if (opts.limit && totalCount > shownCount) {
58
+ console.log(dim(`Showing ${shownCount} of ${totalCount} entries.`));
59
+ }
60
+ else {
61
+ console.log(dim(`${totalCount} entries total.`));
62
+ }
63
+ printHint(hintAfterHistory(agentId));
64
+ }
65
+ // ─── Helpers ───────────────────────────────────────────────────────────────
66
+ function printEntry(entry) {
67
+ const roleTag = formatRole(entry.role);
68
+ // Wrap long content to keep output readable
69
+ const content = entry.content || dim('(empty)');
70
+ console.log(`${roleTag} ${content}`);
71
+ }
72
+ function formatRole(role) {
73
+ const padded = `[${role}]`.padEnd(13);
74
+ return role === 'user'
75
+ ? chalk.cyan(padded)
76
+ : chalk.green(padded);
77
+ }
78
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../../src/commands/agent/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAgentInterrupt(program: Command): void;