diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 210ab4d4..d920afab 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -3,11 +3,11 @@ - + diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java index 41f97514..2bd97016 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCapability.java @@ -45,4 +45,6 @@ public interface ActionCapability { MetaActionInfo loadMetaActionInfo(@NonNull String actionKey); boolean checkExists(String... actionKeys); + + void execute(MetaAction metaAction); } diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java index c70813c4..bfbbb7f9 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionCore.java @@ -55,6 +55,7 @@ public class ActionCore extends PartnerCore { */ private final LinkedHashMap existedMetaActions = new LinkedHashMap<>(); private final List phaserRecords = new ArrayList<>(); + private final SandboxRunnerClient sandboxRunnerClient = new SandboxRunnerClient(); public ActionCore() throws IOException, ClassNotFoundException { new ActionWatchService(existedMetaActions, virtualExecutor).launch(); @@ -241,6 +242,11 @@ public class ActionCore extends PartnerCore { return existedMetaActions.keySet().containsAll(Arrays.asList(actionKeys)); } + @CapabilityMethod + public void execute(MetaAction metaAction) { + sandboxRunnerClient.run(metaAction); + } + /** * 命中缓存且评估通过时 * diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionWatchService.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionWatchService.java index 8af7987b..27c72ff2 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionWatchService.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/ActionWatchService.java @@ -17,6 +17,7 @@ import java.util.concurrent.ExecutorService; import static work.slhaf.partner.common.Constant.Path.ACTION_PROGRAM; +// TODO 后续需迁移至 SandboxRunner,作为容器内的监听逻辑 @SuppressWarnings("unchecked") @Slf4j class ActionWatchService { diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/SandboxRunnerClient.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/SandboxRunnerClient.java new file mode 100644 index 00000000..bb2ff561 --- /dev/null +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/SandboxRunnerClient.java @@ -0,0 +1,36 @@ +package work.slhaf.partner.core.action; + +import work.slhaf.partner.core.action.entity.MetaAction; + +import java.nio.file.Path; + +/** + * 基于 Http 与 WebSocket 的沙盒执行器客户端,负责: + *
    + *
  • + * 发送行动单元数据 + *
  • + *
  • + * 实时更新获取已存在行动列表 + *
  • + *
  • + * 向传入的 MetaAction 回写执行结果 + *
  • + *
+ */ +class SandboxRunnerClient { + + public SandboxRunnerClient() { + // 连接沙盒执行器(websocket) + } + + public void run(MetaAction metaAction) { + // 获取已存在行动列表 + Path path = metaAction.checkAndGetPath(); + if (!metaAction.getResult().isSuccess()) { + return; + } + // 调用沙盒执行器 + } + +} diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaAction.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaAction.java index fafb6840..78c95c2c 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaAction.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/entity/MetaAction.java @@ -2,7 +2,6 @@ package work.slhaf.partner.core.action.entity; import lombok.Data; import org.jetbrains.annotations.NotNull; -import work.slhaf.partner.common.Constant; import java.io.File; import java.nio.file.Path; @@ -10,10 +9,10 @@ import java.nio.file.Path; import static work.slhaf.partner.common.Constant.Path.ACTION_PROGRAM; /** - * 行动链中的单一元素,实现{@link Runnable}接口,封装了调用外部行动程序的必要信息,可被执行 + * 行动链中的单一元素,封装了调用外部行动程序的必要信息与结果容器,可被{@link work.slhaf.partner.core.action.ActionCapability}执行 */ @Data -public class MetaAction implements Comparable, Runnable { +public class MetaAction implements Comparable { /** * 行动key,用于标识与定位行动程序 @@ -40,48 +39,23 @@ public class MetaAction implements Comparable, Runnable { */ private MetaActionType type; - @Override - public int compareTo(@NotNull MetaAction metaAction) { - return this.order - metaAction.order; - } - - @Override - public void run() { - File action = loadFromFile(); + public Path checkAndGetPath() { + Path path = switch (type) { + case PLUGIN -> Path.of(ACTION_PROGRAM, key, "action.jar"); + case SCRIPT -> Path.of(ACTION_PROGRAM, key, "action.py"); + case MCP -> Path.of(ACTION_PROGRAM, key, "action.json"); + }; + File action = path.toFile(); if (!action.exists()) { result.setSuccess(false); result.setData("Action file not found: " + action.getAbsolutePath()); } - try { - switch (type) { - case PLUGIN -> executePlugin(action); - case MCP -> executeMcp(action); - case SCRIPT -> executeScript(action); - } - } catch (Exception e) { - result.setSuccess(false); - result.setData(e.getMessage()); - } + return path; } - private File loadFromFile() { - return switch (type) { - case PLUGIN -> Path.of(Constant.Path.ACTION_PROGRAM, key, "action.jar").toFile(); - case SCRIPT -> Path.of(ACTION_PROGRAM, key, "action.py").toFile(); - case MCP -> Path.of(ACTION_PROGRAM, key, "action.json").toFile(); - }; - } - - private void executePlugin(File actionFile) { - - } - - private void executeMcp(File actionFile) { - - } - - private void executeScript(File actionFile) { - + @Override + public int compareTo(@NotNull MetaAction metaAction) { + return this.order - metaAction.order; } @Data diff --git a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/executor/ActionExecutor.java b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/executor/ActionExecutor.java index a1f0f16a..8155d5ca 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/executor/ActionExecutor.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/module/modules/action/dispatcher/executor/ActionExecutor.java @@ -51,9 +51,12 @@ public class ActionExecutor extends AgentRunningSubModule orderList = new ArrayList<>(actionChain.keySet().stream().toList()); + orderList.sort(Integer::compareTo); try { - actionChain.forEach((k, v) -> { - for (MetaAction metaAction : v) { + for (Integer order : orderList) { + List metaActions = actionChain.get(order); + for (MetaAction metaAction : metaActions) { // 根据io类型放入合适的列表 if (metaAction.isIo()) { virtual.add(metaAction); @@ -65,7 +68,7 @@ public class ActionExecutor extends AgentRunningSubModule { try { - action.run(); + actionCapability.execute(action); } finally { phaser.arriveAndDeregister(); }