Fix all integrations
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import datetime
|
||||
import json
|
||||
import time
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
from asgiref.sync import async_to_sync
|
||||
from django.conf import settings
|
||||
from django.db.models import Q
|
||||
from django.utils import timezone
|
||||
@@ -27,9 +29,12 @@ from core.models import (
|
||||
MemoryChangeRequest,
|
||||
MemoryItem,
|
||||
TaskArtifactLink,
|
||||
TaskEpic,
|
||||
TaskProject,
|
||||
User,
|
||||
WorkspaceConversation,
|
||||
)
|
||||
from core.tasks.engine import create_task_record_and_sync, mark_task_completed_and_sync
|
||||
from core.util import logs
|
||||
|
||||
log = logs.get_logger("mcp-tools")
|
||||
@@ -508,6 +513,55 @@ def tool_tasks_search(arguments: dict[str, Any]) -> dict[str, Any]:
|
||||
return tool_tasks_list(arguments)
|
||||
|
||||
|
||||
def tool_tasks_create(arguments: dict[str, Any]) -> dict[str, Any]:
|
||||
user_id = int(arguments.get("user_id"))
|
||||
project_id = str(arguments.get("project_id") or "").strip()
|
||||
title = str(arguments.get("title") or "").strip()
|
||||
if not project_id:
|
||||
raise ValueError("project_id is required")
|
||||
if not title:
|
||||
raise ValueError("title is required")
|
||||
project = TaskProject.objects.filter(user_id=user_id, id=project_id).first()
|
||||
if project is None:
|
||||
raise ValueError("project_id not found")
|
||||
epic_id = str(arguments.get("epic_id") or "").strip()
|
||||
epic = None
|
||||
if epic_id:
|
||||
epic = TaskEpic.objects.filter(project=project, id=epic_id).first()
|
||||
if epic is None:
|
||||
raise ValueError("epic_id not found for project")
|
||||
|
||||
due_at = str(arguments.get("due_date") or "").strip()
|
||||
due_date = None
|
||||
if due_at:
|
||||
try:
|
||||
due_date = datetime.date.fromisoformat(due_at)
|
||||
except Exception as exc:
|
||||
raise ValueError("due_date must be YYYY-MM-DD") from exc
|
||||
|
||||
task, event = async_to_sync(create_task_record_and_sync)(
|
||||
user=project.user,
|
||||
project=project,
|
||||
epic=epic,
|
||||
title=title,
|
||||
source_service=str(arguments.get("source_service") or "web").strip().lower()
|
||||
or "web",
|
||||
source_channel=str(arguments.get("source_channel") or "").strip(),
|
||||
actor_identifier=str(arguments.get("actor_identifier") or "").strip(),
|
||||
due_date=due_date,
|
||||
assignee_identifier=str(arguments.get("assignee_identifier") or "").strip(),
|
||||
immutable_payload={
|
||||
"source": "mcp.tasks.create",
|
||||
"requested_by": str(arguments.get("actor_identifier") or "").strip(),
|
||||
},
|
||||
event_payload={
|
||||
"source": "mcp.tasks.create",
|
||||
"via": "mcp",
|
||||
},
|
||||
)
|
||||
return {"task": _task_payload(task), "event": _event_payload(event)}
|
||||
|
||||
|
||||
def tool_tasks_get(arguments: dict[str, Any]) -> dict[str, Any]:
|
||||
task = _resolve_task(arguments)
|
||||
payload = _task_payload(task)
|
||||
@@ -555,6 +609,17 @@ def tool_tasks_create_note(arguments: dict[str, Any]) -> dict[str, Any]:
|
||||
return {"task": _task_payload(task), "event": _event_payload(event)}
|
||||
|
||||
|
||||
def tool_tasks_complete(arguments: dict[str, Any]) -> dict[str, Any]:
|
||||
task = _resolve_task(arguments)
|
||||
event = async_to_sync(mark_task_completed_and_sync)(
|
||||
task=task,
|
||||
actor_identifier=str(arguments.get("actor_identifier") or "").strip(),
|
||||
payload={"source": "mcp.tasks.complete", "via": "mcp"},
|
||||
)
|
||||
task.refresh_from_db()
|
||||
return {"task": _task_payload(task), "event": _event_payload(event)}
|
||||
|
||||
|
||||
def tool_tasks_link_artifact(arguments: dict[str, Any]) -> dict[str, Any]:
|
||||
task = _resolve_task(arguments)
|
||||
kind = str(arguments.get("kind") or "").strip() or "note"
|
||||
@@ -987,6 +1052,26 @@ TOOL_DEFS: dict[str, dict[str, Any]] = {
|
||||
},
|
||||
"handler": tool_tasks_search,
|
||||
},
|
||||
"tasks.create": {
|
||||
"description": "Create a canonical task inside GIA.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"user_id": {"type": "integer"},
|
||||
"project_id": {"type": "string"},
|
||||
"epic_id": {"type": "string"},
|
||||
"title": {"type": "string"},
|
||||
"due_date": {"type": "string"},
|
||||
"assignee_identifier": {"type": "string"},
|
||||
"actor_identifier": {"type": "string"},
|
||||
"source_service": {"type": "string"},
|
||||
"source_channel": {"type": "string"},
|
||||
},
|
||||
"required": ["user_id", "project_id", "title"],
|
||||
"additionalProperties": False,
|
||||
},
|
||||
"handler": tool_tasks_create,
|
||||
},
|
||||
"tasks.get": {
|
||||
"description": "Get one derived task by ID, including links.",
|
||||
"inputSchema": {
|
||||
@@ -1029,6 +1114,20 @@ TOOL_DEFS: dict[str, dict[str, Any]] = {
|
||||
},
|
||||
"handler": tool_tasks_create_note,
|
||||
},
|
||||
"tasks.complete": {
|
||||
"description": "Mark a task completed and append a completion event.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"task_id": {"type": "string"},
|
||||
"user_id": {"type": "integer"},
|
||||
"actor_identifier": {"type": "string"},
|
||||
},
|
||||
"required": ["task_id"],
|
||||
"additionalProperties": False,
|
||||
},
|
||||
"handler": tool_tasks_complete,
|
||||
},
|
||||
"tasks.link_artifact": {
|
||||
"description": "Link an artifact (URI/path) to a task.",
|
||||
"inputSchema": {
|
||||
|
||||
Reference in New Issue
Block a user