Skip to content

Commit f990117

Browse files
author
Zvi Fried
committed
enhanced workflow
1 parent 59b9102 commit f990117

23 files changed

+737
-456
lines changed

src/mcp_as_a_judge/coding_task_manager.py

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import json
99
import logging
10-
from datetime import datetime
10+
import time
1111
from typing import Optional
1212

1313
from mcp_as_a_judge.db.conversation_history_service import ConversationHistoryService
@@ -19,7 +19,6 @@
1919

2020
async def create_new_coding_task(
2121
user_request: str,
22-
task_name: str,
2322
task_title: str,
2423
task_description: str,
2524
user_requirements: str,
@@ -28,24 +27,22 @@ async def create_new_coding_task(
2827
) -> TaskMetadata:
2928
"""
3029
Create a new coding task with auto-generated task_id.
31-
30+
3231
Args:
3332
user_request: Original user request
34-
task_name: Human-readable task name
3533
task_title: Display title
3634
task_description: Detailed description
3735
user_requirements: Initial requirements
3836
tags: Task tags
3937
conversation_service: Conversation service
40-
38+
4139
Returns:
4240
New TaskMetadata instance
4341
"""
4442
logger.info(f"📝 Creating new coding task: {task_title}")
4543

4644
# Create new TaskMetadata with auto-generated UUID
4745
task_metadata = TaskMetadata(
48-
name=task_name,
4946
title=task_title,
5047
description=task_description,
5148
user_requirements=user_requirements,
@@ -64,7 +61,6 @@ async def create_new_coding_task(
6461
async def update_existing_coding_task(
6562
task_id: str,
6663
user_request: str,
67-
task_name: str,
6864
task_title: str,
6965
task_description: str,
7066
user_requirements: Optional[str],
@@ -74,21 +70,20 @@ async def update_existing_coding_task(
7470
) -> TaskMetadata:
7571
"""
7672
Update an existing coding task.
77-
73+
7874
Args:
7975
task_id: Immutable task ID
8076
user_request: Original user request
81-
task_name: Updated task name
8277
task_title: Updated title
8378
task_description: Updated description
8479
user_requirements: Updated requirements
85-
state: Updated state
80+
state: Updated state (None to skip state update)
8681
tags: Updated tags
8782
conversation_service: Conversation service
88-
83+
8984
Returns:
9085
Updated TaskMetadata instance
91-
86+
9287
Raises:
9388
ValueError: If task not found or invalid state transition
9489
"""
@@ -104,11 +99,10 @@ async def update_existing_coding_task(
10499
raise ValueError(f"Task not found: {task_id}")
105100

106101
# Update mutable fields
107-
existing_metadata.name = task_name
108102
existing_metadata.title = task_title
109103
existing_metadata.description = task_description
110104
existing_metadata.tags = tags
111-
existing_metadata.updated_at = datetime.now()
105+
existing_metadata.updated_at = int(time.time())
112106

113107
# Update requirements if provided
114108
if user_requirements is not None:
@@ -183,7 +177,7 @@ async def save_task_metadata_to_history(
183177
tool_output=json.dumps({
184178
"action": action,
185179
"current_task_metadata": task_metadata.model_dump(mode='json'),
186-
"timestamp": datetime.now().isoformat(),
180+
"timestamp": int(time.time()),
187181
}),
188182
)
189183

src/mcp_as_a_judge/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# LLM Configuration
88
MAX_TOKENS = 25000 # Maximum tokens for all LLM requests - increased for comprehensive responses
99
DEFAULT_TEMPERATURE = 0.1 # Default temperature for LLM requests
10+
DEFAULT_REASONING_EFFORT = "low" # Default reasoning effort level - lowest for speed and efficiency
1011

1112
# Timeout Configuration
1213
DEFAULT_TIMEOUT = 30 # Default timeout in seconds for operations

src/mcp_as_a_judge/db/cleanup_service.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
removing records older than the retention period (default: 1 day).
66
"""
77

8-
from datetime import datetime, timedelta
8+
import time
99

1010
from sqlalchemy import Engine
1111
from sqlmodel import Session, select
@@ -35,7 +35,7 @@ def __init__(self, engine: Engine) -> None:
3535
"""
3636
self.engine = engine
3737
self.retention_days = RECORD_RETENTION_DAYS
38-
self.last_cleanup_time = datetime.utcnow()
38+
self.last_cleanup_time = int(time.time())
3939

4040
def cleanup_old_records(self) -> int:
4141
"""
@@ -45,16 +45,17 @@ def cleanup_old_records(self) -> int:
4545
Returns:
4646
Number of records deleted
4747
"""
48-
# Only run cleanup once per day
49-
if (datetime.utcnow() - self.last_cleanup_time).days < 1:
48+
# Only run cleanup once per day (86400 seconds)
49+
current_time = int(time.time())
50+
if (current_time - self.last_cleanup_time) < 86400:
5051
return 0
5152

52-
cutoff_date = datetime.utcnow() - timedelta(days=self.retention_days)
53+
cutoff_timestamp = current_time - (self.retention_days * 86400)
5354

5455
with Session(self.engine) as session:
5556
# Count old records
5657
old_count_stmt = select(ConversationRecord).where(
57-
ConversationRecord.timestamp < cutoff_date
58+
ConversationRecord.timestamp < cutoff_timestamp
5859
)
5960
old_records = session.exec(old_count_stmt).all()
6061
old_count = len(old_records)
@@ -63,7 +64,7 @@ def cleanup_old_records(self) -> int:
6364
logger.info(
6465
f"🧹 Daily cleanup: No records older than {self.retention_days} days"
6566
)
66-
self.last_cleanup_time = datetime.utcnow()
67+
self.last_cleanup_time = int(time.time())
6768
return 0
6869

6970
# Delete old records
@@ -73,7 +74,7 @@ def cleanup_old_records(self) -> int:
7374
session.commit()
7475

7576
# Reset cleanup tracking
76-
self.last_cleanup_time = datetime.utcnow()
77+
self.last_cleanup_time = int(time.time())
7778

7879
logger.info(
7980
f"🧹 Daily cleanup: Deleted {old_count} records older than {self.retention_days} days"

src/mcp_as_a_judge/db/conversation_history_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ def format_conversation_history_as_json_array(
135135
"source": record.source,
136136
"input": record.input,
137137
"output": record.output,
138-
"timestamp": record.timestamp.isoformat(),
138+
"timestamp": record.timestamp, # Already epoch int
139139
}
140140
)
141141

src/mcp_as_a_judge/db/interface.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"""
77

88
from abc import ABC, abstractmethod
9-
from datetime import datetime
9+
import time
1010

1111
from sqlmodel import Field, SQLModel
1212

@@ -21,9 +21,9 @@ class ConversationRecord(SQLModel, table=True):
2121
source: str # tool name
2222
input: str # tool input query
2323
output: str # tool output string
24-
timestamp: datetime = Field(
25-
default_factory=datetime.utcnow, index=True
26-
) # when the record was created
24+
timestamp: int = Field(
25+
default_factory=lambda: int(time.time()), index=True
26+
) # when the record was created (epoch seconds)
2727

2828

2929
class ConversationHistoryDB(ABC):

src/mcp_as_a_judge/db/providers/sqlite_provider.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"""
77

88
import uuid
9-
from datetime import datetime
9+
import time
1010

1111
from sqlalchemy import create_engine
1212
from sqlmodel import Session, SQLModel, asc, desc, select
@@ -141,7 +141,7 @@ async def save_conversation(
141141
) -> str:
142142
"""Save a conversation record to SQLite database with LRU cleanup."""
143143
record_id = str(uuid.uuid4())
144-
timestamp = datetime.utcnow()
144+
timestamp = int(time.time())
145145

146146
logger.info(
147147
f"💾 Saving conversation to SQLModel SQLite DB: record {record_id} "

src/mcp_as_a_judge/llm_client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import litellm
1212

13+
from mcp_as_a_judge.constants import DEFAULT_REASONING_EFFORT
1314
from mcp_as_a_judge.llm_integration import LLMConfig, LLMVendor
1415

1516
# Set global drop_params to handle model-specific parameter restrictions
@@ -156,6 +157,7 @@ async def generate_text(
156157
"api_key": self.config.api_key,
157158
"max_tokens": max_tokens,
158159
"temperature": temperature,
160+
"reasoning_effort": DEFAULT_REASONING_EFFORT, # Set reasoning to lowest level
159161
**kwargs,
160162
}
161163

src/mcp_as_a_judge/models.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,51 @@ class JudgeCodingPlanUserVars(BaseModel):
136136
research: str = Field(description="Research findings and analysis")
137137
research_urls: list[str] = Field(
138138
default_factory=list,
139-
description="URLs from MANDATORY online research - minimum 3 URLs required",
139+
description="URLs from online research (conditional based on task needs)",
140140
)
141141
conversation_history: list = Field(
142142
default_factory=list,
143143
description="Previous conversation history as JSON array with timestamps",
144144
)
145145

146+
# Conditional research fields
147+
research_required: bool = Field(
148+
default=False,
149+
description="Whether external research is required for this task"
150+
)
151+
research_scope: str = Field(
152+
default="none",
153+
description="Scope of research required (none, light, deep)"
154+
)
155+
research_rationale: str = Field(
156+
default="",
157+
description="Explanation of why research is or isn't required"
158+
)
159+
160+
# Conditional internal research fields
161+
internal_research_required: bool = Field(
162+
default=False,
163+
description="Whether internal codebase research is needed"
164+
)
165+
related_code_snippets: list[str] = Field(
166+
default_factory=list,
167+
description="Related code snippets from the codebase"
168+
)
169+
170+
# Conditional risk assessment fields
171+
risk_assessment_required: bool = Field(
172+
default=False,
173+
description="Whether risk assessment is needed"
174+
)
175+
identified_risks: list[str] = Field(
176+
default_factory=list,
177+
description="Areas that could be harmed by the changes"
178+
)
179+
risk_mitigation_strategies: list[str] = Field(
180+
default_factory=list,
181+
description="Strategies to mitigate identified risks"
182+
)
183+
146184

147185
class JudgeCodeChangeSystemVars(BaseModel):
148186
"""Variables for judge_code_change system prompt."""

0 commit comments

Comments
 (0)