Files
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

878 lines
40 KiB
Go

package api
import (
"context"
"encoding/base64"
"strings"
workspaceissues "github.com/tutti-os/tutti/packages/workspace/issues"
tuttigenerated "github.com/tutti-os/tutti/services/tuttid/api/generated"
workspaceapi "github.com/tutti-os/tutti/services/tuttid/api/workspace"
"github.com/tutti-os/tutti/services/tuttid/apierrors"
workspaceservice "github.com/tutti-os/tutti/services/tuttid/service/workspace"
)
func (api DaemonAPI) ListWorkspaceIssues(ctx context.Context, request tuttigenerated.ListWorkspaceIssuesRequestObject) (tuttigenerated.ListWorkspaceIssuesResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.ListWorkspaceIssues503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
list, err := api.IssueService.ListIssues(ctx, string(request.WorkspaceID), issueManagerIssueListInputFromGenerated(request.Params))
if err != nil {
return writeListWorkspaceIssuesError(err), nil
}
return tuttigenerated.ListWorkspaceIssues200JSONResponse(
workspaceapi.GeneratedIssueManagerIssueListResponseFromDomain(list),
), nil
}
func (api DaemonAPI) ListWorkspaceIssueTopics(ctx context.Context, request tuttigenerated.ListWorkspaceIssueTopicsRequestObject) (tuttigenerated.ListWorkspaceIssueTopicsResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.ListWorkspaceIssueTopics503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
list, err := api.IssueService.ListTopics(ctx, string(request.WorkspaceID))
if err != nil {
return writeListWorkspaceIssueTopicsError(err), nil
}
return tuttigenerated.ListWorkspaceIssueTopics200JSONResponse(
workspaceapi.GeneratedIssueManagerTopicListResponseFromDomain(list),
), nil
}
func (api DaemonAPI) CreateWorkspaceIssueTopic(ctx context.Context, request tuttigenerated.CreateWorkspaceIssueTopicRequestObject) (tuttigenerated.CreateWorkspaceIssueTopicResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.CreateWorkspaceIssueTopic503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.CreateWorkspaceIssueTopic400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
topic, err := api.IssueService.CreateTopic(ctx, string(request.WorkspaceID), workspaceservice.CreateIssueManagerTopicInput{
TopicID: optionalString(request.Body.TopicId),
Title: request.Body.Title,
Summary: optionalString(request.Body.Summary),
})
if err != nil {
return writeCreateWorkspaceIssueTopicError(err), nil
}
return tuttigenerated.CreateWorkspaceIssueTopic201JSONResponse(
workspaceapi.GeneratedIssueManagerTopicResponseFromDomain(topic),
), nil
}
func (api DaemonAPI) UpdateWorkspaceIssueTopic(ctx context.Context, request tuttigenerated.UpdateWorkspaceIssueTopicRequestObject) (tuttigenerated.UpdateWorkspaceIssueTopicResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.UpdateWorkspaceIssueTopic503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.UpdateWorkspaceIssueTopic400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
topic, err := api.IssueService.UpdateTopic(ctx, string(request.WorkspaceID), string(request.TopicID), workspaceservice.UpdateIssueManagerTopicInput{
Title: optionalString(request.Body.Title),
HasTitle: request.Body.Title != nil,
Summary: optionalString(request.Body.Summary),
HasSummary: request.Body.Summary != nil,
Pinned: optionalBool(request.Body.Pinned),
HasPinned: request.Body.Pinned != nil,
})
if err != nil {
return writeUpdateWorkspaceIssueTopicError(err), nil
}
return tuttigenerated.UpdateWorkspaceIssueTopic200JSONResponse(
workspaceapi.GeneratedIssueManagerTopicResponseFromDomain(topic),
), nil
}
func (api DaemonAPI) DeleteWorkspaceIssueTopic(ctx context.Context, request tuttigenerated.DeleteWorkspaceIssueTopicRequestObject) (tuttigenerated.DeleteWorkspaceIssueTopicResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.DeleteWorkspaceIssueTopic503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
removed, err := api.IssueService.DeleteTopic(ctx, string(request.WorkspaceID), string(request.TopicID))
if err != nil {
return writeDeleteWorkspaceIssueTopicError(err), nil
}
return tuttigenerated.DeleteWorkspaceIssueTopic200JSONResponse{Removed: removed}, nil
}
func (api DaemonAPI) CreateWorkspaceIssue(ctx context.Context, request tuttigenerated.CreateWorkspaceIssueRequestObject) (tuttigenerated.CreateWorkspaceIssueResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.CreateWorkspaceIssue503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.CreateWorkspaceIssue400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
input, err := issueManagerCreateIssueInputFromGenerated(*request.Body)
if err != nil {
return writeCreateWorkspaceIssueError(err), nil
}
issue, err := api.IssueService.CreateIssue(ctx, string(request.WorkspaceID), input)
if err != nil {
return writeCreateWorkspaceIssueError(err), nil
}
return tuttigenerated.CreateWorkspaceIssue201JSONResponse(
workspaceapi.GeneratedIssueManagerIssueResponseFromDomain(issue),
), nil
}
func (api DaemonAPI) CreateWorkspaceIssueFromPlan(ctx context.Context, request tuttigenerated.CreateWorkspaceIssueFromPlanRequestObject) (tuttigenerated.CreateWorkspaceIssueFromPlanResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.CreateWorkspaceIssueFromPlan503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.CreateWorkspaceIssueFromPlan400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
tasks := make([]workspaceservice.CreateIssueManagerTaskItemInput, 0, len(request.Body.Tasks))
for _, task := range request.Body.Tasks {
tasks = append(tasks, issueManagerCreateTaskInputFromGenerated(task))
}
detail, err := api.IssueService.CreateIssueFromPlan(ctx, string(request.WorkspaceID), workspaceservice.CreateIssueManagerIssueFromPlanInput{
Issue: issueManagerCreatePlannedIssueInputFromGenerated(request.Body.Issue),
Tasks: tasks,
})
if err != nil {
return writeCreateWorkspaceIssueFromPlanError(err), nil
}
return tuttigenerated.CreateWorkspaceIssueFromPlan201JSONResponse(
workspaceapi.GeneratedIssueManagerIssueDetailResponseFromDomain(
detail,
api.IssueService.ProjectIssueManagerContextRefs(detail.ContextRefs),
),
), nil
}
func (api DaemonAPI) EstimateWorkspaceIssueAutoTokenBudget(ctx context.Context, request tuttigenerated.EstimateWorkspaceIssueAutoTokenBudgetRequestObject) (tuttigenerated.EstimateWorkspaceIssueAutoTokenBudgetResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.EstimateWorkspaceIssueAutoTokenBudget503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.EstimateWorkspaceIssueAutoTokenBudget400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
tasks := make([]workspaceservice.CreateIssueManagerTaskItemInput, 0, len(request.Body.Tasks))
for _, task := range request.Body.Tasks {
tasks = append(tasks, workspaceservice.CreateIssueManagerTaskItemInput{
AgentTargetID: optionalString(task.AgentTargetId),
ModelPlanID: optionalString(task.ModelPlanId),
Model: optionalString(task.Model),
})
}
estimate, err := api.IssueService.EstimateAutoTokenBudget(ctx, string(request.WorkspaceID), workspaceservice.EstimateIssueManagerAutoTokenBudgetInput{
ExecutionProfile: issueManagerExecutionProfileFromGenerated(&request.Body.ExecutionProfile),
Tasks: tasks,
})
if err != nil {
return writeEstimateWorkspaceIssueAutoTokenBudgetError(err), nil
}
return tuttigenerated.EstimateWorkspaceIssueAutoTokenBudget200JSONResponse{
TokenLimit: estimate.TokenLimit,
DeterministicTokenLimit: estimate.DeterministicTokenLimit,
HistoricalTokenEstimate: estimate.HistoricalTokenEstimate,
MatchedTaskCount: estimate.MatchedHistoricalTaskCount,
}, nil
}
func (api DaemonAPI) RemoveWorkspaceIssueTaskContextRef(ctx context.Context, request tuttigenerated.RemoveWorkspaceIssueTaskContextRefRequestObject) (tuttigenerated.RemoveWorkspaceIssueTaskContextRefResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.RemoveWorkspaceIssueTaskContextRef503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
removed, err := api.IssueService.RemoveTaskContextRef(ctx, string(request.WorkspaceID), string(request.IssueID), string(request.TaskID), string(request.ContextRefID))
if err != nil {
return writeRemoveWorkspaceIssueTaskContextRefError(err), nil
}
return tuttigenerated.RemoveWorkspaceIssueTaskContextRef200JSONResponse{Removed: removed}, nil
}
func (api DaemonAPI) CancelWorkspaceIssueExecution(ctx context.Context, request tuttigenerated.CancelWorkspaceIssueExecutionRequestObject) (tuttigenerated.CancelWorkspaceIssueExecutionResponseObject, error) {
if api.IssueExecutionService == nil {
return tuttigenerated.CancelWorkspaceIssueExecution503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
canceled, err := api.IssueExecutionService.CancelIssueExecution(ctx, string(request.WorkspaceID), string(request.IssueID))
if err != nil {
return writeCancelWorkspaceIssueExecutionError(err), nil
}
return tuttigenerated.CancelWorkspaceIssueExecution200JSONResponse{CanceledRunCount: canceled}, nil
}
func (api DaemonAPI) DeleteWorkspaceIssue(ctx context.Context, request tuttigenerated.DeleteWorkspaceIssueRequestObject) (tuttigenerated.DeleteWorkspaceIssueResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.DeleteWorkspaceIssue503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
removed, err := api.IssueService.DeleteIssue(ctx, string(request.WorkspaceID), string(request.IssueID))
if err != nil {
return writeDeleteWorkspaceIssueError(err), nil
}
return tuttigenerated.DeleteWorkspaceIssue200JSONResponse{Removed: removed}, nil
}
func (api DaemonAPI) GetWorkspaceIssueDetail(ctx context.Context, request tuttigenerated.GetWorkspaceIssueDetailRequestObject) (tuttigenerated.GetWorkspaceIssueDetailResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.GetWorkspaceIssueDetail503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
detail, err := api.IssueService.GetIssueDetail(ctx, string(request.WorkspaceID), string(request.IssueID))
if err != nil {
return writeGetWorkspaceIssueDetailError(err), nil
}
return tuttigenerated.GetWorkspaceIssueDetail200JSONResponse(
workspaceapi.GeneratedIssueManagerIssueDetailResponseFromDomain(
detail,
api.IssueService.ProjectIssueManagerContextRefs(detail.ContextRefs),
),
), nil
}
func (api DaemonAPI) SearchWorkspaceIssueReferences(ctx context.Context, request tuttigenerated.SearchWorkspaceIssueReferencesRequestObject) (tuttigenerated.SearchWorkspaceIssueReferencesResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.SearchWorkspaceIssueReferences503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.SearchWorkspaceIssueReferences400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
var filters []string
if request.Body.Filters != nil {
filters = *request.Body.Filters
}
hits, err := api.IssueService.SearchIssueOutputs(ctx, workspaceissues.RunOutputSearchParams{
WorkspaceID: string(request.WorkspaceID),
Query: request.Body.Query,
Filters: filters,
IssueID: optionalString(request.Body.IssueId),
TopicID: optionalString(request.Body.TopicId),
Limit: optionalInt(request.Body.Limit),
})
if err != nil {
return writeSearchWorkspaceIssueReferencesError(err), nil
}
return tuttigenerated.SearchWorkspaceIssueReferences200JSONResponse(
workspaceapi.GeneratedIssueManagerReferenceSearchResponseFromDomain(string(request.WorkspaceID), hits),
), nil
}
func (api DaemonAPI) UpdateWorkspaceIssue(ctx context.Context, request tuttigenerated.UpdateWorkspaceIssueRequestObject) (tuttigenerated.UpdateWorkspaceIssueResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.UpdateWorkspaceIssue503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.UpdateWorkspaceIssue400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
issue, err := api.IssueService.UpdateIssue(ctx, string(request.WorkspaceID), string(request.IssueID), workspaceservice.UpdateIssueManagerIssueInput{
Title: optionalString(request.Body.Title),
HasTitle: request.Body.Title != nil,
Content: optionalString(request.Body.Content),
HasContent: request.Body.Content != nil,
Status: optionalIssueManagerStatus(request.Body.Status),
HasStatus: request.Body.Status != nil,
})
if err != nil {
return writeUpdateWorkspaceIssueError(err), nil
}
return tuttigenerated.UpdateWorkspaceIssue200JSONResponse(
workspaceapi.GeneratedIssueManagerIssueResponseFromDomain(issue),
), nil
}
func (api DaemonAPI) AddWorkspaceIssueContextRefs(ctx context.Context, request tuttigenerated.AddWorkspaceIssueContextRefsRequestObject) (tuttigenerated.AddWorkspaceIssueContextRefsResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.AddWorkspaceIssueContextRefs503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.AddWorkspaceIssueContextRefs400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
refs, err := api.IssueService.AddIssueContextRefs(ctx, string(request.WorkspaceID), string(request.IssueID), workspaceservice.AddIssueManagerContextRefsInput{
Refs: issueManagerContextRefsInputFromGenerated(request.Body.Refs),
})
if err != nil {
return writeAddWorkspaceIssueContextRefsError(err), nil
}
return tuttigenerated.AddWorkspaceIssueContextRefs200JSONResponse(
workspaceapi.GeneratedIssueManagerContextRefsResponseFromService(
api.IssueService.ProjectIssueManagerContextRefs(refs),
),
), nil
}
func (api DaemonAPI) ListWorkspaceIssueTasks(ctx context.Context, request tuttigenerated.ListWorkspaceIssueTasksRequestObject) (tuttigenerated.ListWorkspaceIssueTasksResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.ListWorkspaceIssueTasks503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
list, err := api.IssueService.ListTasks(ctx, string(request.WorkspaceID), string(request.IssueID), issueManagerTaskListInputFromGenerated(request.Params))
if err != nil {
return writeListWorkspaceIssueTasksError(err), nil
}
return tuttigenerated.ListWorkspaceIssueTasks200JSONResponse(
workspaceapi.GeneratedIssueManagerTaskListResponseFromDomain(list),
), nil
}
func (api DaemonAPI) CreateWorkspaceIssueTask(ctx context.Context, request tuttigenerated.CreateWorkspaceIssueTaskRequestObject) (tuttigenerated.CreateWorkspaceIssueTaskResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.CreateWorkspaceIssueTask503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.CreateWorkspaceIssueTask400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
task, err := api.IssueService.CreateTask(ctx, string(request.WorkspaceID), string(request.IssueID), workspaceservice.CreateIssueManagerTaskInput{
TaskID: optionalString(request.Body.TaskId),
Title: request.Body.Title,
Content: optionalString(request.Body.Content),
Priority: optionalIssueManagerPriority(request.Body.Priority),
DueAtUnixMS: optionalUnixMillis(request.Body.DueAtUnix),
})
if err != nil {
return writeCreateWorkspaceIssueTaskError(err), nil
}
return tuttigenerated.CreateWorkspaceIssueTask201JSONResponse(
workspaceapi.GeneratedIssueManagerTaskResponseFromDomain(task),
), nil
}
func (api DaemonAPI) CreateWorkspaceIssueTasks(ctx context.Context, request tuttigenerated.CreateWorkspaceIssueTasksRequestObject) (tuttigenerated.CreateWorkspaceIssueTasksResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.CreateWorkspaceIssueTasks503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.CreateWorkspaceIssueTasks400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
tasksInput := make([]workspaceservice.CreateIssueManagerTaskItemInput, 0, len(request.Body.Tasks))
for _, task := range request.Body.Tasks {
tasksInput = append(tasksInput, workspaceservice.CreateIssueManagerTaskItemInput{
TaskID: optionalString(task.TaskId),
Title: task.Title,
Content: optionalString(task.Content),
Priority: optionalIssueManagerPriority(task.Priority),
DueAtUnixMS: optionalUnixMillis(task.DueAtUnix),
})
}
tasks, err := api.IssueService.CreateTasks(ctx, string(request.WorkspaceID), string(request.IssueID), workspaceservice.CreateIssueManagerTasksInput{
Tasks: tasksInput,
})
if err != nil {
return writeCreateWorkspaceIssueTasksError(err), nil
}
return tuttigenerated.CreateWorkspaceIssueTasks201JSONResponse(
workspaceapi.GeneratedIssueManagerTasksResponseFromDomain(tasks),
), nil
}
func (api DaemonAPI) DeleteWorkspaceIssueTask(ctx context.Context, request tuttigenerated.DeleteWorkspaceIssueTaskRequestObject) (tuttigenerated.DeleteWorkspaceIssueTaskResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.DeleteWorkspaceIssueTask503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
removed, err := api.IssueService.DeleteTask(ctx, string(request.WorkspaceID), string(request.IssueID), string(request.TaskID))
if err != nil {
return writeDeleteWorkspaceIssueTaskError(err), nil
}
return tuttigenerated.DeleteWorkspaceIssueTask200JSONResponse{Removed: removed}, nil
}
func (api DaemonAPI) GetWorkspaceIssueTaskDetail(ctx context.Context, request tuttigenerated.GetWorkspaceIssueTaskDetailRequestObject) (tuttigenerated.GetWorkspaceIssueTaskDetailResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.GetWorkspaceIssueTaskDetail503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
detail, err := api.IssueService.GetTaskDetail(ctx, string(request.WorkspaceID), string(request.IssueID), string(request.TaskID))
if err != nil {
return writeGetWorkspaceIssueTaskDetailError(err), nil
}
return tuttigenerated.GetWorkspaceIssueTaskDetail200JSONResponse(
workspaceapi.GeneratedIssueManagerTaskDetailResponseFromDomain(
detail,
api.IssueService.ProjectIssueManagerContextRefs(detail.ContextRefs),
),
), nil
}
func (api DaemonAPI) UpdateWorkspaceIssueTask(ctx context.Context, request tuttigenerated.UpdateWorkspaceIssueTaskRequestObject) (tuttigenerated.UpdateWorkspaceIssueTaskResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.UpdateWorkspaceIssueTask503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.UpdateWorkspaceIssueTask400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
task, err := api.IssueService.UpdateTask(ctx, string(request.WorkspaceID), string(request.IssueID), string(request.TaskID), workspaceservice.UpdateIssueManagerTaskInput{
Title: optionalString(request.Body.Title),
HasTitle: request.Body.Title != nil,
Content: optionalString(request.Body.Content),
HasContent: request.Body.Content != nil,
Status: optionalIssueManagerStatus(request.Body.Status),
HasStatus: request.Body.Status != nil,
Priority: optionalIssueManagerPriority(request.Body.Priority),
HasPriority: request.Body.Priority != nil,
DueAtUnixMS: optionalUnixMillis(request.Body.DueAtUnix),
HasDueAt: request.Body.DueAtUnix != nil,
SortIndex: optionalInt(request.Body.SortIndex),
HasSortIndex: request.Body.SortIndex != nil,
Parallelizable: request.Body.Parallelizable != nil && *request.Body.Parallelizable,
HasParallelizable: request.Body.Parallelizable != nil,
AutoAccept: request.Body.AutoAccept != nil && *request.Body.AutoAccept,
HasAutoAccept: request.Body.AutoAccept != nil,
AcceptanceState: optionalAcceptanceState(request.Body.AcceptanceState),
HasAcceptanceState: request.Body.AcceptanceState != nil,
AcceptanceSummary: optionalString(request.Body.AcceptanceSummary),
HasAcceptanceSummary: request.Body.AcceptanceSummary != nil,
})
if err != nil {
return writeUpdateWorkspaceIssueTaskError(err), nil
}
return tuttigenerated.UpdateWorkspaceIssueTask200JSONResponse(
workspaceapi.GeneratedIssueManagerTaskResponseFromDomain(task),
), nil
}
func (api DaemonAPI) AddWorkspaceIssueTaskContextRefs(ctx context.Context, request tuttigenerated.AddWorkspaceIssueTaskContextRefsRequestObject) (tuttigenerated.AddWorkspaceIssueTaskContextRefsResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.AddWorkspaceIssueTaskContextRefs503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.AddWorkspaceIssueTaskContextRefs400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
refs, err := api.IssueService.AddTaskContextRefs(ctx, string(request.WorkspaceID), string(request.IssueID), string(request.TaskID), workspaceservice.AddIssueManagerContextRefsInput{
Refs: issueManagerContextRefsInputFromGenerated(request.Body.Refs),
})
if err != nil {
return writeAddWorkspaceIssueTaskContextRefsError(err), nil
}
return tuttigenerated.AddWorkspaceIssueTaskContextRefs200JSONResponse(
workspaceapi.GeneratedIssueManagerContextRefsResponseFromService(
api.IssueService.ProjectIssueManagerContextRefs(refs),
),
), nil
}
func (api DaemonAPI) ListWorkspaceIssueRuns(ctx context.Context, request tuttigenerated.ListWorkspaceIssueRunsRequestObject) (tuttigenerated.ListWorkspaceIssueRunsResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.ListWorkspaceIssueRuns503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
runs, err := api.IssueService.ListRuns(ctx, string(request.WorkspaceID), string(request.IssueID), "")
if err != nil {
return writeListWorkspaceIssueRunsError(err), nil
}
return tuttigenerated.ListWorkspaceIssueRuns200JSONResponse(
workspaceapi.GeneratedIssueManagerRunListResponseFromDomain(runs),
), nil
}
func (api DaemonAPI) CreateWorkspaceIssueRun(ctx context.Context, request tuttigenerated.CreateWorkspaceIssueRunRequestObject) (tuttigenerated.CreateWorkspaceIssueRunResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.CreateWorkspaceIssueRun503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.CreateWorkspaceIssueRun400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
run, err := api.IssueService.CreateRun(ctx, string(request.WorkspaceID), string(request.IssueID), "", workspaceservice.CreateIssueManagerRunInput{
RunID: optionalString(request.Body.RunId),
AgentTargetID: request.Body.AgentTargetId,
AgentProvider: optionalString(request.Body.AgentProvider),
AgentUserID: optionalString(request.Body.AgentUserId),
AgentSessionID: optionalString(request.Body.AgentSessionId),
ExecutionDirectory: optionalString(request.Body.ExecutionDirectory),
})
if err != nil {
return writeCreateWorkspaceIssueRunError(err), nil
}
return tuttigenerated.CreateWorkspaceIssueRun201JSONResponse(
workspaceapi.GeneratedIssueManagerRunResponseFromDomain(run),
), nil
}
func (api DaemonAPI) StartWorkspaceIssueRun(ctx context.Context, request tuttigenerated.StartWorkspaceIssueRunRequestObject) (tuttigenerated.StartWorkspaceIssueRunResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.StartWorkspaceIssueRun503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.StartWorkspaceIssueRun400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
run, err := api.IssueService.StartIssueRun(ctx, string(request.WorkspaceID), string(request.IssueID), workspaceservice.StartIssueManagerRunInput{
AgentTargetID: request.Body.AgentTargetId,
ExecutionDirectory: optionalString(request.Body.ExecutionDirectory),
})
if err != nil {
return writeStartWorkspaceIssueRunError(err), nil
}
return tuttigenerated.StartWorkspaceIssueRun201JSONResponse(
workspaceapi.GeneratedIssueManagerRunResponseFromDomain(run),
), nil
}
func (api DaemonAPI) GetWorkspaceIssueRun(ctx context.Context, request tuttigenerated.GetWorkspaceIssueRunRequestObject) (tuttigenerated.GetWorkspaceIssueRunResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.GetWorkspaceIssueRun503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
detail, err := api.IssueService.GetRunDetail(ctx, string(request.WorkspaceID), string(request.IssueID), "", string(request.RunID))
if err != nil {
return writeGetWorkspaceIssueRunError(err), nil
}
return tuttigenerated.GetWorkspaceIssueRun200JSONResponse(
workspaceapi.GeneratedIssueManagerRunEnvelopeFromDomain(detail),
), nil
}
func (api DaemonAPI) CompleteWorkspaceIssueRun(ctx context.Context, request tuttigenerated.CompleteWorkspaceIssueRunRequestObject) (tuttigenerated.CompleteWorkspaceIssueRunResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.CompleteWorkspaceIssueRun503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.CompleteWorkspaceIssueRun400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
detail, err := api.IssueService.CompleteRun(ctx, string(request.WorkspaceID), string(request.IssueID), "", string(request.RunID), workspaceservice.CompleteIssueManagerRunInput{
Status: string(request.Body.Status),
Summary: optionalString(request.Body.Summary),
ErrorMessage: optionalString(request.Body.ErrorMessage),
Outputs: issueManagerRunOutputsInputFromGenerated(request.Body.Outputs),
Usage: issueManagerTokenUsageFromGenerated(request.Body.Usage),
RemainingQuotaPercent: optionalFloat64(request.Body.RemainingQuotaPercent),
HasRemainingQuotaPercent: request.Body.RemainingQuotaPercent != nil,
})
if err != nil {
return writeCompleteWorkspaceIssueRunError(err), nil
}
return tuttigenerated.CompleteWorkspaceIssueRun200JSONResponse(
workspaceapi.GeneratedIssueManagerRunEnvelopeFromDomain(detail),
), nil
}
func (api DaemonAPI) ListWorkspaceIssueTaskRuns(ctx context.Context, request tuttigenerated.ListWorkspaceIssueTaskRunsRequestObject) (tuttigenerated.ListWorkspaceIssueTaskRunsResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.ListWorkspaceIssueTaskRuns503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
runs, err := api.IssueService.ListRuns(ctx, string(request.WorkspaceID), string(request.IssueID), string(request.TaskID))
if err != nil {
return writeListWorkspaceIssueTaskRunsError(err), nil
}
return tuttigenerated.ListWorkspaceIssueTaskRuns200JSONResponse(
workspaceapi.GeneratedIssueManagerRunListResponseFromDomain(runs),
), nil
}
func (api DaemonAPI) CreateWorkspaceIssueTaskRun(ctx context.Context, request tuttigenerated.CreateWorkspaceIssueTaskRunRequestObject) (tuttigenerated.CreateWorkspaceIssueTaskRunResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.CreateWorkspaceIssueTaskRun503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.CreateWorkspaceIssueTaskRun400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
run, err := api.IssueService.CreateRun(ctx, string(request.WorkspaceID), string(request.IssueID), string(request.TaskID), workspaceservice.CreateIssueManagerRunInput{
RunID: optionalString(request.Body.RunId),
AgentTargetID: request.Body.AgentTargetId,
AgentProvider: optionalString(request.Body.AgentProvider),
AgentUserID: optionalString(request.Body.AgentUserId),
AgentSessionID: optionalString(request.Body.AgentSessionId),
ExecutionDirectory: optionalString(request.Body.ExecutionDirectory),
})
if err != nil {
return writeCreateWorkspaceIssueTaskRunError(err), nil
}
return tuttigenerated.CreateWorkspaceIssueTaskRun201JSONResponse(
workspaceapi.GeneratedIssueManagerRunResponseFromDomain(run),
), nil
}
func (api DaemonAPI) GetWorkspaceIssueTaskRun(ctx context.Context, request tuttigenerated.GetWorkspaceIssueTaskRunRequestObject) (tuttigenerated.GetWorkspaceIssueTaskRunResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.GetWorkspaceIssueTaskRun503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
detail, err := api.IssueService.GetRunDetail(ctx, string(request.WorkspaceID), string(request.IssueID), string(request.TaskID), string(request.RunID))
if err != nil {
return writeGetWorkspaceIssueTaskRunError(err), nil
}
return tuttigenerated.GetWorkspaceIssueTaskRun200JSONResponse(
workspaceapi.GeneratedIssueManagerRunEnvelopeFromDomain(detail),
), nil
}
func (api DaemonAPI) CompleteWorkspaceIssueTaskRun(ctx context.Context, request tuttigenerated.CompleteWorkspaceIssueTaskRunRequestObject) (tuttigenerated.CompleteWorkspaceIssueTaskRunResponseObject, error) {
if api.IssueService == nil {
return tuttigenerated.CompleteWorkspaceIssueTaskRun503JSONResponse{ServiceUnavailableErrorJSONResponse: issueManagerServiceUnavailableError()}, nil
}
if request.Body == nil {
return tuttigenerated.CompleteWorkspaceIssueTaskRun400JSONResponse{InvalidRequestErrorJSONResponse: issueManagerEmptyBodyError()}, nil
}
detail, err := api.IssueService.CompleteRun(ctx, string(request.WorkspaceID), string(request.IssueID), string(request.TaskID), string(request.RunID), workspaceservice.CompleteIssueManagerRunInput{
Status: string(request.Body.Status),
Summary: optionalString(request.Body.Summary),
ErrorMessage: optionalString(request.Body.ErrorMessage),
Outputs: issueManagerRunOutputsInputFromGenerated(request.Body.Outputs),
Usage: issueManagerTokenUsageFromGenerated(request.Body.Usage),
RemainingQuotaPercent: optionalFloat64(request.Body.RemainingQuotaPercent),
HasRemainingQuotaPercent: request.Body.RemainingQuotaPercent != nil,
})
if err != nil {
return writeCompleteWorkspaceIssueTaskRunError(err), nil
}
return tuttigenerated.CompleteWorkspaceIssueTaskRun200JSONResponse(
workspaceapi.GeneratedIssueManagerRunEnvelopeFromDomain(detail),
), nil
}
func issueManagerIssueListInputFromGenerated(params tuttigenerated.ListWorkspaceIssuesParams) workspaceservice.ListIssueManagerItemsInput {
input := workspaceservice.ListIssueManagerItemsInput{
TopicID: string(params.TopicId),
}
if params.PageSize != nil {
input.PageSize = int(*params.PageSize)
}
if params.PageToken != nil {
input.PageToken = string(*params.PageToken)
}
if params.StatusFilter != nil {
input.StatusFilter = string(*params.StatusFilter)
}
if params.SearchQuery != nil {
input.SearchQuery = string(*params.SearchQuery)
}
return input
}
func issueManagerTaskListInputFromGenerated(params tuttigenerated.ListWorkspaceIssueTasksParams) workspaceservice.ListIssueManagerItemsInput {
input := workspaceservice.ListIssueManagerItemsInput{}
if params.PageSize != nil {
input.PageSize = int(*params.PageSize)
}
if params.PageToken != nil {
input.PageToken = string(*params.PageToken)
}
if params.StatusFilter != nil {
input.StatusFilter = string(*params.StatusFilter)
}
if params.SearchQuery != nil {
input.SearchQuery = string(*params.SearchQuery)
}
return input
}
func issueManagerCreateIssueInputFromGenerated(item tuttigenerated.CreateIssueManagerIssueRequest) (workspaceservice.CreateIssueManagerIssueInput, error) {
attachments, err := issueManagerImageAttachmentsInputFromGenerated(item.Attachments)
if err != nil {
return workspaceservice.CreateIssueManagerIssueInput{}, err
}
return workspaceservice.CreateIssueManagerIssueInput{
IssueID: optionalString(item.IssueId),
TopicID: item.TopicId,
Title: item.Title,
Content: optionalString(item.Content),
PlanningSource: optionalPlanningSource(item.PlanningSource),
SourceSessionID: optionalString(item.SourceSessionId),
SequentialExecution: optionalBool(item.SequentialExecution),
ParallelExecution: optionalBool(item.ParallelExecution),
ExecutionProfile: issueManagerExecutionProfileFromGenerated(item.ExecutionProfile),
HasExecutionProfile: item.ExecutionProfile != nil,
Budget: issueManagerBudgetFromGenerated(item.Budget),
HasBudget: item.Budget != nil,
Attachments: attachments,
}, nil
}
func issueManagerCreatePlannedIssueInputFromGenerated(item tuttigenerated.CreateIssueManagerPlannedIssueRequest) workspaceservice.CreateIssueManagerIssueInput {
return workspaceservice.CreateIssueManagerIssueInput{
IssueID: optionalString(item.IssueId),
TopicID: item.TopicId,
Title: item.Title,
Content: optionalString(item.Content),
PlanningSource: optionalPlanningSource(item.PlanningSource),
SourceSessionID: optionalString(item.SourceSessionId),
SequentialExecution: optionalBool(item.SequentialExecution),
ParallelExecution: optionalBool(item.ParallelExecution),
ExecutionProfile: issueManagerExecutionProfileFromGenerated(item.ExecutionProfile),
HasExecutionProfile: item.ExecutionProfile != nil,
Budget: issueManagerBudgetFromGenerated(item.Budget),
HasBudget: item.Budget != nil,
}
}
func issueManagerImageAttachmentsInputFromGenerated(items *[]tuttigenerated.CreateIssueManagerImageAttachmentRequest) ([]workspaceservice.CreateIssueManagerImageAttachmentInput, error) {
if items == nil {
return nil, nil
}
if len(*items) > 8 {
return nil, workspaceissues.ErrInvalidArgument
}
attachments := make([]workspaceservice.CreateIssueManagerImageAttachmentInput, 0, len(*items))
for _, item := range *items {
encoded := strings.TrimSpace(item.DataBase64)
if !item.MimeType.Valid() || encoded == "" {
return nil, workspaceissues.ErrInvalidArgument
}
data, err := base64.StdEncoding.DecodeString(encoded)
if err != nil {
return nil, workspaceissues.ErrInvalidArgument
}
attachmentID := ""
if item.AttachmentId != nil {
attachmentID = item.AttachmentId.String()
}
attachments = append(attachments, workspaceservice.CreateIssueManagerImageAttachmentInput{
AttachmentID: attachmentID,
DisplayName: optionalString(item.DisplayName),
MimeType: string(item.MimeType),
Data: data,
})
}
return attachments, nil
}
func issueManagerCreateTaskInputFromGenerated(item tuttigenerated.CreateIssueManagerTaskRequest) workspaceservice.CreateIssueManagerTaskItemInput {
return workspaceservice.CreateIssueManagerTaskItemInput{
TaskID: optionalString(item.TaskId),
Title: item.Title,
Content: optionalString(item.Content),
Priority: optionalIssueManagerPriority(item.Priority),
DueAtUnixMS: optionalUnixMillis(item.DueAtUnix),
AgentTargetID: optionalString(item.AgentTargetId),
ModelPlanID: optionalString(item.ModelPlanId),
Model: optionalString(item.Model),
ExecutionDirectory: optionalString(item.ExecutionDirectory),
DependencyTaskIDs: issueManagerOptionalStringSlice(item.DependencyTaskIds),
Parallelizable: item.Parallelizable != nil && *item.Parallelizable,
AutoAccept: item.AutoAccept != nil && *item.AutoAccept,
}
}
func issueManagerExecutionProfileFromGenerated(value *tuttigenerated.IssueManagerExecutionProfile) workspaceissues.ExecutionProfile {
if value == nil {
return workspaceissues.ExecutionProfile{}
}
return workspaceissues.ExecutionProfile{ReasoningIntensity: value.ReasoningIntensity, OrchestrationIntensity: value.OrchestrationIntensity}
}
func issueManagerBudgetFromGenerated(value *tuttigenerated.IssueManagerBudget) workspaceissues.Budget {
if value == nil {
return workspaceissues.Budget{}
}
return workspaceissues.Budget{Mode: workspaceissues.BudgetMode(value.Mode), TokenLimit: value.TokenLimit, ConsumedTokens: value.ConsumedTokens, QuotaWaterlinePercent: value.QuotaWaterlinePercent, RemainingQuotaPercent: optionalFloat64(value.RemainingQuotaPercent), HasRemainingQuota: value.RemainingQuotaPercent != nil, Status: workspaceissues.BudgetStatus(value.Status)}
}
func issueManagerTokenUsageFromGenerated(value *tuttigenerated.IssueManagerTokenUsage) workspaceissues.TokenUsage {
if value == nil {
return workspaceissues.TokenUsage{}
}
return workspaceissues.TokenUsage{InputTokens: value.InputTokens, OutputTokens: value.OutputTokens, CacheReadTokens: value.CacheReadTokens, CacheWriteTokens: value.CacheWriteTokens}
}
func optionalFloat64(value *float64) float64 {
if value == nil {
return 0
}
return *value
}
func issueManagerOptionalStringSlice(value *[]string) []string {
if value == nil {
return nil
}
return append([]string(nil), (*value)...)
}
func optionalPlanningSource(value *tuttigenerated.IssueManagerPlanningSource) string {
if value == nil {
return ""
}
return string(*value)
}
func issueManagerContextRefsInputFromGenerated(items []tuttigenerated.AddIssueManagerContextRefItem) []workspaceissues.AddContextRefInput {
refs := make([]workspaceissues.AddContextRefInput, 0, len(items))
for _, item := range items {
refs = append(refs, workspaceissues.AddContextRefInput{
ContextRefID: optionalString(item.ContextRefId),
RefType: item.RefType,
Path: item.Path,
DisplayName: optionalString(item.DisplayName),
})
}
return refs
}
func issueManagerRunOutputsInputFromGenerated(items []tuttigenerated.CompleteIssueManagerRunOutputItem) []workspaceissues.CompleteRunOutputInput {
outputs := make([]workspaceissues.CompleteRunOutputInput, 0, len(items))
for _, item := range items {
outputs = append(outputs, workspaceissues.CompleteRunOutputInput{
OutputID: optionalString(item.OutputId),
Path: item.Path,
DisplayName: optionalString(item.DisplayName),
MediaType: optionalString(item.MediaType),
SizeBytes: optionalInt64(item.SizeBytes),
})
}
return outputs
}
func issueManagerEmptyBodyError() tuttigenerated.InvalidRequestErrorJSONResponse {
return invalidRequestError(apierrors.EmptyBody(apierrors.WithDeveloperMessage("empty body")))
}
func optionalString(value *string) string {
if value == nil {
return ""
}
return strings.TrimSpace(*value)
}
func optionalInt64(value *int64) int64 {
if value == nil {
return 0
}
return *value
}
func optionalInt(value *int) int {
if value == nil {
return 0
}
return *value
}
func optionalBool(value *bool) bool {
if value == nil {
return false
}
return *value
}
func optionalUnixMillis(value *int64) int64 {
return workspaceapi.UnixMillisFromSeconds(optionalInt64(value))
}
func optionalIssueManagerStatus(value *tuttigenerated.IssueManagerStatus) string {
if value == nil {
return ""
}
return string(*value)
}
func optionalIssueManagerPriority(value *tuttigenerated.IssueManagerPriority) string {
if value == nil {
return ""
}
return string(*value)
}
func optionalAcceptanceState(value *tuttigenerated.IssueManagerAcceptanceState) string {
if value == nil {
return ""
}
return string(*value)
}