summaryrefslogtreecommitdiff
path: root/makima/src/server/handlers/mesh_daemon.rs
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-01-26 20:19:30 +0000
committersoryu <soryu@soryu.co>2026-01-26 20:19:30 +0000
commit04e1e8f0dd85d19917ac5ba0b73cba65ebac8976 (patch)
treee52537dd2a33c10156f1378ffdc6803bc983482d /makima/src/server/handlers/mesh_daemon.rs
parent6328477bc459eca0243b685553dbd75b925fdc8a (diff)
downloadsoryu-04e1e8f0dd85d19917ac5ba0b73cba65ebac8976.tar.gz
soryu-04e1e8f0dd85d19917ac5ba0b73cba65ebac8976.zip
Add completion phases
Diffstat (limited to 'makima/src/server/handlers/mesh_daemon.rs')
-rw-r--r--makima/src/server/handlers/mesh_daemon.rs50
1 files changed, 18 insertions, 32 deletions
diff --git a/makima/src/server/handlers/mesh_daemon.rs b/makima/src/server/handlers/mesh_daemon.rs
index f5a3c10..270118f 100644
--- a/makima/src/server/handlers/mesh_daemon.rs
+++ b/makima/src/server/handlers/mesh_daemon.rs
@@ -23,7 +23,7 @@ use uuid::Uuid;
use crate::db::models::Task;
use crate::db::repository;
-use crate::llm::{check_deliverables_met, FileInfo, TaskInfo};
+use crate::llm::{check_deliverables_met, TaskInfo};
use crate::server::auth::{hash_api_key, API_KEY_HEADER};
use crate::server::messages::ApiError;
use crate::server::state::{
@@ -494,12 +494,6 @@ async fn compute_action_directive(
_ => return None,
};
- // Get files
- let files = match repository::list_files_in_contract(pool, contract_id, owner_id).await {
- Ok(f) => f,
- _ => return None,
- };
-
// Get tasks (non-supervisor only)
let tasks = match repository::list_tasks_by_contract(pool, contract_id, owner_id).await {
Ok(t) => t.into_iter().filter(|t| !t.is_supervisor).collect::<Vec<_>>(),
@@ -512,20 +506,12 @@ async fn compute_action_directive(
_ => return None,
};
- // Convert to FileInfo and TaskInfo for check_deliverables_met
- let file_infos: Vec<FileInfo> = files
- .iter()
- .map(|f| FileInfo {
- id: f.id,
- name: f.name.clone(),
- contract_phase: f.contract_phase.clone(),
- })
- .collect();
+ // Get completed deliverables for the current phase
+ let completed_deliverables = contract.get_completed_deliverables(&contract.phase);
let task_infos: Vec<TaskInfo> = tasks
.iter()
.map(|t| TaskInfo {
- id: t.id,
name: t.name.clone(),
status: t.status.clone(),
})
@@ -533,29 +519,29 @@ async fn compute_action_directive(
let has_repository = !repos.is_empty();
- // Check if any task has a PR URL set
- let pr_url = tasks.iter().find_map(|t| t.pr_url.as_deref());
-
- // Check deliverables
- let check = check_deliverables_met(
+ // Check deliverables (unused, but kept for future reference)
+ let _check = check_deliverables_met(
&contract.phase,
&contract.contract_type,
- &file_infos,
+ &completed_deliverables,
&task_infos,
has_repository,
- pr_url,
);
- // Only generate directive if deliverables are met and we're in execute phase
- if check.deliverables_met && contract.phase == "execute" {
- // All tasks done, need to create PR
- if pr_url.is_none() || pr_url.unwrap_or("").is_empty() {
- let done_count = task_infos.iter().filter(|t| t.status == "done").count();
+ // Generate directive based on deliverable status
+ if contract.phase == "execute" {
+ // Check if all tasks are done but PR deliverable is not marked complete
+ let all_tasks_done = !task_infos.is_empty()
+ && task_infos.iter().all(|t| t.status == "done");
+ let pr_deliverable_complete = completed_deliverables.contains(&"pull-request".to_string());
+
+ if all_tasks_done && !pr_deliverable_complete {
+ let done_count = task_infos.len();
return Some(format!(
"[ACTION REQUIRED] All {} task(s) completed successfully.\n\
- You MUST now create a PR:\n\
- 1. Ensure all changes are merged to your makima branch\n\
- 2. Create PR: `makima supervisor pr \"makima/...\" --title \"...\" --base main`",
+ You MUST now create a PR and mark the 'pull-request' deliverable as complete:\n\
+ 1. Ensure all changes are merged to your branch\n\
+ 2. Create PR and then call mark_deliverable_complete with deliverable_id='pull-request'",
done_count
));
}