Files
tutti/services/tuttid/api/daemon_agent_turns.go
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

65 lines
2.3 KiB
Go

package api
import (
"context"
tuttigenerated "github.com/tutti-os/tutti/services/tuttid/api/generated"
"github.com/tutti-os/tutti/services/tuttid/apierrors"
)
// CancelWorkspaceAgentTurn is the protocol v2 turn-scoped cancel. Idempotent
// by contract: settled, unknown, and delivery-unconfirmed turns return
// canceled=false with an explanatory reason instead of an error.
func (api DaemonAPI) CancelWorkspaceAgentTurn(ctx context.Context, request tuttigenerated.CancelWorkspaceAgentTurnRequestObject) (tuttigenerated.CancelWorkspaceAgentTurnResponseObject, error) {
if api.AgentSessionService == nil {
return tuttigenerated.CancelWorkspaceAgentTurn503JSONResponse{
ServiceUnavailableErrorJSONResponse: agentSessionServiceUnavailableError(),
}, nil
}
result, err := api.AgentSessionService.CancelTurn(
ctx,
string(request.WorkspaceID),
string(request.AgentSessionID),
string(request.TurnID),
)
if err != nil {
return writeCancelWorkspaceAgentTurnError(err), nil
}
response := tuttigenerated.CancelWorkspaceAgentTurn200JSONResponse{
Cancel: tuttigenerated.WorkspaceAgentTurnCancelResult{
Canceled: result.Canceled,
Reason: tuttigenerated.WorkspaceAgentTurnCancelResultReason(result.Reason),
},
}
if result.Turn != nil {
turn := generatedWorkspaceAgentTurn(*result.Turn)
response.Turn = &turn
}
if !isRendererEngineCommandOrigin(
request.Params.XTuttiAgentCommandOrigin,
) {
api.recordAgentStimulus(ctx, "turn.cancel", string(request.WorkspaceID), string(request.AgentSessionID), map[string]any{
"turnId": string(request.TurnID),
})
}
return response, nil
}
func writeCancelWorkspaceAgentTurnError(err error) tuttigenerated.CancelWorkspaceAgentTurnResponseObject {
protocolErr := apierrors.Classify(err)
switch protocolErr.Code {
case tuttigenerated.WorkspaceNotFound:
return tuttigenerated.CancelWorkspaceAgentTurn404JSONResponse{
WorkspaceNotFoundErrorJSONResponse: workspaceNotFoundError(protocolErr),
}
case tuttigenerated.InvalidRequest:
return tuttigenerated.CancelWorkspaceAgentTurn400JSONResponse{
InvalidRequestErrorJSONResponse: invalidRequestError(protocolErr),
}
default:
return tuttigenerated.CancelWorkspaceAgentTurn502JSONResponse{
WorkspaceOperationErrorJSONResponse: workspaceOperationError(protocolErr),
}
}
}