mirror of
https://gitee.com/mateos/mateclaw.git
synced 2026-09-15 20:08:18 +08:00
feat(goal): flip enabled flag on, forward completions to long-term memory
This commit is contained in:
parent
3a0595d5bd
commit
746ade0410
@ -17,8 +17,14 @@ import org.springframework.stereotype.Component;
|
|||||||
@ConfigurationProperties(prefix = "mateclaw.goal")
|
@ConfigurationProperties(prefix = "mateclaw.goal")
|
||||||
public class GoalProperties {
|
public class GoalProperties {
|
||||||
|
|
||||||
/** Master switch — when off, the graph never invokes GoalEvaluationNode. */
|
/**
|
||||||
private boolean enabled = false;
|
* Master switch — when off, the graph never invokes GoalEvaluationNode
|
||||||
|
* (the conditional edge sees no active goal, so the node is unreachable).
|
||||||
|
* Defaults to true now that the full PR1-5 chain is in place; operators
|
||||||
|
* who want to disable goal evaluation can override via
|
||||||
|
* {@code mateclaw.goal.enabled=false} in application.yml.
|
||||||
|
*/
|
||||||
|
private boolean enabled = true;
|
||||||
|
|
||||||
/** Default turn budget when the user doesn't override. */
|
/** Default turn budget when the user doesn't override. */
|
||||||
private int defaultTurnBudget = 20;
|
private int defaultTurnBudget = 20;
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.dao.DuplicateKeyException;
|
import org.springframework.dao.DuplicateKeyException;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
@ -42,7 +43,6 @@ import java.util.function.IntSupplier;
|
|||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
@RequiredArgsConstructor
|
|
||||||
public class GoalServiceImpl implements GoalService {
|
public class GoalServiceImpl implements GoalService {
|
||||||
|
|
||||||
private static final int OPTIMISTIC_LOCK_MAX_RETRIES = 3;
|
private static final int OPTIMISTIC_LOCK_MAX_RETRIES = 3;
|
||||||
@ -53,6 +53,32 @@ public class GoalServiceImpl implements GoalService {
|
|||||||
private final AuditEventService auditEventService;
|
private final AuditEventService auditEventService;
|
||||||
private final ObjectMapper objectMapper;
|
private final ObjectMapper objectMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional — only set when the memory subsystem is wired. On goal
|
||||||
|
* completion we forward a synthetic "[goal completed] ..." turn so
|
||||||
|
* the memory dreaming pass can fold the outcome into long-term
|
||||||
|
* memory and the user can ask about it later. Failures are best
|
||||||
|
* effort: memory should never block the state-machine write.
|
||||||
|
*/
|
||||||
|
private vip.mate.memory.spi.MemoryManager memoryManager;
|
||||||
|
|
||||||
|
public GoalServiceImpl(GoalMapper goalMapper,
|
||||||
|
GoalEventMapper eventMapper,
|
||||||
|
GoalProperties properties,
|
||||||
|
AuditEventService auditEventService,
|
||||||
|
ObjectMapper objectMapper) {
|
||||||
|
this.goalMapper = goalMapper;
|
||||||
|
this.eventMapper = eventMapper;
|
||||||
|
this.properties = properties;
|
||||||
|
this.auditEventService = auditEventService;
|
||||||
|
this.objectMapper = objectMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired(required = false)
|
||||||
|
public void setMemoryManager(vip.mate.memory.spi.MemoryManager memoryManager) {
|
||||||
|
this.memoryManager = memoryManager;
|
||||||
|
}
|
||||||
|
|
||||||
// ==================== CRUD ====================
|
// ==================== CRUD ====================
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -256,6 +282,24 @@ public class GoalServiceImpl implements GoalService {
|
|||||||
detail.put("evalLlmCallsUsed", g.getEvalLlmCallsUsed());
|
detail.put("evalLlmCallsUsed", g.getEvalLlmCallsUsed());
|
||||||
writeEvent(id, GoalEventType.COMPLETED, null, detail);
|
writeEvent(id, GoalEventType.COMPLETED, null, detail);
|
||||||
recordAudit("goal.completed", g, detail);
|
recordAudit("goal.completed", g, detail);
|
||||||
|
|
||||||
|
// RFC 48 PR5 — forward to long-term memory. Best-effort: a failing
|
||||||
|
// memory pipeline must not roll back the DB transition.
|
||||||
|
if (memoryManager != null) {
|
||||||
|
try {
|
||||||
|
String summary = g.getProgressSummary() != null && !g.getProgressSummary().isBlank()
|
||||||
|
? g.getProgressSummary()
|
||||||
|
: "Final score: " + (result != null ? result.score() : "—");
|
||||||
|
memoryManager.syncAll(
|
||||||
|
g.getAgentId(),
|
||||||
|
g.getConversationId(),
|
||||||
|
"[goal completed] " + g.getTitle(),
|
||||||
|
summary);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.debug("[GoalService] memory syncAll on goal completion failed: {}", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return goalMapper.selectById(id);
|
return goalMapper.selectById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user