@xagent-ai/cli 1.0.1 → 1.1.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 (136) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  3. package/README.md +280 -280
  4. package/README_CN.md +3 -3
  5. package/dist/ai-client.d.ts.map +1 -1
  6. package/dist/ai-client.js +84 -82
  7. package/dist/ai-client.js.map +1 -1
  8. package/dist/auth.d.ts +0 -1
  9. package/dist/auth.d.ts.map +1 -1
  10. package/dist/auth.js +75 -105
  11. package/dist/auth.js.map +1 -1
  12. package/dist/cli.js +166 -13
  13. package/dist/cli.js.map +1 -1
  14. package/dist/config.d.ts +3 -1
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +48 -7
  17. package/dist/config.js.map +1 -1
  18. package/dist/context-compressor.d.ts +5 -5
  19. package/dist/context-compressor.js +8 -8
  20. package/dist/context-compressor.js.map +1 -1
  21. package/dist/gui-subagent/action-parser/actionParser.d.ts +7 -0
  22. package/dist/gui-subagent/action-parser/actionParser.d.ts.map +1 -1
  23. package/dist/gui-subagent/action-parser/actionParser.js +6 -3
  24. package/dist/gui-subagent/action-parser/actionParser.js.map +1 -1
  25. package/dist/gui-subagent/action-parser/constants.d.ts +6 -0
  26. package/dist/gui-subagent/action-parser/constants.d.ts.map +1 -1
  27. package/dist/gui-subagent/action-parser/constants.js +5 -3
  28. package/dist/gui-subagent/action-parser/constants.js.map +1 -1
  29. package/dist/gui-subagent/action-parser/index.d.ts +6 -0
  30. package/dist/gui-subagent/action-parser/index.d.ts.map +1 -1
  31. package/dist/gui-subagent/action-parser/index.js +5 -3
  32. package/dist/gui-subagent/action-parser/index.js.map +1 -1
  33. package/dist/gui-subagent/action-parser/types.d.ts +4 -0
  34. package/dist/gui-subagent/action-parser/types.d.ts.map +1 -1
  35. package/dist/gui-subagent/action-parser/types.js +3 -3
  36. package/dist/gui-subagent/agent/gui-agent.d.ts +39 -0
  37. package/dist/gui-subagent/agent/gui-agent.d.ts.map +1 -1
  38. package/dist/gui-subagent/agent/gui-agent.js +164 -89
  39. package/dist/gui-subagent/agent/gui-agent.js.map +1 -1
  40. package/dist/gui-subagent/agent/index.d.ts +1 -1
  41. package/dist/gui-subagent/agent/index.d.ts.map +1 -1
  42. package/dist/gui-subagent/agent/index.js.map +1 -1
  43. package/dist/gui-subagent/index.d.ts +27 -1
  44. package/dist/gui-subagent/index.d.ts.map +1 -1
  45. package/dist/gui-subagent/index.js +6 -0
  46. package/dist/gui-subagent/index.js.map +1 -1
  47. package/dist/logger.js +1 -1
  48. package/dist/logger.js.map +1 -1
  49. package/dist/mcp.d.ts +1 -0
  50. package/dist/mcp.d.ts.map +1 -1
  51. package/dist/mcp.js +140 -29
  52. package/dist/mcp.js.map +1 -1
  53. package/dist/remote-ai-client.d.ts +111 -0
  54. package/dist/remote-ai-client.d.ts.map +1 -0
  55. package/dist/remote-ai-client.js +558 -0
  56. package/dist/remote-ai-client.js.map +1 -0
  57. package/dist/sdk-output-adapter.d.ts +232 -0
  58. package/dist/sdk-output-adapter.d.ts.map +1 -0
  59. package/dist/sdk-output-adapter.js +636 -0
  60. package/dist/sdk-output-adapter.js.map +1 -0
  61. package/dist/sdk-session-v2.d.ts +13 -0
  62. package/dist/sdk-session-v2.d.ts.map +1 -0
  63. package/dist/sdk-session-v2.js +46 -0
  64. package/dist/sdk-session-v2.js.map +1 -0
  65. package/dist/sdk-session.d.ts +13 -0
  66. package/dist/sdk-session.d.ts.map +1 -0
  67. package/dist/sdk-session.js +48 -0
  68. package/dist/sdk-session.js.map +1 -0
  69. package/dist/session-manager.js +3 -3
  70. package/dist/session-manager.js.map +1 -1
  71. package/dist/session.d.ts +46 -3
  72. package/dist/session.d.ts.map +1 -1
  73. package/dist/session.js +539 -104
  74. package/dist/session.js.map +1 -1
  75. package/dist/skill-invoker.d.ts +40 -4
  76. package/dist/skill-invoker.d.ts.map +1 -1
  77. package/dist/skill-invoker.js +310 -1184
  78. package/dist/skill-invoker.js.map +1 -1
  79. package/dist/skill-loader.d.ts +15 -1
  80. package/dist/skill-loader.d.ts.map +1 -1
  81. package/dist/skill-loader.js +49 -32
  82. package/dist/skill-loader.js.map +1 -1
  83. package/dist/slash-commands.d.ts +4 -2
  84. package/dist/slash-commands.d.ts.map +1 -1
  85. package/dist/slash-commands.js +149 -15
  86. package/dist/slash-commands.js.map +1 -1
  87. package/dist/smart-approval.d.ts +2 -1
  88. package/dist/smart-approval.d.ts.map +1 -1
  89. package/dist/smart-approval.js +29 -3
  90. package/dist/smart-approval.js.map +1 -1
  91. package/dist/system-prompt-generator.d.ts +4 -5
  92. package/dist/system-prompt-generator.d.ts.map +1 -1
  93. package/dist/system-prompt-generator.js +131 -81
  94. package/dist/system-prompt-generator.js.map +1 -1
  95. package/dist/tools.d.ts +17 -6
  96. package/dist/tools.d.ts.map +1 -1
  97. package/dist/tools.js +264 -211
  98. package/dist/tools.js.map +1 -1
  99. package/dist/types.d.ts +0 -1
  100. package/dist/types.d.ts.map +1 -1
  101. package/dist/types.js +0 -1
  102. package/dist/types.js.map +1 -1
  103. package/docs/architecture/mcp-integration-guide.md +194 -131
  104. package/docs/architecture/overview.md +169 -93
  105. package/docs/architecture/tool-system-design.md +56 -11
  106. package/docs/cli/commands.md +238 -189
  107. package/docs/smart-mode.md +281 -257
  108. package/docs/third-party-models.md +247 -256
  109. package/package.json +6 -2
  110. package/src/ai-client.ts +107 -105
  111. package/src/auth.ts +82 -116
  112. package/src/cancellation.ts +1 -1
  113. package/src/cli.ts +178 -13
  114. package/src/config.ts +57 -8
  115. package/src/context-compressor.ts +8 -8
  116. package/src/gui-subagent/action-parser/actionParser.ts +6 -3
  117. package/src/gui-subagent/action-parser/constants.ts +5 -3
  118. package/src/gui-subagent/action-parser/index.ts +5 -3
  119. package/src/gui-subagent/action-parser/types.ts +3 -3
  120. package/src/gui-subagent/agent/gui-agent.ts +210 -103
  121. package/src/gui-subagent/agent/index.ts +1 -1
  122. package/src/gui-subagent/index.ts +26 -2
  123. package/src/index.ts +18 -18
  124. package/src/logger.ts +1 -1
  125. package/src/mcp.ts +149 -30
  126. package/src/remote-ai-client.ts +671 -0
  127. package/src/session-manager.ts +3 -3
  128. package/src/session.ts +704 -156
  129. package/src/skill-invoker.ts +340 -1293
  130. package/src/skill-loader.ts +55 -34
  131. package/src/slash-commands.ts +165 -15
  132. package/src/smart-approval.ts +34 -3
  133. package/src/system-prompt-generator.ts +145 -88
  134. package/src/tools.ts +309 -224
  135. package/src/types.ts +0 -1
  136. package/scripts/init-skills-path.js +0 -58
@@ -0,0 +1,558 @@
1
+ import { EventEmitter } from 'events';
2
+ import https from 'https';
3
+ import axios from 'axios';
4
+ import { getLogger } from './logger.js';
5
+ const logger = getLogger();
6
+ /**
7
+ * Token invalid error - thrown when the authentication token is no longer valid
8
+ */
9
+ export class TokenInvalidError extends Error {
10
+ constructor(message = 'Authentication token is invalid or expired') {
11
+ super(message);
12
+ this.name = 'TokenInvalidError';
13
+ }
14
+ }
15
+ /**
16
+ * Remote AI Client - communicates with xagent-web service
17
+ */
18
+ export class RemoteAIClient extends EventEmitter {
19
+ authToken;
20
+ webBaseUrl;
21
+ agentApi;
22
+ vlmApi;
23
+ showAIDebugInfo;
24
+ constructor(authToken, webBaseUrl, showAIDebugInfo = false) {
25
+ super();
26
+ logger.debug(`[RemoteAIClient] Constructor called, authToken: ${authToken ? authToken.substring(0, 30) + '...' : 'empty'}`);
27
+ this.authToken = authToken;
28
+ this.webBaseUrl = webBaseUrl.replace(/\/$/, ''); // Remove trailing slash
29
+ this.agentApi = `${this.webBaseUrl}/api/agent`;
30
+ this.vlmApi = `${this.webBaseUrl}/api/agent/vlm`;
31
+ this.showAIDebugInfo = showAIDebugInfo;
32
+ if (this.showAIDebugInfo) {
33
+ logger.debug('[RemoteAIClient] Initialization complete');
34
+ logger.debug(`[RemoteAIClient] Web Base URL: ${this.webBaseUrl}`);
35
+ logger.debug(`[RemoteAIClient] Agent API: ${this.agentApi}`);
36
+ logger.debug(`[RemoteAIClient] VLM API: ${this.vlmApi}`);
37
+ }
38
+ }
39
+ /**
40
+ * Non-streaming chat - send messages and receive full response
41
+ */
42
+ async chat(messages, remoteChatOptions = {}) {
43
+ // Pass complete messages array to backend, backend forwards directly to LLM
44
+ const requestBody = {
45
+ messages: messages, // Pass complete message history
46
+ taskId: remoteChatOptions.taskId,
47
+ status: remoteChatOptions.status || 'begin',
48
+ conversationId: remoteChatOptions.conversationId,
49
+ context: remoteChatOptions.context,
50
+ options: {
51
+ model: remoteChatOptions.model
52
+ },
53
+ toolResults: remoteChatOptions.toolResults,
54
+ tools: remoteChatOptions.tools
55
+ };
56
+ const url = `${this.agentApi}/chat`;
57
+ if (this.showAIDebugInfo) {
58
+ logger.debug(`[RemoteAIClient] Sending request to: ${url}`);
59
+ logger.debug(`[RemoteAIClient] Token prefix: ${this.authToken.substring(0, 20)}...`);
60
+ logger.debug(`[RemoteAIClient] Message count: ${messages.length}`);
61
+ if (remoteChatOptions.tools) {
62
+ logger.debug(`[RemoteAIClient] Tool count: ${remoteChatOptions.tools.length}`);
63
+ }
64
+ }
65
+ const httpsAgent = new https.Agent({ rejectUnauthorized: false });
66
+ try {
67
+ const response = await axios.post(url, requestBody, {
68
+ headers: {
69
+ 'Content-Type': 'application/json',
70
+ 'Authorization': `Bearer ${this.authToken}`
71
+ },
72
+ httpsAgent,
73
+ timeout: 120000
74
+ });
75
+ // Check for 401 and throw TokenInvalidError
76
+ if (response.status === 401) {
77
+ throw new TokenInvalidError('Authentication token is invalid or expired. Please log in again.');
78
+ }
79
+ const data = response.data;
80
+ logger.debug('[RemoteAIClient] response received, status:', String(response.status));
81
+ if (this.showAIDebugInfo) {
82
+ console.log('[RemoteAIClient] Received response, content length:', data.content?.length || 0);
83
+ console.log('[RemoteAIClient] toolCalls count:', data.toolCalls?.length || 0);
84
+ }
85
+ return {
86
+ role: 'assistant',
87
+ content: data.content || '',
88
+ reasoningContent: data.reasoningContent || '',
89
+ toolCalls: data.toolCalls,
90
+ timestamp: Date.now()
91
+ };
92
+ }
93
+ catch (error) {
94
+ if (this.showAIDebugInfo) {
95
+ console.log('[RemoteAIClient] Request exception:', error.message);
96
+ }
97
+ // Provide user-friendly error messages based on status code
98
+ if (error.response) {
99
+ const status = error.response.status;
100
+ let errorMessage;
101
+ let userFriendlyMessage;
102
+ switch (status) {
103
+ case 400:
104
+ errorMessage = 'Bad Request';
105
+ userFriendlyMessage = 'Invalid request parameters. Please check your input and try again.';
106
+ break;
107
+ case 401:
108
+ throw new TokenInvalidError('Authentication token is invalid or expired. Please log in again.');
109
+ case 413:
110
+ errorMessage = 'Payload Too Large';
111
+ userFriendlyMessage = 'Request data is too large. Please reduce input content or screenshot size and try again.';
112
+ break;
113
+ case 429:
114
+ errorMessage = 'Too Many Requests';
115
+ userFriendlyMessage = 'XAgent service rate limit exceeded. Please wait a moment and try again.';
116
+ break;
117
+ case 500:
118
+ // Try to parse server's detailed error message
119
+ try {
120
+ const errorData = error.response.data || null;
121
+ errorMessage = errorData?.error || 'Internal Server Error';
122
+ if (errorData?.error && errorData?.errorType === 'AI_SERVICE_ERROR') {
123
+ userFriendlyMessage = `${errorData.error}\n\nSuggestion: ${errorData.suggestion}`;
124
+ }
125
+ else {
126
+ userFriendlyMessage = errorData?.error || 'Server error. Please try again later. If the problem persists, contact the administrator.';
127
+ }
128
+ }
129
+ catch {
130
+ errorMessage = 'Internal Server Error';
131
+ userFriendlyMessage = 'Server error. Please try again later. If the problem persists, contact the administrator.';
132
+ }
133
+ break;
134
+ case 502:
135
+ errorMessage = 'Bad Gateway';
136
+ userFriendlyMessage = 'Gateway error. Service temporarily unavailable. Please try again later.';
137
+ break;
138
+ case 503:
139
+ errorMessage = 'Service Unavailable';
140
+ userFriendlyMessage = 'AI service request timed out. Please try again.';
141
+ break;
142
+ case 504:
143
+ errorMessage = 'Gateway Timeout';
144
+ userFriendlyMessage = 'Gateway timeout. Please try again later.';
145
+ break;
146
+ default:
147
+ try {
148
+ errorMessage = error.response.data?.error || `HTTP ${status}`;
149
+ }
150
+ catch {
151
+ errorMessage = `HTTP ${status}`;
152
+ }
153
+ userFriendlyMessage = `Request failed with status code: ${status}`;
154
+ }
155
+ // Print user-friendly error message
156
+ console.error(`\n❌ Request failed (${status})`);
157
+ console.error(` ${userFriendlyMessage}`);
158
+ if (this.showAIDebugInfo) {
159
+ console.error(` Original error: ${errorMessage}`);
160
+ }
161
+ throw new Error(userFriendlyMessage);
162
+ }
163
+ // Network error or other error
164
+ throw error;
165
+ }
166
+ }
167
+ /**
168
+ * Mark task as completed
169
+ * Call backend to update task status to 'end'
170
+ */
171
+ async completeTask(taskId) {
172
+ if (!taskId) {
173
+ logger.debug('[RemoteAIClient] completeTask called with empty taskId, skipping');
174
+ return;
175
+ }
176
+ logger.debug(`[RemoteAIClient] completeTask called: taskId=${taskId}`);
177
+ const url = `${this.agentApi}/chat`;
178
+ const requestBody = {
179
+ taskId,
180
+ status: 'end',
181
+ messages: [],
182
+ options: {}
183
+ };
184
+ const httpsAgent = new https.Agent({ rejectUnauthorized: false });
185
+ try {
186
+ const response = await axios.post(url, requestBody, {
187
+ headers: {
188
+ 'Content-Type': 'application/json',
189
+ 'Authorization': `Bearer ${this.authToken}`
190
+ },
191
+ httpsAgent
192
+ });
193
+ logger.debug(`[RemoteAIClient] completeTask response status: ${response.status}`);
194
+ }
195
+ catch (error) {
196
+ console.error('[RemoteAIClient] Failed to mark task as completed:', error);
197
+ }
198
+ }
199
+ /**
200
+ * Mark task as cancelled
201
+ * Call backend to update task status to 'cancel'
202
+ */
203
+ async cancelTask(taskId) {
204
+ if (!taskId)
205
+ return;
206
+ const url = `${this.agentApi}/chat`;
207
+ const requestBody = {
208
+ taskId,
209
+ status: 'cancel',
210
+ messages: [],
211
+ options: {}
212
+ };
213
+ const httpsAgent = new https.Agent({ rejectUnauthorized: false });
214
+ try {
215
+ await axios.post(url, requestBody, {
216
+ headers: {
217
+ 'Content-Type': 'application/json',
218
+ 'Authorization': `Bearer ${this.authToken}`
219
+ },
220
+ httpsAgent
221
+ });
222
+ }
223
+ catch (error) {
224
+ console.error('[RemoteAIClient] Failed to mark task as cancelled:', error);
225
+ }
226
+ }
227
+ /**
228
+ * Unified LLM call interface - same return type as aiClient.chatCompletion
229
+ * Implements transparency: caller doesn't need to know remote vs local mode
230
+ */
231
+ async chatCompletion(messages, options = {}) {
232
+ const model = options.model || 'remote-llm';
233
+ // Debug output for request
234
+ if (this.showAIDebugInfo) {
235
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
236
+ console.log('║ AI REQUEST DEBUG (REMOTE) ║');
237
+ console.log('╚══════════════════════════════════════════════════════════╝');
238
+ console.log(`📦 Model: ${model}`);
239
+ console.log(`🌐 Base URL: ${this.webBaseUrl}`);
240
+ console.log(`💬 Total Messages: ${messages.length} items`);
241
+ if (options.temperature !== undefined)
242
+ console.log(`🌡️ Temperature: ${options.temperature}`);
243
+ if (options.maxTokens)
244
+ console.log(`📏 Max Tokens: ${options.maxTokens}`);
245
+ if (options.tools?.length)
246
+ console.log(`🔧 Tools: ${options.tools.length} items`);
247
+ if (options.thinkingTokens)
248
+ console.log(`🧠 Thinking Tokens: ${options.thinkingTokens}`);
249
+ console.log('─'.repeat(60));
250
+ // Display system messages separately
251
+ const systemMsgs = messages.filter(m => m.role === 'system');
252
+ const otherMsgs = messages.filter(m => m.role !== 'system');
253
+ if (systemMsgs.length > 0) {
254
+ const systemContent = typeof systemMsgs[0].content === 'string'
255
+ ? systemMsgs[0].content
256
+ : JSON.stringify(systemMsgs[0].content);
257
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
258
+ console.log('│ 🟫 SYSTEM │');
259
+ console.log('├─────────────────────────────────────────────────────────────┤');
260
+ console.log(this.renderMarkdown(systemContent).split('\n').map(l => '│ ' + l).join('\n'));
261
+ console.log('└─────────────────────────────────────────────────────────────┘');
262
+ }
263
+ // Display other messages
264
+ this.displayMessages(otherMsgs);
265
+ console.log('\n📤 Sending request to Remote API...\n');
266
+ }
267
+ // Call existing chat method
268
+ const response = await this.chat(messages, {
269
+ conversationId: undefined,
270
+ tools: options.tools,
271
+ toolResults: undefined,
272
+ context: undefined,
273
+ model: options.model,
274
+ taskId: options.taskId,
275
+ status: 'begin' // Mark as beginning of task
276
+ });
277
+ // Debug output for response
278
+ if (this.showAIDebugInfo) {
279
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
280
+ console.log('║ AI RESPONSE DEBUG (REMOTE) ║');
281
+ console.log('╚══════════════════════════════════════════════════════════╝');
282
+ console.log(`🆔 ID: remote-${Date.now()}`);
283
+ console.log(`🤖 Model: ${model}`);
284
+ console.log(`🏁 Finish Reason: stop`);
285
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
286
+ console.log('│ 🤖 ASSISTANT │');
287
+ console.log('├─────────────────────────────────────────────────────────────┤');
288
+ // Display reasoning_content (if present)
289
+ if (response.reasoningContent) {
290
+ console.log('│ 🧠 REASONING:');
291
+ console.log('│ ───────────────────────────────────────────────────────────');
292
+ const reasoningLines = this.renderMarkdown(response.reasoningContent).split('\n');
293
+ for (const line of reasoningLines.slice(0, 15)) {
294
+ console.log('│ ' + line.slice(0, 62));
295
+ }
296
+ if (response.reasoningContent.length > 800)
297
+ console.log('│ ... (truncated)');
298
+ console.log('│ ───────────────────────────────────────────────────────────');
299
+ }
300
+ // Display content
301
+ console.log('│ 💬 CONTENT:');
302
+ console.log('│ ───────────────────────────────────────────────────────────');
303
+ const lines = this.renderMarkdown(response.content).split('\n');
304
+ for (const line of lines.slice(0, 40)) {
305
+ console.log('│ ' + line.slice(0, 62));
306
+ }
307
+ if (lines.length > 40) {
308
+ console.log(`│ ... (${lines.length - 40} more lines)`);
309
+ }
310
+ console.log('└─────────────────────────────────────────────────────────────┘');
311
+ // Display tool calls if present
312
+ if (response.toolCalls && response.toolCalls.length > 0) {
313
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
314
+ console.log('│ 🔧 TOOL CALLS │');
315
+ console.log('├─────────────────────────────────────────────────────────────┤');
316
+ for (let i = 0; i < response.toolCalls.length; i++) {
317
+ const tc = response.toolCalls[i];
318
+ console.log(`│ ${i + 1}. ${tc.function?.name || 'unknown'}`);
319
+ if (tc.function?.arguments) {
320
+ const args = typeof tc.function.arguments === 'string'
321
+ ? JSON.parse(tc.function.arguments)
322
+ : tc.function.arguments;
323
+ const argsStr = JSON.stringify(args, null, 2).split('\n').slice(0, 5).join('\n');
324
+ console.log('│ Args:', argsStr.slice(0, 50) + (argsStr.length > 50 ? '...' : ''));
325
+ }
326
+ }
327
+ console.log('└─────────────────────────────────────────────────────────────┘');
328
+ }
329
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
330
+ console.log('║ RESPONSE ENDED ║');
331
+ console.log('╚══════════════════════════════════════════════════════════╝\n');
332
+ }
333
+ // Convert to ChatCompletionResponse format (consistent with local mode)
334
+ return {
335
+ id: `remote-${Date.now()}`,
336
+ object: 'chat.completion',
337
+ created: Date.now(),
338
+ model: options.model || 'remote-llm',
339
+ choices: [
340
+ {
341
+ index: 0,
342
+ message: {
343
+ role: 'assistant',
344
+ content: response.content,
345
+ reasoning_content: response.reasoningContent || '',
346
+ tool_calls: response.toolCalls
347
+ },
348
+ finish_reason: 'stop'
349
+ }
350
+ ],
351
+ usage: undefined
352
+ };
353
+ }
354
+ /**
355
+ * Render markdown text (helper method for debug output)
356
+ */
357
+ renderMarkdown(text) {
358
+ let result = text;
359
+ // Code block rendering
360
+ result = result.replace(/```(\w*)\n([\s\S]*?)```/g, (_, lang, code) => {
361
+ return `\n┌─[${lang || 'code'}]\n${code.trim().split('\n').map((l) => '│ ' + l).join('\n')}\n└─\n`;
362
+ });
363
+ // Inline code rendering
364
+ result = result.replace(/`([^`]+)`/g, '`$1`');
365
+ // Bold rendering
366
+ result = result.replace(/\*\*([^*]+)\*\*/g, '●$1○');
367
+ // Italic rendering
368
+ result = result.replace(/\*([^*]+)\*/g, '/$1/');
369
+ // List rendering
370
+ result = result.replace(/^- (.*$)/gm, '○ $1');
371
+ result = result.replace(/^\d+\. (.*$)/gm, '• $1');
372
+ // Heading rendering
373
+ result = result.replace(/^### (.*$)/gm, '\n━━━ $1 ━━━\n');
374
+ result = result.replace(/^## (.*$)/gm, '\n━━━━━ $1 ━━━━━\n');
375
+ result = result.replace(/^# (.*$)/gm, '\n━━━━━━━ $1 ━━━━━━━\n');
376
+ // Quote rendering
377
+ result = result.replace(/^> (.*$)/gm, '│ │ $1');
378
+ return result;
379
+ }
380
+ /**
381
+ * Display messages by category (helper method for debug output)
382
+ */
383
+ displayMessages(messages) {
384
+ const roleColors = {
385
+ system: '🟫 SYSTEM',
386
+ user: '👤 USER',
387
+ assistant: '🤖 ASSISTANT',
388
+ tool: '🔧 TOOL'
389
+ };
390
+ for (let i = 0; i < messages.length; i++) {
391
+ const msg = messages[i];
392
+ const role = msg.role;
393
+ const roleLabel = roleColors[role] || `● ${role.toUpperCase()}`;
394
+ console.log(`\n┌─────────────────────────────────────────────────────────────┐`);
395
+ console.log(`│ ${roleLabel} (${i + 1}/${messages.length}) │`);
396
+ console.log('├─────────────────────────────────────────────────────────────┤');
397
+ // Display main content
398
+ const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);
399
+ const lines = this.renderMarkdown(content).split('\n');
400
+ for (const line of lines.slice(0, 50)) {
401
+ console.log('│ ' + line.slice(0, 62));
402
+ }
403
+ if (lines.length > 50) {
404
+ console.log('│ ... (' + (lines.length - 50) + ' more lines)');
405
+ }
406
+ console.log('└─────────────────────────────────────────────────────────────┘');
407
+ }
408
+ }
409
+ /**
410
+ * Invoke VLM for image understanding
411
+ * @param messages - full messages array (consistent with local mode)
412
+ * @param systemPrompt - system prompt (optional, for reference)
413
+ * @param remoteChatOptions - other options including AbortSignal, taskId
414
+ */
415
+ async invokeVLM(messages, _systemPrompt, remoteChatOptions = {}) {
416
+ // Forward complete messages to backend (same format as local mode)
417
+ const requestBody = {
418
+ messages, // Pass complete messages array
419
+ taskId: remoteChatOptions.taskId,
420
+ status: remoteChatOptions.status || 'begin',
421
+ context: remoteChatOptions.context,
422
+ options: {
423
+ model: remoteChatOptions.model
424
+ }
425
+ };
426
+ if (this.showAIDebugInfo) {
427
+ console.log('[RemoteAIClient] VLM sending request to:', this.vlmApi);
428
+ }
429
+ // Handle abort signal
430
+ const controller = remoteChatOptions.signal ? new AbortController() : undefined;
431
+ const abortSignal = remoteChatOptions.signal || controller?.signal;
432
+ // If external signal is provided, listen to it
433
+ if (remoteChatOptions.signal) {
434
+ remoteChatOptions.signal.addEventListener?.('abort', () => controller?.abort());
435
+ }
436
+ try {
437
+ const response = await axios.post(this.vlmApi, requestBody, {
438
+ headers: {
439
+ 'Content-Type': 'application/json',
440
+ 'Authorization': `Bearer ${this.authToken}`
441
+ },
442
+ signal: abortSignal,
443
+ httpsAgent: new https.Agent({ rejectUnauthorized: false }),
444
+ timeout: 120000
445
+ });
446
+ if (this.showAIDebugInfo) {
447
+ console.log('[RemoteAIClient] VLM response status:', response.status);
448
+ }
449
+ const data = response.data;
450
+ return data.content || '';
451
+ }
452
+ catch (error) {
453
+ if (this.showAIDebugInfo) {
454
+ console.log('[RemoteAIClient] VLM request exception:', error.message);
455
+ }
456
+ throw error;
457
+ }
458
+ }
459
+ /**
460
+ * Validate if the current token is still valid
461
+ * Returns true if valid, false otherwise
462
+ */
463
+ async validateToken() {
464
+ try {
465
+ const url = `${this.webBaseUrl}/api/auth/me`;
466
+ const httpsAgent = new https.Agent({ rejectUnauthorized: false });
467
+ const response = await axios.get(url, {
468
+ httpsAgent,
469
+ timeout: 10000
470
+ });
471
+ return response.status === 200;
472
+ }
473
+ catch {
474
+ return false;
475
+ }
476
+ }
477
+ async getConversations() {
478
+ const url = `${this.agentApi}/conversations`;
479
+ if (this.showAIDebugInfo) {
480
+ console.log('[RemoteAIClient] Getting conversation list:', url);
481
+ }
482
+ const httpsAgent = new https.Agent({ rejectUnauthorized: false });
483
+ const response = await axios.get(url, {
484
+ headers: {
485
+ 'Authorization': `Bearer ${this.authToken}`
486
+ },
487
+ httpsAgent
488
+ });
489
+ if (response.status !== 200) {
490
+ throw new Error('Failed to get conversation list');
491
+ }
492
+ const data = response.data;
493
+ return data.conversations || [];
494
+ }
495
+ /**
496
+ * Get conversation details
497
+ */
498
+ async getConversation(conversationId) {
499
+ const url = `${this.agentApi}/conversations/${conversationId}`;
500
+ if (this.showAIDebugInfo) {
501
+ console.log('[RemoteAIClient] Getting conversation details:', url);
502
+ }
503
+ const httpsAgent = new https.Agent({ rejectUnauthorized: false });
504
+ const response = await axios.get(url, {
505
+ headers: {
506
+ 'Authorization': `Bearer ${this.authToken}`
507
+ },
508
+ httpsAgent
509
+ });
510
+ if (response.status !== 200) {
511
+ throw new Error('Failed to get conversation details');
512
+ }
513
+ const data = response.data;
514
+ return data.conversation;
515
+ }
516
+ /**
517
+ * Create new conversation
518
+ */
519
+ async createConversation(title) {
520
+ const url = `${this.agentApi}/conversations`;
521
+ if (this.showAIDebugInfo) {
522
+ console.log('[RemoteAIClient] Creating conversation:', url);
523
+ }
524
+ const httpsAgent = new https.Agent({ rejectUnauthorized: false });
525
+ const response = await axios.post(url, { title }, {
526
+ headers: {
527
+ 'Content-Type': 'application/json',
528
+ 'Authorization': `Bearer ${this.authToken}`
529
+ },
530
+ httpsAgent
531
+ });
532
+ if (response.status !== 200) {
533
+ throw new Error('Failed to create conversation');
534
+ }
535
+ const data = response.data;
536
+ return data.conversation;
537
+ }
538
+ /**
539
+ * Delete conversation
540
+ */
541
+ async deleteConversation(conversationId) {
542
+ const url = `${this.agentApi}/conversations/${conversationId}`;
543
+ if (this.showAIDebugInfo) {
544
+ console.log('[RemoteAIClient] Deleting conversation:', url);
545
+ }
546
+ const httpsAgent = new https.Agent({ rejectUnauthorized: false });
547
+ const response = await axios.delete(url, {
548
+ headers: {
549
+ 'Authorization': `Bearer ${this.authToken}`
550
+ },
551
+ httpsAgent
552
+ });
553
+ if (!response.status.toString().startsWith('2')) {
554
+ throw new Error('Failed to delete conversation');
555
+ }
556
+ }
557
+ }
558
+ //# sourceMappingURL=remote-ai-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-ai-client.js","sourceRoot":"","sources":["../src/remote-ai-client.ts"],"names":[],"mappings":"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"}