@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.
Files changed (103) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +214 -0
  3. package/dist/bin.d.ts +12 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +127 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/client.d.ts +68 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +115 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/cloud.d.ts +108 -0
  12. package/dist/cloud.d.ts.map +1 -0
  13. package/dist/cloud.js +279 -0
  14. package/dist/cloud.js.map +1 -0
  15. package/dist/errors.d.ts +27 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +48 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/index.d.ts +10 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +16 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/install-cli.d.ts +35 -0
  24. package/dist/install-cli.d.ts.map +1 -0
  25. package/dist/install-cli.js +157 -0
  26. package/dist/install-cli.js.map +1 -0
  27. package/dist/install.d.ts +101 -0
  28. package/dist/install.d.ts.map +1 -0
  29. package/dist/install.js +398 -0
  30. package/dist/install.js.map +1 -0
  31. package/dist/prompts/index.d.ts +2 -0
  32. package/dist/prompts/index.d.ts.map +1 -0
  33. package/dist/prompts/index.js +2 -0
  34. package/dist/prompts/index.js.map +1 -0
  35. package/dist/prompts/protocol.d.ts +11 -0
  36. package/dist/prompts/protocol.d.ts.map +1 -0
  37. package/dist/prompts/protocol.js +168 -0
  38. package/dist/prompts/protocol.js.map +1 -0
  39. package/dist/resources/agents.d.ts +11 -0
  40. package/dist/resources/agents.d.ts.map +1 -0
  41. package/dist/resources/agents.js +17 -0
  42. package/dist/resources/agents.js.map +1 -0
  43. package/dist/resources/inbox.d.ts +11 -0
  44. package/dist/resources/inbox.d.ts.map +1 -0
  45. package/dist/resources/inbox.js +17 -0
  46. package/dist/resources/inbox.js.map +1 -0
  47. package/dist/resources/index.d.ts +4 -0
  48. package/dist/resources/index.d.ts.map +1 -0
  49. package/dist/resources/index.js +4 -0
  50. package/dist/resources/index.js.map +1 -0
  51. package/dist/resources/project.d.ts +11 -0
  52. package/dist/resources/project.d.ts.map +1 -0
  53. package/dist/resources/project.js +21 -0
  54. package/dist/resources/project.js.map +1 -0
  55. package/dist/server.d.ts +19 -0
  56. package/dist/server.d.ts.map +1 -0
  57. package/dist/server.js +215 -0
  58. package/dist/server.js.map +1 -0
  59. package/dist/simple.d.ts +173 -0
  60. package/dist/simple.d.ts.map +1 -0
  61. package/dist/simple.js +120 -0
  62. package/dist/simple.js.map +1 -0
  63. package/dist/tools/index.d.ts +10 -0
  64. package/dist/tools/index.d.ts.map +1 -0
  65. package/dist/tools/index.js +10 -0
  66. package/dist/tools/index.js.map +1 -0
  67. package/dist/tools/relay-health.d.ts +23 -0
  68. package/dist/tools/relay-health.d.ts.map +1 -0
  69. package/dist/tools/relay-health.js +138 -0
  70. package/dist/tools/relay-health.js.map +1 -0
  71. package/dist/tools/relay-inbox.d.ts +26 -0
  72. package/dist/tools/relay-inbox.d.ts.map +1 -0
  73. package/dist/tools/relay-inbox.js +58 -0
  74. package/dist/tools/relay-inbox.js.map +1 -0
  75. package/dist/tools/relay-logs.d.ts +20 -0
  76. package/dist/tools/relay-logs.d.ts.map +1 -0
  77. package/dist/tools/relay-logs.js +88 -0
  78. package/dist/tools/relay-logs.js.map +1 -0
  79. package/dist/tools/relay-metrics.d.ts +20 -0
  80. package/dist/tools/relay-metrics.d.ts.map +1 -0
  81. package/dist/tools/relay-metrics.js +135 -0
  82. package/dist/tools/relay-metrics.js.map +1 -0
  83. package/dist/tools/relay-release.d.ts +20 -0
  84. package/dist/tools/relay-release.d.ts.map +1 -0
  85. package/dist/tools/relay-release.js +44 -0
  86. package/dist/tools/relay-release.js.map +1 -0
  87. package/dist/tools/relay-send.d.ts +29 -0
  88. package/dist/tools/relay-send.d.ts.map +1 -0
  89. package/dist/tools/relay-send.js +71 -0
  90. package/dist/tools/relay-send.js.map +1 -0
  91. package/dist/tools/relay-spawn.d.ts +36 -0
  92. package/dist/tools/relay-spawn.d.ts.map +1 -0
  93. package/dist/tools/relay-spawn.js +73 -0
  94. package/dist/tools/relay-spawn.js.map +1 -0
  95. package/dist/tools/relay-status.d.ts +11 -0
  96. package/dist/tools/relay-status.d.ts.map +1 -0
  97. package/dist/tools/relay-status.js +43 -0
  98. package/dist/tools/relay-status.js.map +1 -0
  99. package/dist/tools/relay-who.d.ts +20 -0
  100. package/dist/tools/relay-who.d.ts.map +1 -0
  101. package/dist/tools/relay-who.js +47 -0
  102. package/dist/tools/relay-who.js.map +1 -0
  103. 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"}