use serde_json::{json, Value};
pub(super) fn task_tool_definitions(has_default: bool) -> Vec<Value> {
let task_add_required: Vec<&str> = if has_default {
vec!["content"]
} else {
vec!["palace", "content"]
};
let task_complete_required: Vec<&str> = if has_default {
vec!["drawer_id"]
} else {
vec!["palace", "drawer_id"]
};
let task_list_required: Vec<&str> = if has_default { vec![] } else { vec!["palace"] };
vec![
json!({
"name": "task_add",
"description": "Create a Task drawer in a palace (spec-001 issue #1722). Task drawers are protected from the dream cycle — never evicted or consolidated regardless of age or importance. Use for goals, milestones, or any long-lived context the application must retain across sessions. Returns { drawer_id, palace, status, drawer_type }.",
"inputSchema": {
"type": "object",
"properties": {
"palace": {"type": "string", "description": "Palace ID (optional if server started with --palace)"},
"content": {"type": "string", "description": "Task description or goal."},
"room": {"type": "string", "description": "Room type (optional, defaults to General)."},
"tags": {"type": "array", "items": {"type": "string"}}
},
"required": task_add_required,
}
}),
json!({
"name": "task_list",
"description": "List Task drawers in a palace (spec-001 issue #1722). Returns only open (incomplete) tasks by default; pass include_completed=true to include tasks with a completed_at timestamp. Returns { palace, tasks: [ { drawer_id, content, importance, tags, created_at, completed_at, drawer_type } ] }.",
"inputSchema": {
"type": "object",
"properties": {
"palace": {"type": "string", "description": "Palace ID (optional if server started with --palace)"},
"include_completed": {"type": "boolean", "default": false, "description": "Include tasks with a completed_at timestamp in the results."}
},
"required": task_list_required,
}
}),
json!({
"name": "task_complete",
"description": "Mark a Task drawer as completed by setting its completed_at timestamp (spec-001 issue #1722). Completed tasks are no longer returned by the default task_list view but are never auto-evicted — they remain eligible for manual cleanup only. Errors if drawer_id does not exist or is not a Task drawer. Returns { palace, drawer_id, completed_at, status }.",
"inputSchema": {
"type": "object",
"properties": {
"palace": {"type": "string", "description": "Palace ID (optional if server started with --palace)"},
"drawer_id": {"type": "string", "description": "UUID of the Task drawer to mark completed."}
},
"required": task_complete_required,
}
}),
]
}