refactor structure

This commit is contained in:
skyfire 2026-02-04 18:38:38 +08:00
parent 3c46278fad
commit 0128f65fe8
198 changed files with 12718 additions and 5 deletions

View file

@ -0,0 +1,31 @@
package com.alibaba.acp.sdk.protocol.client.session;
import com.alibaba.acp.sdk.protocol.domain.permission.PermissionOptionKind;
import com.alibaba.fastjson2.JSON;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class PermissionOptionKindTest {
@Test
public void testJson() {
PermissionOptionKind kind = PermissionOptionKind.ALLOW_ONCE;
assertEquals("\"allow_once\"", JSON.toJSONString(kind));
assertEquals(PermissionOptionKind.ALLOW_ONCE, JSON.parseObject("\"allow_once\"", PermissionOptionKind.class));
kind = PermissionOptionKind.ALLOW_ALWAYS;
assertEquals("\"allow_always\"", JSON.toJSONString(kind));
assertEquals(PermissionOptionKind.ALLOW_ALWAYS, JSON.parseObject("\"allow_always\"", PermissionOptionKind.class));
kind = PermissionOptionKind.REJECT_ONCE;
assertEquals("\"reject_once\"", JSON.toJSONString(kind));
assertEquals(PermissionOptionKind.REJECT_ONCE, JSON.parseObject("\"reject_once\"", PermissionOptionKind.class));
kind = PermissionOptionKind.REJECT_ALWAYS;
assertEquals("\"reject_always\"", JSON.toJSONString(kind));
assertEquals(PermissionOptionKind.REJECT_ALWAYS, JSON.parseObject("\"reject_always\"", PermissionOptionKind.class));
}
}

View file

@ -0,0 +1,27 @@
package com.alibaba.acp.sdk.protocol.client.session;
import com.alibaba.acp.sdk.protocol.domain.plan.PlanEntryPriority;
import com.alibaba.fastjson2.JSON;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class PlanEntryPriorityTest {
@Test
public void testJson() {
PlanEntryPriority priority = PlanEntryPriority.HIGH;
assertEquals("\"high\"", JSON.toJSONString(priority));
assertEquals(PlanEntryPriority.HIGH, JSON.parseObject("\"high\"", PlanEntryPriority.class));
priority = PlanEntryPriority.MEDIUM;
assertEquals("\"medium\"", JSON.toJSONString(priority));
assertEquals(PlanEntryPriority.MEDIUM, JSON.parseObject("\"medium\"", PlanEntryPriority.class));
priority = PlanEntryPriority.LOW;
assertEquals("\"low\"", JSON.toJSONString(priority));
assertEquals(PlanEntryPriority.LOW, JSON.parseObject("\"low\"", PlanEntryPriority.class));
}
}

View file

@ -0,0 +1,27 @@
package com.alibaba.acp.sdk.protocol.client.session;
import com.alibaba.acp.sdk.protocol.domain.plan.PlanEntryStatus;
import com.alibaba.fastjson2.JSON;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class PlanEntryStatusTest {
@Test
public void testJson() {
PlanEntryStatus status = PlanEntryStatus.PENDING;
assertEquals("\"pending\"", JSON.toJSONString(status));
assertEquals(PlanEntryStatus.PENDING, JSON.parseObject("\"pending\"", PlanEntryStatus.class));
status = PlanEntryStatus.IN_PROGRESS;
assertEquals("\"in_progress\"", JSON.toJSONString(status));
assertEquals(PlanEntryStatus.IN_PROGRESS, JSON.parseObject("\"in_progress\"", PlanEntryStatus.class));
status = PlanEntryStatus.COMPLETED;
assertEquals("\"completed\"", JSON.toJSONString(status));
assertEquals(PlanEntryStatus.COMPLETED, JSON.parseObject("\"completed\"", PlanEntryStatus.class));
}
}

View file

@ -0,0 +1,35 @@
package com.alibaba.acp.sdk.protocol.client.session;
import com.alibaba.acp.sdk.protocol.domain.session.StopReason;
import com.alibaba.fastjson2.JSON;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class StopReasonTest {
@Test
public void testJson() {
StopReason reason = StopReason.END_TURN;
assertEquals("\"end_turn\"", JSON.toJSONString(reason));
assertEquals(StopReason.END_TURN, JSON.parseObject("\"end_turn\"", StopReason.class));
reason = StopReason.MAX_TOKENS;
assertEquals("\"max_tokens\"", JSON.toJSONString(reason));
assertEquals(StopReason.MAX_TOKENS, JSON.parseObject("\"max_tokens\"", StopReason.class));
reason = StopReason.MAX_TURN_REQUESTS;
assertEquals("\"max_turn_requests\"", JSON.toJSONString(reason));
assertEquals(StopReason.MAX_TURN_REQUESTS, JSON.parseObject("\"max_turn_requests\"", StopReason.class));
reason = StopReason.REFUSAL;
assertEquals("\"refusal\"", JSON.toJSONString(reason));
assertEquals(StopReason.REFUSAL, JSON.parseObject("\"refusal\"", StopReason.class));
reason = StopReason.CANCELLED;
assertEquals("\"cancelled\"", JSON.toJSONString(reason));
assertEquals(StopReason.CANCELLED, JSON.parseObject("\"cancelled\"", StopReason.class));
}
}

View file

@ -0,0 +1,31 @@
package com.alibaba.acp.sdk.protocol.client.session;
import com.alibaba.acp.sdk.protocol.domain.tool.ToolCallStatus;
import com.alibaba.fastjson2.JSON;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ToolCallStatusTest {
@Test
public void testJson() {
ToolCallStatus status = ToolCallStatus.PENDING;
assertEquals("\"pending\"", JSON.toJSONString(status));
assertEquals(ToolCallStatus.PENDING, JSON.parseObject("\"pending\"", ToolCallStatus.class));
status = ToolCallStatus.IN_PROGRESS;
assertEquals("\"in_progress\"", JSON.toJSONString(status));
assertEquals(ToolCallStatus.IN_PROGRESS, JSON.parseObject("\"in_progress\"", ToolCallStatus.class));
status = ToolCallStatus.COMPLETED;
assertEquals("\"completed\"", JSON.toJSONString(status));
assertEquals(ToolCallStatus.COMPLETED, JSON.parseObject("\"completed\"", ToolCallStatus.class));
status = ToolCallStatus.FAILED;
assertEquals("\"failed\"", JSON.toJSONString(status));
assertEquals(ToolCallStatus.FAILED, JSON.parseObject("\"failed\"", ToolCallStatus.class));
}
}

View file

@ -0,0 +1,55 @@
package com.alibaba.acp.sdk.protocol.client.session;
import com.alibaba.acp.sdk.protocol.domain.tool.ToolKind;
import com.alibaba.fastjson2.JSON;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ToolKindTest {
@Test
public void testJson() {
ToolKind kind = ToolKind.READ;
assertEquals("\"read\"", JSON.toJSONString(kind));
assertEquals(ToolKind.READ, JSON.parseObject("\"read\"", ToolKind.class));
kind = ToolKind.EDIT;
assertEquals("\"edit\"", JSON.toJSONString(kind));
assertEquals(ToolKind.EDIT, JSON.parseObject("\"edit\"", ToolKind.class));
kind = ToolKind.DELETE;
assertEquals("\"delete\"", JSON.toJSONString(kind));
assertEquals(ToolKind.DELETE, JSON.parseObject("\"delete\"", ToolKind.class));
kind = ToolKind.MOVE;
assertEquals("\"move\"", JSON.toJSONString(kind));
assertEquals(ToolKind.MOVE, JSON.parseObject("\"move\"", ToolKind.class));
kind = ToolKind.SEARCH;
assertEquals("\"search\"", JSON.toJSONString(kind));
assertEquals(ToolKind.SEARCH, JSON.parseObject("\"search\"", ToolKind.class));
kind = ToolKind.EXECUTE;
assertEquals("\"execute\"", JSON.toJSONString(kind));
assertEquals(ToolKind.EXECUTE, JSON.parseObject("\"execute\"", ToolKind.class));
kind = ToolKind.THINK;
assertEquals("\"think\"", JSON.toJSONString(kind));
assertEquals(ToolKind.THINK, JSON.parseObject("\"think\"", ToolKind.class));
kind = ToolKind.FETCH;
assertEquals("\"fetch\"", JSON.toJSONString(kind));
assertEquals(ToolKind.FETCH, JSON.parseObject("\"fetch\"", ToolKind.class));
kind = ToolKind.SWITCH_MODE;
assertEquals("\"switch_mode\"", JSON.toJSONString(kind));
assertEquals(ToolKind.SWITCH_MODE, JSON.parseObject("\"switch_mode\"", ToolKind.class));
kind = ToolKind.OTHER;
assertEquals("\"other\"", JSON.toJSONString(kind));
assertEquals(ToolKind.OTHER, JSON.parseObject("\"other\"", ToolKind.class));
}
}

View file

@ -0,0 +1,128 @@
package com.alibaba.acp.sdk.session;
import java.io.IOException;
import java.util.Collections;
import java.util.Optional;
import com.alibaba.acp.sdk.AcpClient;
import com.alibaba.acp.sdk.protocol.domain.client.ClientCapabilities;
import com.alibaba.acp.sdk.protocol.domain.client.ClientCapabilities.FileSystemCapability;
import com.alibaba.acp.sdk.protocol.domain.content.block.TextContent;
import com.alibaba.acp.sdk.protocol.domain.permission.PermissionOption;
import com.alibaba.acp.sdk.protocol.domain.permission.RequestPermissionOutcome;
import com.alibaba.acp.sdk.protocol.domain.session.update.AgentMessageChunkSessionUpdate;
import com.alibaba.acp.sdk.protocol.domain.session.update.AvailableCommandsUpdateSessionUpdate;
import com.alibaba.acp.sdk.protocol.domain.session.update.CurrentModeUpdateSessionUpdate;
import com.alibaba.acp.sdk.protocol.domain.session.update.PlanSessionUpdate;
import com.alibaba.acp.sdk.protocol.domain.session.update.ToolCallSessionUpdate;
import com.alibaba.acp.sdk.protocol.domain.session.update.ToolCallUpdateSessionUpdate;
import com.alibaba.acp.sdk.session.event.consumer.ContentEventSimpleConsumer;
import com.alibaba.acp.sdk.session.event.consumer.FileEventSimpleConsumer;
import com.alibaba.acp.sdk.utils.AgentInitializeException;
import com.alibaba.acp.sdk.protocol.agent.request.RequestPermissionRequest;
import com.alibaba.acp.sdk.protocol.agent.request.RequestPermissionRequest.RequestPermissionRequestParams;
import com.alibaba.acp.sdk.protocol.client.request.InitializeRequest.InitializeRequestParams;
import com.alibaba.acp.sdk.protocol.client.request.NewSessionRequest.NewSessionRequestParams;
import com.alibaba.acp.sdk.protocol.client.response.RequestPermissionResponse.RequestPermissionResponseResult;
import com.alibaba.acp.sdk.protocol.domain.permission.PermissionOutcomeKind;
import com.alibaba.acp.sdk.protocol.jsonrpc.MethodMessage;
import com.alibaba.acp.sdk.session.event.consumer.AgentEventConsumer;
import com.alibaba.acp.sdk.session.event.consumer.PermissionEventConsumer;
import com.alibaba.acp.sdk.session.event.consumer.exception.EventConsumeException;
import com.alibaba.acp.sdk.session.exception.SessionNewException;
import com.alibaba.acp.sdk.transport.Transport;
import com.alibaba.acp.sdk.transport.process.ProcessTransport;
import com.alibaba.acp.sdk.transport.process.ProcessTransportOptions;
import com.alibaba.acp.sdk.utils.Timeout;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static com.alibaba.acp.sdk.protocol.domain.permission.PermissionOptionKind.ALLOW_ALWAYS;
class SessionTest {
private static final Logger logger = LoggerFactory.getLogger(SessionTest.class);
@Test
public void testSession() throws AgentInitializeException, SessionNewException, IOException {
AcpClient acpClient = new AcpClient(new ProcessTransport(new ProcessTransportOptions().setCommandArgs(new String[] {"qwen", "--acp", "--experimental-skills", "-y"})));
try {
acpClient.sendPrompt(Collections.singletonList(new TextContent("你是谁")), new AgentEventConsumer().setContentEventConsumer(new ContentEventSimpleConsumer(){
@Override
public void onAgentMessageChunkSessionUpdate(AgentMessageChunkSessionUpdate sessionUpdate) {
logger.info(sessionUpdate.toString());
}
@Override
public void onAvailableCommandsUpdateSessionUpdate(AvailableCommandsUpdateSessionUpdate sessionUpdate) {
logger.info(sessionUpdate.toString());
}
@Override
public void onCurrentModeUpdateSessionUpdate(CurrentModeUpdateSessionUpdate sessionUpdate) {
logger.info(sessionUpdate.toString());
}
@Override
public void onPlanSessionUpdate(PlanSessionUpdate sessionUpdate) {
logger.info(sessionUpdate.toString());
}
@Override
public void onToolCallUpdateSessionUpdate(ToolCallUpdateSessionUpdate sessionUpdate) {
logger.info(sessionUpdate.toString());
}
@Override
public void onToolCallSessionUpdate(ToolCallSessionUpdate sessionUpdate) {
logger.info(sessionUpdate.toString());
}
}));
} finally {
acpClient.close();
}
}
@Test
void test() throws SessionNewException, AgentInitializeException, IOException {
Transport transport = new ProcessTransport(
new ProcessTransportOptions().setCommandArgs(new String[] {"qwen", "--acp", "--experimental-skills", "-y"}));
AcpClient acpClient = new AcpClient(transport, new InitializeRequestParams().setClientCapabilities(
new ClientCapabilities()
.setTerminal(true)
.setFs(new FileSystemCapability().setReadTextFile(true).setWriteTextFile(true))));
Session session = acpClient.newSession(new NewSessionRequestParams());
session.sendPrompt(Collections.singletonList(new TextContent("你是谁")), new AgentEventConsumer());
}
@Test
void testPermission() throws AgentInitializeException, SessionNewException, IOException {
Transport transport = new ProcessTransport(
new ProcessTransportOptions().setCommandArgs(new String[] {"qwen", "--acp", "--experimental-skills"}));
AcpClient acpClient = new AcpClient(transport, new InitializeRequestParams().setClientCapabilities(
new ClientCapabilities()
.setTerminal(false)
.setFs(new FileSystemCapability(true, true))));
Session session = acpClient.newSession(new NewSessionRequestParams());
session.sendPrompt(Collections.singletonList(new TextContent("创建一个test.touch文件"))
, new AgentEventConsumer().setFileEventConsumer(new FileEventSimpleConsumer()).setPermissionEventConsumer(new PermissionEventConsumer() {
@Override
public RequestPermissionResponseResult onRequestPermissionRequest(RequestPermissionRequest request) throws EventConsumeException {
return new RequestPermissionResponseResult(new RequestPermissionOutcome().
setOptionId(Optional.of(request)
.map(MethodMessage::getParams)
.map(RequestPermissionRequestParams::getOptions)
.flatMap(options -> options.stream()
.filter(option -> ALLOW_ALWAYS.equals(option.getKind()))
.findFirst())
.map(PermissionOption::getOptionId).orElse(null))
.setOutcome(PermissionOutcomeKind.SELECTED));
}
@Override
public Timeout onRequestPermissionRequestTimeout(RequestPermissionRequest request) {
return Timeout.TIMEOUT_60_SECONDS;
}
}));
}
}

View file

@ -0,0 +1,22 @@
package com.alibaba.acp.sdk.test;
import com.alibaba.acp.sdk.protocol.domain.plan.PlanEntryStatus;
import com.alibaba.fastjson2.JSON;
public class EnumTest {
public static void main(String[] args) {
// Test PlanEntryStatus enum
PlanEntryStatus status = PlanEntryStatus.PENDING;
String json = JSON.toJSONString(status);
System.out.println("JSON output: " + json);
PlanEntryStatus parsed = JSON.parseObject("\"pending\"", PlanEntryStatus.class);
System.out.println("Parsed enum: " + parsed);
if ("\"pending\"".equals(json) && PlanEntryStatus.PENDING == parsed) {
System.out.println("SUCCESS: PlanEntryStatus enum works correctly!");
} else {
System.out.println("FAILURE: PlanEntryStatus enum not working properly");
}
}
}

File diff suppressed because it is too large Load diff