import type Redis from "ioredis";
import type { Task, TaskStatus } from "@slackwsh/contracts";
import { type EntityIdInput } from "./channels";
export interface CreateTaskInput {
    title: string;
    description?: string;
    assigneeUserId?: EntityIdInput | null;
    dueAt?: string | null;
    channelId?: EntityIdInput | null;
    status?: TaskStatus;
}
export interface UpdateTaskInput {
    title?: string;
    description?: string | null;
    dueAt?: string | null;
    channelId?: EntityIdInput | null;
}
export interface CreateTaskFromMessageInput {
    title?: string;
    description?: string;
    assigneeUserId?: EntityIdInput | null;
    dueAt?: string | null;
}
export declare function createTask(redis: Redis, workspaceId: EntityIdInput, actorUserId: EntityIdInput, input: CreateTaskInput): Promise<Task>;
export declare function listTasks(workspaceId: EntityIdInput, actorUserId: EntityIdInput, filters?: {
    status?: TaskStatus;
    assigneeUserId?: EntityIdInput;
    channelId?: EntityIdInput;
    mine?: boolean;
    deleted?: boolean;
    dueBefore?: string;
    dueAfter?: string;
    limit?: number;
}): Promise<Task[]>;
export declare function getTask(workspaceId: EntityIdInput, actorUserId: EntityIdInput, taskId: EntityIdInput): Promise<Task>;
export declare function updateTask(redis: Redis, workspaceId: EntityIdInput, actorUserId: EntityIdInput, taskId: EntityIdInput, input: UpdateTaskInput): Promise<Task>;
export declare function assignTask(redis: Redis, workspaceId: EntityIdInput, actorUserId: EntityIdInput, taskId: EntityIdInput, assigneeUserId: EntityIdInput | null): Promise<Task>;
export declare function updateTaskStatus(redis: Redis, workspaceId: EntityIdInput, actorUserId: EntityIdInput, taskId: EntityIdInput, status: TaskStatus): Promise<Task>;
export declare function deleteTask(redis: Redis, workspaceId: EntityIdInput, actorUserId: EntityIdInput, taskId: EntityIdInput): Promise<void>;
/** Bring a soft-deleted task back into the active lists. */
export declare function restoreTask(redis: Redis, workspaceId: EntityIdInput, actorUserId: EntityIdInput, taskId: EntityIdInput): Promise<Task>;
/** The one place a task action checks *channel* membership rather than just
 * workspace membership: the actor must be able to read the specific message
 * they're building a task from. Standalone task creation and the general
 * list intentionally have no such gate (tasks are workspace-wide). */
export declare function createTaskFromMessage(redis: Redis, workspaceId: EntityIdInput, actorUserId: EntityIdInput, channelId: EntityIdInput, messageId: EntityIdInput, input: CreateTaskFromMessageInput): Promise<Task>;
/** How many assignment notifications the actor has never opened — the Tasks badge. */
export declare function unreadAssignedTaskCount(workspaceId: EntityIdInput, actorUserId: EntityIdInput): Promise<number>;
/** Opening the Tasks page is the acknowledgement — the badge clears here
 * rather than per-row, matching how missed calls behave. */
export declare function markAssignedTasksSeen(workspaceId: EntityIdInput, actorUserId: EntityIdInput): Promise<{
    seen: number;
}>;
//# sourceMappingURL=tasks.d.ts.map