Refactor: Dismantle MemoryState into semantic domain sub-structs
This commit is contained in:
1 parent
0e866f2465
commit
a34554b7ff
13 files changed
+186
-158
No files matched your search
+24
-24
@@ -24,7 +24,7 @@ impl McpTool for LogDecisionHandler {
|
||||
let idx = state.get_search_index();
|
||||
let mut final_id = String::new();
|
||||
|
||||
state.adrs.modify(|adrs| {
|
||||
state.code.adrs.modify(|adrs| {
|
||||
if let Some(superseded_id) = &req.supersedes {
|
||||
for old_adr in adrs.iter_mut() {
|
||||
if old_adr.id == *superseded_id {
|
||||
@@ -70,7 +70,7 @@ impl McpTool for QueryDecisionsHandler {
|
||||
|
||||
async fn execute(&self, args: Value, state: Arc<MemoryState>) -> crate::error::Result<String> {
|
||||
let req: QueryDecisionsTool = serde_json::from_value(args).map_err(|e| e.to_string())?;
|
||||
let data = state.adrs.read_with(|adrs| {
|
||||
let data = state.code.adrs.read_with(|adrs| {
|
||||
let filtered: Vec<_> = adrs
|
||||
.iter()
|
||||
.filter(|a| {
|
||||
@@ -108,7 +108,7 @@ impl McpTool for DeleteDecisionHandler {
|
||||
let req: crate::tools::DeleteDecisionTool =
|
||||
serde_json::from_value(args).map_err(|e| e.to_string())?;
|
||||
let mut found = false;
|
||||
state.adrs.modify(|adrs| {
|
||||
state.code.adrs.modify(|adrs| {
|
||||
if let Some(pos) = adrs.iter().position(|a| a.id == req.id) {
|
||||
adrs.remove(pos);
|
||||
found = true;
|
||||
@@ -140,7 +140,7 @@ impl McpTool for LogErrorFixHandler {
|
||||
let req: LogErrorFixTool = serde_json::from_value(args).map_err(|e| e.to_string())?;
|
||||
let text_to_embed = format!("Signature: {}\nSolution: {}", req.signature, req.solution);
|
||||
let embedding = crate::embedding::generate_embedding_async(text_to_embed).await.ok();
|
||||
state.error_fixes.modify(|fixes| {
|
||||
state.code.error_fixes.modify(|fixes| {
|
||||
fixes.push(crate::models::ErrorFix {
|
||||
signature: req.signature,
|
||||
solution: req.solution,
|
||||
@@ -172,7 +172,7 @@ impl McpTool for SearchErrorFixesHandler {
|
||||
async fn execute(&self, args: Value, state: Arc<MemoryState>) -> crate::error::Result<String> {
|
||||
let req: SearchErrorFixesTool = serde_json::from_value(args).map_err(|e| e.to_string())?;
|
||||
let q = req.query;
|
||||
let data = state.error_fixes.read_with(|fixes| {
|
||||
let data = state.code.error_fixes.read_with(|fixes| {
|
||||
let filtered: Vec<_> = fixes
|
||||
.iter()
|
||||
.filter(|f| {
|
||||
@@ -200,7 +200,7 @@ impl McpTool for LogCodeChangeHandler {
|
||||
|
||||
async fn execute(&self, args: Value, state: Arc<MemoryState>) -> crate::error::Result<String> {
|
||||
let req: LogCodeChangeTool = serde_json::from_value(args).map_err(|e| e.to_string())?;
|
||||
state.ledger.modify(|ledger| {
|
||||
state.code.ledger.modify(|ledger| {
|
||||
ledger.push(CodeChange {
|
||||
timestamp: crate::handlers::utils::now_secs(),
|
||||
file_path: req.file_path,
|
||||
@@ -230,7 +230,7 @@ impl McpTool for QueryRecentChangesHandler {
|
||||
|
||||
async fn execute(&self, _args: Value, state: Arc<MemoryState>) -> crate::error::Result<String> {
|
||||
let data = state
|
||||
.ledger
|
||||
.code.ledger
|
||||
.read_with(|l| Ok::<String, crate::error::AppError>(serde_json::to_string(l)?))?;
|
||||
Ok(data)
|
||||
}
|
||||
@@ -250,7 +250,7 @@ impl McpTool for LearnPreferenceHandler {
|
||||
|
||||
async fn execute(&self, args: Value, state: Arc<MemoryState>) -> crate::error::Result<String> {
|
||||
let req: LearnPreferenceTool = serde_json::from_value(args).map_err(|e| e.to_string())?;
|
||||
state.prefs.modify(|prefs| {
|
||||
state.env.prefs.modify(|prefs| {
|
||||
prefs.insert(
|
||||
req.key.clone(),
|
||||
crate::models::Preference {
|
||||
@@ -278,7 +278,7 @@ impl McpTool for ReadPreferencesHandler {
|
||||
|
||||
async fn execute(&self, _args: Value, state: Arc<MemoryState>) -> crate::error::Result<String> {
|
||||
state
|
||||
.prefs
|
||||
.env.prefs
|
||||
.read_with(|prefs| Ok::<String, crate::error::AppError>(serde_json::to_string(prefs)?))
|
||||
}
|
||||
}
|
||||
@@ -299,7 +299,7 @@ impl McpTool for LogTechDebtHandler {
|
||||
let req: LogTechDebtTool = serde_json::from_value(args).map_err(|e| e.to_string())?;
|
||||
let text_to_embed = format!("Description: {}\nIdeal Solution: {}", req.description, req.ideal_solution);
|
||||
let embedding = crate::embedding::generate_embedding_async(text_to_embed).await.ok();
|
||||
state.tech_debts.modify(|debts| {
|
||||
state.code.tech_debts.modify(|debts| {
|
||||
debts.push(crate::models::TechDebt {
|
||||
id: uuid::Uuid::new_v4().to_string(),
|
||||
namespace: req.namespace,
|
||||
@@ -334,7 +334,7 @@ impl McpTool for ResolveTechDebtHandler {
|
||||
async fn execute(&self, args: Value, state: Arc<MemoryState>) -> crate::error::Result<String> {
|
||||
let req: ResolveTechDebtTool = serde_json::from_value(args).map_err(|e| e.to_string())?;
|
||||
let mut found = false;
|
||||
state.tech_debts.modify(|debts| {
|
||||
state.code.tech_debts.modify(|debts| {
|
||||
for d in debts.iter_mut() {
|
||||
if d.id == req.id {
|
||||
d.is_resolved = true;
|
||||
@@ -365,7 +365,7 @@ impl McpTool for ListTechDebtHandler {
|
||||
|
||||
async fn execute(&self, args: Value, state: Arc<MemoryState>) -> crate::error::Result<String> {
|
||||
let req: ListTechDebtTool = serde_json::from_value(args).map_err(|e| e.to_string())?;
|
||||
let data = state.tech_debts.read_with(|debts| {
|
||||
let data = state.code.tech_debts.read_with(|debts| {
|
||||
let filtered: Vec<_> = debts
|
||||
.iter()
|
||||
.filter(|d| {
|
||||
@@ -451,7 +451,7 @@ impl McpTool for OmniSearchHandler {
|
||||
}
|
||||
}
|
||||
|
||||
let tasks_json = state.tasks.read_with(|all_tasks| {
|
||||
let tasks_json = state.project.tasks.read_with(|all_tasks| {
|
||||
let filtered: Vec<_> = all_tasks
|
||||
.iter()
|
||||
.filter(|t| matched_tasks.contains(t.id.as_str()))
|
||||
@@ -470,7 +470,7 @@ impl McpTool for OmniSearchHandler {
|
||||
serde_json::to_value(&filtered).map_err(|e| e.to_string())
|
||||
})?;
|
||||
|
||||
let snippets_json = state.snippets.read_with(|all_snippets| {
|
||||
let snippets_json = state.code.snippets.read_with(|all_snippets| {
|
||||
let mut scored: Vec<_> = all_snippets.iter().map(|s| {
|
||||
let mut score = 0.0;
|
||||
if matched_snippets.contains(s.name.as_str()) || contains_ignore_ascii_case(&s.name, &q) || contains_ignore_ascii_case(&s.description, &q) {
|
||||
@@ -495,7 +495,7 @@ impl McpTool for OmniSearchHandler {
|
||||
serde_json::to_value(&filtered).map_err(|e| e.to_string())
|
||||
})?;
|
||||
|
||||
let adrs_json = state.adrs.read_with(|all_adrs| {
|
||||
let adrs_json = state.code.adrs.read_with(|all_adrs| {
|
||||
let filtered: Vec<_> = all_adrs
|
||||
.iter()
|
||||
.filter(|a| matched_adrs.contains(a.id.as_str()))
|
||||
@@ -516,7 +516,7 @@ impl McpTool for OmniSearchHandler {
|
||||
})?;
|
||||
|
||||
let q = req.query;
|
||||
let tech_debts_json = state.tech_debts.read_with(|debts| {
|
||||
let tech_debts_json = state.code.tech_debts.read_with(|debts| {
|
||||
let mut scored: Vec<_> = debts.iter().map(|d| {
|
||||
if req.namespace.as_ref().is_some_and(|ns| d.namespace != *ns) {
|
||||
return (d, 0.0);
|
||||
@@ -545,7 +545,7 @@ impl McpTool for OmniSearchHandler {
|
||||
serde_json::to_value(&filtered).map_err(|e| e.to_string())
|
||||
})?;
|
||||
|
||||
let memos_json = state.handoff_memos.read_with(|memos| {
|
||||
let memos_json = state.telemetry.handoff_memos.read_with(|memos| {
|
||||
let filtered: Vec<_> = memos
|
||||
.iter()
|
||||
.filter(|m| {
|
||||
@@ -566,7 +566,7 @@ impl McpTool for OmniSearchHandler {
|
||||
serde_json::to_value(&filtered).map_err(|e| e.to_string())
|
||||
})?;
|
||||
|
||||
let error_fixes_json = state.error_fixes.read_with(|fixes| {
|
||||
let error_fixes_json = state.code.error_fixes.read_with(|fixes| {
|
||||
let mut scored: Vec<_> = fixes.iter().map(|f| {
|
||||
let mut score = 0.0;
|
||||
if contains_ignore_ascii_case(&f.signature, &q) || contains_ignore_ascii_case(&f.solution, &q) {
|
||||
@@ -614,27 +614,27 @@ impl McpTool for GetProjectHealthHandler {
|
||||
async fn execute(&self, args: Value, state: Arc<MemoryState>) -> crate::error::Result<String> {
|
||||
let req: GetProjectHealthTool = serde_json::from_value(args).map_err(|e| e.to_string())?;
|
||||
let active_tasks = state
|
||||
.tasks
|
||||
.project.tasks
|
||||
.read_with(|tasks| tasks.iter().filter(|t| t.status != "done").count());
|
||||
let unresolved_debt = state.tech_debts.read_with(|debts| {
|
||||
let unresolved_debt = state.code.tech_debts.read_with(|debts| {
|
||||
debts
|
||||
.iter()
|
||||
.filter(|d| d.namespace == req.namespace && !d.is_resolved)
|
||||
.count()
|
||||
});
|
||||
let unread_memos = state.handoff_memos.read_with(|memos| {
|
||||
let unread_memos = state.telemetry.handoff_memos.read_with(|memos| {
|
||||
memos
|
||||
.iter()
|
||||
.filter(|m| m.namespace == req.namespace)
|
||||
.count()
|
||||
});
|
||||
let active_milestones = state.milestones.read_with(|milestones| {
|
||||
let active_milestones = state.project.milestones.read_with(|milestones| {
|
||||
milestones
|
||||
.iter()
|
||||
.filter(|m| m.namespace == req.namespace && m.status != "done")
|
||||
.count()
|
||||
});
|
||||
let remaining_checklists = state.pr_checklists.read_with(|checklists| {
|
||||
let remaining_checklists = state.project.pr_checklists.read_with(|checklists| {
|
||||
checklists
|
||||
.iter()
|
||||
.filter(|c| c.namespace == req.namespace)
|
||||
@@ -821,7 +821,7 @@ mod tests {
|
||||
};
|
||||
|
||||
{
|
||||
state.tasks.modify(|t| {
|
||||
state.project.tasks.modify(|t| {
|
||||
t.push(task.clone());
|
||||
});
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user