diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/action/ActionPoolStateCodec.java b/Partner-Core/src/main/java/work/slhaf/partner/core/action/ActionPoolStateCodec.java index d5729af2..da6bca48 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/action/ActionPoolStateCodec.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/action/ActionPoolStateCodec.java @@ -76,6 +76,10 @@ final class ActionPoolStateCodec { .map(entry -> { Map stageMap = new LinkedHashMap<>(); stageMap.put("stage", StateValue.num(entry.getKey())); + String stageDescription = action.getStageDescriptions().get(entry.getKey()); + if (stageDescription != null && !stageDescription.isBlank()) { + stageMap.put("description", StateValue.str(stageDescription)); + } stageMap.put("actions", StateValue.arr(entry.getValue().stream() .map(metaAction -> (StateValue) encodeMetaAction(metaAction)) .toList())); @@ -126,7 +130,11 @@ final class ActionPoolStateCodec { return null; } - Map> restoredChain = decodeActionChain(actionObject.getJSONArray("action_chain")); + Map restoredStageDescriptions = new LinkedHashMap<>(); + Map> restoredChain = decodeActionChain( + actionObject.getJSONArray("action_chain"), + restoredStageDescriptions + ); ExecutableAction executableAction; if ("schedulable".equals(kind)) { String scheduleType = actionObject.getString("schedule_type"); @@ -173,11 +181,15 @@ final class ActionPoolStateCodec { if (result != null) { executableAction.setResult(result); } + executableAction.getStageDescriptions().putAll(restoredStageDescriptions); executableAction.getHistory().putAll(decodeHistory(actionObject.getJSONArray("history"))); return executableAction; } - private static Map> decodeActionChain(@Nullable JSONArray actionChainArray) { + private static Map> decodeActionChain( + @Nullable JSONArray actionChainArray, + Map stageDescriptions + ) { Map> restored = new LinkedHashMap<>(); if (actionChainArray == null) { return toMutableActionChain(restored); @@ -188,10 +200,14 @@ final class ActionPoolStateCodec { continue; } Integer stage = stageObject.getInteger("stage"); + String description = stageObject.getString("description"); JSONArray actions = stageObject.getJSONArray("actions"); if (stage == null || actions == null) { continue; } + if (description != null && !description.isBlank()) { + stageDescriptions.put(stage, description); + } List metaActions = new ArrayList<>(); for (int j = 0; j < actions.size(); j++) { JSONObject actionObject = actions.getJSONObject(j); diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/action/entity/Action.kt b/Partner-Core/src/main/java/work/slhaf/partner/core/action/entity/Action.kt index 896a9c14..3f458d39 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/action/entity/Action.kt +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/action/entity/Action.kt @@ -96,6 +96,11 @@ sealed class ExecutableAction( */ abstract val actionChain: MutableMap> + /** + * 行动阶段描述,用于为每个 stage 提供可落地的执行目标说明 + */ + val stageDescriptions: MutableMap = mutableMapOf() + /** * 行动阶段(当前阶段) */ @@ -143,6 +148,7 @@ sealed class ExecutableAction( status = status, tendency = tendency, actionChainSize = actionChain.size, + stageDescriptions = stageDescriptions.toMap(), executingStage = executingStage, result = result, history = history.mapValues { (_, value) -> value.toList() }, @@ -268,6 +274,7 @@ data class ExecutableActionSnapshot( val tendency: String, val actionChainSize: Int, + val stageDescriptions: Map, val executingStage: Int, val result: String?, val history: Map>, 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 06609a7f..e9518fb8 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 @@ -406,7 +406,12 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { result.reset(); metaAction.getParams().clear(); - Result extractorInputResult = assemblyHelper.buildExtractorInput(metaAction.getKey(), actionData.getUuid(), actionData.getDescription()); + Result extractorInputResult = assemblyHelper.buildExtractorInput( + metaAction.getKey(), + actionData.getUuid(), + actionData.getDescription(), + resolveCurrentStageDescription(actionData, executingStage) + ); AgentRuntimeException exception = extractorInputResult.exceptionOrNull(); if (exception != null) { failureReason.set(exception.getMessage()); @@ -512,6 +517,10 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { } } + private String resolveCurrentStageDescription(ExecutableAction executableAction, int executingStage) { + return executableAction.getStageDescriptions().get(executingStage); + } + private String buildAttemptFailureReason(String prefix, String detail) { if (detail == null || detail.isBlank()) { return prefix; @@ -745,13 +754,14 @@ public class ActionExecutor extends AbstractAgentModule.Standalone { private AssemblyHelper() { } - private Result buildExtractorInput(String actionKey, @NotNull String uuid, @NotNull String description) { + private Result buildExtractorInput(String actionKey, @NotNull String uuid, @NotNull String description, String currentStageDescription) { return actionCapability.loadMetaActionInfo(actionKey).fold( metaActionInfo -> { ExtractorInput input = new ExtractorInput(); input.setMetaActionInfo(metaActionInfo); input.setTargetActionId(uuid); input.setTargetActionDesc(description); + input.setCurrentStageDesc(currentStageDescription); return Result.success(input); }, Result::failure diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ParamsExtractor.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ParamsExtractor.java index 0b4568c1..deabb236 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ParamsExtractor.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/ParamsExtractor.java @@ -29,7 +29,7 @@ public class ParamsExtractor extends AbstractAgentModule.Sub 节点的文本内容表示该参数的含义或期望内容。 你的任务: @@ -78,6 +78,9 @@ public class ParamsExtractor extends AbstractAgentModule.Sub { appendTextElement(document, block, "uuid", input.getTargetActionId()); appendTextElement(document, block, "description", input.getTargetActionDesc()); + if (input.getCurrentStageDesc() != null && !input.getCurrentStageDesc().isBlank()) { + appendTextElement(document, block, "current_stage_description", input.getCurrentStageDesc()); + } return Unit.INSTANCE; }); appendChildElement(document, root, "meta_action_info", element -> { diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/ExtractorInput.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/ExtractorInput.java index 8361e8de..61d2bd74 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/ExtractorInput.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/executor/entity/ExtractorInput.java @@ -16,6 +16,11 @@ public class ExtractorInput { */ private String targetActionDesc; + /** + * 当前执行阶段的 description + */ + private String currentStageDesc; + /** * 目标 MetaActionInfo */ diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/evaluator/ActionEvaluator.java b/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/evaluator/ActionEvaluator.java index 138a9aeb..c345ab34 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/evaluator/ActionEvaluator.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/planner/evaluator/ActionEvaluator.java @@ -150,10 +150,13 @@ public class ActionEvaluator extends AbstractAgentModule.Sub actionKeys; } }