diff --git a/surfsense_backend/app/agents/new_chat/tools/linear/create_issue.py b/surfsense_backend/app/agents/new_chat/tools/linear/create_issue.py index f57b4a880..319151d59 100644 --- a/surfsense_backend/app/agents/new_chat/tools/linear/create_issue.py +++ b/surfsense_backend/app/agents/new_chat/tools/linear/create_issue.py @@ -197,7 +197,7 @@ def create_create_linear_issue_tool( linear_client = LinearConnector( session=db_session, connector_id=actual_connector_id ) - issue = await linear_client.create_issue( + result = await linear_client.create_issue( team_id=final_team_id, title=final_title, description=final_description, @@ -207,15 +207,19 @@ def create_create_linear_issue_tool( label_ids=final_label_ids if final_label_ids else None, ) + if result.get("status") == "error": + logger.error(f"Failed to create Linear issue: {result.get('message')}") + return {"status": "error", "message": result.get("message")} + logger.info( - f"Linear issue created: {issue.get('identifier')} - {issue.get('title')}" + f"Linear issue created: {result.get('identifier')} - {result.get('title')}" ) return { "status": "success", - "issue_id": issue.get("id"), - "identifier": issue.get("identifier"), - "url": issue.get("url"), - "message": f"Issue {issue.get('identifier')} created successfully.", + "issue_id": result.get("id"), + "identifier": result.get("identifier"), + "url": result.get("url"), + "message": result.get("message"), } except Exception as e: diff --git a/surfsense_backend/app/agents/new_chat/tools/linear/update_issue.py b/surfsense_backend/app/agents/new_chat/tools/linear/update_issue.py index dafd32ad1..a4d8cd92e 100644 --- a/surfsense_backend/app/agents/new_chat/tools/linear/update_issue.py +++ b/surfsense_backend/app/agents/new_chat/tools/linear/update_issue.py @@ -234,6 +234,16 @@ def create_update_linear_issue_tool( if final_new_label_ids is not None else None, ) + + if updated_issue.get("status") == "error": + logger.error( + f"Failed to update Linear issue: {updated_issue.get('message')}" + ) + return { + "status": "error", + "message": updated_issue.get("message"), + } + logger.info( f"update_issue result: {updated_issue.get('identifier')} - {updated_issue.get('title')}" ) @@ -262,11 +272,13 @@ def create_update_linear_issue_tool( else: kb_message = "" + identifier = updated_issue.get("identifier") + default_msg = f"Issue {identifier} updated successfully." return { "status": "success", - "identifier": updated_issue.get("identifier"), + "identifier": identifier, "url": updated_issue.get("url"), - "message": f"Issue {updated_issue.get('identifier')} updated successfully.{kb_message}", + "message": f"{updated_issue.get('message', default_msg)}{kb_message}", } except Exception as e: diff --git a/surfsense_backend/app/connectors/linear_connector.py b/surfsense_backend/app/connectors/linear_connector.py index 1c34ce946..377716824 100644 --- a/surfsense_backend/app/connectors/linear_connector.py +++ b/surfsense_backend/app/connectors/linear_connector.py @@ -598,35 +598,49 @@ class LinearConnector: priority: int | None = None, label_ids: list[str] | None = None, ) -> dict[str, Any]: - mutation = """ - mutation IssueCreate($input: IssueCreateInput!) { - issueCreate(input: $input) { - success - issue { id identifier title url } + try: + mutation = """ + mutation IssueCreate($input: IssueCreateInput!) { + issueCreate(input: $input) { + success + issue { id identifier title url } + } } - } - """ - input_data: dict[str, Any] = {"teamId": team_id, "title": title} - if description is not None: - input_data["description"] = description - if state_id is not None: - input_data["stateId"] = state_id - if assignee_id is not None: - input_data["assigneeId"] = assignee_id - if priority is not None: - input_data["priority"] = priority - if label_ids: - input_data["labelIds"] = label_ids + """ + input_data: dict[str, Any] = {"teamId": team_id, "title": title} + if description is not None: + input_data["description"] = description + if state_id is not None: + input_data["stateId"] = state_id + if assignee_id is not None: + input_data["assigneeId"] = assignee_id + if priority is not None: + input_data["priority"] = priority + if label_ids: + input_data["labelIds"] = label_ids - result = await self.execute_graphql_query(mutation, {"input": input_data}) - payload = result.get("data", {}).get("issueCreate", {}) - if not payload.get("success"): - errors = result.get("errors", []) - msg = ( - errors[0].get("message", "Unknown error") if errors else "Unknown error" - ) - raise Exception(f"issueCreate failed: {msg}") - return payload.get("issue", {}) + result = await self.execute_graphql_query(mutation, {"input": input_data}) + payload = result.get("data", {}).get("issueCreate", {}) + if not payload.get("success"): + errors = result.get("errors", []) + msg = ( + errors[0].get("message", "Unknown error") + if errors + else "Unknown error" + ) + return {"status": "error", "message": f"issueCreate failed: {msg}"} + issue = payload.get("issue", {}) + return { + "status": "success", + "id": issue.get("id"), + "identifier": issue.get("identifier"), + "title": issue.get("title"), + "url": issue.get("url"), + "message": f"Issue {issue.get('identifier')} created successfully.", + } + except Exception as e: + logger.error(f"Error creating Linear issue: {e}") + return {"status": "error", "message": str(e)} async def update_issue( self, @@ -638,57 +652,77 @@ class LinearConnector: priority: int | None = None, label_ids: list[str] | None = None, ) -> dict[str, Any]: - mutation = """ - mutation IssueUpdate($id: String!, $input: IssueUpdateInput!) { - issueUpdate(id: $id, input: $input) { - success - issue { id identifier title url } + try: + mutation = """ + mutation IssueUpdate($id: String!, $input: IssueUpdateInput!) { + issueUpdate(id: $id, input: $input) { + success + issue { id identifier title url } + } } - } - """ - input_data: dict[str, Any] = {} - if title is not None: - input_data["title"] = title - if description is not None: - input_data["description"] = description - if state_id is not None: - input_data["stateId"] = state_id - if assignee_id is not None: - input_data["assigneeId"] = assignee_id - if priority is not None: - input_data["priority"] = priority - if label_ids is not None: - input_data["labelIds"] = label_ids + """ + input_data: dict[str, Any] = {} + if title is not None: + input_data["title"] = title + if description is not None: + input_data["description"] = description + if state_id is not None: + input_data["stateId"] = state_id + if assignee_id is not None: + input_data["assigneeId"] = assignee_id + if priority is not None: + input_data["priority"] = priority + if label_ids is not None: + input_data["labelIds"] = label_ids - result = await self.execute_graphql_query( - mutation, {"id": issue_id, "input": input_data} - ) - payload = result.get("data", {}).get("issueUpdate", {}) - if not payload.get("success"): - errors = result.get("errors", []) - msg = ( - errors[0].get("message", "Unknown error") if errors else "Unknown error" + result = await self.execute_graphql_query( + mutation, {"id": issue_id, "input": input_data} ) - raise Exception(f"issueUpdate failed: {msg}") - return payload.get("issue", {}) - - async def archive_issue(self, issue_id: str) -> bool: - mutation = """ - mutation IssueArchive($id: String!) { - issueArchive(id: $id) { - success + payload = result.get("data", {}).get("issueUpdate", {}) + if not payload.get("success"): + errors = result.get("errors", []) + msg = ( + errors[0].get("message", "Unknown error") + if errors + else "Unknown error" + ) + return {"status": "error", "message": f"issueUpdate failed: {msg}"} + issue = payload.get("issue", {}) + return { + "status": "success", + "id": issue.get("id"), + "identifier": issue.get("identifier"), + "title": issue.get("title"), + "url": issue.get("url"), + "message": f"Issue {issue.get('identifier')} updated successfully.", } - } - """ - result = await self.execute_graphql_query(mutation, {"id": issue_id}) - payload = result.get("data", {}).get("issueArchive", {}) - if not payload.get("success"): - errors = result.get("errors", []) - msg = ( - errors[0].get("message", "Unknown error") if errors else "Unknown error" - ) - raise Exception(f"issueArchive failed: {msg}") - return True + except Exception as e: + logger.error(f"Error updating Linear issue: {e}") + return {"status": "error", "message": str(e)} + + async def archive_issue(self, issue_id: str) -> dict[str, Any]: + try: + mutation = """ + mutation IssueArchive($id: String!) { + issueArchive(id: $id) { + success + } + } + """ + result = await self.execute_graphql_query(mutation, {"id": issue_id}) + payload = result.get("data", {}).get("issueArchive", {}) + if not payload.get("success"): + errors = result.get("errors", []) + msg = ( + errors[0].get("message", "Unknown error") + if errors + else "Unknown error" + ) + return {"status": "error", "message": f"issueArchive failed: {msg}"} + return {"status": "success", "message": "Issue archived successfully."} + except Exception as e: + logger.error(f"Error archiving Linear issue: {e}") + return {"status": "error", "message": str(e)} def format_issue_to_markdown(self, issue: dict[str, Any]) -> str: """