/**
* Developed by eBrook Group.
* Copyright © 2026 eBrook Group (https://www.ebrook.com.tw)
*/
/**
* Get task details tool handler
* Fetches and formats ClickUp task details
*/
import { ClickUpService } from "../services/clickup.js";
import { debug, error } from "../utils/logger.js";
import { sanitizeErrorResponse } from "../utils/error-sanitizer.js";
import type { AppConfig } from "../config/env.js";
import type { ClickUpTaskResponse } from "../types/index.js";
/**
* Get task details tool handler
* @param task_id - ClickUp task ID
* @param _config - Application configuration (unused)
* @param click_up_service - ClickUp service instance
* @returns Tool execution result
*/
export async function handleGetTaskDetails(
task_id: string,
_config: AppConfig,
click_up_service: ClickUpService
): Promise<{ content: Array<{ type: "text"; text: string }>; isError?: boolean }> {
debug(`Fetching task details for: ${task_id}`);
// Fetch task from ClickUp
const task_res = await click_up_service.getTask(task_id);
debug(`ClickUp API response status: ${task_res.status}`);
if (task_res.status !== 200) {
// Sanitized error message for client
const error_msg = `Failed to fetch task ${task_id}. ${sanitizeErrorResponse(task_res.status, task_res.body)}`;
// Full error details only in logs
debug(`Full API error response: ${JSON.stringify(task_res.body)}`);
error(error_msg);
return {
content: [
{
type: "text",
text: error_msg,
},
],
isError: true,
};
}
const task = task_res.body as ClickUpTaskResponse;
debug(`Successfully fetched task: ${task.name}`);
// Format task details
const details = click_up_service.formatTaskDetails(task);
// Build formatted output
const output_lines: string[] = [];
output_lines.push("=".repeat(80));
output_lines.push(`📋 TASK DETAILS: ${details.name}`);
output_lines.push("=".repeat(80));
output_lines.push("");
// Basic Information
output_lines.push("📌 BASIC INFORMATION");
output_lines.push(` ID: ${details.id}`);
if (details.custom_id) {
output_lines.push(` Custom ID: ${details.custom_id}`);
}
output_lines.push(` Status: ${details.status}`);
if (details.priority) {
output_lines.push(` Priority: ${details.priority}`);
}
output_lines.push(` URL: ${details.url}`);
output_lines.push("");
// Location
output_lines.push("📍 LOCATION");
output_lines.push(` Space: ${details.space}`);
output_lines.push(` Folder: ${details.folder}`);
output_lines.push(` List: ${details.list}`);
output_lines.push("");
// Description
if (details.description) {
output_lines.push("📝 DESCRIPTION");
output_lines.push(` ${details.description.substring(0, 500)}${details.description.length > 500 ? "..." : ""}`);
output_lines.push("");
}
// Team
output_lines.push("👥 TEAM");
output_lines.push(` Creator: ${details.creator}`);
if (details.assignees.length > 0) {
output_lines.push(` Assignees: ${details.assignees.join(", ")}`);
} else {
output_lines.push(" Assignees: (none)");
}
output_lines.push("");
// Time Information
output_lines.push("⏰ TIME INFORMATION");
output_lines.push(` Created: ${new Date(parseInt(details.created_at)).toLocaleString()}`);
output_lines.push(` Updated: ${new Date(parseInt(details.updated_at)).toLocaleString()}`);
if (details.due_date) {
output_lines.push(` Due Date: ${new Date(parseInt(details.due_date)).toLocaleString()}`);
}
if (details.time_estimate) {
output_lines.push(` Estimated Time: ${details.time_estimate}`);
}
if (details.time_spent) {
output_lines.push(` Time Spent: ${details.time_spent}`);
}
output_lines.push("");
// Tags
if (details.tags.length > 0) {
output_lines.push("🏷️ TAGS");
output_lines.push(` ${details.tags.join(", ")}`);
output_lines.push("");
}
// Custom Fields
const custom_field_keys = Object.keys(details.custom_fields);
if (custom_field_keys.length > 0) {
output_lines.push("⚙️ CUSTOM FIELDS");
custom_field_keys.forEach((key) => {
const value = details.custom_fields[key];
output_lines.push(` ${key}: ${JSON.stringify(value)}`);
});
output_lines.push("");
}
// Dependencies
if (details.dependencies_count > 0) {
output_lines.push("🔗 DEPENDENCIES");
output_lines.push(` Total Dependencies: ${details.dependencies_count}`);
output_lines.push("");
}
output_lines.push("=".repeat(80));
// Return formatted result
return {
content: [
{
type: "text",
text: output_lines.join("\n"),
},
{
type: "text",
text: `\n📊 Raw Data (JSON):\n${JSON.stringify(details, null, 2)}`,
},
],
isError: false,
};
}