Skip to content

Commit 15955ac

Browse files
committed
Add additional directories to listSession request
1 parent fde0a3f commit 15955ac

8 files changed

Lines changed: 84 additions & 21 deletions

File tree

acp-ktor-test/src/commonTest/kotlin/com/agentclientprotocol/SimpleAgentTest.kt

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,7 +1649,7 @@ abstract class SimpleAgentTest(protocolDriver: ProtocolDriver) : ProtocolDriver
16491649
)
16501650
}
16511651

1652-
override suspend fun listSessions(cwd: String?, _meta: kotlinx.serialization.json.JsonElement?): Sequence<SessionInfo> {
1652+
override suspend fun listSessions(cwd: String?, additionalDirectories: List<String>?, _meta: kotlinx.serialization.json.JsonElement?): Sequence<SessionInfo> {
16531653
return if (cwd != null) {
16541654
testSessions.filter { it.cwd.contains(cwd) }.asSequence()
16551655
} else {
@@ -1700,7 +1700,7 @@ abstract class SimpleAgentTest(protocolDriver: ProtocolDriver) : ProtocolDriver
17001700
)
17011701
}
17021702

1703-
override suspend fun listSessions(cwd: String?, _meta: kotlinx.serialization.json.JsonElement?): Sequence<SessionInfo> {
1703+
override suspend fun listSessions(cwd: String?, additionalDirectories: List<String>?, _meta: kotlinx.serialization.json.JsonElement?): Sequence<SessionInfo> {
17041704
return if (cwd != null) {
17051705
testSessions.filter { it.cwd.contains(cwd) }.asSequence()
17061706
} else {
@@ -1729,6 +1729,63 @@ abstract class SimpleAgentTest(protocolDriver: ProtocolDriver) : ProtocolDriver
17291729
assertTrue(filteredSessions.all { it.cwd.contains("/project/a") })
17301730
}
17311731

1732+
@OptIn(UnstableApi::class)
1733+
@Test
1734+
fun `list sessions filters by additionalDirectories`() = testWithProtocols { clientProtocol, agentProtocol ->
1735+
val testSessions = listOf(
1736+
SessionInfo(sessionId = SessionId("session-1"), cwd = "/project", additionalDirectories = listOf("/extra/a", "/extra/b")),
1737+
SessionInfo(sessionId = SessionId("session-2"), cwd = "/project", additionalDirectories = listOf("/extra/c")),
1738+
SessionInfo(sessionId = SessionId("session-3"), cwd = "/project", additionalDirectories = null),
1739+
)
1740+
1741+
var receivedAdditionalDirectories: List<String>? = null
1742+
1743+
val client = Client(protocol = clientProtocol)
1744+
val agent = Agent(protocol = agentProtocol, agentSupport = object : AgentSupport {
1745+
override suspend fun initialize(clientInfo: ClientInfo): AgentInfo {
1746+
return AgentInfo(
1747+
clientInfo.protocolVersion,
1748+
capabilities = AgentCapabilities(
1749+
sessionCapabilities = SessionCapabilities(list = SessionListCapabilities())
1750+
)
1751+
)
1752+
}
1753+
1754+
override suspend fun listSessions(cwd: String?, additionalDirectories: List<String>?, _meta: kotlinx.serialization.json.JsonElement?): Sequence<SessionInfo> {
1755+
receivedAdditionalDirectories = additionalDirectories
1756+
return if (additionalDirectories != null) {
1757+
testSessions.filter { session ->
1758+
session.additionalDirectories != null &&
1759+
additionalDirectories.all { it in session.additionalDirectories!! }
1760+
}.asSequence()
1761+
} else {
1762+
testSessions.asSequence()
1763+
}
1764+
}
1765+
1766+
override suspend fun createSession(sessionParameters: SessionCreationParameters): AgentSession {
1767+
TODO("Not yet implemented")
1768+
}
1769+
1770+
override suspend fun loadSession(
1771+
sessionId: SessionId,
1772+
sessionParameters: SessionCreationParameters,
1773+
): AgentSession {
1774+
TODO("Not yet implemented")
1775+
}
1776+
})
1777+
1778+
client.initialize(ClientInfo(protocolVersion = LATEST_PROTOCOL_VERSION))
1779+
1780+
val filterDirs = listOf("/extra/a")
1781+
val flow = client.listSessions(additionalDirectories = filterDirs)
1782+
val filteredSessions = flow.toList()
1783+
1784+
assertEquals(filterDirs, receivedAdditionalDirectories)
1785+
assertEquals(1, filteredSessions.size)
1786+
assertEquals("session-1", filteredSessions.first().sessionId.value)
1787+
}
1788+
17321789
@OptIn(UnstableApi::class)
17331790
@Test
17341791
fun `list sessions with partial iteration works correctly`() = testWithProtocols { clientProtocol, agentProtocol ->
@@ -1748,7 +1805,7 @@ abstract class SimpleAgentTest(protocolDriver: ProtocolDriver) : ProtocolDriver
17481805
)
17491806
}
17501807

1751-
override suspend fun listSessions(cwd: String?, _meta: JsonElement?): Sequence<SessionInfo> {
1808+
override suspend fun listSessions(cwd: String?, additionalDirectories: List<String>?, _meta: JsonElement?): Sequence<SessionInfo> {
17521809
// Return all sessions - the adapter will handle pagination
17531810
return allSessions.asSequence()
17541811
}
@@ -1794,7 +1851,7 @@ abstract class SimpleAgentTest(protocolDriver: ProtocolDriver) : ProtocolDriver
17941851
)
17951852
}
17961853

1797-
override suspend fun listSessions(cwd: String?, _meta: JsonElement?): Sequence<SessionInfo> {
1854+
override suspend fun listSessions(cwd: String?, additionalDirectories: List<String>?, _meta: JsonElement?): Sequence<SessionInfo> {
17981855
resourcesAcquired++
17991856

18001857
return sequence {
@@ -1853,7 +1910,7 @@ abstract class SimpleAgentTest(protocolDriver: ProtocolDriver) : ProtocolDriver
18531910
)
18541911
}
18551912

1856-
override suspend fun listSessions(cwd: String?, _meta: JsonElement?): Sequence<SessionInfo> {
1913+
override suspend fun listSessions(cwd: String?, additionalDirectories: List<String>?, _meta: JsonElement?): Sequence<SessionInfo> {
18571914
// The Agent's setPaginatedRequestHandler with batchSize=10 will consume
18581915
// items from this sequence in batches of 10
18591916
return sequence {
@@ -1909,7 +1966,7 @@ abstract class SimpleAgentTest(protocolDriver: ProtocolDriver) : ProtocolDriver
19091966
)
19101967
}
19111968

1912-
override suspend fun listSessions(cwd: String?, _meta: JsonElement?): Sequence<SessionInfo> {
1969+
override suspend fun listSessions(cwd: String?, additionalDirectories: List<String>?, _meta: JsonElement?): Sequence<SessionInfo> {
19131970
fetchStarted = true
19141971
return sequenceOf(
19151972
SessionInfo(sessionId = SessionId("session-1"), cwd = "/project")

acp-model/api/acp-model.api

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1908,14 +1908,16 @@ public final class com/agentclientprotocol/model/KillTerminalCommandResponse$Com
19081908
public final class com/agentclientprotocol/model/ListSessionsRequest : com/agentclientprotocol/model/AcpPaginatedRequest, com/agentclientprotocol/model/AcpRequest {
19091909
public static final field Companion Lcom/agentclientprotocol/model/ListSessionsRequest$Companion;
19101910
public fun <init> ()V
1911-
public fun <init> (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V
1912-
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
1911+
public fun <init> (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V
1912+
public synthetic fun <init> (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
19131913
public final fun component1 ()Ljava/lang/String;
1914-
public final fun component2 ()Ljava/lang/String;
1915-
public final fun component3 ()Lkotlinx/serialization/json/JsonElement;
1916-
public final fun copy (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/ListSessionsRequest;
1917-
public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ListSessionsRequest;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ListSessionsRequest;
1914+
public final fun component2 ()Ljava/util/List;
1915+
public final fun component3 ()Ljava/lang/String;
1916+
public final fun component4 ()Lkotlinx/serialization/json/JsonElement;
1917+
public final fun copy (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/ListSessionsRequest;
1918+
public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ListSessionsRequest;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ListSessionsRequest;
19181919
public fun equals (Ljava/lang/Object;)Z
1920+
public final fun getAdditionalDirectories ()Ljava/util/List;
19191921
public fun getCursor ()Ljava/lang/String;
19201922
public final fun getCwd ()Ljava/lang/String;
19211923
public fun get_meta ()Lkotlinx/serialization/json/JsonElement;

acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Requests.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,7 @@ public data class ForkSessionResponse(
788788
@Serializable
789789
public data class ListSessionsRequest(
790790
val cwd: String? = null,
791+
val additionalDirectories: List<String>? = null,
791792
override val cursor: String? = null,
792793
override val _meta: JsonElement? = null
793794
) : AcpRequest, AcpPaginatedRequest

acp/api/acp.api

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ public abstract interface class com/agentclientprotocol/agent/AgentSupport {
9292
public fun forkSession-nk3TnMc (Ljava/lang/String;Lcom/agentclientprotocol/common/SessionCreationParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
9393
public static synthetic fun forkSession-nk3TnMc$suspendImpl (Lcom/agentclientprotocol/agent/AgentSupport;Ljava/lang/String;Lcom/agentclientprotocol/common/SessionCreationParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
9494
public abstract fun initialize (Lcom/agentclientprotocol/client/ClientInfo;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
95-
public fun listSessions (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
96-
public static synthetic fun listSessions$suspendImpl (Lcom/agentclientprotocol/agent/AgentSupport;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
95+
public fun listSessions (Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
96+
public static synthetic fun listSessions$suspendImpl (Lcom/agentclientprotocol/agent/AgentSupport;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
9797
public fun loadSession-nk3TnMc (Ljava/lang/String;Lcom/agentclientprotocol/common/SessionCreationParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
9898
public static synthetic fun loadSession-nk3TnMc$suspendImpl (Lcom/agentclientprotocol/agent/AgentSupport;Ljava/lang/String;Lcom/agentclientprotocol/common/SessionCreationParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
9999
public fun logout (Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
@@ -106,7 +106,7 @@ public final class com/agentclientprotocol/agent/AgentSupport$DefaultImpls {
106106
public static fun authenticate-fMnwWJU (Lcom/agentclientprotocol/agent/AgentSupport;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
107107
public static fun createNesSession (Lcom/agentclientprotocol/agent/AgentSupport;Lcom/agentclientprotocol/model/StartNesRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
108108
public static fun forkSession-nk3TnMc (Lcom/agentclientprotocol/agent/AgentSupport;Ljava/lang/String;Lcom/agentclientprotocol/common/SessionCreationParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
109-
public static fun listSessions (Lcom/agentclientprotocol/agent/AgentSupport;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
109+
public static fun listSessions (Lcom/agentclientprotocol/agent/AgentSupport;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
110110
public static fun loadSession-nk3TnMc (Lcom/agentclientprotocol/agent/AgentSupport;Ljava/lang/String;Lcom/agentclientprotocol/common/SessionCreationParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
111111
public static fun logout (Lcom/agentclientprotocol/agent/AgentSupport;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
112112
public static fun resumeSession-nk3TnMc (Lcom/agentclientprotocol/agent/AgentSupport;Ljava/lang/String;Lcom/agentclientprotocol/common/SessionCreationParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
@@ -162,8 +162,8 @@ public final class com/agentclientprotocol/client/Client {
162162
public final fun getSession-0izbxq0 (Ljava/lang/String;)Lcom/agentclientprotocol/client/ClientSession;
163163
public final fun initialize (Lcom/agentclientprotocol/client/ClientInfo;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
164164
public static synthetic fun initialize$default (Lcom/agentclientprotocol/client/Client;Lcom/agentclientprotocol/client/ClientInfo;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
165-
public final fun listSessions (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lkotlinx/coroutines/flow/Flow;
166-
public static synthetic fun listSessions$default (Lcom/agentclientprotocol/client/Client;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;
165+
public final fun listSessions (Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;)Lkotlinx/coroutines/flow/Flow;
166+
public static synthetic fun listSessions$default (Lcom/agentclientprotocol/client/Client;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;
167167
public final fun loadSession-wPMwmcM (Ljava/lang/String;Lcom/agentclientprotocol/common/SessionCreationParameters;Lcom/agentclientprotocol/client/ClientOperationsFactory;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
168168
public final fun logout (Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
169169
public static synthetic fun logout$default (Lcom/agentclientprotocol/client/Client;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;

acp/src/commonMain/kotlin/com/agentclientprotocol/agent/Agent.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public class Agent(
158158
// TODO: move to some global agent/client settings
159159
batchSize = 10,
160160
batchedResultFactory = { _, batch, newCursor -> ListSessionsResponse(batch, newCursor) },
161-
sequenceFactory = { p -> agentSupport.listSessions(p.cwd, p._meta) }
161+
sequenceFactory = { p -> agentSupport.listSessions(p.cwd, p.additionalDirectories, p._meta) }
162162
)
163163

164164
protocol.setRequestHandler(AcpMethod.AgentMethods.SessionNew) { params: NewSessionRequest ->

acp/src/commonMain/kotlin/com/agentclientprotocol/agent/AgentSupport.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,12 @@ public interface AgentSupport {
5858
* Pagination is automatically handled by [com.agentclientprotocol.util.SequenceToPaginatedResponseAdapter].
5959
*
6060
* @param cwd optional current working directory filter
61+
* @param additionalDirectories optional additional directories filter
6162
* @param _meta optional metadata
6263
* @return a sequence of [SessionInfo]
6364
*/
6465
@UnstableApi
65-
public suspend fun listSessions(cwd: String?, _meta: JsonElement?): Sequence<SessionInfo> {
66+
public suspend fun listSessions(cwd: String?, additionalDirectories: List<String>?, _meta: JsonElement?): Sequence<SessionInfo> {
6667
throw NotImplementedError("listSessions is not implemented. The capability is declared in AgentCapabilities.sessionCapabilities.list")
6768
}
6869

acp/src/commonMain/kotlin/com/agentclientprotocol/client/Client.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,16 +314,18 @@ public class Client(
314314
* Sequences don't support suspending operations between value yields.
315315
*
316316
* @param cwd optional current working directory filter
317+
* @param additionalDirectories optional additional directories filter
317318
* @param _meta optional metadata
318319
* @return a cold [Flow] of [SessionInfo] that lazily fetches pages as needed
319320
*/
320321
@UnstableApi
321322
public fun listSessions(
322323
cwd: String? = null,
324+
additionalDirectories: List<String>? = null,
323325
_meta: JsonElement? = null
324326
): Flow<SessionInfo> {
325327
return PaginatedResponseToFlowAdapter.asFlow { cursor ->
326-
AcpMethod.AgentMethods.SessionList(protocol, ListSessionsRequest(cwd, cursor, _meta))
328+
AcpMethod.AgentMethods.SessionList(protocol, ListSessionsRequest(cwd, additionalDirectories, cursor, _meta))
327329
}
328330
}
329331

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ plugins {
77
private val buildNumber: String? = System.getenv("GITHUB_RUN_NUMBER")
88
private val isReleasePublication = System.getenv("RELEASE_PUBLICATION")?.toBoolean() ?: false
99

10-
private val baseVersion = "0.18.0"
10+
private val baseVersion = "0.18.1"
1111

1212
allprojects {
1313
group = "com.agentclientprotocol"

0 commit comments

Comments
 (0)