Skip to content

Commit f6c50ce

Browse files
authored
Merge pull request #95 from AutoMaker-Org/refactor-api-approach
refactoring the api endpoints to be separate files to reduce context …
2 parents cdc8334 + 0632249 commit f6c50ce

132 files changed

Lines changed: 4544 additions & 2963 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
>
55
> Automaker itself was built by a group of engineers using AI and agentic coding techniques to build features faster than ever. By leveraging tools like Cursor IDE and Claude Code CLI, the team orchestrated AI agents to implement complex functionality in days instead of weeks.
66
>
7-
> **Learn how:** Master these same techniques and workflows in the [Agentic Jumpstart course](https://agenticjumpstart.com/).
7+
> **Learn how:** Master these same techniques and workflows in the [Agentic Jumpstart course](https://agenticjumpstart.com/?utm=automaker).
88
99
# Automaker
1010

apps/server/src/index.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,26 @@ import dotenv from "dotenv";
1616
import { createEventEmitter, type EventEmitter } from "./lib/events.js";
1717
import { initAllowedPaths } from "./lib/security.js";
1818
import { authMiddleware, getAuthStatus } from "./lib/auth.js";
19-
import { createFsRoutes } from "./routes/fs.js";
20-
import { createHealthRoutes } from "./routes/health.js";
21-
import { createAgentRoutes } from "./routes/agent.js";
22-
import { createSessionsRoutes } from "./routes/sessions.js";
23-
import { createFeaturesRoutes } from "./routes/features.js";
24-
import { createAutoModeRoutes } from "./routes/auto-mode.js";
25-
import { createWorktreeRoutes } from "./routes/worktree.js";
26-
import { createGitRoutes } from "./routes/git.js";
27-
import { createSetupRoutes } from "./routes/setup.js";
28-
import { createSuggestionsRoutes } from "./routes/suggestions.js";
29-
import { createModelsRoutes } from "./routes/models.js";
30-
import { createRunningAgentsRoutes } from "./routes/running-agents.js";
31-
import { createWorkspaceRoutes } from "./routes/workspace.js";
32-
import { createTemplatesRoutes } from "./routes/templates.js";
19+
import { createFsRoutes } from "./routes/fs/index.js";
20+
import { createHealthRoutes } from "./routes/health/index.js";
21+
import { createAgentRoutes } from "./routes/agent/index.js";
22+
import { createSessionsRoutes } from "./routes/sessions/index.js";
23+
import { createFeaturesRoutes } from "./routes/features/index.js";
24+
import { createAutoModeRoutes } from "./routes/auto-mode/index.js";
25+
import { createWorktreeRoutes } from "./routes/worktree/index.js";
26+
import { createGitRoutes } from "./routes/git/index.js";
27+
import { createSetupRoutes } from "./routes/setup/index.js";
28+
import { createSuggestionsRoutes } from "./routes/suggestions/index.js";
29+
import { createModelsRoutes } from "./routes/models/index.js";
30+
import { createRunningAgentsRoutes } from "./routes/running-agents/index.js";
31+
import { createWorkspaceRoutes } from "./routes/workspace/index.js";
32+
import { createTemplatesRoutes } from "./routes/templates/index.js";
3333
import {
3434
createTerminalRoutes,
3535
validateTerminalToken,
3636
isTerminalEnabled,
3737
isTerminalPasswordRequired,
38-
} from "./routes/terminal.js";
38+
} from "./routes/terminal/index.js";
3939
import { AgentService } from "./services/agent-service.js";
4040
import { FeatureLoader } from "./services/feature-loader.js";
4141
import { AutoModeService } from "./services/auto-mode-service.js";

apps/server/src/routes/agent.ts

Lines changed: 0 additions & 155 deletions
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* Common utilities for agent routes
3+
*/
4+
5+
import { createLogger } from "../../lib/logger.js";
6+
import {
7+
getErrorMessage as getErrorMessageShared,
8+
createLogError,
9+
} from "../common.js";
10+
11+
const logger = createLogger("Agent");
12+
13+
// Re-export shared utilities
14+
export { getErrorMessageShared as getErrorMessage };
15+
export const logError = createLogError(logger);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Agent routes - HTTP API for Claude agent interactions
3+
*/
4+
5+
import { Router } from "express";
6+
import { AgentService } from "../../services/agent-service.js";
7+
import type { EventEmitter } from "../../lib/events.js";
8+
import { createStartHandler } from "./routes/start.js";
9+
import { createSendHandler } from "./routes/send.js";
10+
import { createHistoryHandler } from "./routes/history.js";
11+
import { createStopHandler } from "./routes/stop.js";
12+
import { createClearHandler } from "./routes/clear.js";
13+
import { createModelHandler } from "./routes/model.js";
14+
15+
export function createAgentRoutes(
16+
agentService: AgentService,
17+
_events: EventEmitter
18+
): Router {
19+
const router = Router();
20+
21+
router.post("/start", createStartHandler(agentService));
22+
router.post("/send", createSendHandler(agentService));
23+
router.post("/history", createHistoryHandler(agentService));
24+
router.post("/stop", createStopHandler(agentService));
25+
router.post("/clear", createClearHandler(agentService));
26+
router.post("/model", createModelHandler(agentService));
27+
28+
return router;
29+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* POST /clear endpoint - Clear conversation
3+
*/
4+
5+
import type { Request, Response } from "express";
6+
import { AgentService } from "../../../services/agent-service.js";
7+
import { getErrorMessage, logError } from "../common.js";
8+
9+
export function createClearHandler(agentService: AgentService) {
10+
return async (req: Request, res: Response): Promise<void> => {
11+
try {
12+
const { sessionId } = req.body as { sessionId: string };
13+
14+
if (!sessionId) {
15+
res
16+
.status(400)
17+
.json({ success: false, error: "sessionId is required" });
18+
return;
19+
}
20+
21+
const result = await agentService.clearSession(sessionId);
22+
res.json(result);
23+
} catch (error) {
24+
logError(error, "Clear session failed");
25+
res.status(500).json({ success: false, error: getErrorMessage(error) });
26+
}
27+
};
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* POST /history endpoint - Get conversation history
3+
*/
4+
5+
import type { Request, Response } from "express";
6+
import { AgentService } from "../../../services/agent-service.js";
7+
import { getErrorMessage, logError } from "../common.js";
8+
9+
export function createHistoryHandler(agentService: AgentService) {
10+
return async (req: Request, res: Response): Promise<void> => {
11+
try {
12+
const { sessionId } = req.body as { sessionId: string };
13+
14+
if (!sessionId) {
15+
res
16+
.status(400)
17+
.json({ success: false, error: "sessionId is required" });
18+
return;
19+
}
20+
21+
const result = agentService.getHistory(sessionId);
22+
res.json(result);
23+
} catch (error) {
24+
logError(error, "Get history failed");
25+
res.status(500).json({ success: false, error: getErrorMessage(error) });
26+
}
27+
};
28+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* POST /model endpoint - Set session model
3+
*/
4+
5+
import type { Request, Response } from "express";
6+
import { AgentService } from "../../../services/agent-service.js";
7+
import { getErrorMessage, logError } from "../common.js";
8+
9+
export function createModelHandler(agentService: AgentService) {
10+
return async (req: Request, res: Response): Promise<void> => {
11+
try {
12+
const { sessionId, model } = req.body as {
13+
sessionId: string;
14+
model: string;
15+
};
16+
17+
if (!sessionId || !model) {
18+
res
19+
.status(400)
20+
.json({ success: false, error: "sessionId and model are required" });
21+
return;
22+
}
23+
24+
const result = await agentService.setSessionModel(sessionId, model);
25+
res.json({ success: result });
26+
} catch (error) {
27+
logError(error, "Set session model failed");
28+
res.status(500).json({ success: false, error: getErrorMessage(error) });
29+
}
30+
};
31+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* POST /send endpoint - Send a message
3+
*/
4+
5+
import type { Request, Response } from "express";
6+
import { AgentService } from "../../../services/agent-service.js";
7+
import { createLogger } from "../../../lib/logger.js";
8+
import { getErrorMessage, logError } from "../common.js";
9+
10+
const logger = createLogger("Agent");
11+
12+
export function createSendHandler(agentService: AgentService) {
13+
return async (req: Request, res: Response): Promise<void> => {
14+
try {
15+
const { sessionId, message, workingDirectory, imagePaths, model } =
16+
req.body as {
17+
sessionId: string;
18+
message: string;
19+
workingDirectory?: string;
20+
imagePaths?: string[];
21+
model?: string;
22+
};
23+
24+
if (!sessionId || !message) {
25+
res.status(400).json({
26+
success: false,
27+
error: "sessionId and message are required",
28+
});
29+
return;
30+
}
31+
32+
// Start the message processing (don't await - it streams via WebSocket)
33+
agentService
34+
.sendMessage({
35+
sessionId,
36+
message,
37+
workingDirectory,
38+
imagePaths,
39+
model,
40+
})
41+
.catch((error) => {
42+
logError(error, "Send message failed (background)");
43+
});
44+
45+
// Return immediately - responses come via WebSocket
46+
res.json({ success: true, message: "Message sent" });
47+
} catch (error) {
48+
logError(error, "Send message failed");
49+
res.status(500).json({ success: false, error: getErrorMessage(error) });
50+
}
51+
};
52+
}

0 commit comments

Comments
 (0)