( ctx context.Context, scope toolspkg.Scope, req toolspkg.CallRequest, )
| 2980 | } |
| 2981 | |
| 2982 | func (n *daemonNativeTools) taskPromoteFromThread( |
| 2983 | ctx context.Context, |
| 2984 | scope toolspkg.Scope, |
| 2985 | req toolspkg.CallRequest, |
| 2986 | ) (toolspkg.ToolResult, error) { |
| 2987 | var input taskPromoteFromThreadInput |
| 2988 | if err := decodeNativeInput(req, &input); err != nil { |
| 2989 | return toolspkg.ToolResult{}, err |
| 2990 | } |
| 2991 | source, err := n.nativeThreadPromotionSource(ctx, scope, req.ToolID, input) |
| 2992 | if err != nil { |
| 2993 | return toolspkg.ToolResult{}, err |
| 2994 | } |
| 2995 | actor, err := actorContextFromScope(scope) |
| 2996 | if err != nil { |
| 2997 | return toolspkg.ToolResult{}, err |
| 2998 | } |
| 2999 | spec := taskpkg.CreateTask{ |
| 3000 | Scope: taskpkg.ScopeWorkspace, |
| 3001 | WorkspaceID: source.workspaceID, |
| 3002 | NetworkChannel: source.channel, |
| 3003 | Title: nativePromotedThreadTaskTitle(input, source), |
| 3004 | Description: firstNonEmpty(strings.TrimSpace(input.Description), source.digest), |
| 3005 | Priority: taskpkg.Priority(strings.TrimSpace(input.Priority)).Normalize(), |
| 3006 | Metadata: cloneJSON(input.Metadata), |
| 3007 | } |
| 3008 | taskRecord, err := n.deps.Tasks.CreateTask(ctx, spec, actor) |
| 3009 | if err != nil { |
| 3010 | return toolspkg.ToolResult{}, err |
| 3011 | } |
| 3012 | now := time.Now().UTC() |
| 3013 | origin := store.NetworkTaskThreadOrigin{ |
| 3014 | TaskID: taskRecord.ID, |
| 3015 | WorkspaceID: source.workspaceID, |
| 3016 | Channel: source.channel, |
| 3017 | ThreadID: source.threadID, |
| 3018 | OriginMessageID: source.originMessageID, |
| 3019 | Digest: source.digest, |
| 3020 | SourceMessageIDs: source.sourceMessageIDs, |
| 3021 | CreatedAt: now, |
| 3022 | UpdatedAt: now, |
| 3023 | } |
| 3024 | if err := origin.Validate(); err != nil { |
| 3025 | return toolspkg.ToolResult{}, nativeNetworkInputError( |
| 3026 | req.ToolID, |
| 3027 | n.rollbackPromotedThreadTask(ctx, taskRecord.ID, actor, err), |
| 3028 | ) |
| 3029 | } |
| 3030 | if err := n.deps.NetworkStore.PutNetworkTaskThreadOrigin(ctx, origin); err != nil { |
| 3031 | return toolspkg.ToolResult{}, nativeNetworkInputError( |
| 3032 | req.ToolID, |
| 3033 | n.rollbackPromotedThreadTask(ctx, taskRecord.ID, actor, err), |
| 3034 | ) |
| 3035 | } |
| 3036 | return structuredResult( |
| 3037 | map[string]any{"task": taskRecord, "origin": core.NetworkTaskThreadOriginPayloadFromStore(origin)}, |
| 3038 | taskRecord.Title, |
| 3039 | ) |
nothing calls this directly
no test coverage detected