-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrunAgentLoop.ts
More file actions
113 lines (100 loc) · 2.8 KB
/
runAgentLoop.ts
File metadata and controls
113 lines (100 loc) · 2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import { query } from "@anthropic-ai/claude-agent-sdk"
import type { AgentChatConfig } from "store"
import { createCanUseTool } from "utils/canUseTool"
import { createSDKAgents } from "utils/createAgent"
import { getEnabledMcpServers } from "utils/getEnabledMcpServers"
import { buildSystemPrompt } from "utils/getPrompt"
import { getDisallowedTools } from "utils/getToolInfo"
import { log } from "utils/logger"
import { selectMcpServers } from "utils/mcpServerSelectionAgent"
import type { MessageQueue } from "utils/MessageQueue"
export const messageTypes = {
ASSISTANT: "assistant",
INIT: "init",
RESULT: "result",
STREAM_EVENT: "stream_event",
SYSTEM: "system",
} as const
export const contentTypes = {
TEXT: "text",
TOOL_USE: "tool_use",
} as const
export interface RunAgentLoopOptions {
abortController: AbortController
additionalSystemPrompt?: string
config: AgentChatConfig
connectedServers: Set<string>
messageQueue: MessageQueue
onServerConnection?: (status: string) => void
onToolPermissionRequest?: (toolName: string, input: any) => void
sessionId?: string
setIsProcessing?: (value: boolean) => void
userMessage: string
}
export async function* runAgentLoop({
abortController,
additionalSystemPrompt,
config,
connectedServers,
messageQueue,
onServerConnection,
onToolPermissionRequest,
sessionId,
setIsProcessing,
userMessage,
}: RunAgentLoopOptions) {
log("\n[runAgentLoop] USER:", userMessage, "\n")
const canUseTool = createCanUseTool({
messageQueue,
onToolPermissionRequest,
setIsProcessing,
})
const disallowedTools = getDisallowedTools(config)
const enabledMcpServers = getEnabledMcpServers(config.mcpServers)
const { mcpServers } = await selectMcpServers({
abortController,
agents: config.agents,
connectedServers,
enabledMcpServers,
onServerConnection,
sessionId,
userMessage,
})
const systemPrompt = await buildSystemPrompt({
additionalSystemPrompt,
config,
connectedServers,
})
const agents = await createSDKAgents(config.agents)
const turnResponse = query({
prompt: userMessage,
options: {
abortController,
agents,
canUseTool,
disallowedTools,
includePartialMessages: config.stream ?? false,
mcpServers,
model: config.model ?? "haiku",
permissionMode: config.permissionMode ?? "default",
resume: sessionId,
systemPrompt,
},
})
for await (const message of turnResponse) {
if (
message.type === messageTypes.SYSTEM &&
message.subtype === messageTypes.INIT
) {
log(
"[runAgentLoop] [messageTypes.INIT]:",
JSON.stringify(message, null, 2)
)
}
yield message
// If we hit a RESULT, this turn is complete
if (message.type === messageTypes.RESULT) {
break
}
}
}