feat(workflow): enforce review-only done for agent assignees + reviewer decision endpoint

This commit is contained in:
Abhimanyu Saharan
2026-02-02 21:33:22 +05:30
parent 52b2797b1d
commit b59a08f632
5 changed files with 248 additions and 1 deletions

View File

@@ -32,6 +32,7 @@ export * from "./task";
export * from "./taskComment";
export * from "./taskCommentCreate";
export * from "./taskCreate";
export * from "./taskReviewDecision";
export * from "./taskUpdate";
export * from "./team";
export * from "./teamCreate";

View File

@@ -0,0 +1,11 @@
/**
* Generated by orval v8.2.0 🍺
* Do not edit manually.
* OpenClaw Agency API
* OpenAPI spec version: 0.3.0
*/
export interface TaskReviewDecision {
decision: string;
comment_body: string;
}

View File

@@ -28,6 +28,7 @@ import type {
TaskComment,
TaskCommentCreate,
TaskCreate,
TaskReviewDecision,
TaskUpdate,
} from ".././model";
@@ -467,6 +468,130 @@ export const useDispatchTaskTasksTaskIdDispatchPost = <
queryClient,
);
};
/**
* Reviewer approves or requests changes.
- Approve => status=done
- Changes => status=in_progress
Always writes a TaskComment by the reviewer for audit.
* @summary Review Task
*/
export type reviewTaskTasksTaskIdReviewPostResponse200 = {
data: Task;
status: 200;
};
export type reviewTaskTasksTaskIdReviewPostResponse422 = {
data: HTTPValidationError;
status: 422;
};
export type reviewTaskTasksTaskIdReviewPostResponseSuccess =
reviewTaskTasksTaskIdReviewPostResponse200 & {
headers: Headers;
};
export type reviewTaskTasksTaskIdReviewPostResponseError =
reviewTaskTasksTaskIdReviewPostResponse422 & {
headers: Headers;
};
export type reviewTaskTasksTaskIdReviewPostResponse =
| reviewTaskTasksTaskIdReviewPostResponseSuccess
| reviewTaskTasksTaskIdReviewPostResponseError;
export const getReviewTaskTasksTaskIdReviewPostUrl = (taskId: number) => {
return `/tasks/${taskId}/review`;
};
export const reviewTaskTasksTaskIdReviewPost = async (
taskId: number,
taskReviewDecision: TaskReviewDecision,
options?: RequestInit,
): Promise<reviewTaskTasksTaskIdReviewPostResponse> => {
return customFetch<reviewTaskTasksTaskIdReviewPostResponse>(
getReviewTaskTasksTaskIdReviewPostUrl(taskId),
{
...options,
method: "POST",
headers: { "Content-Type": "application/json", ...options?.headers },
body: JSON.stringify(taskReviewDecision),
},
);
};
export const getReviewTaskTasksTaskIdReviewPostMutationOptions = <
TError = HTTPValidationError,
TContext = unknown,
>(options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof reviewTaskTasksTaskIdReviewPost>>,
TError,
{ taskId: number; data: TaskReviewDecision },
TContext
>;
request?: SecondParameter<typeof customFetch>;
}): UseMutationOptions<
Awaited<ReturnType<typeof reviewTaskTasksTaskIdReviewPost>>,
TError,
{ taskId: number; data: TaskReviewDecision },
TContext
> => {
const mutationKey = ["reviewTaskTasksTaskIdReviewPost"];
const { mutation: mutationOptions, request: requestOptions } = options
? options.mutation &&
"mutationKey" in options.mutation &&
options.mutation.mutationKey
? options
: { ...options, mutation: { ...options.mutation, mutationKey } }
: { mutation: { mutationKey }, request: undefined };
const mutationFn: MutationFunction<
Awaited<ReturnType<typeof reviewTaskTasksTaskIdReviewPost>>,
{ taskId: number; data: TaskReviewDecision }
> = (props) => {
const { taskId, data } = props ?? {};
return reviewTaskTasksTaskIdReviewPost(taskId, data, requestOptions);
};
return { mutationFn, ...mutationOptions };
};
export type ReviewTaskTasksTaskIdReviewPostMutationResult = NonNullable<
Awaited<ReturnType<typeof reviewTaskTasksTaskIdReviewPost>>
>;
export type ReviewTaskTasksTaskIdReviewPostMutationBody = TaskReviewDecision;
export type ReviewTaskTasksTaskIdReviewPostMutationError = HTTPValidationError;
/**
* @summary Review Task
*/
export const useReviewTaskTasksTaskIdReviewPost = <
TError = HTTPValidationError,
TContext = unknown,
>(
options?: {
mutation?: UseMutationOptions<
Awaited<ReturnType<typeof reviewTaskTasksTaskIdReviewPost>>,
TError,
{ taskId: number; data: TaskReviewDecision },
TContext
>;
request?: SecondParameter<typeof customFetch>;
},
queryClient?: QueryClient,
): UseMutationResult<
Awaited<ReturnType<typeof reviewTaskTasksTaskIdReviewPost>>,
TError,
{ taskId: number; data: TaskReviewDecision },
TContext
> => {
return useMutation(
getReviewTaskTasksTaskIdReviewPostMutationOptions(options),
queryClient,
);
};
/**
* @summary Update Task
*/