refactor(watch): support configurable directory watch depth

This commit is contained in:
2026-04-01 22:15:00 +08:00
parent 632e47ec13
commit 4ae65b885e
7 changed files with 322 additions and 20 deletions

View File

@@ -328,6 +328,7 @@ public class LocalRunnerClientTest {
}
}
@Test
void testDynamicWatchDeleteBehavior(@TempDir Path tempDir) throws IOException, InterruptedException {
ConcurrentHashMap<String, MetaActionInfo> existedMetaActions = new ConcurrentHashMap<>();
@@ -521,6 +522,7 @@ public class LocalRunnerClientTest {
}
}
@Test
void testDescMcpIgnoreInvalidFileName(@TempDir Path tempDir) throws IOException, InterruptedException {
ConcurrentHashMap<String, MetaActionInfo> existedMetaActions = new ConcurrentHashMap<>();
@@ -809,6 +811,7 @@ public class LocalRunnerClientTest {
executor.shutdownNow();
}
}
}
@Nested

View File

@@ -0,0 +1,89 @@
package work.slhaf.partner.core.action.runner;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import work.slhaf.partner.core.action.entity.MetaActionInfo;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import static work.slhaf.partner.core.action.runner.LocalRunnerClientTest.Await.waitForCondition;
import static work.slhaf.partner.core.action.runner.LocalRunnerClientTest.Common.*;
import static work.slhaf.partner.core.action.runner.LocalRunnerClientTest.Fs.*;
class LocalRunnerClientWatchDepthTest {
@Test
void testDynamicWatchIgnoresGrandchildDirectories(@TempDir Path tempDir) throws IOException, InterruptedException {
ConcurrentHashMap<String, MetaActionInfo> existedMetaActions = new ConcurrentHashMap<>();
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
new LocalRunnerClient(existedMetaActions, executor, tempDir.toString());
try {
Path nestedActionDir = tempDir.resolve("action").resolve("dynamic").resolve("group").resolve("demo_action_nested");
Files.createDirectories(nestedActionDir);
writeRunFile(nestedActionDir);
writeDescJson(nestedActionDir, "nested action");
waitForCondition(() -> existedMetaActions.containsKey("local::demo_action_nested"), 1000);
Assertions.assertFalse(existedMetaActions.containsKey("local::demo_action_nested"));
} finally {
executor.shutdownNow();
}
}
@Test
void testDescMcpIgnoresNestedDirectories(@TempDir Path tempDir) throws IOException, InterruptedException {
ConcurrentHashMap<String, MetaActionInfo> existedMetaActions = new ConcurrentHashMap<>();
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
String actionKey = "local::desc_nested";
existedMetaActions.put(actionKey, buildMetaActionInfo("base"));
new LocalRunnerClient(existedMetaActions, executor, tempDir.toString());
try {
Path nestedDescDir = tempDir.resolve("action").resolve("mcp").resolve("desc").resolve("nested");
Files.createDirectories(nestedDescDir);
writeDescMcpJson(nestedDescDir, actionKey, "nested override");
waitForCondition(() -> {
MetaActionInfo current = getMetaActionInfo(existedMetaActions, actionKey);
return current != null && "nested override".equals(current.getDescription());
}, 1000);
MetaActionInfo info = getMetaActionInfo(existedMetaActions, actionKey);
Assertions.assertNotNull(info);
Assertions.assertEquals("base", info.getDescription());
} finally {
executor.shutdownNow();
}
}
@Test
void testCommonMcpIgnoresNestedDirectories(@TempDir Path tempDir) throws IOException, InterruptedException {
ConcurrentHashMap<String, MetaActionInfo> existedMetaActions = new ConcurrentHashMap<>();
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
new LocalRunnerClient(existedMetaActions, executor, tempDir.toString());
try {
Path nestedDir = tempDir.resolve("action").resolve("mcp").resolve("nested");
Files.createDirectories(nestedDir);
Path configFile = nestedDir.resolve("servers.json");
String config = buildCommonMcpConfig(
buildStdioServerEntry("mcp-deepwiki", "mcp-deepwiki@latest")
);
writeCommonMcpConfig(configFile, config);
waitForCondition(() -> hasActionKey(existedMetaActions, key -> key.startsWith("mcp-deepwiki::")), 2000);
Assertions.assertFalse(hasActionKey(existedMetaActions, key -> key.startsWith("mcp-deepwiki::")));
} finally {
executor.shutdownNow();
}
}
}