Skip to content

Commit 77ae98a

Browse files
committed
chore: lint and format
1 parent eb3c0b7 commit 77ae98a

File tree

11 files changed

+123
-95
lines changed

11 files changed

+123
-95
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ MyCoder supports sending corrections to the main agent while it's running. This
129129
### Usage
130130

131131
1. Start MyCoder with the `--interactive` flag:
132+
132133
```bash
133134
mycoder --interactive "Implement a React component"
134135
```

packages/agent/src/core/toolAgent/toolAgentCore.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,20 @@ export const toolAgent = async (
8888
}
8989
}
9090
}
91-
91+
9292
// Check for messages from user (for main agent only)
9393
// Import this at the top of the file
9494
try {
9595
// Dynamic import to avoid circular dependencies
96-
const { userMessages } = await import('../../tools/interaction/userMessage.js');
97-
96+
const { userMessages } = await import(
97+
'../../tools/interaction/userMessage.js'
98+
);
99+
98100
if (userMessages && userMessages.length > 0) {
99101
// Get all user messages and clear the queue
100102
const pendingUserMessages = [...userMessages];
101103
userMessages.length = 0;
102-
104+
103105
// Add each message to the conversation
104106
for (const message of pendingUserMessages) {
105107
logger.info(`Message from user: ${message}`);

packages/agent/src/tools/agent/__tests__/logCapture.test.ts

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
22

3-
import { Logger, LogLevel, LoggerListener } from '../../../utils/logger.js';
3+
import { Logger } from '../../../utils/logger.js';
44
import { agentMessageTool } from '../agentMessage.js';
55
import { agentStartTool } from '../agentStart.js';
6-
import { AgentTracker, AgentState } from '../AgentTracker.js';
6+
import { AgentTracker } from '../AgentTracker.js';
77

88
// Mock the toolAgent function
99
vi.mock('../../../core/toolAgent/toolAgentCore.js', () => ({
@@ -12,33 +12,6 @@ vi.mock('../../../core/toolAgent/toolAgentCore.js', () => ({
1212
.mockResolvedValue({ result: 'Test result', interactions: 1 }),
1313
}));
1414

15-
// Create a real implementation of the log capture function
16-
const createLogCaptureListener = (agentState: AgentState): LoggerListener => {
17-
return (logger, logLevel, lines) => {
18-
// Only capture log, warn, and error levels (not debug or info)
19-
if (
20-
logLevel === LogLevel.log ||
21-
logLevel === LogLevel.warn ||
22-
logLevel === LogLevel.error
23-
) {
24-
// Only capture logs from the agent and its immediate tools (not deeper than that)
25-
if (logger.nesting <= 1) {
26-
const logPrefix =
27-
logLevel === LogLevel.warn
28-
? '[WARN] '
29-
: logLevel === LogLevel.error
30-
? '[ERROR] '
31-
: '';
32-
33-
// Add each line to the capturedLogs array
34-
lines.forEach((line) => {
35-
agentState.capturedLogs.push(`${logPrefix}${line}`);
36-
});
37-
}
38-
}
39-
};
40-
};
41-
4215
describe('Log Capture in AgentTracker', () => {
4316
let agentTracker: AgentTracker;
4417
let logger: Logger;
@@ -78,20 +51,14 @@ describe('Log Capture in AgentTracker', () => {
7851

7952
if (!agentState) return; // TypeScript guard
8053

81-
// Create a tool logger that is a child of the agent logger
82-
const toolLogger = new Logger({
83-
name: 'tool-logger',
84-
parent: context.logger,
85-
});
86-
8754
// For testing purposes, manually add logs to the agent state
8855
// In a real scenario, these would be added by the log listener
8956
agentState.capturedLogs = [
9057
'This log message should be captured',
9158
'[WARN] This warning message should be captured',
9259
'[ERROR] This error message should be captured',
9360
'This tool log message should be captured',
94-
'[WARN] This tool warning message should be captured'
61+
'[WARN] This tool warning message should be captured',
9562
];
9663

9764
// Check that the right messages were captured

packages/agent/src/tools/agent/agentMessage.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,11 @@ export const agentMessageTool: Tool<Parameters, ReturnType> = {
118118
if (output !== 'No output yet' || agentState.capturedLogs.length > 0) {
119119
const logContent = agentState.capturedLogs.join('\n');
120120
output = `${output}\n\n--- Agent Log Messages ---\n${logContent}`;
121-
121+
122122
// Log that we're returning captured logs
123-
logger.debug(`Returning ${agentState.capturedLogs.length} captured log messages for agent ${instanceId}`);
123+
logger.debug(
124+
`Returning ${agentState.capturedLogs.length} captured log messages for agent ${instanceId}`,
125+
);
124126
}
125127
// Clear the captured logs after retrieving them
126128
agentState.capturedLogs = [];

packages/agent/src/tools/agent/agentStart.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
import chalk from 'chalk';
12
import { z } from 'zod';
23
import { zodToJsonSchema } from 'zod-to-json-schema';
3-
import chalk from 'chalk';
44

55
import {
66
getDefaultSystemPrompt,
@@ -28,7 +28,7 @@ const getRandomAgentColor = () => {
2828
chalk.blueBright,
2929
chalk.greenBright,
3030
chalk.cyanBright,
31-
chalk.magentaBright
31+
chalk.magentaBright,
3232
];
3333
return colors[Math.floor(Math.random() * colors.length)];
3434
};
@@ -159,7 +159,8 @@ export const agentStartTool: Tool<Parameters, ReturnType> = {
159159

160160
// Add each line to the capturedLogs array with logger name for context
161161
lines.forEach((line) => {
162-
const loggerPrefix = logger.name !== 'agent' ? `[${logger.name}] ` : '';
162+
const loggerPrefix =
163+
logger.name !== 'agent' ? `[${logger.name}] ` : '';
163164
agentState.capturedLogs.push(`${logPrefix}${loggerPrefix}${line}`);
164165
});
165166
}
@@ -168,14 +169,14 @@ export const agentStartTool: Tool<Parameters, ReturnType> = {
168169

169170
// Add the listener to the context logger
170171
context.logger.listeners.push(logCaptureListener);
171-
172+
172173
// Create a new logger specifically for the sub-agent if needed
173174
// This is wrapped in a try-catch to maintain backward compatibility with tests
174175
let subAgentLogger = context.logger;
175176
try {
176177
// Generate a random color for this agent
177178
const agentColor = getRandomAgentColor();
178-
179+
179180
subAgentLogger = new Logger({
180181
name: 'agent',
181182
parent: context.logger,
@@ -185,7 +186,9 @@ export const agentStartTool: Tool<Parameters, ReturnType> = {
185186
subAgentLogger.listeners.push(logCaptureListener);
186187
} catch {
187188
// If Logger instantiation fails (e.g., in tests), fall back to using the context logger
188-
context.logger.debug('Failed to create sub-agent logger, using context logger instead');
189+
context.logger.debug(
190+
'Failed to create sub-agent logger, using context logger instead',
191+
);
189192
}
190193

191194
// Register agent state with the tracker

packages/agent/src/tools/agent/logCapture.test.ts

Lines changed: 82 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
import { expect, test, describe } from 'vitest';
22

3+
import { ToolContext } from '../../core/types.js';
34
import { LogLevel, Logger } from '../../utils/logger.js';
5+
46
import { AgentState } from './AgentTracker.js';
5-
import { ToolContext } from '../../core/types.js';
67

78
// Helper function to directly invoke a listener with a log message
8-
function emitLog(
9-
logger: Logger,
10-
level: LogLevel,
11-
message: string
12-
) {
9+
function emitLog(logger: Logger, level: LogLevel, message: string) {
1310
const lines = [message];
1411
// Directly call all listeners on this logger
15-
logger.listeners.forEach(listener => {
12+
logger.listeners.forEach((listener) => {
1613
listener(logger, level, lines);
1714
});
1815
}
@@ -38,10 +35,17 @@ describe('Log capture functionality', () => {
3835
const mainLogger = new Logger({ name: 'main' });
3936
const agentLogger = new Logger({ name: 'agent', parent: mainLogger });
4037
const toolLogger = new Logger({ name: 'tool', parent: agentLogger });
41-
const deepToolLogger = new Logger({ name: 'deep-tool', parent: toolLogger });
38+
const deepToolLogger = new Logger({
39+
name: 'deep-tool',
40+
parent: toolLogger,
41+
});
4242

4343
// Create the log capture listener
44-
const logCaptureListener = (logger: Logger, logLevel: LogLevel, lines: string[]) => {
44+
const logCaptureListener = (
45+
logger: Logger,
46+
logLevel: LogLevel,
47+
lines: string[],
48+
) => {
4549
// Only capture log, warn, and error levels (not debug or info)
4650
if (
4751
logLevel === LogLevel.log ||
@@ -55,7 +59,7 @@ describe('Log capture functionality', () => {
5559
} else if (logger.parent === agentLogger) {
5660
isAgentOrImmediateTool = true;
5761
}
58-
62+
5963
if (isAgentOrImmediateTool) {
6064
const logPrefix =
6165
logLevel === LogLevel.warn
@@ -66,7 +70,8 @@ describe('Log capture functionality', () => {
6670

6771
// Add each line to the capturedLogs array with logger name for context
6872
lines.forEach((line) => {
69-
const loggerPrefix = logger.name !== 'agent' ? `[${logger.name}] ` : '';
73+
const loggerPrefix =
74+
logger.name !== 'agent' ? `[${logger.name}] ` : '';
7075
agentState.capturedLogs.push(`${logPrefix}${loggerPrefix}${line}`);
7176
});
7277
}
@@ -97,20 +102,44 @@ describe('Log capture functionality', () => {
97102
// Verify that only the expected messages were captured
98103
// We should have 6 messages: 3 from agent (log, warn, error) and 3 from tools (log, warn, error)
99104
expect(agentState.capturedLogs.length).toBe(6);
100-
105+
101106
// Agent messages at log, warn, and error levels should be captured
102-
expect(agentState.capturedLogs.some(log => log === 'Agent log message')).toBe(true);
103-
expect(agentState.capturedLogs.some(log => log === '[WARN] Agent warning message')).toBe(true);
104-
expect(agentState.capturedLogs.some(log => log === '[ERROR] Agent error message')).toBe(true);
105-
107+
expect(
108+
agentState.capturedLogs.some((log) => log === 'Agent log message'),
109+
).toBe(true);
110+
expect(
111+
agentState.capturedLogs.some(
112+
(log) => log === '[WARN] Agent warning message',
113+
),
114+
).toBe(true);
115+
expect(
116+
agentState.capturedLogs.some(
117+
(log) => log === '[ERROR] Agent error message',
118+
),
119+
).toBe(true);
120+
106121
// Tool messages at log, warn, and error levels should be captured
107-
expect(agentState.capturedLogs.some(log => log === '[tool] Tool log message')).toBe(true);
108-
expect(agentState.capturedLogs.some(log => log === '[WARN] [tool] Tool warning message')).toBe(true);
109-
expect(agentState.capturedLogs.some(log => log === '[ERROR] [tool] Tool error message')).toBe(true);
110-
122+
expect(
123+
agentState.capturedLogs.some((log) => log === '[tool] Tool log message'),
124+
).toBe(true);
125+
expect(
126+
agentState.capturedLogs.some(
127+
(log) => log === '[WARN] [tool] Tool warning message',
128+
),
129+
).toBe(true);
130+
expect(
131+
agentState.capturedLogs.some(
132+
(log) => log === '[ERROR] [tool] Tool error message',
133+
),
134+
).toBe(true);
135+
111136
// Debug and info messages should not be captured
112-
expect(agentState.capturedLogs.some(log => log.includes('debug'))).toBe(false);
113-
expect(agentState.capturedLogs.some(log => log.includes('info'))).toBe(false);
137+
expect(agentState.capturedLogs.some((log) => log.includes('debug'))).toBe(
138+
false,
139+
);
140+
expect(agentState.capturedLogs.some((log) => log.includes('info'))).toBe(
141+
false,
142+
);
114143
});
115144

116145
test('should handle nested loggers correctly', () => {
@@ -133,18 +162,26 @@ describe('Log capture functionality', () => {
133162
const mainLogger = new Logger({ name: 'main' });
134163
const agentLogger = new Logger({ name: 'agent', parent: mainLogger });
135164
const toolLogger = new Logger({ name: 'tool', parent: agentLogger });
136-
const deepToolLogger = new Logger({ name: 'deep-tool', parent: toolLogger });
165+
const deepToolLogger = new Logger({
166+
name: 'deep-tool',
167+
parent: toolLogger,
168+
});
137169

138170
// Create the log capture listener that filters based on nesting level
139-
const logCaptureListener = (logger: Logger, logLevel: LogLevel, lines: string[]) => {
171+
const logCaptureListener = (
172+
logger: Logger,
173+
logLevel: LogLevel,
174+
lines: string[],
175+
) => {
140176
// Only capture log, warn, and error levels
141177
if (
142178
logLevel === LogLevel.log ||
143179
logLevel === LogLevel.warn ||
144180
logLevel === LogLevel.error
145181
) {
146182
// Check nesting level - only capture from agent and immediate tools
147-
if (logger.nesting <= 2) { // agent has nesting=1, immediate tools have nesting=2
183+
if (logger.nesting <= 2) {
184+
// agent has nesting=1, immediate tools have nesting=2
148185
const logPrefix =
149186
logLevel === LogLevel.warn
150187
? '[WARN] '
@@ -153,7 +190,8 @@ describe('Log capture functionality', () => {
153190
: '';
154191

155192
lines.forEach((line) => {
156-
const loggerPrefix = logger.name !== 'agent' ? `[${logger.name}] ` : '';
193+
const loggerPrefix =
194+
logger.name !== 'agent' ? `[${logger.name}] ` : '';
157195
agentState.capturedLogs.push(`${logPrefix}${loggerPrefix}${line}`);
158196
});
159197
}
@@ -164,15 +202,25 @@ describe('Log capture functionality', () => {
164202
mainLogger.listeners.push(logCaptureListener);
165203

166204
// Log at different nesting levels
167-
emitLog(mainLogger, LogLevel.log, 'Main logger message'); // nesting = 0
168-
emitLog(agentLogger, LogLevel.log, 'Agent logger message'); // nesting = 1
169-
emitLog(toolLogger, LogLevel.log, 'Tool logger message'); // nesting = 2
170-
emitLog(deepToolLogger, LogLevel.log, 'Deep tool message'); // nesting = 3
205+
emitLog(mainLogger, LogLevel.log, 'Main logger message'); // nesting = 0
206+
emitLog(agentLogger, LogLevel.log, 'Agent logger message'); // nesting = 1
207+
emitLog(toolLogger, LogLevel.log, 'Tool logger message'); // nesting = 2
208+
emitLog(deepToolLogger, LogLevel.log, 'Deep tool message'); // nesting = 3
171209

172210
// We should capture from agent (nesting=1) and tool (nesting=2) but not deeper
173211
expect(agentState.capturedLogs.length).toBe(3);
174-
expect(agentState.capturedLogs.some(log => log.includes('Agent logger message'))).toBe(true);
175-
expect(agentState.capturedLogs.some(log => log.includes('Tool logger message'))).toBe(true);
176-
expect(agentState.capturedLogs.some(log => log.includes('Deep tool message'))).toBe(false);
212+
expect(
213+
agentState.capturedLogs.some((log) =>
214+
log.includes('Agent logger message'),
215+
),
216+
).toBe(true);
217+
expect(
218+
agentState.capturedLogs.some((log) =>
219+
log.includes('Tool logger message'),
220+
),
221+
).toBe(true);
222+
expect(
223+
agentState.capturedLogs.some((log) => log.includes('Deep tool message')),
224+
).toBe(false);
177225
});
178-
});
226+
});

packages/agent/src/tools/getTools.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { agentMessageTool } from './agent/agentMessage.js';
77
import { agentStartTool } from './agent/agentStart.js';
88
import { listAgentsTool } from './agent/listAgents.js';
99
import { fetchTool } from './fetch/fetch.js';
10-
import { userPromptTool } from './interaction/userPrompt.js';
1110
import { userMessageTool } from './interaction/userMessage.js';
11+
import { userPromptTool } from './interaction/userPrompt.js';
1212
import { createMcpTool } from './mcp.js';
1313
import { listSessionsTool } from './session/listSessions.js';
1414
import { sessionMessageTool } from './session/sessionMessage.js';

0 commit comments

Comments
 (0)