@agent-relay/mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +190 -0
- package/README.md +214 -0
- package/dist/bin.d.ts +12 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +127 -0
- package/dist/bin.js.map +1 -0
- package/dist/client.d.ts +68 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +115 -0
- package/dist/client.js.map +1 -0
- package/dist/cloud.d.ts +108 -0
- package/dist/cloud.d.ts.map +1 -0
- package/dist/cloud.js +279 -0
- package/dist/cloud.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +48 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/install-cli.d.ts +35 -0
- package/dist/install-cli.d.ts.map +1 -0
- package/dist/install-cli.js +157 -0
- package/dist/install-cli.js.map +1 -0
- package/dist/install.d.ts +101 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +398 -0
- package/dist/install.js.map +1 -0
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/protocol.d.ts +11 -0
- package/dist/prompts/protocol.d.ts.map +1 -0
- package/dist/prompts/protocol.js +168 -0
- package/dist/prompts/protocol.js.map +1 -0
- package/dist/resources/agents.d.ts +11 -0
- package/dist/resources/agents.d.ts.map +1 -0
- package/dist/resources/agents.js +17 -0
- package/dist/resources/agents.js.map +1 -0
- package/dist/resources/inbox.d.ts +11 -0
- package/dist/resources/inbox.d.ts.map +1 -0
- package/dist/resources/inbox.js +17 -0
- package/dist/resources/inbox.js.map +1 -0
- package/dist/resources/index.d.ts +4 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +4 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/project.d.ts +11 -0
- package/dist/resources/project.d.ts.map +1 -0
- package/dist/resources/project.js +21 -0
- package/dist/resources/project.js.map +1 -0
- package/dist/server.d.ts +19 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +215 -0
- package/dist/server.js.map +1 -0
- package/dist/simple.d.ts +173 -0
- package/dist/simple.d.ts.map +1 -0
- package/dist/simple.js +120 -0
- package/dist/simple.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/relay-health.d.ts +23 -0
- package/dist/tools/relay-health.d.ts.map +1 -0
- package/dist/tools/relay-health.js +138 -0
- package/dist/tools/relay-health.js.map +1 -0
- package/dist/tools/relay-inbox.d.ts +26 -0
- package/dist/tools/relay-inbox.d.ts.map +1 -0
- package/dist/tools/relay-inbox.js +58 -0
- package/dist/tools/relay-inbox.js.map +1 -0
- package/dist/tools/relay-logs.d.ts +20 -0
- package/dist/tools/relay-logs.d.ts.map +1 -0
- package/dist/tools/relay-logs.js +88 -0
- package/dist/tools/relay-logs.js.map +1 -0
- package/dist/tools/relay-metrics.d.ts +20 -0
- package/dist/tools/relay-metrics.d.ts.map +1 -0
- package/dist/tools/relay-metrics.js +135 -0
- package/dist/tools/relay-metrics.js.map +1 -0
- package/dist/tools/relay-release.d.ts +20 -0
- package/dist/tools/relay-release.d.ts.map +1 -0
- package/dist/tools/relay-release.js +44 -0
- package/dist/tools/relay-release.js.map +1 -0
- package/dist/tools/relay-send.d.ts +29 -0
- package/dist/tools/relay-send.d.ts.map +1 -0
- package/dist/tools/relay-send.js +71 -0
- package/dist/tools/relay-send.js.map +1 -0
- package/dist/tools/relay-spawn.d.ts +36 -0
- package/dist/tools/relay-spawn.d.ts.map +1 -0
- package/dist/tools/relay-spawn.js +73 -0
- package/dist/tools/relay-spawn.js.map +1 -0
- package/dist/tools/relay-status.d.ts +11 -0
- package/dist/tools/relay-status.d.ts.map +1 -0
- package/dist/tools/relay-status.js +43 -0
- package/dist/tools/relay-status.js.map +1 -0
- package/dist/tools/relay-who.d.ts +20 -0
- package/dist/tools/relay-who.d.ts.map +1 -0
- package/dist/tools/relay-who.js +47 -0
- package/dist/tools/relay-who.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,GAEhB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GAEjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAsB,MAAM,gBAAgB,CAAC;AAElG,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GAEjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,GAEhB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import type { RelayClient } from '../client.js';
|
|
4
|
+
export declare const relayHealthSchema: z.ZodObject<{
|
|
5
|
+
port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
6
|
+
include_crashes: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
7
|
+
include_alerts: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
port: number;
|
|
10
|
+
include_crashes: boolean;
|
|
11
|
+
include_alerts: boolean;
|
|
12
|
+
}, {
|
|
13
|
+
port?: number | undefined;
|
|
14
|
+
include_crashes?: boolean | undefined;
|
|
15
|
+
include_alerts?: boolean | undefined;
|
|
16
|
+
}>;
|
|
17
|
+
export type RelayHealthInput = z.infer<typeof relayHealthSchema>;
|
|
18
|
+
export declare const relayHealthTool: Tool;
|
|
19
|
+
/**
|
|
20
|
+
* Get system health, crash insights, and recommendations.
|
|
21
|
+
*/
|
|
22
|
+
export declare function handleRelayHealth(_client: RelayClient, input: RelayHealthInput): Promise<string>;
|
|
23
|
+
//# sourceMappingURL=relay-health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-health.d.ts","sourceRoot":"","sources":["../../src/tools/relay-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAI5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,eAAO,MAAM,eAAe,EAAE,IAsC7B,CAAC;AAqCF;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,MAAM,CAAC,CAmGjB"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const relayHealthSchema = z.object({
|
|
3
|
+
port: z.number().optional().default(3888).describe('Dashboard port (default: 3888)'),
|
|
4
|
+
include_crashes: z.boolean().optional().default(true).describe('Include recent crash history'),
|
|
5
|
+
include_alerts: z.boolean().optional().default(true).describe('Include unacknowledged alerts'),
|
|
6
|
+
});
|
|
7
|
+
export const relayHealthTool = {
|
|
8
|
+
name: 'relay_health',
|
|
9
|
+
description: `Get system health, crash insights, and recommendations.
|
|
10
|
+
|
|
11
|
+
Use this to:
|
|
12
|
+
- Check overall system health score
|
|
13
|
+
- View recent agent crashes and their causes
|
|
14
|
+
- Get recommendations for improving stability
|
|
15
|
+
- Identify recurring issues
|
|
16
|
+
|
|
17
|
+
Returns health score (0-100), issues, recommendations, and crash history.
|
|
18
|
+
|
|
19
|
+
Example: Full health check
|
|
20
|
+
{}
|
|
21
|
+
|
|
22
|
+
Example: Health check without crash history
|
|
23
|
+
{ "include_crashes": false }`,
|
|
24
|
+
inputSchema: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
port: {
|
|
28
|
+
type: 'number',
|
|
29
|
+
description: 'Dashboard port (default: 3888)',
|
|
30
|
+
default: 3888,
|
|
31
|
+
},
|
|
32
|
+
include_crashes: {
|
|
33
|
+
type: 'boolean',
|
|
34
|
+
description: 'Include recent crash history',
|
|
35
|
+
default: true,
|
|
36
|
+
},
|
|
37
|
+
include_alerts: {
|
|
38
|
+
type: 'boolean',
|
|
39
|
+
description: 'Include unacknowledged alerts',
|
|
40
|
+
default: true,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
required: [],
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Get system health, crash insights, and recommendations.
|
|
48
|
+
*/
|
|
49
|
+
export async function handleRelayHealth(_client, input) {
|
|
50
|
+
const port = input.port || 3888;
|
|
51
|
+
try {
|
|
52
|
+
const response = await fetch(`http://localhost:${port}/api/metrics/health`);
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
throw new Error(`HTTP ${response.status}`);
|
|
55
|
+
}
|
|
56
|
+
const data = await response.json();
|
|
57
|
+
const lines = [];
|
|
58
|
+
// Health score header
|
|
59
|
+
const scoreEmoji = data.healthScore >= 80 ? '✅' :
|
|
60
|
+
data.healthScore >= 50 ? '⚠️' : '🔴';
|
|
61
|
+
lines.push('═'.repeat(60));
|
|
62
|
+
lines.push(` SYSTEM HEALTH: ${scoreEmoji} ${data.healthScore}/100`);
|
|
63
|
+
lines.push('═'.repeat(60));
|
|
64
|
+
lines.push('');
|
|
65
|
+
lines.push(` ${data.summary}`);
|
|
66
|
+
lines.push('');
|
|
67
|
+
// Stats
|
|
68
|
+
lines.push(` Agents: ${data.stats.agentCount}`);
|
|
69
|
+
lines.push(` Crashes (24h): ${data.stats.totalCrashes24h}`);
|
|
70
|
+
lines.push(` Alerts (24h): ${data.stats.totalAlerts24h}`);
|
|
71
|
+
lines.push('');
|
|
72
|
+
// Issues
|
|
73
|
+
if (data.issues.length > 0) {
|
|
74
|
+
lines.push('ISSUES:');
|
|
75
|
+
for (const issue of data.issues) {
|
|
76
|
+
const icon = issue.severity === 'critical' ? '🔴' :
|
|
77
|
+
issue.severity === 'high' ? '🟠' :
|
|
78
|
+
issue.severity === 'medium' ? '🟡' : '🔵';
|
|
79
|
+
lines.push(` ${icon} ${issue.message}`);
|
|
80
|
+
}
|
|
81
|
+
lines.push('');
|
|
82
|
+
}
|
|
83
|
+
// Recommendations
|
|
84
|
+
if (data.recommendations.length > 0) {
|
|
85
|
+
lines.push('RECOMMENDATIONS:');
|
|
86
|
+
for (const rec of data.recommendations) {
|
|
87
|
+
lines.push(` → ${rec}`);
|
|
88
|
+
}
|
|
89
|
+
lines.push('');
|
|
90
|
+
}
|
|
91
|
+
// Crashes
|
|
92
|
+
if (input.include_crashes && data.crashes.length > 0) {
|
|
93
|
+
lines.push('RECENT CRASHES:');
|
|
94
|
+
lines.push('─'.repeat(60));
|
|
95
|
+
for (const crash of data.crashes.slice(0, 5)) {
|
|
96
|
+
const time = new Date(crash.crashedAt).toLocaleString();
|
|
97
|
+
lines.push(` ${crash.agentName} - ${time}`);
|
|
98
|
+
lines.push(` Cause: ${crash.likelyCause}`);
|
|
99
|
+
if (crash.summary) {
|
|
100
|
+
lines.push(` Summary: ${crash.summary.substring(0, 80)}${crash.summary.length > 80 ? '...' : ''}`);
|
|
101
|
+
}
|
|
102
|
+
lines.push('');
|
|
103
|
+
}
|
|
104
|
+
if (data.crashes.length > 5) {
|
|
105
|
+
lines.push(` ... and ${data.crashes.length - 5} more crashes`);
|
|
106
|
+
lines.push('');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Alerts
|
|
110
|
+
if (input.include_alerts && data.alerts.length > 0) {
|
|
111
|
+
lines.push('UNACKNOWLEDGED ALERTS:');
|
|
112
|
+
lines.push('─'.repeat(60));
|
|
113
|
+
for (const alert of data.alerts.slice(0, 5)) {
|
|
114
|
+
const time = new Date(alert.createdAt).toLocaleString();
|
|
115
|
+
lines.push(` [${alert.alertType}] ${alert.agentName} - ${time}`);
|
|
116
|
+
lines.push(` ${alert.message}`);
|
|
117
|
+
lines.push('');
|
|
118
|
+
}
|
|
119
|
+
if (data.alerts.length > 5) {
|
|
120
|
+
lines.push(` ... and ${data.alerts.length - 5} more alerts`);
|
|
121
|
+
lines.push('');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// No issues message
|
|
125
|
+
if (data.issues.length === 0 && data.crashes.length === 0 && data.alerts.length === 0) {
|
|
126
|
+
lines.push('No issues detected. System is healthy.');
|
|
127
|
+
}
|
|
128
|
+
return lines.join('\n');
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
const error = err;
|
|
132
|
+
if (error.code === 'ECONNREFUSED') {
|
|
133
|
+
return `Cannot connect to dashboard at port ${port}. Is the daemon running?\n\nRun 'agent-relay up' to start the daemon.`;
|
|
134
|
+
}
|
|
135
|
+
return `Failed to fetch health data: ${error.message || String(err)}`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=relay-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-health.js","sourceRoot":"","sources":["../../src/tools/relay-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import type { RelayClient } from '../client.js';
|
|
4
|
+
export declare const relayInboxSchema: z.ZodObject<{
|
|
5
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
6
|
+
unread_only: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
7
|
+
from: z.ZodOptional<z.ZodString>;
|
|
8
|
+
channel: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
limit: number;
|
|
11
|
+
unread_only: boolean;
|
|
12
|
+
from?: string | undefined;
|
|
13
|
+
channel?: string | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
from?: string | undefined;
|
|
16
|
+
limit?: number | undefined;
|
|
17
|
+
unread_only?: boolean | undefined;
|
|
18
|
+
channel?: string | undefined;
|
|
19
|
+
}>;
|
|
20
|
+
export type RelayInboxInput = z.infer<typeof relayInboxSchema>;
|
|
21
|
+
export declare const relayInboxTool: Tool;
|
|
22
|
+
/**
|
|
23
|
+
* Retrieve inbox messages from the relay daemon with optional filtering.
|
|
24
|
+
*/
|
|
25
|
+
export declare function handleRelayInbox(client: RelayClient, input: RelayInboxInput): Promise<string>;
|
|
26
|
+
//# sourceMappingURL=relay-inbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-inbox.d.ts","sourceRoot":"","sources":["../../src/tools/relay-inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;EAK3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,eAAO,MAAM,cAAc,EAAE,IAkC5B,CAAC;AAEF;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,MAAM,CAAC,CAcjB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const relayInboxSchema = z.object({
|
|
3
|
+
limit: z.number().optional().default(10).describe('Max messages to return'),
|
|
4
|
+
unread_only: z.boolean().optional().default(true).describe('Only return unread messages'),
|
|
5
|
+
from: z.string().optional().describe('Filter by sender'),
|
|
6
|
+
channel: z.string().optional().describe('Filter by channel'),
|
|
7
|
+
});
|
|
8
|
+
export const relayInboxTool = {
|
|
9
|
+
name: 'relay_inbox',
|
|
10
|
+
description: `Check your inbox for pending messages.
|
|
11
|
+
|
|
12
|
+
Returns messages sent to you by other agents or in channels you're subscribed to.
|
|
13
|
+
|
|
14
|
+
Examples:
|
|
15
|
+
- Get all unread: (no params)
|
|
16
|
+
- From specific agent: from="Alice"
|
|
17
|
+
- From channel: channel="#general"`,
|
|
18
|
+
inputSchema: {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {
|
|
21
|
+
limit: {
|
|
22
|
+
type: 'number',
|
|
23
|
+
description: 'Max messages to return',
|
|
24
|
+
default: 10,
|
|
25
|
+
},
|
|
26
|
+
unread_only: {
|
|
27
|
+
type: 'boolean',
|
|
28
|
+
description: 'Only return unread messages',
|
|
29
|
+
default: true,
|
|
30
|
+
},
|
|
31
|
+
from: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'Filter by sender',
|
|
34
|
+
},
|
|
35
|
+
channel: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Filter by channel',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
required: [],
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Retrieve inbox messages from the relay daemon with optional filtering.
|
|
45
|
+
*/
|
|
46
|
+
export async function handleRelayInbox(client, input) {
|
|
47
|
+
const messages = await client.getInbox(input);
|
|
48
|
+
if (messages.length === 0) {
|
|
49
|
+
return 'No messages in inbox.';
|
|
50
|
+
}
|
|
51
|
+
const formatted = messages.map((m) => {
|
|
52
|
+
const channel = m.channel ? ` [${m.channel}]` : '';
|
|
53
|
+
const thread = m.thread ? ` (thread: ${m.thread})` : '';
|
|
54
|
+
return `[${m.id}] From ${m.from}${channel}${thread}:\n${m.content}`;
|
|
55
|
+
});
|
|
56
|
+
return `${messages.length} message(s):\n\n${formatted.join('\n\n---\n\n')}`;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=relay-inbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-inbox.js","sourceRoot":"","sources":["../../src/tools/relay-inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAC3E,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACzF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IACxD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CAC7D,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE;;;;;;;mCAOoB;IACjC,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wBAAwB;gBACrC,OAAO,EAAE,EAAE;aACZ;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,6BAA6B;gBAC1C,OAAO,EAAE,IAAI;aACd;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kBAAkB;aAChC;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mBAAmB;aACjC;SACF;QACD,QAAQ,EAAE,EAAE;KACb;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAmB,EACnB,KAAsB;IAEtB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,GAAG,OAAO,GAAG,MAAM,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,QAAQ,CAAC,MAAM,mBAAmB,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import type { RelayClient } from '../client.js';
|
|
4
|
+
export declare const relayLogsSchema: z.ZodObject<{
|
|
5
|
+
agent: z.ZodString;
|
|
6
|
+
lines: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
agent: string;
|
|
9
|
+
lines: number;
|
|
10
|
+
}, {
|
|
11
|
+
agent: string;
|
|
12
|
+
lines?: number | undefined;
|
|
13
|
+
}>;
|
|
14
|
+
export type RelayLogsInput = z.infer<typeof relayLogsSchema>;
|
|
15
|
+
export declare const relayLogsTool: Tool;
|
|
16
|
+
/**
|
|
17
|
+
* Read recent logs from an agent's output file.
|
|
18
|
+
*/
|
|
19
|
+
export declare function handleRelayLogs(client: RelayClient, input: RelayLogsInput): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=relay-logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-logs.d.ts","sourceRoot":"","sources":["../../src/tools/relay-logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAQhD,eAAO,MAAM,eAAe;;;;;;;;;EAG1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE7D,eAAO,MAAM,aAAa,EAAE,IA4B3B,CAAC;AAUF;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,MAAM,CAAC,CA0CjB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
import { exec } from 'node:child_process';
|
|
6
|
+
const execAsync = promisify(exec);
|
|
7
|
+
export const relayLogsSchema = z.object({
|
|
8
|
+
agent: z.string().describe('Name of the agent to get logs for'),
|
|
9
|
+
lines: z.number().optional().default(50).describe('Number of lines to retrieve (default: 50)'),
|
|
10
|
+
});
|
|
11
|
+
export const relayLogsTool = {
|
|
12
|
+
name: 'relay_logs',
|
|
13
|
+
description: `Read recent output logs from another agent.
|
|
14
|
+
|
|
15
|
+
Use this to:
|
|
16
|
+
- Monitor worker progress on tasks
|
|
17
|
+
- Debug issues with spawned agents
|
|
18
|
+
- Check what an agent has been outputting
|
|
19
|
+
|
|
20
|
+
Returns the last N lines of the agent's output log.
|
|
21
|
+
|
|
22
|
+
Example: Get last 100 lines from Worker1
|
|
23
|
+
{ "agent": "Worker1", "lines": 100 }`,
|
|
24
|
+
inputSchema: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
agent: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'Name of the agent to get logs for',
|
|
30
|
+
},
|
|
31
|
+
lines: {
|
|
32
|
+
type: 'number',
|
|
33
|
+
description: 'Number of lines to retrieve (default: 50)',
|
|
34
|
+
default: 50,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
required: ['agent'],
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Get the worker logs directory path.
|
|
42
|
+
* Mirrors the logic from @agent-relay/bridge.
|
|
43
|
+
*/
|
|
44
|
+
function getWorkerLogsDir(projectRoot) {
|
|
45
|
+
return path.join(projectRoot, '.relay', 'logs');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Read recent logs from an agent's output file.
|
|
49
|
+
*/
|
|
50
|
+
export async function handleRelayLogs(client, input) {
|
|
51
|
+
const { agent, lines = 50 } = input;
|
|
52
|
+
// Get project root from client status
|
|
53
|
+
const status = await client.getStatus();
|
|
54
|
+
const projectRoot = status.project || process.cwd();
|
|
55
|
+
const logsDir = getWorkerLogsDir(projectRoot);
|
|
56
|
+
const logFile = path.join(logsDir, `${agent}.log`);
|
|
57
|
+
if (!fs.existsSync(logFile)) {
|
|
58
|
+
// Try to list available log files
|
|
59
|
+
let availableAgents = [];
|
|
60
|
+
try {
|
|
61
|
+
if (fs.existsSync(logsDir)) {
|
|
62
|
+
availableAgents = fs.readdirSync(logsDir)
|
|
63
|
+
.filter(f => f.endsWith('.log'))
|
|
64
|
+
.map(f => f.replace('.log', ''));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Ignore errors listing directory
|
|
69
|
+
}
|
|
70
|
+
if (availableAgents.length > 0) {
|
|
71
|
+
return `No logs found for agent "${agent}".\n\nAvailable agents with logs:\n${availableAgents.map(a => `- ${a}`).join('\n')}`;
|
|
72
|
+
}
|
|
73
|
+
return `No logs found for agent "${agent}". The agent may not have been spawned yet or has no output.`;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const { stdout } = await execAsync(`tail -n ${lines} "${logFile}"`);
|
|
77
|
+
const logContent = stdout.trim();
|
|
78
|
+
if (!logContent) {
|
|
79
|
+
return `Logs for ${agent} (last ${lines} lines):\n(empty - no output yet)`;
|
|
80
|
+
}
|
|
81
|
+
return `Logs for ${agent} (last ${lines} lines):\n${'─'.repeat(50)}\n${logContent}`;
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
85
|
+
return `Failed to read logs for "${agent}": ${message}`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=relay-logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-logs.js","sourceRoot":"","sources":["../../src/tools/relay-logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import type { RelayClient } from '../client.js';
|
|
4
|
+
export declare const relayMetricsSchema: z.ZodObject<{
|
|
5
|
+
agent: z.ZodOptional<z.ZodString>;
|
|
6
|
+
port: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
port: number;
|
|
9
|
+
agent?: string | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
agent?: string | undefined;
|
|
12
|
+
port?: number | undefined;
|
|
13
|
+
}>;
|
|
14
|
+
export type RelayMetricsInput = z.infer<typeof relayMetricsSchema>;
|
|
15
|
+
export declare const relayMetricsTool: Tool;
|
|
16
|
+
/**
|
|
17
|
+
* Get memory and resource metrics for agents.
|
|
18
|
+
*/
|
|
19
|
+
export declare function handleRelayMetrics(_client: RelayClient, input: RelayMetricsInput): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=relay-metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-metrics.d.ts","sourceRoot":"","sources":["../../src/tools/relay-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,kBAAkB;;;;;;;;;EAG7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,eAAO,MAAM,gBAAgB,EAAE,IAgC9B,CAAC;AA6CF;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,MAAM,CAAC,CAiFjB"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const relayMetricsSchema = z.object({
|
|
3
|
+
agent: z.string().optional().describe('Filter metrics to a specific agent'),
|
|
4
|
+
port: z.number().optional().default(3888).describe('Dashboard port (default: 3888)'),
|
|
5
|
+
});
|
|
6
|
+
export const relayMetricsTool = {
|
|
7
|
+
name: 'relay_metrics',
|
|
8
|
+
description: `Get memory and resource metrics for agents.
|
|
9
|
+
|
|
10
|
+
Use this to:
|
|
11
|
+
- Monitor memory usage across agents
|
|
12
|
+
- Detect resource-heavy workers
|
|
13
|
+
- Identify memory leaks or runaway processes
|
|
14
|
+
- Make informed decisions about spawning new workers
|
|
15
|
+
|
|
16
|
+
Returns CPU/memory usage per agent plus system totals.
|
|
17
|
+
|
|
18
|
+
Example: Get all agent metrics
|
|
19
|
+
{}
|
|
20
|
+
|
|
21
|
+
Example: Get metrics for specific agent
|
|
22
|
+
{ "agent": "Worker1" }`,
|
|
23
|
+
inputSchema: {
|
|
24
|
+
type: 'object',
|
|
25
|
+
properties: {
|
|
26
|
+
agent: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
description: 'Filter metrics to a specific agent',
|
|
29
|
+
},
|
|
30
|
+
port: {
|
|
31
|
+
type: 'number',
|
|
32
|
+
description: 'Dashboard port (default: 3888)',
|
|
33
|
+
default: 3888,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
required: [],
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Format bytes to human readable string.
|
|
41
|
+
*/
|
|
42
|
+
function formatBytes(bytes) {
|
|
43
|
+
if (bytes === 0)
|
|
44
|
+
return '0 B';
|
|
45
|
+
const k = 1024;
|
|
46
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
47
|
+
const i = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));
|
|
48
|
+
return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Format uptime in milliseconds to human readable string.
|
|
52
|
+
*/
|
|
53
|
+
function formatUptime(ms) {
|
|
54
|
+
if (ms < 60000)
|
|
55
|
+
return `${Math.floor(ms / 1000)}s`;
|
|
56
|
+
if (ms < 3600000)
|
|
57
|
+
return `${Math.floor(ms / 60000)}m`;
|
|
58
|
+
return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get memory and resource metrics for agents.
|
|
62
|
+
*/
|
|
63
|
+
export async function handleRelayMetrics(_client, input) {
|
|
64
|
+
const port = input.port || 3888;
|
|
65
|
+
try {
|
|
66
|
+
const response = await fetch(`http://localhost:${port}/api/metrics/agents`);
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw new Error(`HTTP ${response.status}`);
|
|
69
|
+
}
|
|
70
|
+
const data = await response.json();
|
|
71
|
+
let agents = data.agents;
|
|
72
|
+
// Filter to specific agent if requested
|
|
73
|
+
if (input.agent) {
|
|
74
|
+
agents = agents.filter(a => a.name === input.agent);
|
|
75
|
+
if (agents.length === 0) {
|
|
76
|
+
const available = data.agents.map(a => a.name).join(', ');
|
|
77
|
+
return `Agent "${input.agent}" not found.\n\nAvailable agents: ${available || 'none'}`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (agents.length === 0) {
|
|
81
|
+
return 'No agents with metrics data.';
|
|
82
|
+
}
|
|
83
|
+
// Build output
|
|
84
|
+
const lines = [];
|
|
85
|
+
lines.push('AGENT METRICS');
|
|
86
|
+
lines.push('═'.repeat(60));
|
|
87
|
+
lines.push('');
|
|
88
|
+
// System summary
|
|
89
|
+
lines.push(`System: ${formatBytes(data.system.heapUsed)} heap used / ${formatBytes(data.system.freeMemory)} free`);
|
|
90
|
+
lines.push('');
|
|
91
|
+
// Per-agent metrics
|
|
92
|
+
lines.push('NAME MEMORY CPU UPTIME STATUS');
|
|
93
|
+
lines.push('─'.repeat(60));
|
|
94
|
+
for (const agent of agents) {
|
|
95
|
+
const name = agent.name.padEnd(20).substring(0, 20);
|
|
96
|
+
const memory = agent.rssBytes ? formatBytes(agent.rssBytes).padEnd(10) : 'N/A'.padEnd(10);
|
|
97
|
+
const cpu = agent.cpuPercent !== undefined ? `${agent.cpuPercent.toFixed(1)}%`.padEnd(7) : 'N/A'.padEnd(7);
|
|
98
|
+
const uptime = agent.uptimeMs ? formatUptime(agent.uptimeMs).padEnd(9) : 'N/A'.padEnd(9);
|
|
99
|
+
const status = agent.status;
|
|
100
|
+
let statusIndicator = '';
|
|
101
|
+
if (agent.alertLevel === 'critical') {
|
|
102
|
+
statusIndicator = ' [CRITICAL]';
|
|
103
|
+
}
|
|
104
|
+
else if (agent.alertLevel === 'warning') {
|
|
105
|
+
statusIndicator = ' [WARNING]';
|
|
106
|
+
}
|
|
107
|
+
else if (agent.trend === 'rising') {
|
|
108
|
+
statusIndicator = ' [↑]';
|
|
109
|
+
}
|
|
110
|
+
lines.push(`${name} ${memory} ${cpu} ${uptime} ${status}${statusIndicator}`);
|
|
111
|
+
}
|
|
112
|
+
// Add recommendations for high resource usage
|
|
113
|
+
const criticalAgents = agents.filter(a => a.alertLevel === 'critical');
|
|
114
|
+
const warningAgents = agents.filter(a => a.alertLevel === 'warning');
|
|
115
|
+
if (criticalAgents.length > 0 || warningAgents.length > 0) {
|
|
116
|
+
lines.push('');
|
|
117
|
+
lines.push('ALERTS:');
|
|
118
|
+
for (const agent of criticalAgents) {
|
|
119
|
+
lines.push(` 🔴 ${agent.name}: Critical memory usage (${formatBytes(agent.rssBytes || 0)})`);
|
|
120
|
+
}
|
|
121
|
+
for (const agent of warningAgents) {
|
|
122
|
+
lines.push(` 🟡 ${agent.name}: High memory usage (${formatBytes(agent.rssBytes || 0)})`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return lines.join('\n');
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const error = err;
|
|
129
|
+
if (error.code === 'ECONNREFUSED') {
|
|
130
|
+
return `Cannot connect to dashboard at port ${port}. Is the daemon running?\n\nRun 'agent-relay up' to start the daemon.`;
|
|
131
|
+
}
|
|
132
|
+
return `Failed to fetch metrics: ${error.message || String(err)}`;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=relay-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-metrics.js","sourceRoot":"","sources":["../../src/tools/relay-metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import type { RelayClient } from '../client.js';
|
|
4
|
+
export declare const relayReleaseSchema: z.ZodObject<{
|
|
5
|
+
name: z.ZodString;
|
|
6
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
name: string;
|
|
9
|
+
reason?: string | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
name: string;
|
|
12
|
+
reason?: string | undefined;
|
|
13
|
+
}>;
|
|
14
|
+
export type RelayReleaseInput = z.infer<typeof relayReleaseSchema>;
|
|
15
|
+
export declare const relayReleaseTool: Tool;
|
|
16
|
+
/**
|
|
17
|
+
* Release a worker agent via the relay client.
|
|
18
|
+
*/
|
|
19
|
+
export declare function handleRelayRelease(client: RelayClient, input: RelayReleaseInput): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=relay-release.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-release.d.ts","sourceRoot":"","sources":["../../src/tools/relay-release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,kBAAkB;;;;;;;;;EAG7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,eAAO,MAAM,gBAAgB,EAAE,IAwB9B,CAAC;AAEF;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,MAAM,CAAC,CAUjB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const relayReleaseSchema = z.object({
|
|
3
|
+
name: z.string().describe('Name of the worker to release'),
|
|
4
|
+
reason: z.string().optional().describe('Optional reason for release'),
|
|
5
|
+
});
|
|
6
|
+
export const relayReleaseTool = {
|
|
7
|
+
name: 'relay_release',
|
|
8
|
+
description: `Release (terminate) a worker agent.
|
|
9
|
+
|
|
10
|
+
Use this when a worker has completed its task or is no longer needed.
|
|
11
|
+
The worker will be gracefully terminated.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
name="TestRunner"
|
|
15
|
+
reason="Tests completed successfully"`,
|
|
16
|
+
inputSchema: {
|
|
17
|
+
type: 'object',
|
|
18
|
+
properties: {
|
|
19
|
+
name: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
description: 'Name of the worker to release',
|
|
22
|
+
},
|
|
23
|
+
reason: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
description: 'Optional reason for release',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
required: ['name'],
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Release a worker agent via the relay client.
|
|
33
|
+
*/
|
|
34
|
+
export async function handleRelayRelease(client, input) {
|
|
35
|
+
const { name, reason } = input;
|
|
36
|
+
const result = await client.release(name, reason);
|
|
37
|
+
if (result.success) {
|
|
38
|
+
return `Worker "${name}" released.`;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return `Failed to release worker: ${result.error}`;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=relay-release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-release.js","sourceRoot":"","sources":["../../src/tools/relay-release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CACtE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE;;;;;;;wCAOyB;IACtC,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+BAA+B;aAC7C;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6BAA6B;aAC3C;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAmB,EACnB,KAAwB;IAExB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAE/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,WAAW,IAAI,aAAa,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,OAAO,6BAA6B,MAAM,CAAC,KAAK,EAAE,CAAC;IACrD,CAAC;AACH,CAAC"}
|