codevf 1.0.2 → 1.0.3
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/README.md +118 -62
- package/dist/commands/chat.d.ts +2 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +130 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/cvf-chat-command-content.d.ts +2 -0
- package/dist/commands/cvf-chat-command-content.d.ts.map +1 -0
- package/dist/commands/cvf-chat-command-content.js +22 -0
- package/dist/commands/cvf-chat-command-content.js.map +1 -0
- package/dist/commands/cvf-command-content.d.ts +2 -0
- package/dist/commands/cvf-command-content.d.ts.map +1 -0
- package/dist/commands/cvf-command-content.js +109 -0
- package/dist/commands/cvf-command-content.js.map +1 -0
- package/dist/commands/fix.d.ts +1 -0
- package/dist/commands/fix.d.ts.map +1 -1
- package/dist/commands/fix.js +36 -0
- package/dist/commands/fix.js.map +1 -1
- package/dist/commands/listen.d.ts +2 -0
- package/dist/commands/listen.d.ts.map +1 -0
- package/dist/commands/listen.js +109 -0
- package/dist/commands/listen.js.map +1 -0
- package/dist/commands/mcp-tools.d.ts.map +1 -1
- package/dist/commands/mcp-tools.js +15 -15
- package/dist/commands/mcp-tools.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +138 -56
- package/dist/commands/setup.js.map +1 -1
- package/dist/index.js +28 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/api/client.d.ts +4 -0
- package/dist/lib/api/client.d.ts.map +1 -1
- package/dist/lib/api/client.js +6 -0
- package/dist/lib/api/client.js.map +1 -1
- package/dist/lib/api/sessions.d.ts +85 -0
- package/dist/lib/api/sessions.d.ts.map +1 -0
- package/dist/lib/api/sessions.js +137 -0
- package/dist/lib/api/sessions.js.map +1 -0
- package/dist/lib/api/tasks.d.ts +44 -0
- package/dist/lib/api/tasks.d.ts.map +1 -1
- package/dist/lib/api/tasks.js +82 -1
- package/dist/lib/api/tasks.js.map +1 -1
- package/dist/lib/api/websocket.d.ts +4 -2
- package/dist/lib/api/websocket.d.ts.map +1 -1
- package/dist/lib/api/websocket.js +54 -5
- package/dist/lib/api/websocket.js.map +1 -1
- package/dist/lib/auth/token-manager.d.ts.map +1 -1
- package/dist/lib/auth/token-manager.js +17 -6
- package/dist/lib/auth/token-manager.js.map +1 -1
- package/dist/lib/utils/logger.d.ts +3 -0
- package/dist/lib/utils/logger.d.ts.map +1 -1
- package/dist/lib/utils/logger.js +12 -4
- package/dist/lib/utils/logger.js.map +1 -1
- package/dist/mcp/index.js +134 -8
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/tools/chat.d.ts +81 -1
- package/dist/mcp/tools/chat.d.ts.map +1 -1
- package/dist/mcp/tools/chat.js +624 -21
- package/dist/mcp/tools/chat.js.map +1 -1
- package/dist/mcp/tools/instant.d.ts +18 -5
- package/dist/mcp/tools/instant.d.ts.map +1 -1
- package/dist/mcp/tools/instant.js +320 -31
- package/dist/mcp/tools/instant.js.map +1 -1
- package/dist/mcp/tools/listen.d.ts +35 -0
- package/dist/mcp/tools/listen.d.ts.map +1 -0
- package/dist/mcp/tools/listen.js +97 -0
- package/dist/mcp/tools/listen.js.map +1 -0
- package/dist/mcp/tools/task-checker.d.ts +60 -0
- package/dist/mcp/tools/task-checker.d.ts.map +1 -0
- package/dist/mcp/tools/task-checker.js +139 -0
- package/dist/mcp/tools/task-checker.js.map +1 -0
- package/dist/mcp/tools/tunnel.d.ts +38 -0
- package/dist/mcp/tools/tunnel.d.ts.map +1 -0
- package/dist/mcp/tools/tunnel.js +109 -0
- package/dist/mcp/tools/tunnel.js.map +1 -0
- package/dist/modules/permissions.d.ts +1 -0
- package/dist/modules/permissions.d.ts.map +1 -1
- package/dist/modules/permissions.js +2 -0
- package/dist/modules/permissions.js.map +1 -1
- package/dist/modules/tunnel.d.ts +5 -0
- package/dist/modules/tunnel.d.ts.map +1 -1
- package/dist/modules/tunnel.js +55 -0
- package/dist/modules/tunnel.js.map +1 -1
- package/dist/modules/websocket.d.ts.map +1 -1
- package/dist/modules/websocket.js +3 -2
- package/dist/modules/websocket.js.map +1 -1
- package/dist/types/index.d.ts +7 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/ui/LiveSession.js +2 -2
- package/dist/ui/LiveSession.js.map +1 -1
- package/dist/ui/SessionUI.d.ts +1 -1
- package/dist/ui/SessionUI.d.ts.map +1 -1
- package/dist/ui/SessionUI.js +4 -1
- package/dist/ui/SessionUI.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +8 -7
- package/dist/utils/errors.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codevf-listen tool implementation
|
|
3
|
+
* Monitor active chat sessions in real-time
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../../lib/utils/logger.js';
|
|
6
|
+
export class ListenTool {
|
|
7
|
+
constructor(tasksApi, baseUrl) {
|
|
8
|
+
this.tasksApi = tasksApi;
|
|
9
|
+
this.baseUrl = baseUrl;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Handle codevf-listen tool call
|
|
13
|
+
* Provides monitoring capabilities for active sessions
|
|
14
|
+
*/
|
|
15
|
+
async execute(args) {
|
|
16
|
+
try {
|
|
17
|
+
logger.info('Executing codevf-listen', { sessionId: args.sessionId });
|
|
18
|
+
if (args.sessionId) {
|
|
19
|
+
// Monitor specific session
|
|
20
|
+
return await this.monitorSession(args.sessionId, args.verbose || false);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// List all active sessions
|
|
24
|
+
return await this.listActiveSessions(args.verbose || false);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
logger.error('codevf-listen failed', error);
|
|
29
|
+
return {
|
|
30
|
+
content: [
|
|
31
|
+
{
|
|
32
|
+
type: 'text',
|
|
33
|
+
text: `Error: ${error.message}`,
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
isError: true,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Monitor a specific session
|
|
42
|
+
*/
|
|
43
|
+
async monitorSession(sessionId, verbose) {
|
|
44
|
+
try {
|
|
45
|
+
// Get session details (this would be implemented via API)
|
|
46
|
+
const sessionUrl = `${this.baseUrl}/session/${sessionId}`;
|
|
47
|
+
let output = `Monitoring session: ${sessionId}\n\n`;
|
|
48
|
+
output += `Session URL: ${sessionUrl}\n`;
|
|
49
|
+
output += `Status: Active\n`;
|
|
50
|
+
output += `Last updated: ${new Date().toLocaleTimeString()}\n\n`;
|
|
51
|
+
if (verbose) {
|
|
52
|
+
output += 'Connection established. Waiting for engineer updates...\n';
|
|
53
|
+
output += 'Messages will appear as they are sent.\n';
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
content: [
|
|
57
|
+
{
|
|
58
|
+
type: 'text',
|
|
59
|
+
text: output,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* List all active sessions for the current user
|
|
70
|
+
*/
|
|
71
|
+
async listActiveSessions(verbose) {
|
|
72
|
+
try {
|
|
73
|
+
let output = 'Active Chat Sessions:\n\n';
|
|
74
|
+
// Note: Fetching all active sessions would require a list endpoint
|
|
75
|
+
// For now, provide guidance on how to monitor sessions
|
|
76
|
+
output += 'To monitor a specific chat session, use:\n';
|
|
77
|
+
output += ' codevf-listen <sessionId>\n\n';
|
|
78
|
+
output += 'Chat sessions are created using codevf-chat tool.\n';
|
|
79
|
+
output += 'Each session provides a URL for real-time monitoring.\n\n';
|
|
80
|
+
output += 'Session URLs follow this format:\n';
|
|
81
|
+
output += ` ${this.baseUrl}/session/<sessionId>\n\n`;
|
|
82
|
+
output += 'Share these URLs with team members to collaborate on debugging sessions.';
|
|
83
|
+
return {
|
|
84
|
+
content: [
|
|
85
|
+
{
|
|
86
|
+
type: 'text',
|
|
87
|
+
text: output,
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=listen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen.js","sourceRoot":"","sources":["../../../src/mcp/tools/listen.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAYnD,MAAM,OAAO,UAAU;IAIrB,YAAY,QAAkB,EAAE,OAAe;QAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,IAAoB;QAChC,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAEtE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,2BAA2B;gBAC3B,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;YAC1E,CAAC;iBAAM,CAAC;gBACN,2BAA2B;gBAC3B,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;YAC9D,CAAC;QACH,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;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAC1B,SAAiB,EACjB,OAAgB;QAEhB,IAAI,CAAC;YACH,0DAA0D;YAC1D,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,OAAO,YAAY,SAAS,EAAE,CAAC;YAE1D,IAAI,MAAM,GAAG,uBAAuB,SAAS,MAAM,CAAC;YACpD,MAAM,IAAI,gBAAgB,UAAU,IAAI,CAAC;YACzC,MAAM,IAAI,kBAAkB,CAAC;YAC7B,MAAM,IAAI,iBAAiB,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,MAAM,CAAC;YAEjE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,IAAI,2DAA2D,CAAC;gBACtE,MAAM,IAAI,0CAA0C,CAAC;YACvD,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,MAAM;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAAC,OAAgB;QAC/C,IAAI,CAAC;YACH,IAAI,MAAM,GAAG,2BAA2B,CAAC;YAEzC,mEAAmE;YACnE,uDAAuD;YACvD,MAAM,IAAI,4CAA4C,CAAC;YACvD,MAAM,IAAI,iCAAiC,CAAC;YAC5C,MAAM,IAAI,qDAAqD,CAAC;YAChE,MAAM,IAAI,2DAA2D,CAAC;YACtE,MAAM,IAAI,oCAAoC,CAAC;YAC/C,MAAM,IAAI,KAAK,IAAI,CAAC,OAAO,0BAA0B,CAAC;YACtD,MAAM,IAAI,0EAA0E,CAAC;YAErF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,MAAM;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task checking utilities for MCP tools
|
|
3
|
+
*/
|
|
4
|
+
import { TasksApi } from '../../lib/api/tasks.js';
|
|
5
|
+
export interface TaskCheckResult {
|
|
6
|
+
shouldPromptUser: boolean;
|
|
7
|
+
taskToResumeId?: string;
|
|
8
|
+
decision?: {
|
|
9
|
+
status: 'decision_required';
|
|
10
|
+
agentInstruction: string;
|
|
11
|
+
existingTask: {
|
|
12
|
+
id: string;
|
|
13
|
+
type: string;
|
|
14
|
+
status: string;
|
|
15
|
+
message: string;
|
|
16
|
+
};
|
|
17
|
+
newTask: {
|
|
18
|
+
type: 'instant' | 'chat';
|
|
19
|
+
content: string;
|
|
20
|
+
};
|
|
21
|
+
options: Array<{
|
|
22
|
+
action: 'override' | 'followup' | 'reconnect';
|
|
23
|
+
description: string;
|
|
24
|
+
}>;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check for active tasks and determine if user should be prompted
|
|
29
|
+
* Returns task ID to resume if continueTaskId is provided, or prompts user if active tasks exist
|
|
30
|
+
*/
|
|
31
|
+
export declare function checkForActiveTasks(tasksApi: TasksApi, projectId: string, continueTaskId: string | undefined, toolName: 'instant' | 'chat', newTaskContent?: string): Promise<TaskCheckResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Get all parent tasks up to 4 levels deep
|
|
34
|
+
* Returns array of parent tasks in order from immediate parent to root
|
|
35
|
+
*/
|
|
36
|
+
export declare function getParentTaskChain(taskId: string, tasksApi: TasksApi, projectId: string): Promise<Array<{
|
|
37
|
+
taskId: string;
|
|
38
|
+
mode: string;
|
|
39
|
+
status: string;
|
|
40
|
+
message: string;
|
|
41
|
+
}>>;
|
|
42
|
+
/**
|
|
43
|
+
* Analyze task escalation and return recommendation with reasoning
|
|
44
|
+
*/
|
|
45
|
+
export declare function analyzeTaskEscalation(taskId: string, tasksApi: TasksApi, projectId: string, currentMode: 'instant' | 'chat'): Promise<{
|
|
46
|
+
shouldEscalate: boolean;
|
|
47
|
+
reason: string;
|
|
48
|
+
taskChain: Array<{
|
|
49
|
+
taskId: string;
|
|
50
|
+
mode: string;
|
|
51
|
+
status: string;
|
|
52
|
+
message: string;
|
|
53
|
+
}>;
|
|
54
|
+
prompt: string;
|
|
55
|
+
options: Array<{
|
|
56
|
+
action: 'escalate' | 'keep';
|
|
57
|
+
description: string;
|
|
58
|
+
}>;
|
|
59
|
+
}>;
|
|
60
|
+
//# sourceMappingURL=task-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-checker.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/task-checker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,mBAAmB,CAAC;QAC5B,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE;YACZ,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,OAAO,EAAE;YACP,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;YACzB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,OAAO,EAAE,KAAK,CAAC;YACb,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;YAC9C,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC;CACH;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,QAAQ,EAAE,SAAS,GAAG,MAAM,EAC5B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,eAAe,CAAC,CAuE1B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAQnF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,SAAS,GAAG,MAAM,GAC9B,OAAO,CAAC;IACT,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpF,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtE,CAAC,CAiDD"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task checking utilities for MCP tools
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check for active tasks and determine if user should be prompted
|
|
6
|
+
* Returns task ID to resume if continueTaskId is provided, or prompts user if active tasks exist
|
|
7
|
+
*/
|
|
8
|
+
export async function checkForActiveTasks(tasksApi, projectId, continueTaskId, toolName, newTaskContent) {
|
|
9
|
+
console.error('=== checkForActiveTasks START ===');
|
|
10
|
+
console.error('projectId:', projectId);
|
|
11
|
+
console.error('continueTaskId:', continueTaskId);
|
|
12
|
+
console.error('toolName:', toolName);
|
|
13
|
+
// If user already specified a task to continue, use that
|
|
14
|
+
if (continueTaskId) {
|
|
15
|
+
console.error('continueTaskId provided, returning taskToResumeId');
|
|
16
|
+
return {
|
|
17
|
+
shouldPromptUser: false,
|
|
18
|
+
taskToResumeId: continueTaskId,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
// Check for active tasks
|
|
22
|
+
try {
|
|
23
|
+
console.error('Calling getActiveTasks...');
|
|
24
|
+
const activeTasks = await tasksApi.getActiveTasks(projectId);
|
|
25
|
+
console.error('activeTasks result:', JSON.stringify(activeTasks, null, 2));
|
|
26
|
+
console.error('activeTasks.length:', activeTasks?.length);
|
|
27
|
+
if (activeTasks && activeTasks.length > 0) {
|
|
28
|
+
const mostRecentTask = activeTasks[0];
|
|
29
|
+
console.error('Found active task, returning shouldPromptUser=true');
|
|
30
|
+
const agentInstructionText = `Ask the user which option they prefer for handling the existing active task. Present all options clearly and wait for their choice before proceeding.\n\nTo proceed, call this tool again with continueTaskId="${mostRecentTask.taskId}" and one of these parameters:\n - decision="reconnect" (reconnect to task #${mostRecentTask.taskId} without sending new message)\n - decision="followup" (continue task #${mostRecentTask.taskId} with new message)\n - decision="override" (replace task #${mostRecentTask.taskId} with new task)`;
|
|
31
|
+
return {
|
|
32
|
+
shouldPromptUser: true,
|
|
33
|
+
decision: {
|
|
34
|
+
status: 'decision_required',
|
|
35
|
+
agentInstruction: agentInstructionText,
|
|
36
|
+
existingTask: {
|
|
37
|
+
id: mostRecentTask.taskId,
|
|
38
|
+
type: mostRecentTask.taskMode || 'unknown',
|
|
39
|
+
status: mostRecentTask.status,
|
|
40
|
+
message: mostRecentTask.message?.substring(0, 60) || 'No message',
|
|
41
|
+
},
|
|
42
|
+
newTask: {
|
|
43
|
+
type: toolName,
|
|
44
|
+
content: newTaskContent || '',
|
|
45
|
+
},
|
|
46
|
+
options: [
|
|
47
|
+
{
|
|
48
|
+
action: 'reconnect',
|
|
49
|
+
description: `Reconnect to task #${mostRecentTask.taskId} (just listen, don't send new message)`,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
action: 'followup',
|
|
53
|
+
description: `Add as follow-up to task #${mostRecentTask.taskId} (sends your new message)`,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
action: 'override',
|
|
57
|
+
description: `Replace task #${mostRecentTask.taskId} with new task (closes #${mostRecentTask.taskId})`,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
console.error('No active tasks found');
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error('ERROR in getActiveTasks:', error);
|
|
67
|
+
// Continue with normal flow if we can't check active tasks
|
|
68
|
+
}
|
|
69
|
+
console.error('Returning shouldPromptUser=false (no active tasks)');
|
|
70
|
+
return {
|
|
71
|
+
shouldPromptUser: false,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get all parent tasks up to 4 levels deep
|
|
76
|
+
* Returns array of parent tasks in order from immediate parent to root
|
|
77
|
+
*/
|
|
78
|
+
export async function getParentTaskChain(taskId, tasksApi, projectId) {
|
|
79
|
+
try {
|
|
80
|
+
const result = await tasksApi.getParentTaskChain(projectId, taskId);
|
|
81
|
+
return result.parentChain;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error('Error fetching parent task chain:', error);
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Analyze task escalation and return recommendation with reasoning
|
|
90
|
+
*/
|
|
91
|
+
export async function analyzeTaskEscalation(taskId, tasksApi, projectId, currentMode) {
|
|
92
|
+
try {
|
|
93
|
+
const parentChain = await getParentTaskChain(taskId, tasksApi, projectId);
|
|
94
|
+
// Determine if escalation is needed based on task depth and complexity
|
|
95
|
+
const chainDepth = parentChain.length;
|
|
96
|
+
const hasComplexHistory = chainDepth >= 2; // Multiple follow-ups indicate complexity
|
|
97
|
+
const shouldEscalate = hasComplexHistory && currentMode === 'instant';
|
|
98
|
+
let reason = '';
|
|
99
|
+
if (shouldEscalate) {
|
|
100
|
+
reason = `This task has ${chainDepth} parent task${chainDepth !== 1 ? 's' : ''} in its history, indicating a complex, multi-level debugging session. The instant mode has a 5-minute timeout and is designed for quick questions. A chat session would allow for continuous, extended collaboration with the engineer, better suited for this complexity level.`;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
reason = `This is a straightforward ${currentMode} task${chainDepth === 0 ? ' with no parent tasks' : ' that can be handled efficiently'} within the current mode's parameters.`;
|
|
104
|
+
}
|
|
105
|
+
const prompt = shouldEscalate
|
|
106
|
+
? `This task appears to be part of a multi-level debugging conversation with ${chainDepth} parent task${chainDepth !== 1 ? 's' : ''}. The current instant mode (5-minute timeout) may be limiting for complex, ongoing collaboration.\n\nWould you like to escalate this to a chat session for extended, real-time collaboration with the engineer? This would provide better continuity and allow for deeper problem-solving without timeout constraints.`
|
|
107
|
+
: `This task can continue as an instant query. However, if you need extended real-time collaboration, you have the option to escalate to chat mode.`;
|
|
108
|
+
return {
|
|
109
|
+
shouldEscalate,
|
|
110
|
+
reason,
|
|
111
|
+
taskChain: parentChain,
|
|
112
|
+
prompt,
|
|
113
|
+
options: [
|
|
114
|
+
{
|
|
115
|
+
action: 'escalate',
|
|
116
|
+
description: 'Escalate to Chat (extended collaboration, no timeout)',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
action: 'keep',
|
|
120
|
+
description: `Keep as ${currentMode.charAt(0).toUpperCase() + currentMode.slice(1)} (quick response within timeout)`,
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error('Error analyzing task escalation:', error);
|
|
127
|
+
return {
|
|
128
|
+
shouldEscalate: false,
|
|
129
|
+
reason: 'Unable to analyze task escalation',
|
|
130
|
+
taskChain: [],
|
|
131
|
+
prompt: 'Continue with current mode.',
|
|
132
|
+
options: [
|
|
133
|
+
{ action: 'escalate', description: 'Escalate to Chat' },
|
|
134
|
+
{ action: 'keep', description: 'Keep as Instant' },
|
|
135
|
+
],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=task-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-checker.js","sourceRoot":"","sources":["../../../src/mcp/tools/task-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tunnel Tool - Create localtunnel for local dev server access
|
|
3
|
+
*/
|
|
4
|
+
export interface TunnelArgs {
|
|
5
|
+
port: number;
|
|
6
|
+
subdomain?: string;
|
|
7
|
+
reason?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class TunnelTool {
|
|
10
|
+
private tunnelManager;
|
|
11
|
+
private activeTunnels;
|
|
12
|
+
constructor();
|
|
13
|
+
execute(args: TunnelArgs): Promise<{
|
|
14
|
+
content: {
|
|
15
|
+
type: string;
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
isError: boolean;
|
|
19
|
+
} | {
|
|
20
|
+
content: {
|
|
21
|
+
type: string;
|
|
22
|
+
text: string;
|
|
23
|
+
}[];
|
|
24
|
+
isError?: undefined;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Close all active tunnels
|
|
28
|
+
*/
|
|
29
|
+
closeAll(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Get list of active tunnels
|
|
32
|
+
*/
|
|
33
|
+
getActiveTunnels(): {
|
|
34
|
+
url: string;
|
|
35
|
+
port: number;
|
|
36
|
+
}[];
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=tunnel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/tunnel.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAkE;;IAOjF,OAAO,CAAC,IAAI,EAAE,UAAU;;;;;;;;;;;;;IAgF9B;;OAEG;IACG,QAAQ;IAYd;;OAEG;IACH,gBAAgB;;;;CAMjB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tunnel Tool - Create localtunnel for local dev server access
|
|
3
|
+
*/
|
|
4
|
+
import { TunnelManager } from '../../modules/tunnel.js';
|
|
5
|
+
import { logger } from '../../lib/utils/logger.js';
|
|
6
|
+
import { nanoid } from 'nanoid';
|
|
7
|
+
export class TunnelTool {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.tunnelManager = new TunnelManager();
|
|
10
|
+
this.activeTunnels = new Map();
|
|
11
|
+
}
|
|
12
|
+
async execute(args) {
|
|
13
|
+
const { port, subdomain, reason } = args;
|
|
14
|
+
try {
|
|
15
|
+
logger.info(`Creating tunnel for port ${port}`, { subdomain, reason });
|
|
16
|
+
// Validate port
|
|
17
|
+
if (!port || port < 1 || port > 65535) {
|
|
18
|
+
return {
|
|
19
|
+
content: [
|
|
20
|
+
{
|
|
21
|
+
type: 'text',
|
|
22
|
+
text: `❌ Invalid port: ${port}. Must be between 1 and 65535.`,
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
isError: true,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// Create tunnel using a unique task ID
|
|
29
|
+
const taskId = nanoid();
|
|
30
|
+
const tunnel = await this.tunnelManager.createTunnel({
|
|
31
|
+
port,
|
|
32
|
+
subdomain,
|
|
33
|
+
taskId,
|
|
34
|
+
onError: (error) => {
|
|
35
|
+
logger.error('Tunnel error', error);
|
|
36
|
+
},
|
|
37
|
+
onClose: () => {
|
|
38
|
+
logger.info(`Tunnel closed for port ${port}`);
|
|
39
|
+
this.activeTunnels.delete(taskId);
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
// Store tunnel reference
|
|
43
|
+
this.activeTunnels.set(taskId, {
|
|
44
|
+
url: tunnel.url,
|
|
45
|
+
port: tunnel.port,
|
|
46
|
+
closeFn: async () => {
|
|
47
|
+
await this.tunnelManager.closeTunnel();
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
const message = [
|
|
51
|
+
`✅ Tunnel created successfully!`,
|
|
52
|
+
``,
|
|
53
|
+
`🔗 **Tunnel URL:** ${tunnel.url}`,
|
|
54
|
+
`📍 **Local Port:** ${tunnel.port}`,
|
|
55
|
+
`🔑 **Password:** ${tunnel.password}`,
|
|
56
|
+
`⏰ **Created:** ${tunnel.createdAt.toISOString()}`,
|
|
57
|
+
``,
|
|
58
|
+
`The tunnel will remain open for this session.`,
|
|
59
|
+
`Engineers or external services can now access your local server at this URL.`,
|
|
60
|
+
].join('\n');
|
|
61
|
+
logger.info('Tunnel created', { url: tunnel.url, port: tunnel.port });
|
|
62
|
+
return {
|
|
63
|
+
content: [
|
|
64
|
+
{
|
|
65
|
+
type: 'text',
|
|
66
|
+
text: message,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
logger.error('Failed to create tunnel', error);
|
|
73
|
+
return {
|
|
74
|
+
content: [
|
|
75
|
+
{
|
|
76
|
+
type: 'text',
|
|
77
|
+
text: `❌ Failed to create tunnel: ${error.message}\n\nCommon issues:\n- Port ${port} may not be in use\n- Firewall blocking connections\n- Localtunnel service temporarily unavailable`,
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
isError: true,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Close all active tunnels
|
|
86
|
+
*/
|
|
87
|
+
async closeAll() {
|
|
88
|
+
for (const [taskId, tunnel] of this.activeTunnels.entries()) {
|
|
89
|
+
try {
|
|
90
|
+
await tunnel.closeFn();
|
|
91
|
+
logger.info(`Closed tunnel: ${tunnel.url}`);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
logger.error(`Failed to close tunnel ${taskId}`, error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
this.activeTunnels.clear();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get list of active tunnels
|
|
101
|
+
*/
|
|
102
|
+
getActiveTunnels() {
|
|
103
|
+
return Array.from(this.activeTunnels.values()).map((t) => ({
|
|
104
|
+
url: t.url,
|
|
105
|
+
port: t.port,
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=tunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../../src/mcp/tools/tunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/modules/permissions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,qBAAa,iBAAiB;IACtB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB5E,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2B1E,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB9E;;OAEG;IACG,mBAAmB,CACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/modules/permissions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,qBAAa,iBAAiB;IACtB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB5E,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2B1E,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB9E;;OAEG;IACG,mBAAmB,CACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA6DxF;;OAEG;YACW,kBAAkB;CAsBjC"}
|
|
@@ -97,9 +97,11 @@ export class PermissionManager {
|
|
|
97
97
|
onClose: () => console.log('Tunnel closed'),
|
|
98
98
|
});
|
|
99
99
|
console.log(chalk.green(`✓ Tunnel created: ${chalk.cyan(tunnel.url)}\n`));
|
|
100
|
+
console.log(chalk.dim(` Password: ${tunnel.password}\n`));
|
|
100
101
|
return {
|
|
101
102
|
approved: true,
|
|
102
103
|
tunnelUrl: tunnel.url,
|
|
104
|
+
password: tunnel.password, // Always included - required for loca.lt access
|
|
103
105
|
};
|
|
104
106
|
}
|
|
105
107
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/modules/permissions.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/modules/permissions.ts"],"names":[],"mappings":"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"}
|
package/dist/modules/tunnel.d.ts
CHANGED
|
@@ -13,6 +13,11 @@ export interface TunnelOptions {
|
|
|
13
13
|
export declare class TunnelManager extends EventEmitter {
|
|
14
14
|
private tunnel;
|
|
15
15
|
private activeTunnel;
|
|
16
|
+
/**
|
|
17
|
+
* Fetch the localtunnel password for bypassing the landing page
|
|
18
|
+
* Retries up to 3 times to ensure we always get a password
|
|
19
|
+
*/
|
|
20
|
+
private fetchTunnelPassword;
|
|
16
21
|
/**
|
|
17
22
|
* Create a new localtunnel for a task session
|
|
18
23
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/modules/tunnel.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/modules/tunnel.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAA6B;IAEjD;;;OAGG;YACW,mBAAmB;IAmDjC;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAiDjE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAUlC;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGpB"}
|
package/dist/modules/tunnel.js
CHANGED
|
@@ -3,12 +3,64 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import localtunnel from 'localtunnel';
|
|
5
5
|
import { EventEmitter } from 'events';
|
|
6
|
+
import https from 'https';
|
|
6
7
|
export class TunnelManager extends EventEmitter {
|
|
7
8
|
constructor() {
|
|
8
9
|
super(...arguments);
|
|
9
10
|
this.tunnel = null;
|
|
10
11
|
this.activeTunnel = null;
|
|
11
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Fetch the localtunnel password for bypassing the landing page
|
|
15
|
+
* Retries up to 3 times to ensure we always get a password
|
|
16
|
+
*/
|
|
17
|
+
async fetchTunnelPassword() {
|
|
18
|
+
const maxRetries = 3;
|
|
19
|
+
let lastError = null;
|
|
20
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
21
|
+
try {
|
|
22
|
+
const password = await new Promise((resolve, reject) => {
|
|
23
|
+
https
|
|
24
|
+
.get('https://loca.lt/mytunnelpassword', (res) => {
|
|
25
|
+
// Check HTTP status code before reading response
|
|
26
|
+
if (res.statusCode !== 200) {
|
|
27
|
+
reject(new Error(`HTTP ${res.statusCode}: ${res.statusMessage || 'Request failed'}`));
|
|
28
|
+
// Consume response data to free up memory
|
|
29
|
+
res.resume();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
let data = '';
|
|
33
|
+
res.on('data', (chunk) => {
|
|
34
|
+
data += chunk;
|
|
35
|
+
});
|
|
36
|
+
res.on('end', () => {
|
|
37
|
+
const trimmed = data.trim();
|
|
38
|
+
if (trimmed) {
|
|
39
|
+
resolve(trimmed);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
reject(new Error('Empty password received'));
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
})
|
|
46
|
+
.on('error', (err) => {
|
|
47
|
+
reject(err);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
return password;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
54
|
+
console.error(`Failed to fetch tunnel password (attempt ${attempt}/${maxRetries}):`, err);
|
|
55
|
+
// Wait before retry if not the last attempt (exponential backoff: 500ms, 1s, 2s)
|
|
56
|
+
if (attempt < maxRetries) {
|
|
57
|
+
await new Promise(resolve => setTimeout(resolve, 500 * Math.pow(2, attempt - 1)));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// If we exit the loop, all retries failed
|
|
62
|
+
throw new Error(`Could not fetch tunnel password after multiple attempts: ${lastError?.message || 'Unknown error'}`);
|
|
63
|
+
}
|
|
12
64
|
/**
|
|
13
65
|
* Create a new localtunnel for a task session
|
|
14
66
|
*/
|
|
@@ -23,12 +75,15 @@ export class TunnelManager extends EventEmitter {
|
|
|
23
75
|
}
|
|
24
76
|
try {
|
|
25
77
|
this.tunnel = await localtunnel(tunnelOptions);
|
|
78
|
+
// Fetch the tunnel password (with retries to ensure we always get one)
|
|
79
|
+
const password = await this.fetchTunnelPassword();
|
|
26
80
|
this.activeTunnel = {
|
|
27
81
|
url: this.tunnel.url,
|
|
28
82
|
port: options.port,
|
|
29
83
|
subdomain: options.subdomain,
|
|
30
84
|
createdAt: new Date(),
|
|
31
85
|
taskId: options.taskId,
|
|
86
|
+
password, // Password is always present (method throws if unavailable)
|
|
32
87
|
};
|
|
33
88
|
// Handle tunnel errors
|
|
34
89
|
this.tunnel.on('error', (err) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/modules/tunnel.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,WAAW,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/modules/tunnel.ts"],"names":[],"mappings":"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"}
|