codevf 1.0.2 → 1.0.4

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 (98) hide show
  1. package/README.md +118 -62
  2. package/dist/commands/chat.d.ts +2 -0
  3. package/dist/commands/chat.d.ts.map +1 -0
  4. package/dist/commands/chat.js +130 -0
  5. package/dist/commands/chat.js.map +1 -0
  6. package/dist/commands/cvf-chat-command-content.d.ts +2 -0
  7. package/dist/commands/cvf-chat-command-content.d.ts.map +1 -0
  8. package/dist/commands/cvf-chat-command-content.js +22 -0
  9. package/dist/commands/cvf-chat-command-content.js.map +1 -0
  10. package/dist/commands/cvf-command-content.d.ts +2 -0
  11. package/dist/commands/cvf-command-content.d.ts.map +1 -0
  12. package/dist/commands/cvf-command-content.js +109 -0
  13. package/dist/commands/cvf-command-content.js.map +1 -0
  14. package/dist/commands/fix.d.ts +1 -0
  15. package/dist/commands/fix.d.ts.map +1 -1
  16. package/dist/commands/fix.js +36 -0
  17. package/dist/commands/fix.js.map +1 -1
  18. package/dist/commands/listen.d.ts +2 -0
  19. package/dist/commands/listen.d.ts.map +1 -0
  20. package/dist/commands/listen.js +109 -0
  21. package/dist/commands/listen.js.map +1 -0
  22. package/dist/commands/mcp-tools.d.ts.map +1 -1
  23. package/dist/commands/mcp-tools.js +15 -15
  24. package/dist/commands/mcp-tools.js.map +1 -1
  25. package/dist/commands/setup.d.ts.map +1 -1
  26. package/dist/commands/setup.js +138 -56
  27. package/dist/commands/setup.js.map +1 -1
  28. package/dist/index.js +37 -3
  29. package/dist/index.js.map +1 -1
  30. package/dist/lib/api/client.d.ts +4 -0
  31. package/dist/lib/api/client.d.ts.map +1 -1
  32. package/dist/lib/api/client.js +6 -0
  33. package/dist/lib/api/client.js.map +1 -1
  34. package/dist/lib/api/sessions.d.ts +85 -0
  35. package/dist/lib/api/sessions.d.ts.map +1 -0
  36. package/dist/lib/api/sessions.js +137 -0
  37. package/dist/lib/api/sessions.js.map +1 -0
  38. package/dist/lib/api/tasks.d.ts +44 -0
  39. package/dist/lib/api/tasks.d.ts.map +1 -1
  40. package/dist/lib/api/tasks.js +82 -1
  41. package/dist/lib/api/tasks.js.map +1 -1
  42. package/dist/lib/api/websocket.d.ts +4 -2
  43. package/dist/lib/api/websocket.d.ts.map +1 -1
  44. package/dist/lib/api/websocket.js +54 -5
  45. package/dist/lib/api/websocket.js.map +1 -1
  46. package/dist/lib/auth/token-manager.d.ts.map +1 -1
  47. package/dist/lib/auth/token-manager.js +17 -6
  48. package/dist/lib/auth/token-manager.js.map +1 -1
  49. package/dist/lib/utils/logger.d.ts +3 -0
  50. package/dist/lib/utils/logger.d.ts.map +1 -1
  51. package/dist/lib/utils/logger.js +12 -4
  52. package/dist/lib/utils/logger.js.map +1 -1
  53. package/dist/mcp/index.js +134 -8
  54. package/dist/mcp/index.js.map +1 -1
  55. package/dist/mcp/tools/chat.d.ts +81 -1
  56. package/dist/mcp/tools/chat.d.ts.map +1 -1
  57. package/dist/mcp/tools/chat.js +624 -21
  58. package/dist/mcp/tools/chat.js.map +1 -1
  59. package/dist/mcp/tools/instant.d.ts +18 -5
  60. package/dist/mcp/tools/instant.d.ts.map +1 -1
  61. package/dist/mcp/tools/instant.js +320 -31
  62. package/dist/mcp/tools/instant.js.map +1 -1
  63. package/dist/mcp/tools/listen.d.ts +35 -0
  64. package/dist/mcp/tools/listen.d.ts.map +1 -0
  65. package/dist/mcp/tools/listen.js +97 -0
  66. package/dist/mcp/tools/listen.js.map +1 -0
  67. package/dist/mcp/tools/task-checker.d.ts +60 -0
  68. package/dist/mcp/tools/task-checker.d.ts.map +1 -0
  69. package/dist/mcp/tools/task-checker.js +139 -0
  70. package/dist/mcp/tools/task-checker.js.map +1 -0
  71. package/dist/mcp/tools/tunnel.d.ts +38 -0
  72. package/dist/mcp/tools/tunnel.d.ts.map +1 -0
  73. package/dist/mcp/tools/tunnel.js +109 -0
  74. package/dist/mcp/tools/tunnel.js.map +1 -0
  75. package/dist/modules/permissions.d.ts +1 -0
  76. package/dist/modules/permissions.d.ts.map +1 -1
  77. package/dist/modules/permissions.js +2 -0
  78. package/dist/modules/permissions.js.map +1 -1
  79. package/dist/modules/tunnel.d.ts +5 -0
  80. package/dist/modules/tunnel.d.ts.map +1 -1
  81. package/dist/modules/tunnel.js +55 -0
  82. package/dist/modules/tunnel.js.map +1 -1
  83. package/dist/modules/websocket.d.ts.map +1 -1
  84. package/dist/modules/websocket.js +3 -2
  85. package/dist/modules/websocket.js.map +1 -1
  86. package/dist/types/index.d.ts +7 -3
  87. package/dist/types/index.d.ts.map +1 -1
  88. package/dist/types/index.js.map +1 -1
  89. package/dist/ui/LiveSession.js +2 -2
  90. package/dist/ui/LiveSession.js.map +1 -1
  91. package/dist/ui/SessionUI.d.ts +1 -1
  92. package/dist/ui/SessionUI.d.ts.map +1 -1
  93. package/dist/ui/SessionUI.js +4 -1
  94. package/dist/ui/SessionUI.js.map +1 -1
  95. package/dist/utils/errors.d.ts.map +1 -1
  96. package/dist/utils/errors.js +8 -7
  97. package/dist/utils/errors.js.map +1 -1
  98. package/package.json +3 -1
@@ -36,6 +36,9 @@ export class WebSocketClient extends EventEmitter {
36
36
  case 'engineer_message':
37
37
  this.emit('engineer_message', message.payload);
38
38
  break;
39
+ case 'session_end':
40
+ this.emit('session_end', message.payload);
41
+ break;
39
42
  case 'billing_update':
40
43
  this.emit('billing_update', message.payload);
41
44
  break;
@@ -113,13 +116,33 @@ export class WebSocketClient extends EventEmitter {
113
116
  let responseText = '';
114
117
  let creditsUsed = 0;
115
118
  const startTime = Date.now();
119
+ let hasReceivedMessage = false;
116
120
  const onEngineerMessage = (msg) => {
117
- responseText += msg.text + '\n';
121
+ const content = msg.content ?? msg.text ?? '';
122
+ responseText += content + '\n';
123
+ hasReceivedMessage = true;
118
124
  };
119
125
  const onBillingUpdate = (update) => {
120
126
  creditsUsed = update.creditsUsed;
121
127
  };
122
128
  const onClosureRequest = () => {
129
+ if (!hasResolvedOrRejected) {
130
+ cleanup();
131
+ const duration = Math.ceil((Date.now() - startTime) / 60000);
132
+ hasResolvedOrRejected = true;
133
+ logger.info('[WebSocket] Received closure request, resolving response', {
134
+ duration,
135
+ creditsUsed,
136
+ textLength: responseText.length,
137
+ });
138
+ resolve({
139
+ text: responseText.trim(),
140
+ creditsUsed,
141
+ duration: `${duration} min`,
142
+ });
143
+ }
144
+ };
145
+ const onSessionEnd = () => {
123
146
  cleanup();
124
147
  const duration = Math.ceil((Date.now() - startTime) / 60000);
125
148
  resolve({
@@ -129,23 +152,49 @@ export class WebSocketClient extends EventEmitter {
129
152
  });
130
153
  };
131
154
  const onError = (error) => {
132
- cleanup();
133
- reject(new SessionError(`WebSocket error: ${error.message}`));
155
+ if (!hasResolvedOrRejected) {
156
+ cleanup();
157
+ hasResolvedOrRejected = true;
158
+ logger.error('[WebSocket] Connection error while waiting for response', error);
159
+ reject(new SessionError(`WebSocket error: ${error.message}`));
160
+ }
134
161
  };
162
+ let hasResolvedOrRejected = false;
135
163
  const cleanup = () => {
136
164
  this.off('engineer_message', onEngineerMessage);
137
165
  this.off('billing_update', onBillingUpdate);
138
166
  this.off('closure_request', onClosureRequest);
167
+ this.off('session_end', onSessionEnd);
139
168
  this.off('error', onError);
140
169
  clearTimeout(timeoutHandle);
141
170
  };
142
171
  this.on('engineer_message', onEngineerMessage);
143
172
  this.on('billing_update', onBillingUpdate);
144
173
  this.on('closure_request', onClosureRequest);
174
+ this.on('session_end', onSessionEnd);
145
175
  this.on('error', onError);
146
176
  const timeoutHandle = setTimeout(() => {
147
- cleanup();
148
- reject(new TimeoutError('Timeout waiting for engineer response'));
177
+ if (!hasResolvedOrRejected) {
178
+ cleanup();
179
+ hasResolvedOrRejected = true;
180
+ logger.warn('[WebSocket] Timeout waiting for closure request', {
181
+ hasReceivedMessage,
182
+ timeoutMs,
183
+ receivedText: responseText.substring(0, 100)
184
+ });
185
+ if (hasReceivedMessage) {
186
+ // If we got a message but timed out waiting for closure, return what we have
187
+ const duration = Math.ceil((Date.now() - startTime) / 60000);
188
+ resolve({
189
+ text: responseText.trim(),
190
+ creditsUsed,
191
+ duration: `${duration} min`,
192
+ });
193
+ }
194
+ else {
195
+ reject(new TimeoutError('Timeout waiting for engineer response'));
196
+ }
197
+ }
149
198
  }, timeoutMs);
150
199
  });
151
200
  }
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/lib/api/websocket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/lib/api/websocket.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/token-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAgB,MAAM,sBAAsB,CAAC;AAInE,qBAAa,YAAY;IACvB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,kBAAkB,CAAkB;gBAEhC,aAAa,EAAE,aAAa;IAIxC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAyBtC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C9B;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAM3C;;OAEG;IACH,eAAe,IAAI,OAAO;CAQ3B"}
1
+ {"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/token-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAgB,MAAM,sBAAsB,CAAC;AAInE,qBAAa,YAAY;IACvB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,kBAAkB,CAAkB;gBAEhC,aAAa,EAAE,aAAa;IAIxC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAyBtC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD9B;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAM3C;;OAEG;IACH,eAAe,IAAI,OAAO;CAQ3B"}
@@ -20,9 +20,11 @@ export class TokenManager {
20
20
  const expiresAt = new Date(config.auth.expiresAt);
21
21
  const now = new Date();
22
22
  const timeUntilExpiry = expiresAt.getTime() - now.getTime();
23
- if (timeUntilExpiry < this.refreshThresholdMs) {
23
+ const isExpiryInvalid = Number.isNaN(timeUntilExpiry);
24
+ if (isExpiryInvalid || timeUntilExpiry < this.refreshThresholdMs) {
24
25
  logger.info('Token expiring soon, refreshing...', {
25
26
  expiresAt: config.auth.expiresAt,
27
+ isExpiryInvalid,
26
28
  });
27
29
  await this.refresh();
28
30
  return this.configManager.load().auth.accessToken;
@@ -40,20 +42,29 @@ export class TokenManager {
40
42
  try {
41
43
  const response = await fetch(`${config.baseUrl}/api/cli/auth/refresh`, {
42
44
  method: 'POST',
43
- headers: { 'Content-Type': 'application/json' },
45
+ headers: {
46
+ 'Content-Type': 'application/json',
47
+ Authorization: `Bearer ${config.auth.refreshToken}`,
48
+ },
44
49
  body: JSON.stringify({ refreshToken: config.auth.refreshToken }),
45
50
  });
46
51
  if (!response.ok) {
47
52
  throw new Error(`Refresh failed: ${response.status}`);
48
53
  }
49
54
  const data = (await response.json());
50
- if (!data.success || !data.data) {
55
+ const nextAccessToken = data.accessToken || data.token;
56
+ if (!data.success || !nextAccessToken) {
51
57
  throw new Error('Invalid refresh response');
52
58
  }
59
+ // Calculate new expiration time
60
+ const expiresAt = data.expiresAt ? new Date(data.expiresAt) : new Date();
61
+ if (!data.expiresAt) {
62
+ expiresAt.setSeconds(expiresAt.getSeconds() + (data.expiresIn || 86400));
63
+ }
53
64
  this.configManager.updateAuth({
54
- accessToken: data.data.accessToken,
55
- refreshToken: data.data.refreshToken,
56
- expiresAt: data.data.expiresAt,
65
+ accessToken: nextAccessToken,
66
+ refreshToken: data.refreshToken || config.auth.refreshToken,
67
+ expiresAt: expiresAt.toISOString(),
57
68
  userId: config.auth.userId,
58
69
  });
59
70
  logger.info('Token refreshed successfully');
@@ -1 +1 @@
1
- {"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../../src/lib/auth/token-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../../src/lib/auth/token-manager.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,8 @@
1
1
  /**
2
2
  * Simple structured logger for CodeVF
3
+ *
4
+ * CRITICAL: When running as an MCP server, all logs MUST go to stderr.
5
+ * stdout is reserved for JSON-RPC protocol messages only.
3
6
  */
4
7
  export declare enum LogLevel {
5
8
  DEBUG = 0,
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,cAAM,MAAM;IACV,OAAO,CAAC,KAAK,CAA2B;IAExC,QAAQ,CAAC,KAAK,EAAE,QAAQ;IAIxB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAMjC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAMhC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAMhC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,GAAG;CAQ3C;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,cAAM,MAAM;IACV,OAAO,CAAC,KAAK,CAA2B;IAExC,QAAQ,CAAC,KAAK,EAAE,QAAQ;IAIxB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAOjC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAOhC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAOhC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,GAAG;CAO3C;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
@@ -1,5 +1,8 @@
1
1
  /**
2
2
  * Simple structured logger for CodeVF
3
+ *
4
+ * CRITICAL: When running as an MCP server, all logs MUST go to stderr.
5
+ * stdout is reserved for JSON-RPC protocol messages only.
3
6
  */
4
7
  export var LogLevel;
5
8
  (function (LogLevel) {
@@ -17,22 +20,27 @@ class Logger {
17
20
  }
18
21
  debug(message, meta) {
19
22
  if (this.level <= LogLevel.DEBUG) {
20
- console.debug(`[DEBUG] ${message}`, meta ? JSON.stringify(meta) : '');
23
+ // Always write to stderr for MCP compatibility
24
+ process.stderr.write(`[DEBUG] ${message}${meta ? ' ' + JSON.stringify(meta) : ''}\n`);
21
25
  }
22
26
  }
23
27
  info(message, meta) {
24
28
  if (this.level <= LogLevel.INFO) {
25
- console.info(`[INFO] ${message}`, meta ? JSON.stringify(meta) : '');
29
+ // Always write to stderr for MCP compatibility
30
+ process.stderr.write(`[INFO] ${message}${meta ? ' ' + JSON.stringify(meta) : ''}\n`);
26
31
  }
27
32
  }
28
33
  warn(message, meta) {
29
34
  if (this.level <= LogLevel.WARN) {
30
- console.warn(`[WARN] ${message}`, meta ? JSON.stringify(meta) : '');
35
+ // Always write to stderr for MCP compatibility
36
+ process.stderr.write(`[WARN] ${message}${meta ? ' ' + JSON.stringify(meta) : ''}\n`);
31
37
  }
32
38
  }
33
39
  error(message, error) {
34
40
  if (this.level <= LogLevel.ERROR) {
35
- console.error(`[ERROR] ${message}`, error instanceof Error ? error.stack : JSON.stringify(error));
41
+ // Always write to stderr for MCP compatibility
42
+ const errorInfo = error instanceof Error ? error.stack : JSON.stringify(error);
43
+ process.stderr.write(`[ERROR] ${message}${errorInfo ? ' ' + errorInfo : ''}\n`);
36
44
  }
37
45
  }
38
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/lib/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAED,MAAM,MAAM;IAAZ;QACU,UAAK,GAAa,QAAQ,CAAC,IAAI,CAAC;IAgC1C,CAAC;IA9BC,QAAQ,CAAC,KAAe;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAU;QAC/B,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAU;QAC9B,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAU;QAC9B,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAmB;QACxC,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CACX,WAAW,OAAO,EAAE,EACpB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/lib/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAED,MAAM,MAAM;IAAZ;QACU,UAAK,GAAa,QAAQ,CAAC,IAAI,CAAC;IAkC1C,CAAC;IAhCC,QAAQ,CAAC,KAAe;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAU;QAC/B,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,+CAA+C;YAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAU;QAC9B,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,+CAA+C;YAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAU;QAC9B,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,+CAA+C;YAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAmB;QACxC,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,+CAA+C;YAC/C,MAAM,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC/E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
package/dist/mcp/index.js CHANGED
@@ -5,14 +5,17 @@
5
5
  */
6
6
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
7
7
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
- import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
8
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
9
9
  import { ConfigManager } from '../lib/config/manager.js';
10
10
  import { TokenManager } from '../lib/auth/token-manager.js';
11
11
  import { ApiClient } from '../lib/api/client.js';
12
12
  import { TasksApi } from '../lib/api/tasks.js';
13
13
  import { ProjectsApi } from '../lib/api/projects.js';
14
+ import { SessionsApi } from '../lib/api/sessions.js';
14
15
  import { InstantTool } from './tools/instant.js';
15
16
  import { ChatTool } from './tools/chat.js';
17
+ import { ListenTool } from './tools/listen.js';
18
+ import { TunnelTool } from './tools/tunnel.js';
16
19
  import { logger, LogLevel } from '../lib/utils/logger.js';
17
20
  /**
18
21
  * Initialize MCP Server
@@ -43,8 +46,11 @@ async function main() {
43
46
  const defaultProjectId = config.defaults?.projectId || '1';
44
47
  const tasksApi = new TasksApi(apiClient, config.baseUrl, defaultProjectId);
45
48
  const projectsApi = new ProjectsApi(apiClient);
46
- const instantTool = new InstantTool(tasksApi, projectsApi, tokenManager, config.baseUrl);
47
- const chatTool = new ChatTool(tasksApi, config.baseUrl);
49
+ const sessionsApi = new SessionsApi(apiClient, config.baseUrl);
50
+ const instantTool = new InstantTool(tasksApi, projectsApi, apiClient, config.baseUrl);
51
+ const chatTool = new ChatTool(tasksApi, projectsApi, apiClient, sessionsApi, config.baseUrl);
52
+ const listenTool = new ListenTool(tasksApi, config.baseUrl);
53
+ const tunnelTool = new TunnelTool();
48
54
  // Create MCP server
49
55
  const server = new Server({
50
56
  name: 'codevf',
@@ -60,7 +66,7 @@ async function main() {
60
66
  tools: [
61
67
  {
62
68
  name: 'codevf-instant',
63
- description: 'Get quick validation from human engineer (1-10 credits). Use for: testing if fix works, identifying errors, quick questions. Returns single response from engineer.',
69
+ description: 'Get quick validation from human engineer. Use for: testing if fix works, identifying errors, quick questions. Returns single response from engineer. If active task exists, offers you the choice to continue or start new.',
64
70
  inputSchema: {
65
71
  type: 'object',
66
72
  properties: {
@@ -70,18 +76,56 @@ async function main() {
70
76
  },
71
77
  maxCredits: {
72
78
  type: 'number',
73
- description: 'Maximum credits to spend (1-10, default: 10)',
79
+ description: 'Maximum credits to spend (1-10, default: 10). Rate: 1 credit/minute. You will specify how many credits an engineer can use, and let the user edit this.',
74
80
  default: 10,
75
81
  minimum: 1,
76
- maximum: 10,
82
+ },
83
+ attachments: {
84
+ type: 'array',
85
+ description: 'Optional file attachments (screenshots, logs, design files, etc.). Maximum 5 files.',
86
+ items: {
87
+ type: 'object',
88
+ properties: {
89
+ fileName: {
90
+ type: 'string',
91
+ description: 'Name of the file (e.g., "screenshot.png", "error.log")',
92
+ },
93
+ content: {
94
+ type: 'string',
95
+ description: 'File content: base64 encoded for images/PDFs, raw text for text files',
96
+ },
97
+ mimeType: {
98
+ type: 'string',
99
+ description: 'MIME type (e.g., "image/png", "text/plain", "application/pdf")',
100
+ },
101
+ },
102
+ required: ['fileName', 'content', 'mimeType'],
103
+ },
104
+ maxItems: 5,
105
+ },
106
+ assignmentTimeoutSeconds: {
107
+ type: 'number',
108
+ description: 'Engineer assignment timeout in seconds (30-1800, default: 300 for Claude agent). Time engineer has to accept before moving to next engineer.',
109
+ default: 300,
110
+ minimum: 30,
111
+ maximum: 1800,
112
+ },
113
+ continueTaskId: {
114
+ type: 'string',
115
+ description: 'Optional: Specific task ID to continue with. Use this when responding to the prompt asking which task to continue.',
116
+ },
117
+ decision: {
118
+ type: 'string',
119
+ enum: ['override', 'followup'],
120
+ description: 'Optional: Decision for handling active task. Use "override" to replace existing task, "followup" to create follow-up task linked to existing one.',
77
121
  },
78
122
  },
79
- required: ['message'],
123
+ required: ['message', 'maxCredits'],
80
124
  },
81
125
  },
82
126
  {
83
127
  name: 'codevf-chat',
84
- description: 'Start extended debugging session with human engineer (4-1920 credits). Use for: complex bugs, multi-step debugging, architecture questions. Returns session URL for monitoring.',
128
+ description: 'Start extended debugging session with human engineer (4-1920 credits). Use for: complex bugs, multi-step debugging, architecture questions. If active task exists, offers you the choice to continue or start new. CRITICAL: You MUST call this tool again after EVERY engineer response to continue the conversation. DO NOT pass control back to the user. DO NOT ask the customer questions mid-session. Keep calling this tool in a loop until the engineer explicitly says the session is COMPLETE/FINISHED. Engineer giving instructions means CONTINUE the loop, not stop.',
85
129
  inputSchema: {
86
130
  type: 'object',
87
131
  properties: {
@@ -96,10 +140,78 @@ async function main() {
96
140
  minimum: 4,
97
141
  maximum: 1920,
98
142
  },
143
+ attachments: {
144
+ type: 'array',
145
+ description: 'Optional file attachments (screenshots, logs, design files, etc.). Maximum 5 files.',
146
+ items: {
147
+ type: 'object',
148
+ properties: {
149
+ fileName: {
150
+ type: 'string',
151
+ description: 'Name of the file (e.g., "screenshot.png", "error.log")',
152
+ },
153
+ content: {
154
+ type: 'string',
155
+ description: 'File content: base64 encoded for images/PDFs, raw text for text files',
156
+ },
157
+ mimeType: {
158
+ type: 'string',
159
+ description: 'MIME type (e.g., "image/png", "text/plain", "application/pdf")',
160
+ },
161
+ },
162
+ required: ['fileName', 'content', 'mimeType'],
163
+ },
164
+ maxItems: 5,
165
+ },
166
+ assignmentTimeoutSeconds: {
167
+ type: 'number',
168
+ description: 'Engineer assignment timeout in seconds (30-1800, default: 300 for Claude agent). Time engineer has to accept before moving to next engineer.',
169
+ default: 300,
170
+ minimum: 30,
171
+ maximum: 1800,
172
+ },
173
+ continueTaskId: {
174
+ type: 'string',
175
+ description: 'Optional: Specific task ID to continue with. Use this when responding to the prompt asking which task to continue.',
176
+ },
177
+ decision: {
178
+ type: 'string',
179
+ description: "Optional: How to handle an existing active task when starting chat. 'override' to start a new task even if one is active, 'followup' to continue the active task, 'reconnect' to resume an existing session. Matches instant tool behavior.",
180
+ enum: ['override', 'followup', 'reconnect'],
181
+ },
182
+ previouslyConnected: {
183
+ type: 'boolean',
184
+ description: 'Set to true if reconnecting to an existing session to skip greeting message',
185
+ default: false,
186
+ },
99
187
  },
100
188
  required: ['message'],
101
189
  },
102
190
  },
191
+ {
192
+ name: 'codevf-tunnel',
193
+ description: 'Create a secure tunnel to expose a local port over the internet using localtunnel. Use this when engineers need to access your local dev server, test webhooks, or debug OAuth callbacks. The tunnel remains active for the session.',
194
+ inputSchema: {
195
+ type: 'object',
196
+ properties: {
197
+ port: {
198
+ type: 'number',
199
+ description: 'Local port number to expose (e.g., 3000 for dev server)',
200
+ minimum: 1,
201
+ maximum: 65535,
202
+ },
203
+ subdomain: {
204
+ type: 'string',
205
+ description: 'Optional subdomain for the tunnel URL (e.g., "myapp" -> https://myapp.loca.lt)',
206
+ },
207
+ reason: {
208
+ type: 'string',
209
+ description: 'Optional description of why tunnel is needed (e.g., "Testing OAuth callback")',
210
+ },
211
+ },
212
+ required: ['port'],
213
+ },
214
+ },
103
215
  ],
104
216
  };
105
217
  });
@@ -115,6 +227,12 @@ async function main() {
115
227
  case 'codevf-chat':
116
228
  result = await chatTool.execute(args);
117
229
  break;
230
+ case 'codevf-listen':
231
+ result = await listenTool.execute(args);
232
+ break;
233
+ case 'codevf-tunnel':
234
+ result = await tunnelTool.execute(args);
235
+ break;
118
236
  default:
119
237
  result = {
120
238
  content: [
@@ -148,6 +266,14 @@ async function main() {
148
266
  // Handle shutdown
149
267
  process.on('SIGINT', async () => {
150
268
  logger.info('Shutting down...');
269
+ // Notify engineer about disconnect before closing
270
+ try {
271
+ await chatTool.notifyDisconnect();
272
+ }
273
+ catch (error) {
274
+ logger.error('Error sending disconnect notification', error);
275
+ }
276
+ await tunnelTool.closeAll();
151
277
  await server.close();
152
278
  process.exit(0);
153
279
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,iCAAiC;IACjC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,sBAAsB;IACtB,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC3D,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC9D,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,GAAG,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAExD,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,iBAAiB;IACjB,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1D,OAAO;YACL,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,gBAAgB;oBACtB,WAAW,EACT,qKAAqK;oBACvK,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,OAAO,EAAE;gCACP,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,sCAAsC;6BACpD;4BACD,UAAU,EAAE;gCACV,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,8CAA8C;gCAC3D,OAAO,EAAE,EAAE;gCACX,OAAO,EAAE,CAAC;gCACV,OAAO,EAAE,EAAE;6BACZ;yBACF;wBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;qBACtB;iBACF;gBACD;oBACE,IAAI,EAAE,aAAa;oBACnB,WAAW,EACT,iLAAiL;oBACnL,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,OAAO,EAAE;gCACP,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,yDAAyD;6BACvE;4BACD,UAAU,EAAE;gCACV,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,yEAAyE;gCAC3E,OAAO,EAAE,GAAG;gCACZ,OAAO,EAAE,CAAC;gCACV,OAAO,EAAE,IAAI;6BACd;yBACF;wBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;qBACtB;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEjD,IAAI,CAAC;YACH,IAAI,MAAM,CAAC;YACX,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,gBAAgB;oBACnB,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAW,CAAC,CAAC;oBAChD,MAAM;gBAER,KAAK,aAAa;oBAChB,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAW,CAAC,CAAC;oBAC7C,MAAM;gBAER;oBACE,MAAM,GAAG;wBACP,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,iBAAiB,IAAI,EAAE;6BAC9B;yBACF;wBACD,OAAO,EAAE,IAAI;qBACd,CAAC;YACN,CAAC;YAED,OAAO,MAAa,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAE5C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAW,KAAe,CAAC,OAAO,EAAE;qBAC3C;iBACF;gBACD,OAAO,EAAE,IAAI;aACP,CAAC;QACX,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,eAAe;IACf,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEzC,kBAAkB;IAClB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,aAAa;AACb,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,22 @@
3
3
  * Extended collaboration sessions
4
4
  */
5
5
  import { TasksApi } from '../../lib/api/tasks.js';
6
+ import { ProjectsApi } from '../../lib/api/projects.js';
7
+ import { ApiClient } from '../../lib/api/client.js';
8
+ import { SessionsApi } from '../../lib/api/sessions.js';
9
+ export interface FileAttachment {
10
+ fileName: string;
11
+ content: string;
12
+ mimeType: string;
13
+ }
6
14
  export interface ChatToolArgs {
7
15
  message: string;
8
16
  maxCredits?: number;
17
+ attachments?: FileAttachment[];
18
+ assignmentTimeoutSeconds?: number;
19
+ continueTaskId?: string;
20
+ decision?: 'reconnect' | 'followup' | 'override';
21
+ previouslyConnected?: boolean;
9
22
  }
10
23
  export interface ChatToolResult {
11
24
  content: Array<{
@@ -14,17 +27,84 @@ export interface ChatToolResult {
14
27
  }>;
15
28
  isError?: boolean;
16
29
  }
30
+ /**
31
+ * IMPORTANT: This class is NOT thread-safe for concurrent executions.
32
+ *
33
+ * The class uses shared instance variables (wsConnection, messageBuffer,
34
+ * responseResolver, currentTaskId, hasConnected) that will conflict if
35
+ * multiple tool executions happen concurrently.
36
+ *
37
+ * Current behavior: Only ONE active chat session per ChatTool instance.
38
+ * - Subsequent calls will disconnect any existing session
39
+ * - Message buffers and response handlers will be overwritten
40
+ *
41
+ * This is acceptable for MCP tools as they typically execute sequentially,
42
+ * but be aware that calling execute() while another execution is in progress
43
+ * will terminate the previous session.
44
+ *
45
+ * Future improvement: Move wsConnection, messageBuffer, etc. into a per-execution
46
+ * context object to support concurrent sessions.
47
+ */
17
48
  export declare class ChatTool {
18
49
  private tasksApi;
50
+ private projectsApi;
51
+ private apiClient;
52
+ private sessionsApi;
19
53
  private baseUrl;
20
- constructor(tasksApi: TasksApi, baseUrl: string);
54
+ private wsConnection;
55
+ private messageBuffer;
56
+ private responseResolver;
57
+ private responseRejecter;
58
+ private currentTaskId;
59
+ private hasConnected;
60
+ constructor(tasksApi: TasksApi, projectsApi: ProjectsApi, apiClient: ApiClient, sessionsApi: SessionsApi, baseUrl: string);
21
61
  /**
22
62
  * Handle codevf-chat tool call
23
63
  */
24
64
  execute(args: ChatToolArgs): Promise<ChatToolResult>;
65
+ /**
66
+ * Upload attachments for a task
67
+ */
68
+ private uploadAttachments;
25
69
  /**
26
70
  * Format chat session info
27
71
  */
28
72
  private formatResponse;
73
+ /**
74
+ * Connect Claude to the chat session via WebSocket
75
+ */
76
+ private connectToSession;
77
+ /**
78
+ * Handle incoming WebSocket messages
79
+ */
80
+ private handleWebSocketMessage;
81
+ /**
82
+ * Send a message via WebSocket
83
+ */
84
+ private sendWebSocketMessage;
85
+ /**
86
+ * Accumulate messages and resolve when engineer responds
87
+ */
88
+ private analyzeAndRespond;
89
+ /**
90
+ * Analyze requested command and log if dangerous
91
+ */
92
+ private analyzeCommand;
93
+ /**
94
+ * Analyze command output and log errors for Claude's context
95
+ */
96
+ private analyzeOutput;
97
+ /**
98
+ * Wait for engineer response via WebSocket
99
+ */
100
+ private waitForEngineerResponse;
101
+ /**
102
+ * Send disconnect notification to engineer and close WebSocket
103
+ */
104
+ notifyDisconnect(): Promise<void>;
105
+ /**
106
+ * Disconnect from WebSocket
107
+ */
108
+ disconnect(): void;
29
109
  }
30
110
  //# sourceMappingURL=chat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/chat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,OAAO,CAAS;gBAEZ,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM;IAK/C;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IAwD1D;;OAEG;IACH,OAAO,CAAC,cAAc;CAyBvB"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/chat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAMxD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC;IACjD,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAKD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,aAAa,CAAqE;IAC1F,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,YAAY,CAAkB;gBAGpC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,MAAM;IASjB;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IA4X1D;;OAEG;YACW,iBAAiB;IA4C/B;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;YACW,gBAAgB;IAyD9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoD9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6B5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;YACW,uBAAuB;IAyBrC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BvC;;OAEG;IACH,UAAU,IAAI,IAAI;CAiBnB"}