From e37dc7bc9b02a64beb89c25fd9ad36cea19dbfd0 Mon Sep 17 00:00:00 2001 From: slhafzjw Date: Fri, 24 Apr 2026 22:28:25 +0800 Subject: [PATCH] refactor(action-executor): emit action-finished state hint and trigger cognition turn on executable completion --- .../action/executor/ActionExecutor.java | 15 +++++++++++--- .../executor/ExecutingActionBlockManager.java | 20 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java index 7cd22684..549c4ef0 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ActionExecutor.java @@ -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; diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ExecutingActionBlockManager.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ExecutingActionBlockManager.java index 3c0bd4da..d029d1e8 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ExecutingActionBlockManager.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ExecutingActionBlockManager.java @@ -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")); }