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

400 lines
15 KiB
Go

package workspace
import (
workspaceissues "github.com/tutti-os/tutti/packages/workspace/issues"
tuttigenerated "github.com/tutti-os/tutti/services/tuttid/api/generated"
workspaceservice "github.com/tutti-os/tutti/services/tuttid/service/workspace"
)
func GeneratedIssueManagerIssueFromDomain(item workspaceissues.Issue) tuttigenerated.IssueManagerIssue {
return tuttigenerated.IssueManagerIssue{
IssueId: item.IssueID,
WorkspaceId: item.WorkspaceID,
TopicId: item.TopicID,
Title: item.Title,
Content: item.Content,
Status: tuttigenerated.IssueManagerStatus(item.Status),
PlanningSource: tuttigenerated.IssueManagerPlanningSource(item.PlanningSource),
SourceSessionId: item.SourceSessionID,
SequentialExecution: item.SequentialExecution,
ParallelExecution: item.ParallelExecution,
DispatchPaused: item.DispatchPaused,
ExecutionProfile: tuttigenerated.IssueManagerExecutionProfile{
ReasoningIntensity: item.ExecutionProfile.ReasoningIntensity,
OrchestrationIntensity: item.ExecutionProfile.OrchestrationIntensity,
},
Budget: tuttigenerated.IssueManagerBudget{
Mode: tuttigenerated.IssueManagerBudgetMode(item.Budget.Mode),
TokenLimit: item.Budget.TokenLimit,
ConsumedTokens: item.Budget.ConsumedTokens,
QuotaWaterlinePercent: item.Budget.QuotaWaterlinePercent,
RemainingQuotaPercent: issueManagerRemainingQuotaPercent(item.Budget),
Status: tuttigenerated.IssueManagerBudgetStatus(item.Budget.Status),
},
TaskCount: item.TaskCount,
NotStartedCount: item.NotStartedCount,
RunningCount: item.RunningCount,
PendingAcceptanceCount: item.PendingAcceptanceCount,
CompletedCount: item.CompletedCount,
FailedCount: item.FailedCount,
CanceledCount: item.CanceledCount,
CreatorUserId: item.CreatorUserID,
CreatorDisplayName: item.CreatorDisplayName,
CreatorAvatarUrl: item.CreatorAvatarURL,
CreatedAtUnix: unixSecondsFromMillis(item.CreatedAtUnixMS),
UpdatedAtUnix: unixSecondsFromMillis(item.UpdatedAtUnixMS),
}
}
func issueManagerRemainingQuotaPercent(budget workspaceissues.Budget) *float64 {
if !budget.HasRemainingQuota {
return nil
}
value := budget.RemainingQuotaPercent
return &value
}
func GeneratedIssueManagerTopicFromDomain(item workspaceissues.Topic) tuttigenerated.IssueManagerTopic {
return tuttigenerated.IssueManagerTopic{
TopicId: item.TopicID,
WorkspaceId: item.WorkspaceID,
Title: item.Title,
Summary: item.Summary,
IsDefault: item.IsDefault,
PinnedAtUnix: unixSecondsFromMillis(item.PinnedAtUnixMS),
LastActivityAtUnix: unixSecondsFromMillis(item.LastActivityAtUnixMS),
CreatedAtUnix: unixSecondsFromMillis(item.CreatedAtUnixMS),
UpdatedAtUnix: unixSecondsFromMillis(item.UpdatedAtUnixMS),
}
}
func GeneratedIssueManagerTopicsFromDomain(items []workspaceissues.Topic) []tuttigenerated.IssueManagerTopic {
if len(items) == 0 {
return []tuttigenerated.IssueManagerTopic{}
}
result := make([]tuttigenerated.IssueManagerTopic, 0, len(items))
for _, item := range items {
result = append(result, GeneratedIssueManagerTopicFromDomain(item))
}
return result
}
func GeneratedIssueManagerTopicListResponseFromDomain(list workspaceissues.TopicList) tuttigenerated.IssueManagerTopicListResponse {
return tuttigenerated.IssueManagerTopicListResponse{
Topics: GeneratedIssueManagerTopicsFromDomain(list.Items),
}
}
func GeneratedIssueManagerTopicResponseFromDomain(item workspaceissues.Topic) tuttigenerated.IssueManagerTopicResponse {
return tuttigenerated.IssueManagerTopicResponse{
Topic: GeneratedIssueManagerTopicFromDomain(item),
}
}
func GeneratedIssueManagerIssueListResponseFromDomain(list workspaceissues.IssueList) tuttigenerated.IssueManagerIssueListResponse {
return tuttigenerated.IssueManagerIssueListResponse{
Issues: GeneratedIssueManagerIssuesFromDomain(list.Items),
NextPageToken: stringPointerIfNotEmpty(list.NextPageToken),
TotalCount: list.TotalCount,
StatusCounts: GeneratedIssueManagerStatusCountsFromDomain(list.StatusCounts),
}
}
func GeneratedIssueManagerIssueResponseFromDomain(item workspaceissues.Issue) tuttigenerated.IssueManagerIssueResponse {
return tuttigenerated.IssueManagerIssueResponse{
Issue: GeneratedIssueManagerIssueFromDomain(item),
}
}
func GeneratedIssueManagerIssueDetailResponseFromDomain(
detail workspaceissues.IssueDetail,
contextRefs []workspaceservice.IssueManagerContextRefView,
) tuttigenerated.IssueManagerIssueDetailResponse {
return tuttigenerated.IssueManagerIssueDetailResponse{
Issue: GeneratedIssueManagerIssueFromDomain(detail.Issue),
Tasks: GeneratedIssueManagerTasksFromDomain(detail.Tasks),
ContextRefs: GeneratedIssueManagerContextRefsFromService(contextRefs),
LatestRun: latestRunPointer(detail.LatestRun),
RecentRuns: GeneratedIssueManagerRunsFromDomain(detail.RecentRuns),
LatestOutputs: GeneratedIssueManagerRunOutputsFromDomain(detail.LatestOutputs),
}
}
func GeneratedIssueManagerIssuesFromDomain(items []workspaceissues.Issue) []tuttigenerated.IssueManagerIssue {
if len(items) == 0 {
return []tuttigenerated.IssueManagerIssue{}
}
result := make([]tuttigenerated.IssueManagerIssue, 0, len(items))
for _, item := range items {
result = append(result, GeneratedIssueManagerIssueFromDomain(item))
}
return result
}
func GeneratedIssueManagerTaskFromDomain(item workspaceissues.Task) tuttigenerated.IssueManagerTask {
return tuttigenerated.IssueManagerTask{
TaskId: item.TaskID,
IssueId: item.IssueID,
WorkspaceId: item.WorkspaceID,
Title: item.Title,
Content: item.Content,
Status: tuttigenerated.IssueManagerStatus(item.Status),
Priority: tuttigenerated.IssueManagerPriority(item.Priority),
SortIndex: item.SortIndex,
DueAtUnix: unixSecondsFromMillis(item.DueAtUnixMS),
CreatorUserId: item.CreatorUserID,
CreatorDisplayName: item.CreatorDisplayName,
CreatorAvatarUrl: item.CreatorAvatarURL,
LatestRunId: item.LatestRunID,
AgentTargetId: item.AgentTargetID,
ModelPlanId: item.ModelPlanID,
Model: item.Model,
ExecutionDirectory: item.ExecutionDirectory,
DependencyTaskIds: append([]string(nil), item.DependencyTaskIDs...),
Parallelizable: item.Parallelizable,
AutoAccept: item.AutoAccept,
AcceptanceState: tuttigenerated.IssueManagerAcceptanceState(item.AcceptanceState),
AcceptanceSummary: item.AcceptanceSummary,
SupersededAtUnix: unixSecondsFromMillis(item.SupersededAtUnixMS),
SupersededByTaskId: item.SupersededByTaskID,
CreatedAtUnix: unixSecondsFromMillis(item.CreatedAtUnixMS),
UpdatedAtUnix: unixSecondsFromMillis(item.UpdatedAtUnixMS),
}
}
func GeneratedIssueManagerTaskListResponseFromDomain(list workspaceissues.TaskList) tuttigenerated.IssueManagerTaskListResponse {
return tuttigenerated.IssueManagerTaskListResponse{
Tasks: GeneratedIssueManagerTasksFromDomain(list.Items),
NextPageToken: stringPointerIfNotEmpty(list.NextPageToken),
TotalCount: list.TotalCount,
StatusCounts: GeneratedIssueManagerStatusCountsFromDomain(list.StatusCounts),
}
}
func GeneratedIssueManagerTaskResponseFromDomain(item workspaceissues.Task) tuttigenerated.IssueManagerTaskResponse {
return tuttigenerated.IssueManagerTaskResponse{
Task: GeneratedIssueManagerTaskFromDomain(item),
}
}
func GeneratedIssueManagerTasksResponseFromDomain(items []workspaceissues.Task) tuttigenerated.IssueManagerTasksResponse {
return tuttigenerated.IssueManagerTasksResponse{
Tasks: GeneratedIssueManagerTasksFromDomain(items),
}
}
func GeneratedIssueManagerTaskDetailResponseFromDomain(
detail workspaceissues.TaskDetail,
contextRefs []workspaceservice.IssueManagerContextRefView,
) tuttigenerated.IssueManagerTaskDetailResponse {
return tuttigenerated.IssueManagerTaskDetailResponse{
Task: GeneratedIssueManagerTaskFromDomain(detail.Task),
ContextRefs: GeneratedIssueManagerContextRefsFromService(contextRefs),
LatestRun: latestRunPointer(detail.LatestRun),
RecentRuns: GeneratedIssueManagerRunsFromDomain(detail.RecentRuns),
LatestOutputs: GeneratedIssueManagerRunOutputsFromDomain(detail.LatestOutputs),
}
}
func GeneratedIssueManagerTasksFromDomain(items []workspaceissues.Task) []tuttigenerated.IssueManagerTask {
if len(items) == 0 {
return []tuttigenerated.IssueManagerTask{}
}
result := make([]tuttigenerated.IssueManagerTask, 0, len(items))
for _, item := range items {
result = append(result, GeneratedIssueManagerTaskFromDomain(item))
}
return result
}
func GeneratedIssueManagerRunFromDomain(item workspaceissues.Run) tuttigenerated.IssueManagerRun {
return tuttigenerated.IssueManagerRun{
RunId: item.RunID,
TaskId: stringPointerIfNotEmpty(item.TaskID),
IssueId: item.IssueID,
WorkspaceId: item.WorkspaceID,
RequesterUserId: item.RequesterUserID,
AgentUserId: item.AgentUserID,
AgentTargetId: item.AgentTargetID,
AgentSessionId: item.AgentSessionID,
AgentProvider: item.AgentProvider,
Status: tuttigenerated.IssueManagerStatus(item.Status),
Summary: item.Summary,
ErrorMessage: item.ErrorMessage,
OutputDir: item.OutputDir,
ExecutionDirectory: item.ExecutionDirectory,
CreatedAtUnix: unixSecondsFromMillis(item.CreatedAtUnixMS),
StartedAtUnix: unixSecondsFromMillis(item.StartedAtUnixMS),
CompletedAtUnix: unixSecondsFromMillis(item.CompletedAtUnixMS),
UpdatedAtUnix: unixSecondsFromMillis(item.UpdatedAtUnixMS),
}
}
func GeneratedIssueManagerRunResponseFromDomain(item workspaceissues.Run) tuttigenerated.IssueManagerRunResponse {
return tuttigenerated.IssueManagerRunResponse{
Run: GeneratedIssueManagerRunFromDomain(item),
}
}
func GeneratedIssueManagerRunListResponseFromDomain(items []workspaceissues.Run) tuttigenerated.IssueManagerRunListResponse {
return tuttigenerated.IssueManagerRunListResponse{
Runs: GeneratedIssueManagerRunsFromDomain(items),
}
}
func GeneratedIssueManagerRunEnvelopeFromDomain(detail workspaceissues.RunDetail) tuttigenerated.IssueManagerRunEnvelope {
return tuttigenerated.IssueManagerRunEnvelope{
Run: GeneratedIssueManagerRunFromDomain(detail.Run),
Outputs: GeneratedIssueManagerRunOutputsFromDomain(detail.Outputs),
}
}
func GeneratedIssueManagerRunsFromDomain(items []workspaceissues.Run) []tuttigenerated.IssueManagerRun {
if len(items) == 0 {
return []tuttigenerated.IssueManagerRun{}
}
result := make([]tuttigenerated.IssueManagerRun, 0, len(items))
for _, item := range items {
result = append(result, GeneratedIssueManagerRunFromDomain(item))
}
return result
}
func GeneratedIssueManagerRunOutputFromDomain(item workspaceissues.RunOutput) tuttigenerated.IssueManagerRunOutput {
return tuttigenerated.IssueManagerRunOutput{
OutputId: item.OutputID,
RunId: item.RunID,
TaskId: stringPointerIfNotEmpty(item.TaskID),
IssueId: item.IssueID,
WorkspaceId: item.WorkspaceID,
Path: item.Path,
DisplayName: item.DisplayName,
MediaType: item.MediaType,
SizeBytes: item.SizeBytes,
CreatedAtUnix: unixSecondsFromMillis(item.CreatedAtUnixMS),
}
}
func latestRunPointer(item *workspaceissues.Run) *tuttigenerated.IssueManagerRun {
if item == nil {
return nil
}
value := GeneratedIssueManagerRunFromDomain(*item)
return &value
}
func GeneratedIssueManagerRunOutputsFromDomain(items []workspaceissues.RunOutput) []tuttigenerated.IssueManagerRunOutput {
if len(items) == 0 {
return []tuttigenerated.IssueManagerRunOutput{}
}
result := make([]tuttigenerated.IssueManagerRunOutput, 0, len(items))
for _, item := range items {
result = append(result, GeneratedIssueManagerRunOutputFromDomain(item))
}
return result
}
func GeneratedIssueManagerReferenceSearchResponseFromDomain(workspaceID string, hits []workspaceissues.RunOutputSearchHit) tuttigenerated.IssueManagerReferenceSearchResponse {
items := make([]tuttigenerated.IssueManagerReferenceSearchHit, 0, len(hits))
for _, hit := range hits {
items = append(items, tuttigenerated.IssueManagerReferenceSearchHit{
Output: GeneratedIssueManagerRunOutputFromDomain(hit.Output),
IssueTitle: hit.IssueTitle,
})
}
return tuttigenerated.IssueManagerReferenceSearchResponse{
WorkspaceId: workspaceID,
Items: items,
}
}
func GeneratedIssueManagerContextRefsResponseFromService(
items []workspaceservice.IssueManagerContextRefView,
) tuttigenerated.IssueManagerContextRefsResponse {
return tuttigenerated.IssueManagerContextRefsResponse{
ContextRefs: GeneratedIssueManagerContextRefsFromService(items),
}
}
func GeneratedIssueManagerContextRefsFromService(
items []workspaceservice.IssueManagerContextRefView,
) []tuttigenerated.IssueManagerContextRef {
if len(items) == 0 {
return []tuttigenerated.IssueManagerContextRef{}
}
result := make([]tuttigenerated.IssueManagerContextRef, 0, len(items))
for _, item := range items {
result = append(result, GeneratedIssueManagerContextRefFromService(item))
}
return result
}
func GeneratedIssueManagerContextRefFromService(
view workspaceservice.IssueManagerContextRefView,
) tuttigenerated.IssueManagerContextRef {
item := view.Ref
if item.ParentKind == workspaceissues.ContextRefParentTask {
ref := tuttigenerated.IssueManagerContextRef{}
_ = ref.FromIssueManagerTaskContextRef(tuttigenerated.IssueManagerTaskContextRef{
AccessKind: tuttigenerated.IssueManagerTaskContextRefAccessKind(view.AccessKind),
ContextRefId: item.ContextRefID,
WorkspaceId: item.WorkspaceID,
IssueId: item.IssueID,
TaskId: item.TaskID,
ParentKind: tuttigenerated.IssueManagerTaskContextRefParentKindTask,
RefType: item.RefType,
Path: view.Path,
DisplayName: item.DisplayName,
CreatedAtUnix: unixSecondsFromMillis(item.CreatedAtUnixMS),
})
return ref
}
ref := tuttigenerated.IssueManagerContextRef{}
_ = ref.FromIssueManagerIssueContextRef(tuttigenerated.IssueManagerIssueContextRef{
AccessKind: tuttigenerated.IssueManagerIssueContextRefAccessKind(view.AccessKind),
ContextRefId: item.ContextRefID,
WorkspaceId: item.WorkspaceID,
IssueId: item.IssueID,
ParentKind: tuttigenerated.IssueManagerIssueContextRefParentKindIssue,
RefType: item.RefType,
Path: view.Path,
DisplayName: item.DisplayName,
CreatedAtUnix: unixSecondsFromMillis(item.CreatedAtUnixMS),
})
return ref
}
func GeneratedIssueManagerStatusCountsFromDomain(counts workspaceissues.StatusCounts) tuttigenerated.IssueManagerStatusCounts {
return tuttigenerated.IssueManagerStatusCounts{
All: counts.All,
NotStarted: counts.NotStarted,
Running: counts.Running,
PendingAcceptance: counts.PendingAcceptance,
Completed: counts.Completed,
Failed: counts.Failed,
Canceled: counts.Canceled,
}
}
func UnixMillisFromSeconds(value int64) int64 {
if value <= 0 {
return 0
}
return value * 1000
}
func unixSecondsFromMillis(value int64) int64 {
if value <= 0 {
return 0
}
return value / 1000
}
func stringPointerIfNotEmpty(value string) *string {
if value == "" {
return nil
}
return &value
}