feat: add shell tool call delta message handling

Implemented the buildShellToolCallDeltaMessage function to map client shell output to the delta format for Cursor's terminal bubble. This includes handling both stdout and stderr events. Updated the service to publish these messages when processing execution results. Additionally, added a test for enabling terminal output UI streaming in the bootstrap statsig configuration.
This commit is contained in:
leookun
2026-08-07 22:39:58 +08:00
parent 426bdd6592
commit 9eb24bb4d4
7 changed files with 309 additions and 1 deletions
+35
View File
@@ -201,6 +201,41 @@ func buildShellOutputDeltaMessage(delta *agentv1.ShellOutputDeltaUpdate) *agentv
}
}
// buildShellToolCallDeltaMessage maps client shell output to the delta consumed by Cursor's terminal bubble.
func buildShellToolCallDeltaMessage(callID string, modelCallID string, output *agentv1.ShellOutputDeltaUpdate) *agentv1.AgentServerMessage {
if output == nil {
return nil
}
var delta *agentv1.ShellToolCallDelta
switch event := output.GetEvent().(type) {
case *agentv1.ShellOutputDeltaUpdate_Stdout:
content := event.Stdout.GetData()
if content == "" {
return nil
}
delta = &agentv1.ShellToolCallDelta{
Delta: &agentv1.ShellToolCallDelta_Stdout{
Stdout: &agentv1.ShellToolCallStdoutDelta{Content: content},
},
}
case *agentv1.ShellOutputDeltaUpdate_Stderr:
content := event.Stderr.GetData()
if content == "" {
return nil
}
delta = &agentv1.ShellToolCallDelta{
Delta: &agentv1.ShellToolCallDelta_Stderr{
Stderr: &agentv1.ShellToolCallStderrDelta{Content: content},
},
}
default:
return nil
}
return buildToolCallDeltaMessage(callID, modelCallID, &agentv1.ToolCallDelta{
Delta: &agentv1.ToolCallDelta_ShellToolCallDelta{ShellToolCallDelta: delta},
})
}
// buildTurnEndedMessage 构造 turn 结束消息,并携带标准化后的 token 统计。
func buildTurnEndedMessage(inputTokens int64, outputTokens int64, cacheReadTokens int64, cacheWriteTokens int64) *agentv1.AgentServerMessage {
inputTokensValue := inputTokens