refactor(action-executor): emit action-finished state hint and trigger cognition turn on executable completion

This commit is contained in:
2026-04-24 22:28:25 +08:00
parent 51706eb55e
commit e37dc7bc9b
2 changed files with 32 additions and 3 deletions

View File

@@ -105,12 +105,12 @@ public class ActionExecutor extends AbstractAgentModule.Standalone {
if (action instanceof ExecutableAction executableAction) {
if (action.getStatus() == Action.Status.FAILED) {
ensureExecutableResult(executableAction, true, null);
blockManager.emitActionFinishedBlock(executableAction);
emitExecutableActionFinished(executableAction);
return;
}
action.setStatus(Action.Status.SUCCESS);
ensureExecutableResult(executableAction, false, null);
blockManager.emitActionFinishedBlock(executableAction);
emitExecutableActionFinished(executableAction);
return;
}
if (action.getStatus() == Action.Status.FAILED) {
@@ -122,7 +122,7 @@ public class ActionExecutor extends AbstractAgentModule.Standalone {
action.setStatus(Action.Status.FAILED);
if (action instanceof ExecutableAction executableAction) {
ensureExecutableResult(executableAction, true, e.getLocalizedMessage());
blockManager.emitActionFinishedBlock(executableAction);
emitExecutableActionFinished(executableAction);
}
}
};
@@ -133,6 +133,15 @@ public class ActionExecutor extends AbstractAgentModule.Standalone {
action.setStatus(Action.Status.FAILED);
}
private void emitExecutableActionFinished(ExecutableAction executableAction) {
blockManager.emitActionFinishedBlock(executableAction);
cognitionCapability.initiateTurn(
"An executable action has finished. Check the latest action-finished state and inform the user of the outcome if it is relevant to the current conversation.",
executableAction.getSource(),
"action_planner"
);
}
private void handleStateAction(StateAction stateAction) {
if (closed.get()) {
return;

View File

@@ -9,6 +9,7 @@ import work.slhaf.partner.core.action.entity.intervention.MetaIntervention;
import work.slhaf.partner.core.cognition.BlockContent;
import work.slhaf.partner.core.cognition.ContextBlock;
import work.slhaf.partner.core.cognition.ContextWorkspace;
import work.slhaf.partner.module.StateHintContent;
import work.slhaf.partner.module.action.executor.entity.HistoryAction;
import java.time.ZonedDateTime;
@@ -382,6 +383,7 @@ class ExecutingActionBlockManager {
14,
24
));
contextWorkspace.register(buildActionFinishedStateHintBlock(snapshot, emittedAt, event));
}
private @NotNull BlockContent buildActionFinishedAbstractBlock(ExecutableActionSnapshot snapshot, String blockName, String event) {
@@ -406,6 +408,24 @@ class ExecutingActionBlockManager {
};
}
private @NotNull ContextBlock buildActionFinishedStateHintBlock(ExecutableActionSnapshot snapshot, String emittedAt, String event) {
return StateHintContent.createBlock(new StateHintContent(
SOURCE,
"An executable action has finished."
) {
@Override
public void fillStateContent(@NotNull Document document, @NotNull Element stateElement) {
appendTextElement(document, stateElement, "event", event);
appendTextElement(document, stateElement, "emitted_at", emittedAt);
appendTextElement(document, stateElement, "action_id", snapshot.getUuid());
appendTextElement(document, stateElement, "final_status", snapshot.getStatus().name().toLowerCase(Locale.ROOT));
appendTextElement(document, stateElement, "description", snapshot.getDescription());
appendTextElement(document, stateElement, "result", snapshot.getResult());
appendTextElement(document, stateElement, "source_user", snapshot.getSource());
}
});
}
private String emittedAt() {
return ZonedDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}