UNPKG

omnifocus-mcp-enhanced

Version:

🚀 NEW: Native Custom Perspective Access! Enhanced MCP server with OmniFocus custom perspective support, hierarchical task display, AI-optimized tool selection, and comprehensive task management

243 lines (217 loc) 8.01 kB
// 修复版本的 filter_tasks (() => { try { // 获取参数 const args = typeof injectedArgs !== 'undefined' ? injectedArgs : {}; const filters = { taskStatus: args.taskStatus || null, perspective: args.perspective || "all", flagged: args.flagged !== undefined ? args.flagged : null, // 完成日期过滤器 completedToday: args.completedToday || false, completedYesterday: args.completedYesterday || false, completedThisWeek: args.completedThisWeek || false, completedThisMonth: args.completedThisMonth || false, completedBefore: args.completedBefore || null, completedAfter: args.completedAfter || null, // 其他过滤器 projectFilter: args.projectFilter || null, searchText: args.searchText || null, limit: args.limit || 100, sortBy: args.sortBy || "name", sortOrder: args.sortOrder || "asc" }; // 辅助函数 function getTaskStatus(status) { const taskStatusMap = { [Task.Status.Available]: "Available", [Task.Status.Blocked]: "Blocked", [Task.Status.Completed]: "Completed", [Task.Status.Dropped]: "Dropped", [Task.Status.DueSoon]: "DueSoon", [Task.Status.Next]: "Next", [Task.Status.Overdue]: "Overdue" }; return taskStatusMap[status] || "Unknown"; } function formatDate(date) { if (!date) return null; return date.toISOString(); } function isToday(date) { if (!date) return false; const today = new Date(); today.setHours(0, 0, 0, 0); const tomorrow = new Date(today); tomorrow.setDate(today.getDate() + 1); const checkDate = new Date(date); return checkDate >= today && checkDate < tomorrow; } function isYesterday(date) { if (!date) return false; const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); yesterday.setHours(0, 0, 0, 0); const today = new Date(yesterday); today.setDate(yesterday.getDate() + 1); const checkDate = new Date(date); return checkDate >= yesterday && checkDate < today; } // 获取所有任务 const allTasks = flattenedTasks; // 判断是否需要包含完成的任务 const wantsCompletedTasks = filters.completedToday || filters.completedYesterday || filters.completedThisWeek || filters.completedThisMonth || filters.completedBefore || filters.completedAfter; const includeCompletedByStatus = filters.taskStatus && (filters.taskStatus.includes("Completed") || filters.taskStatus.includes("Dropped")); // 选择任务集 let availableTasks; if (wantsCompletedTasks || includeCompletedByStatus) { availableTasks = allTasks; } else { availableTasks = allTasks.filter(task => task.taskStatus !== Task.Status.Completed && task.taskStatus !== Task.Status.Dropped ); } // 应用透视过滤 let baseTasks = []; switch (filters.perspective) { case "inbox": baseTasks = availableTasks.filter(task => task.inInbox); break; case "flagged": baseTasks = availableTasks.filter(task => task.flagged); break; default: baseTasks = availableTasks; break; } // 应用所有过滤器 let filteredTasks = baseTasks.filter(task => { try { const taskStatus = getTaskStatus(task.taskStatus); // 完成任务逻辑 if (wantsCompletedTasks) { // 只要完成任务 if (taskStatus !== "Completed") { return false; } } else { // 排除完成任务(除非明确指定状态) if (!includeCompletedByStatus && (taskStatus === "Completed" || taskStatus === "Dropped")) { return false; } } // 状态过滤 if (filters.taskStatus && filters.taskStatus.length > 0) { if (!filters.taskStatus.includes(taskStatus)) { return false; } } // 标记过滤 if (filters.flagged !== null && task.flagged !== filters.flagged) { return false; } // 项目过滤 if (filters.projectFilter) { const projectName = task.containingProject ? task.containingProject.name : ''; if (!projectName.toLowerCase().includes(filters.projectFilter.toLowerCase())) { return false; } } // 搜索文本过滤 if (filters.searchText) { const searchLower = filters.searchText.toLowerCase(); const taskName = (task.name || '').toLowerCase(); const taskNote = (task.note || '').toLowerCase(); if (!taskName.includes(searchLower) && !taskNote.includes(searchLower)) { return false; } } // 完成日期过滤 if (wantsCompletedTasks) { if (filters.completedToday && !isToday(task.completionDate)) { return false; } if (filters.completedYesterday && !isYesterday(task.completionDate)) { return false; } if (filters.completedBefore && task.completionDate && new Date(task.completionDate) >= new Date(filters.completedBefore)) { return false; } if (filters.completedAfter && task.completionDate && new Date(task.completionDate) <= new Date(filters.completedAfter)) { return false; } } return true; } catch (error) { return false; } }); // 排序 if (filters.sortBy === "completedDate") { filteredTasks.sort((a, b) => { const dateA = a.completionDate || new Date('1900-01-01'); const dateB = b.completionDate || new Date('1900-01-01'); return filters.sortOrder === "desc" ? dateB - dateA : dateA - dateB; }); } else { filteredTasks.sort((a, b) => { const valueA = a.name || ''; const valueB = b.name || ''; if (valueA < valueB) return filters.sortOrder === "desc" ? 1 : -1; if (valueA > valueB) return filters.sortOrder === "desc" ? -1 : 1; return 0; }); } // 限制结果数量 if (filters.limit && filteredTasks.length > filters.limit) { filteredTasks = filteredTasks.slice(0, filters.limit); } // 构建返回数据 const exportData = { exportDate: new Date().toISOString(), tasks: [], totalCount: baseTasks.length, filteredCount: filteredTasks.length, sortedBy: filters.sortBy, sortOrder: filters.sortOrder }; // 处理每个任务 filteredTasks.forEach(task => { try { const taskData = { id: task.id.primaryKey, name: task.name, note: task.note || "", taskStatus: getTaskStatus(task.taskStatus), flagged: task.flagged, dueDate: formatDate(task.dueDate), deferDate: formatDate(task.deferDate), completedDate: formatDate(task.completionDate), estimatedMinutes: task.estimatedMinutes, projectId: task.containingProject ? task.containingProject.id.primaryKey : null, projectName: task.containingProject ? task.containingProject.name : null, inInbox: task.inInbox, tags: task.tags.map(tag => ({ id: tag.id.primaryKey, name: tag.name })) }; exportData.tasks.push(taskData); } catch (taskError) { // 跳过处理错误的任务 } }); return JSON.stringify(exportData); } catch (error) { return JSON.stringify({ success: false, error: `Error filtering tasks: ${error}` }); } })();