codevf 1.0.0 → 1.0.2
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.
- package/LICENSE +30 -21
- package/README.md +7 -2
- package/bin/codevf-mcp.js +11 -0
- package/dist/commands/fix.d.ts +5 -1
- package/dist/commands/fix.d.ts.map +1 -1
- package/dist/commands/fix.js +170 -13
- package/dist/commands/fix.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +72 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp-tools.d.ts +17 -0
- package/dist/commands/mcp-tools.d.ts.map +1 -0
- package/dist/commands/mcp-tools.js +237 -0
- package/dist/commands/mcp-tools.js.map +1 -0
- package/dist/commands/setup.d.ts +8 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +250 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/welcome.d.ts +9 -0
- package/dist/commands/welcome.d.ts.map +1 -0
- package/dist/commands/welcome.js +175 -0
- package/dist/commands/welcome.js.map +1 -0
- package/dist/index.js +263 -207
- package/dist/index.js.map +1 -1
- package/dist/lib/api/client.d.ts +28 -0
- package/dist/lib/api/client.d.ts.map +1 -0
- package/dist/lib/api/client.js +66 -0
- package/dist/lib/api/client.js.map +1 -0
- package/dist/lib/api/projects.d.ts +32 -0
- package/dist/lib/api/projects.d.ts.map +1 -0
- package/dist/lib/api/projects.js +61 -0
- package/dist/lib/api/projects.js.map +1 -0
- package/dist/lib/api/tasks.d.ts +36 -0
- package/dist/lib/api/tasks.d.ts.map +1 -0
- package/dist/lib/api/tasks.js +62 -0
- package/dist/lib/api/tasks.js.map +1 -0
- package/dist/lib/api/websocket.d.ts +50 -0
- package/dist/lib/api/websocket.d.ts.map +1 -0
- package/dist/lib/api/websocket.js +153 -0
- package/dist/lib/api/websocket.js.map +1 -0
- package/dist/lib/auth/oauth-flow.d.ts +37 -0
- package/dist/lib/auth/oauth-flow.d.ts.map +1 -0
- package/dist/lib/auth/oauth-flow.js +119 -0
- package/dist/lib/auth/oauth-flow.js.map +1 -0
- package/dist/lib/auth/token-manager.d.ts +26 -0
- package/dist/lib/auth/token-manager.d.ts.map +1 -0
- package/dist/lib/auth/token-manager.js +87 -0
- package/dist/lib/auth/token-manager.js.map +1 -0
- package/dist/lib/config/manager.d.ts +50 -0
- package/dist/lib/config/manager.d.ts.map +1 -0
- package/dist/lib/config/manager.js +84 -0
- package/dist/lib/config/manager.js.map +1 -0
- package/dist/lib/utils/errors.d.ts +28 -0
- package/dist/lib/utils/errors.d.ts.map +1 -0
- package/dist/lib/utils/errors.js +44 -0
- package/dist/lib/utils/errors.js.map +1 -0
- package/dist/lib/utils/logger.d.ts +20 -0
- package/dist/lib/utils/logger.d.ts.map +1 -0
- package/dist/lib/utils/logger.js +40 -0
- package/dist/lib/utils/logger.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +160 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools/chat.d.ts +30 -0
- package/dist/mcp/tools/chat.d.ts.map +1 -0
- package/dist/mcp/tools/chat.js +82 -0
- package/dist/mcp/tools/chat.js.map +1 -0
- package/dist/mcp/tools/instant.d.ts +38 -0
- package/dist/mcp/tools/instant.d.ts.map +1 -0
- package/dist/mcp/tools/instant.js +106 -0
- package/dist/mcp/tools/instant.js.map +1 -0
- package/dist/modules/aiAgent.d.ts +75 -0
- package/dist/modules/aiAgent.d.ts.map +1 -0
- package/dist/modules/aiAgent.js +707 -0
- package/dist/modules/aiAgent.js.map +1 -0
- package/dist/modules/api.d.ts +7 -0
- package/dist/modules/api.d.ts.map +1 -1
- package/dist/modules/api.js +13 -4
- package/dist/modules/api.js.map +1 -1
- package/dist/modules/commandHandler.d.ts +40 -0
- package/dist/modules/commandHandler.d.ts.map +1 -0
- package/dist/modules/commandHandler.js +328 -0
- package/dist/modules/commandHandler.js.map +1 -0
- package/dist/modules/config.d.ts +2 -0
- package/dist/modules/config.d.ts.map +1 -1
- package/dist/modules/config.js +9 -0
- package/dist/modules/config.js.map +1 -1
- package/dist/modules/constants.d.ts +83 -0
- package/dist/modules/constants.d.ts.map +1 -0
- package/dist/modules/constants.js +75 -0
- package/dist/modules/constants.js.map +1 -0
- package/dist/modules/permissions.d.ts +14 -0
- package/dist/modules/permissions.d.ts.map +1 -1
- package/dist/modules/permissions.js +94 -0
- package/dist/modules/permissions.js.map +1 -1
- package/dist/modules/toolRegistry.d.ts +50 -0
- package/dist/modules/toolRegistry.d.ts.map +1 -0
- package/dist/modules/toolRegistry.js +114 -0
- package/dist/modules/toolRegistry.js.map +1 -0
- package/dist/modules/tunnel.d.ts +33 -0
- package/dist/modules/tunnel.d.ts.map +1 -0
- package/dist/modules/tunnel.js +79 -0
- package/dist/modules/tunnel.js.map +1 -0
- package/dist/modules/vibeHelper.d.ts +16 -0
- package/dist/modules/vibeHelper.d.ts.map +1 -0
- package/dist/modules/vibeHelper.js +38 -0
- package/dist/modules/vibeHelper.js.map +1 -0
- package/dist/modules/websocket.d.ts +9 -0
- package/dist/modules/websocket.d.ts.map +1 -1
- package/dist/modules/websocket.js +70 -0
- package/dist/modules/websocket.js.map +1 -1
- package/dist/tools/consultEngineer.d.ts +13 -0
- package/dist/tools/consultEngineer.d.ts.map +1 -0
- package/dist/tools/consultEngineer.js +161 -0
- package/dist/tools/consultEngineer.js.map +1 -0
- package/dist/tools/realtimeChat.d.ts +9 -0
- package/dist/tools/realtimeChat.d.ts.map +1 -0
- package/dist/tools/realtimeChat.js +101 -0
- package/dist/tools/realtimeChat.js.map +1 -0
- package/dist/types/index.d.ts +183 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/ui/InteractiveApp.d.ts +13 -0
- package/dist/ui/InteractiveApp.d.ts.map +1 -0
- package/dist/ui/InteractiveApp.js +84 -0
- package/dist/ui/InteractiveApp.js.map +1 -0
- package/dist/ui/InteractivePrompt.d.ts +53 -0
- package/dist/ui/InteractivePrompt.d.ts.map +1 -0
- package/dist/ui/InteractivePrompt.js +422 -0
- package/dist/ui/InteractivePrompt.js.map +1 -0
- package/dist/ui/LiveSession.d.ts +2 -0
- package/dist/ui/LiveSession.d.ts.map +1 -1
- package/dist/ui/LiveSession.js +461 -180
- package/dist/ui/LiveSession.js.map +1 -1
- package/dist/ui/PromptInput.d.ts +14 -0
- package/dist/ui/PromptInput.d.ts.map +1 -0
- package/dist/ui/PromptInput.js +206 -0
- package/dist/ui/PromptInput.js.map +1 -0
- package/dist/ui/SessionUI.d.ts +40 -0
- package/dist/ui/SessionUI.d.ts.map +1 -0
- package/dist/ui/SessionUI.js +218 -0
- package/dist/ui/SessionUI.js.map +1 -0
- package/dist/ui/input/Command.d.ts +22 -0
- package/dist/ui/input/Command.d.ts.map +1 -0
- package/dist/ui/input/Command.js +30 -0
- package/dist/ui/input/Command.js.map +1 -0
- package/dist/ui/input/CustomInput.d.ts +15 -0
- package/dist/ui/input/CustomInput.d.ts.map +1 -0
- package/dist/ui/input/CustomInput.js +182 -0
- package/dist/ui/input/CustomInput.js.map +1 -0
- package/dist/ui/input/handlers/handleCursor.d.ts +22 -0
- package/dist/ui/input/handlers/handleCursor.d.ts.map +1 -0
- package/dist/ui/input/handlers/handleCursor.js +53 -0
- package/dist/ui/input/handlers/handleCursor.js.map +1 -0
- package/dist/ui/input/handlers/handleEdit.d.ts +18 -0
- package/dist/ui/input/handlers/handleEdit.d.ts.map +1 -0
- package/dist/ui/input/handlers/handleEdit.js +55 -0
- package/dist/ui/input/handlers/handleEdit.js.map +1 -0
- package/dist/ui/input/handlers/handleHistory.d.ts +18 -0
- package/dist/ui/input/handlers/handleHistory.d.ts.map +1 -0
- package/dist/ui/input/handlers/handleHistory.js +85 -0
- package/dist/ui/input/handlers/handleHistory.js.map +1 -0
- package/dist/ui/input/handlers/handlePaste.d.ts +19 -0
- package/dist/ui/input/handlers/handlePaste.d.ts.map +1 -0
- package/dist/ui/input/handlers/handlePaste.js +49 -0
- package/dist/ui/input/handlers/handlePaste.js.map +1 -0
- package/dist/ui/input/handlers/handleSubmit.d.ts +18 -0
- package/dist/ui/input/handlers/handleSubmit.d.ts.map +1 -0
- package/dist/ui/input/handlers/handleSubmit.js +39 -0
- package/dist/ui/input/handlers/handleSubmit.js.map +1 -0
- package/dist/ui/input/helpers.d.ts +4 -0
- package/dist/ui/input/helpers.d.ts.map +1 -0
- package/dist/ui/input/helpers.js +13 -0
- package/dist/ui/input/helpers.js.map +1 -0
- package/dist/ui/input/keyMatchers.d.ts +14 -0
- package/dist/ui/input/keyMatchers.d.ts.map +1 -0
- package/dist/ui/input/keyMatchers.js +49 -0
- package/dist/ui/input/keyMatchers.js.map +1 -0
- package/dist/ui/input/types.d.ts +33 -0
- package/dist/ui/input/types.d.ts.map +1 -0
- package/dist/ui/input/types.js +2 -0
- package/dist/ui/input/types.js.map +1 -0
- package/dist/ui/promptWithModes.d.ts +12 -0
- package/dist/ui/promptWithModes.d.ts.map +1 -0
- package/dist/ui/promptWithModes.js +24 -0
- package/dist/ui/promptWithModes.js.map +1 -0
- package/dist/ui/renderPrompt.d.ts +12 -0
- package/dist/ui/renderPrompt.d.ts.map +1 -0
- package/dist/ui/renderPrompt.js +14 -0
- package/dist/ui/renderPrompt.js.map +1 -0
- package/dist/ui/simplePrompt.d.ts +7 -0
- package/dist/ui/simplePrompt.d.ts.map +1 -0
- package/dist/ui/simplePrompt.js +38 -0
- package/dist/ui/simplePrompt.js.map +1 -0
- package/dist/ui/spinner.d.ts +7 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +13 -0
- package/dist/ui/spinner.js.map +1 -0
- package/package.json +36 -26
- package/ARCHITECTURE.md +0 -285
- package/BUILD_SUMMARY.md +0 -340
- package/QUICKSTART.md +0 -180
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import prompts from 'prompts';
|
|
3
|
+
/**
|
|
4
|
+
* Quick engineer consultation for vibe mode
|
|
5
|
+
* Engineer provides context to help AI, not take over the task
|
|
6
|
+
*/
|
|
7
|
+
export async function consultEngineer(aiQuestion, context) {
|
|
8
|
+
console.log(chalk.dim(' [→] Connecting to engineer for quick consultation...'));
|
|
9
|
+
console.log(chalk.dim(' Rate: 2 credits/min (estimated 1-2 min)'));
|
|
10
|
+
// TODO: Replace with actual backend call
|
|
11
|
+
// For now, simulate engineer consultation
|
|
12
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
13
|
+
// Mock engineer response (in production, this would be real engineer input)
|
|
14
|
+
const mockEngineerResponse = `Based on the codebase:
|
|
15
|
+
- The authentication system uses JWT tokens stored in localStorage
|
|
16
|
+
- Login endpoint is POST /api/auth/login
|
|
17
|
+
- The bug is in src/auth/validateToken.js line 42 - missing expiry check
|
|
18
|
+
- Fix: Add "if (Date.now() > token.exp * 1000) throw new Error('expired')"`;
|
|
19
|
+
console.log(chalk.green(' [✓] Engineer provided context'));
|
|
20
|
+
console.log(chalk.dim(' Credits used: 2'));
|
|
21
|
+
return {
|
|
22
|
+
engineerContext: mockEngineerResponse,
|
|
23
|
+
credits: 2,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Ask if user wants to use vibe mode for this request
|
|
28
|
+
*/
|
|
29
|
+
export async function promptForVibeMode() {
|
|
30
|
+
const { useVibe } = await prompts({
|
|
31
|
+
type: 'confirm',
|
|
32
|
+
name: 'useVibe',
|
|
33
|
+
message: ' Use vibe mode? (Engineer helps AI with context)',
|
|
34
|
+
initial: true,
|
|
35
|
+
});
|
|
36
|
+
return useVibe;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=vibeHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vibeHelper.js","sourceRoot":"","sources":["../../src/modules/vibeHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,OAAiD;IAEjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;IAEpE,yCAAyC;IACzC,0CAA0C;IAC1C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1D,4EAA4E;IAC5E,MAAM,oBAAoB,GAAG;;;;2EAI4C,CAAC;IAE1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE5C,OAAO;QACL,eAAe,EAAE,oBAAoB;QACrC,OAAO,EAAE,CAAC;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC;QAChC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,mDAAmD;QAC5D,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
2
|
import { WebSocketMessage } from '../types/index.js';
|
|
3
|
+
import { TunnelManager } from './tunnel.js';
|
|
4
|
+
import { PermissionManager } from './permissions.js';
|
|
3
5
|
export declare class WebSocketClient extends EventEmitter {
|
|
4
6
|
private ws;
|
|
5
7
|
private url;
|
|
@@ -7,7 +9,14 @@ export declare class WebSocketClient extends EventEmitter {
|
|
|
7
9
|
private reconnectAttempts;
|
|
8
10
|
private maxReconnectAttempts;
|
|
9
11
|
private reconnectDelay;
|
|
12
|
+
private tunnelManager;
|
|
13
|
+
private permissionManager;
|
|
14
|
+
private taskId;
|
|
10
15
|
constructor(url: string, token: string);
|
|
16
|
+
/**
|
|
17
|
+
* Enable tunnel support for this WebSocket connection
|
|
18
|
+
*/
|
|
19
|
+
enableTunnelSupport(tunnelManager: TunnelManager, permissionManager: PermissionManager, taskId: string): void;
|
|
11
20
|
connect(): Promise<void>;
|
|
12
21
|
send(message: WebSocketMessage): void;
|
|
13
22
|
disconnect(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/modules/websocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/modules/websocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAA8B,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,MAAM,CAAuB;gBAEzB,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAMtC;;OAEG;IACH,mBAAmB,CACjB,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,MAAM,GACb,IAAI;IA8EP,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCxB,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAQrC,UAAU,IAAI,IAAI;IAOlB,WAAW,IAAI,OAAO;IAItB,OAAO,CAAC,gBAAgB;CAezB"}
|
|
@@ -8,9 +8,79 @@ export class WebSocketClient extends EventEmitter {
|
|
|
8
8
|
this.reconnectAttempts = 0;
|
|
9
9
|
this.maxReconnectAttempts = 5;
|
|
10
10
|
this.reconnectDelay = 2000;
|
|
11
|
+
this.tunnelManager = null;
|
|
12
|
+
this.permissionManager = null;
|
|
13
|
+
this.taskId = null;
|
|
11
14
|
this.url = url;
|
|
12
15
|
this.token = token;
|
|
13
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Enable tunnel support for this WebSocket connection
|
|
19
|
+
*/
|
|
20
|
+
enableTunnelSupport(tunnelManager, permissionManager, taskId) {
|
|
21
|
+
this.tunnelManager = tunnelManager;
|
|
22
|
+
this.permissionManager = permissionManager;
|
|
23
|
+
this.taskId = taskId;
|
|
24
|
+
// Listen for tunnel requests
|
|
25
|
+
this.on('tunnel_request', async (message) => {
|
|
26
|
+
if (!this.tunnelManager || !this.permissionManager || !this.taskId) {
|
|
27
|
+
console.error('Tunnel support not properly configured');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const { suggestedPort, reason } = message.payload;
|
|
31
|
+
const result = await this.permissionManager.handleTunnelRequest(suggestedPort, reason, this.taskId, this.tunnelManager);
|
|
32
|
+
if (result.approved && result.tunnelUrl) {
|
|
33
|
+
// Send approval with tunnel URL
|
|
34
|
+
this.send({
|
|
35
|
+
type: 'approve_tunnel',
|
|
36
|
+
timestamp: new Date().toISOString(),
|
|
37
|
+
payload: {
|
|
38
|
+
tunnelUrl: result.tunnelUrl,
|
|
39
|
+
port: suggestedPort,
|
|
40
|
+
expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), // 24h
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
this.emit('tunnel_created', this.tunnelManager.getActiveTunnel());
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Send denial
|
|
47
|
+
this.send({
|
|
48
|
+
type: 'deny_tunnel',
|
|
49
|
+
timestamp: new Date().toISOString(),
|
|
50
|
+
payload: {
|
|
51
|
+
reason: result.error || 'Tunnel access denied',
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
// Handle tunnel approval confirmation
|
|
57
|
+
this.on('tunnel_approved', (message) => {
|
|
58
|
+
console.log(`Tunnel approved: ${message.payload.tunnelUrl}`);
|
|
59
|
+
this.emit('tunnel_approved', message.payload);
|
|
60
|
+
});
|
|
61
|
+
// Handle tunnel denial
|
|
62
|
+
this.on('tunnel_denied', (message) => {
|
|
63
|
+
console.log(`Tunnel denied: ${message.payload.reason}`);
|
|
64
|
+
this.emit('tunnel_denied', message.payload);
|
|
65
|
+
});
|
|
66
|
+
// Handle tunnel closure
|
|
67
|
+
this.on('tunnel_closed', (message) => {
|
|
68
|
+
console.log(`Tunnel closed by ${message.payload.closedBy}`);
|
|
69
|
+
this.emit('tunnel_closed', message.payload);
|
|
70
|
+
});
|
|
71
|
+
// Auto-close tunnel when session ends
|
|
72
|
+
tunnelManager.on('closed', (tunnel) => {
|
|
73
|
+
if (this.isConnected()) {
|
|
74
|
+
this.send({
|
|
75
|
+
type: 'close_tunnel',
|
|
76
|
+
timestamp: new Date().toISOString(),
|
|
77
|
+
payload: {
|
|
78
|
+
tunnelUrl: tunnel.url,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
14
84
|
connect() {
|
|
15
85
|
return new Promise((resolve, reject) => {
|
|
16
86
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/modules/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAoB,YAAY,
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/modules/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AiTool } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* ConsultEngineer Tool
|
|
4
|
+
*
|
|
5
|
+
* Allows the AI agent to create realtime_answer requests to consult
|
|
6
|
+
* human engineers for quick answers to specific technical questions.
|
|
7
|
+
*
|
|
8
|
+
* This tool enables hybrid AI+Human workflows where the AI can
|
|
9
|
+
* escalate difficult questions to human experts and incorporate
|
|
10
|
+
* their responses into the conversation.
|
|
11
|
+
*/
|
|
12
|
+
export declare const consultEngineerTool: AiTool;
|
|
13
|
+
//# sourceMappingURL=consultEngineer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consultEngineer.d.ts","sourceRoot":"","sources":["../../src/tools/consultEngineer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAc,MAAM,mBAAmB,CAAC;AAKvD;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAwHjC,CAAC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { ApiClient } from '../modules/api.js';
|
|
2
|
+
import { AuthManager } from '../modules/auth.js';
|
|
3
|
+
import { ConfigManager } from '../modules/config.js';
|
|
4
|
+
/**
|
|
5
|
+
* ConsultEngineer Tool
|
|
6
|
+
*
|
|
7
|
+
* Allows the AI agent to create realtime_answer requests to consult
|
|
8
|
+
* human engineers for quick answers to specific technical questions.
|
|
9
|
+
*
|
|
10
|
+
* This tool enables hybrid AI+Human workflows where the AI can
|
|
11
|
+
* escalate difficult questions to human experts and incorporate
|
|
12
|
+
* their responses into the conversation.
|
|
13
|
+
*/
|
|
14
|
+
export const consultEngineerTool = {
|
|
15
|
+
name: 'consultEngineer',
|
|
16
|
+
description: 'Consult a human engineer for quick, single-response answers to specific technical questions. ' +
|
|
17
|
+
'This is a one-shot request (not a chat), so include the full question and all necessary context. ' +
|
|
18
|
+
'Use this when you need expert human insight, code review, or answers to questions ' +
|
|
19
|
+
'you cannot confidently answer alone. Response typically within 2-5 minutes.',
|
|
20
|
+
parameters: {
|
|
21
|
+
type: 'object',
|
|
22
|
+
properties: {
|
|
23
|
+
question: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
description: 'Clear, specific question for the engineer. Include context and what you need to know.',
|
|
26
|
+
},
|
|
27
|
+
context: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'Relevant code snippets, error messages, or background information the engineer needs.',
|
|
30
|
+
},
|
|
31
|
+
urgency: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'Priority level: "normal" or "high". High uses more credits for faster response.',
|
|
34
|
+
enum: ['normal', 'high'],
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
required: ['question', 'context'],
|
|
38
|
+
},
|
|
39
|
+
async execute(params) {
|
|
40
|
+
try {
|
|
41
|
+
const authManager = new AuthManager();
|
|
42
|
+
const configManager = new ConfigManager();
|
|
43
|
+
const apiClient = new ApiClient(authManager);
|
|
44
|
+
// Verify prerequisites
|
|
45
|
+
if (!authManager.isAuthenticated()) {
|
|
46
|
+
return {
|
|
47
|
+
success: false,
|
|
48
|
+
error: 'Not authenticated. Please run: codevf login',
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (!configManager.isInitialized()) {
|
|
52
|
+
return {
|
|
53
|
+
success: false,
|
|
54
|
+
error: 'Project not initialized. Please run: codevf init',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const config = configManager.loadConfig();
|
|
58
|
+
const urgency = params.urgency || 'normal';
|
|
59
|
+
// Check if consultEngineer tool is enabled in config
|
|
60
|
+
const toolConfig = config.ai?.tools?.consultEngineer;
|
|
61
|
+
if (toolConfig && toolConfig.enabled === false) {
|
|
62
|
+
return {
|
|
63
|
+
success: false,
|
|
64
|
+
error: 'ConsultEngineer tool is disabled in project configuration',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// Create task description combining question and context
|
|
68
|
+
const issueDescription = `[AI Consultation Request]\n\n` +
|
|
69
|
+
`**Question:**\n${params.question}\n\n` +
|
|
70
|
+
`**Context:**\n${params.context}`;
|
|
71
|
+
// Determine credits based on urgency and config
|
|
72
|
+
const defaultMaxCredits = urgency === 'high' ? 20 : 10;
|
|
73
|
+
const maxCredits = urgency === 'high'
|
|
74
|
+
? (toolConfig?.highUrgencyCredits || defaultMaxCredits)
|
|
75
|
+
: (toolConfig?.maxCreditsPerCall || defaultMaxCredits);
|
|
76
|
+
console.log(`🔧 AI is consulting an engineer...`);
|
|
77
|
+
console.log(` Question: ${params.question.substring(0, 60)}${params.question.length > 60 ? '...' : ''}`);
|
|
78
|
+
console.log(` Urgency: ${urgency}`);
|
|
79
|
+
console.log(` Max credits: ${maxCredits}`);
|
|
80
|
+
// Create realtime_answer task
|
|
81
|
+
const { taskId, creditsRemaining, warning } = await apiClient.createTask({
|
|
82
|
+
issueDescription,
|
|
83
|
+
projectId: config.projectId,
|
|
84
|
+
maxCredits,
|
|
85
|
+
taskMode: 'realtime_answer',
|
|
86
|
+
contextData: JSON.stringify({
|
|
87
|
+
source: 'ai_tool_call',
|
|
88
|
+
aiQuestion: params.question,
|
|
89
|
+
timestamp: new Date().toISOString(),
|
|
90
|
+
}),
|
|
91
|
+
initiatedBy: 'ai_tool',
|
|
92
|
+
});
|
|
93
|
+
if (warning) {
|
|
94
|
+
console.log(` ⚠️ ${warning}`);
|
|
95
|
+
}
|
|
96
|
+
console.log(` ⏳ Waiting for engineer response (Task ${taskId})...`);
|
|
97
|
+
// Poll for response
|
|
98
|
+
const response = await waitForEngineerResponse(apiClient, taskId);
|
|
99
|
+
console.log(` ✅ Received answer from ${response.engineerName}`);
|
|
100
|
+
console.log(` Credits used: ${response.creditsUsed}`);
|
|
101
|
+
return {
|
|
102
|
+
success: true,
|
|
103
|
+
data: {
|
|
104
|
+
answer: response.answer,
|
|
105
|
+
engineerName: response.engineerName,
|
|
106
|
+
creditsUsed: response.creditsUsed,
|
|
107
|
+
},
|
|
108
|
+
creditsUsed: response.creditsUsed,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error(` ❌ Failed to consult engineer: ${error.message}`);
|
|
113
|
+
return {
|
|
114
|
+
success: false,
|
|
115
|
+
error: error.message || 'Failed to consult engineer',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Poll for engineer response with timeout
|
|
122
|
+
*/
|
|
123
|
+
async function waitForEngineerResponse(apiClient, taskId, timeoutMs = 600000 // 10 minutes max
|
|
124
|
+
) {
|
|
125
|
+
const startTime = Date.now();
|
|
126
|
+
const pollInterval = 5000; // 5 seconds
|
|
127
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
128
|
+
try {
|
|
129
|
+
// Poll task status
|
|
130
|
+
const task = await apiClient.getTaskStatus(taskId);
|
|
131
|
+
if (task.status === 'completed') {
|
|
132
|
+
return {
|
|
133
|
+
answer: task.response || 'Engineer completed the task',
|
|
134
|
+
engineerName: task.engineerName || 'Engineer',
|
|
135
|
+
creditsUsed: parseFloat(task.actualCreditsUsed || '0'),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
if (task.status === 'cancelled') {
|
|
139
|
+
throw new Error('Engineer consultation was cancelled');
|
|
140
|
+
}
|
|
141
|
+
// Show progress every 30 seconds
|
|
142
|
+
const elapsed = Date.now() - startTime;
|
|
143
|
+
if (elapsed % 30000 < pollInterval) {
|
|
144
|
+
const minutes = Math.floor(elapsed / 60000);
|
|
145
|
+
const seconds = Math.floor((elapsed % 60000) / 1000);
|
|
146
|
+
console.log(` ⏳ Still waiting... (${minutes}m ${seconds}s elapsed)`);
|
|
147
|
+
}
|
|
148
|
+
// Wait before next poll
|
|
149
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
// If polling fails, continue trying until timeout
|
|
153
|
+
if (error.message.includes('cancelled')) {
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
// Continue polling on other errors
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
throw new Error('Engineer consultation timed out after 10 minutes');
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=consultEngineer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consultEngineer.js","sourceRoot":"","sources":["../../src/tools/consultEngineer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AiTool } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* LaunchRealtimeChat Tool
|
|
4
|
+
*
|
|
5
|
+
* Starts a realtime_chat session so a human engineer can join live.
|
|
6
|
+
* Returns the task id and websocket URL for the session.
|
|
7
|
+
*/
|
|
8
|
+
export declare const realtimeChatTool: AiTool;
|
|
9
|
+
//# sourceMappingURL=realtimeChat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtimeChat.d.ts","sourceRoot":"","sources":["../../src/tools/realtimeChat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAc,MAAM,mBAAmB,CAAC;AAOvD;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAsG9B,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ApiClient } from '../modules/api.js';
|
|
2
|
+
import { AuthManager } from '../modules/auth.js';
|
|
3
|
+
import { ConfigManager } from '../modules/config.js';
|
|
4
|
+
const DEFAULT_MAX_CREDITS = 240;
|
|
5
|
+
/**
|
|
6
|
+
* LaunchRealtimeChat Tool
|
|
7
|
+
*
|
|
8
|
+
* Starts a realtime_chat session so a human engineer can join live.
|
|
9
|
+
* Returns the task id and websocket URL for the session.
|
|
10
|
+
*/
|
|
11
|
+
export const realtimeChatTool = {
|
|
12
|
+
name: 'launchRealtimeChat',
|
|
13
|
+
description: 'Start a live realtime chat session with a human engineer. Use when you want an engineer to join the conversation and collaborate in real time.',
|
|
14
|
+
parameters: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
issueDescription: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: 'Short description of the problem you want to discuss in realtime.',
|
|
20
|
+
},
|
|
21
|
+
maxCredits: {
|
|
22
|
+
type: 'number',
|
|
23
|
+
description: 'Maximum credits to allocate for the realtime chat session (default 240).',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
required: ['issueDescription'],
|
|
27
|
+
},
|
|
28
|
+
async execute(params) {
|
|
29
|
+
try {
|
|
30
|
+
const authManager = new AuthManager();
|
|
31
|
+
const configManager = new ConfigManager();
|
|
32
|
+
const apiClient = new ApiClient(authManager);
|
|
33
|
+
if (!authManager.isAuthenticated()) {
|
|
34
|
+
return {
|
|
35
|
+
success: false,
|
|
36
|
+
error: 'Not authenticated. Please run: codevf login',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (!configManager.isInitialized()) {
|
|
40
|
+
return {
|
|
41
|
+
success: false,
|
|
42
|
+
error: 'Project not initialized. Please run: codevf init',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const config = configManager.loadConfig();
|
|
46
|
+
const issueDescription = params.issueDescription?.trim();
|
|
47
|
+
if (!issueDescription) {
|
|
48
|
+
return { success: false, error: 'Issue description is required to start realtime chat' };
|
|
49
|
+
}
|
|
50
|
+
const maxCredits = typeof params.maxCredits === 'number' && params.maxCredits > 0
|
|
51
|
+
? params.maxCredits
|
|
52
|
+
: DEFAULT_MAX_CREDITS;
|
|
53
|
+
const contextData = {
|
|
54
|
+
source: 'ai_tool',
|
|
55
|
+
type: 'realtime_chat',
|
|
56
|
+
timestamp: new Date().toISOString(),
|
|
57
|
+
workingDir: process.cwd(),
|
|
58
|
+
};
|
|
59
|
+
const { taskId, estimatedWaitTime, warning, creditsRemaining, maxCreditsAllocated } = await apiClient.createTask({
|
|
60
|
+
issueDescription,
|
|
61
|
+
projectId: config.projectId,
|
|
62
|
+
maxCredits,
|
|
63
|
+
taskMode: 'realtime_chat',
|
|
64
|
+
contextData: JSON.stringify(contextData),
|
|
65
|
+
initiatedBy: 'ai_tool',
|
|
66
|
+
});
|
|
67
|
+
const websocketUrl = apiClient.getWebSocketUrl(taskId, authManager.getAccessToken());
|
|
68
|
+
if (warning) {
|
|
69
|
+
// Surface warnings as part of the tool response
|
|
70
|
+
return {
|
|
71
|
+
success: true,
|
|
72
|
+
data: {
|
|
73
|
+
taskId,
|
|
74
|
+
websocketUrl,
|
|
75
|
+
estimatedWaitTime,
|
|
76
|
+
warning,
|
|
77
|
+
creditsRemaining,
|
|
78
|
+
maxCreditsAllocated,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
data: {
|
|
85
|
+
taskId,
|
|
86
|
+
websocketUrl,
|
|
87
|
+
estimatedWaitTime,
|
|
88
|
+
creditsRemaining,
|
|
89
|
+
maxCreditsAllocated,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return {
|
|
95
|
+
success: false,
|
|
96
|
+
error: error?.message || 'Failed to start realtime chat session',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=realtimeChat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtimeChat.js","sourceRoot":"","sources":["../../src/tools/realtimeChat.ts"],"names":[],"mappings":"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"}
|