From 4ca54a9b05ec8a1ec4ca2b9af3fe1d912b6b6ca1 Mon Sep 17 00:00:00 2001 From: subochev Date: Wed, 9 Sep 2026 23:40:52 +0300 Subject: [PATCH] Address PR review: rename package to pw.binom.agui, add native KMP targets, fix native event serialization - Rename module package com.agui -> pw.binom.agui (dirs + code + root group) - Expand KMP targets on all modules: jvm + macOS/ios/Linux/mingw (no Android) - Server native via ktor-server-cio; client native via ktor-client-cio - Annotate sealed interface BaseEvent with @Serializable so the sealed serializer resolves without reflection on Kotlin/Native (was reflection-only on JVM, so native tests failed with 'Serializer for class BaseEvent not found') --- api/build.gradle.kts | 8 ++++ .../binom}/agui/api/agent/AbstractAgent.kt | 20 ++++---- .../{com => pw/binom}/agui/api/agent/Agent.kt | 8 ++-- .../binom}/agui/api/agent/AgentSubscriber.kt | 38 +++++++-------- .../binom}/agui/api/agent/EventDispatcher.kt | 38 +++++++-------- .../binom}/agui/api/context/Context.kt | 2 +- .../binom}/agui/api/event/BaseEvent.kt | 9 ++-- .../binom}/agui/api/message/Message.kt | 2 +- .../{com => pw/binom}/agui/api/run/Run.kt | 10 ++-- .../binom}/agui/api/serialization/AguiJson.kt | 38 +++++++-------- .../{com => pw/binom}/agui/api/state/State.kt | 4 +- .../{com => pw/binom}/agui/api/tool/Tool.kt | 2 +- .../{com => pw/binom}/agui/api/AgentTest.kt | 30 ++++++------ .../binom}/agui/api/EventSerializationTest.kt | 46 +++++++++---------- build.gradle.kts | 2 +- client/build.gradle.kts | 11 +++++ .../binom}/agui/client/HttpAgent.kt | 10 ++-- .../binom}/agui/client/HttpAgentFactory.kt | 2 +- .../binom}/agui/client/HttpAgentTest.kt | 24 +++++----- gradle/libs.versions.toml | 1 + server/build.gradle.kts | 11 +++++ .../{com => pw/binom}/agui/server/Agui.kt | 12 ++--- .../binom}/agui/server/demo/SampleServer.kt | 18 ++++---- .../binom}/agui/server/AguiServerTest.kt | 28 +++++------ 24 files changed, 203 insertions(+), 171 deletions(-) rename api/src/commonMain/kotlin/{com => pw/binom}/agui/api/agent/AbstractAgent.kt (79%) rename api/src/commonMain/kotlin/{com => pw/binom}/agui/api/agent/Agent.kt (74%) rename api/src/commonMain/kotlin/{com => pw/binom}/agui/api/agent/AgentSubscriber.kt (62%) rename api/src/commonMain/kotlin/{com => pw/binom}/agui/api/agent/EventDispatcher.kt (66%) rename api/src/commonMain/kotlin/{com => pw/binom}/agui/api/context/Context.kt (90%) rename api/src/commonMain/kotlin/{com => pw/binom}/agui/api/event/BaseEvent.kt (95%) rename api/src/commonMain/kotlin/{com => pw/binom}/agui/api/message/Message.kt (97%) rename api/src/commonMain/kotlin/{com => pw/binom}/agui/api/run/Run.kt (91%) rename api/src/commonMain/kotlin/{com => pw/binom}/agui/api/serialization/AguiJson.kt (72%) rename api/src/commonMain/kotlin/{com => pw/binom}/agui/api/state/State.kt (84%) rename api/src/commonMain/kotlin/{com => pw/binom}/agui/api/tool/Tool.kt (93%) rename api/src/commonTest/kotlin/{com => pw/binom}/agui/api/AgentTest.kt (81%) rename api/src/commonTest/kotlin/{com => pw/binom}/agui/api/EventSerializationTest.kt (73%) rename client/src/commonMain/kotlin/{com => pw/binom}/agui/client/HttpAgent.kt (87%) rename client/src/jvmMain/kotlin/{com => pw/binom}/agui/client/HttpAgentFactory.kt (96%) rename client/src/jvmTest/kotlin/{com => pw/binom}/agui/client/HttpAgentTest.kt (79%) rename server/src/commonMain/kotlin/{com => pw/binom}/agui/server/Agui.kt (91%) rename server/src/jvmMain/kotlin/{com => pw/binom}/agui/server/demo/SampleServer.kt (74%) rename server/src/jvmTest/kotlin/{com => pw/binom}/agui/server/AguiServerTest.kt (81%) diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 5649905..56cbd68 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -6,6 +6,14 @@ plugins { kotlin { jvmToolchain(21) jvm() + macosX64() + macosArm64() + iosX64() + iosArm64() + iosSimulatorArm64() + linuxX64() + linuxArm64() + mingwX64() sourceSets { commonMain.dependencies { diff --git a/api/src/commonMain/kotlin/com/agui/api/agent/AbstractAgent.kt b/api/src/commonMain/kotlin/pw/binom/agui/api/agent/AbstractAgent.kt similarity index 79% rename from api/src/commonMain/kotlin/com/agui/api/agent/AbstractAgent.kt rename to api/src/commonMain/kotlin/pw/binom/agui/api/agent/AbstractAgent.kt index 4f2198a..f450170 100644 --- a/api/src/commonMain/kotlin/com/agui/api/agent/AbstractAgent.kt +++ b/api/src/commonMain/kotlin/pw/binom/agui/api/agent/AbstractAgent.kt @@ -1,14 +1,14 @@ -package com.agui.api.agent +package pw.binom.agui.api.agent -import com.agui.api.event.BaseEvent -import com.agui.api.message.Message -import com.agui.api.run.RunAgentInput -import com.agui.api.run.RunAgentParameters -import com.agui.api.run.randomRunId -import com.agui.api.run.toParameters -import com.agui.api.run.toRunAgentInput -import com.agui.api.state.State -import com.agui.api.state.mutableState +import pw.binom.agui.api.event.BaseEvent +import pw.binom.agui.api.message.Message +import pw.binom.agui.api.run.RunAgentInput +import pw.binom.agui.api.run.RunAgentParameters +import pw.binom.agui.api.run.randomRunId +import pw.binom.agui.api.run.toParameters +import pw.binom.agui.api.run.toRunAgentInput +import pw.binom.agui.api.state.State +import pw.binom.agui.api.state.mutableState import kotlinx.coroutines.flow.Flow /** diff --git a/api/src/commonMain/kotlin/com/agui/api/agent/Agent.kt b/api/src/commonMain/kotlin/pw/binom/agui/api/agent/Agent.kt similarity index 74% rename from api/src/commonMain/kotlin/com/agui/api/agent/Agent.kt rename to api/src/commonMain/kotlin/pw/binom/agui/api/agent/Agent.kt index ee56df4..d0e597b 100644 --- a/api/src/commonMain/kotlin/com/agui/api/agent/Agent.kt +++ b/api/src/commonMain/kotlin/pw/binom/agui/api/agent/Agent.kt @@ -1,7 +1,7 @@ -package com.agui.api.agent +package pw.binom.agui.api.agent -import com.agui.api.event.BaseEvent -import com.agui.api.run.RunAgentInput +import pw.binom.agui.api.event.BaseEvent +import pw.binom.agui.api.run.RunAgentInput import kotlinx.coroutines.flow.Flow /** @@ -10,7 +10,7 @@ import kotlinx.coroutines.flow.Flow * * This is the network-agnostic heart of the protocol. A concrete [Agent] can be: * - * - remote — [com.agui.client.HttpAgent] streams events over SSE; + * - remote — [pw.binom.agui.client.HttpAgent] streams events over SSE; * - local — a real agent implementation; * - composed/decorated — logging, auth, retry, observability wrappers. */ diff --git a/api/src/commonMain/kotlin/com/agui/api/agent/AgentSubscriber.kt b/api/src/commonMain/kotlin/pw/binom/agui/api/agent/AgentSubscriber.kt similarity index 62% rename from api/src/commonMain/kotlin/com/agui/api/agent/AgentSubscriber.kt rename to api/src/commonMain/kotlin/pw/binom/agui/api/agent/AgentSubscriber.kt index 5385b07..b575c64 100644 --- a/api/src/commonMain/kotlin/com/agui/api/agent/AgentSubscriber.kt +++ b/api/src/commonMain/kotlin/pw/binom/agui/api/agent/AgentSubscriber.kt @@ -1,23 +1,23 @@ -package com.agui.api.agent +package pw.binom.agui.api.agent -import com.agui.api.event.BaseEvent -import com.agui.api.event.CustomEvent -import com.agui.api.event.MessagesSnapshotEvent -import com.agui.api.event.RawEvent -import com.agui.api.event.RunErrorEvent -import com.agui.api.event.RunFinishedEvent -import com.agui.api.event.RunStartedEvent -import com.agui.api.event.StateDeltaEvent -import com.agui.api.event.StateSnapshotEvent -import com.agui.api.event.StepFinishedEvent -import com.agui.api.event.StepStartedEvent -import com.agui.api.event.TextMessageContentEvent -import com.agui.api.event.TextMessageEndEvent -import com.agui.api.event.TextMessageStartEvent -import com.agui.api.event.ToolCallArgsEvent -import com.agui.api.event.ToolCallEndEvent -import com.agui.api.event.ToolCallResultEvent -import com.agui.api.event.ToolCallStartEvent +import pw.binom.agui.api.event.BaseEvent +import pw.binom.agui.api.event.CustomEvent +import pw.binom.agui.api.event.MessagesSnapshotEvent +import pw.binom.agui.api.event.RawEvent +import pw.binom.agui.api.event.RunErrorEvent +import pw.binom.agui.api.event.RunFinishedEvent +import pw.binom.agui.api.event.RunStartedEvent +import pw.binom.agui.api.event.StateDeltaEvent +import pw.binom.agui.api.event.StateSnapshotEvent +import pw.binom.agui.api.event.StepFinishedEvent +import pw.binom.agui.api.event.StepStartedEvent +import pw.binom.agui.api.event.TextMessageContentEvent +import pw.binom.agui.api.event.TextMessageEndEvent +import pw.binom.agui.api.event.TextMessageStartEvent +import pw.binom.agui.api.event.ToolCallArgsEvent +import pw.binom.agui.api.event.ToolCallEndEvent +import pw.binom.agui.api.event.ToolCallResultEvent +import pw.binom.agui.api.event.ToolCallStartEvent /** * Observer for a stream of [BaseEvent]s. diff --git a/api/src/commonMain/kotlin/com/agui/api/agent/EventDispatcher.kt b/api/src/commonMain/kotlin/pw/binom/agui/api/agent/EventDispatcher.kt similarity index 66% rename from api/src/commonMain/kotlin/com/agui/api/agent/EventDispatcher.kt rename to api/src/commonMain/kotlin/pw/binom/agui/api/agent/EventDispatcher.kt index a72792a..064e492 100644 --- a/api/src/commonMain/kotlin/com/agui/api/agent/EventDispatcher.kt +++ b/api/src/commonMain/kotlin/pw/binom/agui/api/agent/EventDispatcher.kt @@ -1,23 +1,23 @@ -package com.agui.api.agent +package pw.binom.agui.api.agent -import com.agui.api.event.BaseEvent -import com.agui.api.event.CustomEvent -import com.agui.api.event.MessagesSnapshotEvent -import com.agui.api.event.RawEvent -import com.agui.api.event.RunErrorEvent -import com.agui.api.event.RunFinishedEvent -import com.agui.api.event.RunStartedEvent -import com.agui.api.event.StateDeltaEvent -import com.agui.api.event.StateSnapshotEvent -import com.agui.api.event.StepFinishedEvent -import com.agui.api.event.StepStartedEvent -import com.agui.api.event.TextMessageContentEvent -import com.agui.api.event.TextMessageEndEvent -import com.agui.api.event.TextMessageStartEvent -import com.agui.api.event.ToolCallArgsEvent -import com.agui.api.event.ToolCallEndEvent -import com.agui.api.event.ToolCallResultEvent -import com.agui.api.event.ToolCallStartEvent +import pw.binom.agui.api.event.BaseEvent +import pw.binom.agui.api.event.CustomEvent +import pw.binom.agui.api.event.MessagesSnapshotEvent +import pw.binom.agui.api.event.RawEvent +import pw.binom.agui.api.event.RunErrorEvent +import pw.binom.agui.api.event.RunFinishedEvent +import pw.binom.agui.api.event.RunStartedEvent +import pw.binom.agui.api.event.StateDeltaEvent +import pw.binom.agui.api.event.StateSnapshotEvent +import pw.binom.agui.api.event.StepFinishedEvent +import pw.binom.agui.api.event.StepStartedEvent +import pw.binom.agui.api.event.TextMessageContentEvent +import pw.binom.agui.api.event.TextMessageEndEvent +import pw.binom.agui.api.event.TextMessageStartEvent +import pw.binom.agui.api.event.ToolCallArgsEvent +import pw.binom.agui.api.event.ToolCallEndEvent +import pw.binom.agui.api.event.ToolCallResultEvent +import pw.binom.agui.api.event.ToolCallStartEvent import kotlinx.coroutines.flow.Flow /** diff --git a/api/src/commonMain/kotlin/com/agui/api/context/Context.kt b/api/src/commonMain/kotlin/pw/binom/agui/api/context/Context.kt similarity index 90% rename from api/src/commonMain/kotlin/com/agui/api/context/Context.kt rename to api/src/commonMain/kotlin/pw/binom/agui/api/context/Context.kt index 4bbf974..9df3e76 100644 --- a/api/src/commonMain/kotlin/com/agui/api/context/Context.kt +++ b/api/src/commonMain/kotlin/pw/binom/agui/api/context/Context.kt @@ -1,4 +1,4 @@ -package com.agui.api.context +package pw.binom.agui.api.context import kotlinx.serialization.Serializable diff --git a/api/src/commonMain/kotlin/com/agui/api/event/BaseEvent.kt b/api/src/commonMain/kotlin/pw/binom/agui/api/event/BaseEvent.kt similarity index 95% rename from api/src/commonMain/kotlin/com/agui/api/event/BaseEvent.kt rename to api/src/commonMain/kotlin/pw/binom/agui/api/event/BaseEvent.kt index 9902e26..c13e632 100644 --- a/api/src/commonMain/kotlin/com/agui/api/event/BaseEvent.kt +++ b/api/src/commonMain/kotlin/pw/binom/agui/api/event/BaseEvent.kt @@ -1,8 +1,8 @@ -package com.agui.api.event +package pw.binom.agui.api.event -import com.agui.api.message.Message -import com.agui.api.message.MessageRole -import com.agui.api.state.State +import pw.binom.agui.api.message.Message +import pw.binom.agui.api.message.MessageRole +import pw.binom.agui.api.state.State import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonElement @@ -14,6 +14,7 @@ import kotlinx.serialization.json.JsonElement * subclasses mirror the AG-UI protocol event catalogue and are (de)serialized * polymorphically by the `type` discriminator field. */ +@Serializable public sealed interface BaseEvent { /** Event creation timestamp in epoch milliseconds, if provided. */ diff --git a/api/src/commonMain/kotlin/com/agui/api/message/Message.kt b/api/src/commonMain/kotlin/pw/binom/agui/api/message/Message.kt similarity index 97% rename from api/src/commonMain/kotlin/com/agui/api/message/Message.kt rename to api/src/commonMain/kotlin/pw/binom/agui/api/message/Message.kt index 9db0adb..eb26df7 100644 --- a/api/src/commonMain/kotlin/com/agui/api/message/Message.kt +++ b/api/src/commonMain/kotlin/pw/binom/agui/api/message/Message.kt @@ -1,4 +1,4 @@ -package com.agui.api.message +package pw.binom.agui.api.message import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/api/src/commonMain/kotlin/com/agui/api/run/Run.kt b/api/src/commonMain/kotlin/pw/binom/agui/api/run/Run.kt similarity index 91% rename from api/src/commonMain/kotlin/com/agui/api/run/Run.kt rename to api/src/commonMain/kotlin/pw/binom/agui/api/run/Run.kt index 979f518..5f70caa 100644 --- a/api/src/commonMain/kotlin/com/agui/api/run/Run.kt +++ b/api/src/commonMain/kotlin/pw/binom/agui/api/run/Run.kt @@ -1,9 +1,9 @@ -package com.agui.api.run +package pw.binom.agui.api.run -import com.agui.api.context.Context -import com.agui.api.message.Message -import com.agui.api.state.State -import com.agui.api.tool.Tool +import pw.binom.agui.api.context.Context +import pw.binom.agui.api.message.Message +import pw.binom.agui.api.state.State +import pw.binom.agui.api.tool.Tool import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonElement import kotlin.random.Random diff --git a/api/src/commonMain/kotlin/com/agui/api/serialization/AguiJson.kt b/api/src/commonMain/kotlin/pw/binom/agui/api/serialization/AguiJson.kt similarity index 72% rename from api/src/commonMain/kotlin/com/agui/api/serialization/AguiJson.kt rename to api/src/commonMain/kotlin/pw/binom/agui/api/serialization/AguiJson.kt index f6f4d74..3cc28d5 100644 --- a/api/src/commonMain/kotlin/com/agui/api/serialization/AguiJson.kt +++ b/api/src/commonMain/kotlin/pw/binom/agui/api/serialization/AguiJson.kt @@ -1,23 +1,23 @@ -package com.agui.api.serialization +package pw.binom.agui.api.serialization -import com.agui.api.event.BaseEvent -import com.agui.api.event.CustomEvent -import com.agui.api.event.MessagesSnapshotEvent -import com.agui.api.event.RawEvent -import com.agui.api.event.RunErrorEvent -import com.agui.api.event.RunFinishedEvent -import com.agui.api.event.RunStartedEvent -import com.agui.api.event.StateDeltaEvent -import com.agui.api.event.StateSnapshotEvent -import com.agui.api.event.StepFinishedEvent -import com.agui.api.event.StepStartedEvent -import com.agui.api.event.TextMessageContentEvent -import com.agui.api.event.TextMessageEndEvent -import com.agui.api.event.TextMessageStartEvent -import com.agui.api.event.ToolCallArgsEvent -import com.agui.api.event.ToolCallEndEvent -import com.agui.api.event.ToolCallResultEvent -import com.agui.api.event.ToolCallStartEvent +import pw.binom.agui.api.event.BaseEvent +import pw.binom.agui.api.event.CustomEvent +import pw.binom.agui.api.event.MessagesSnapshotEvent +import pw.binom.agui.api.event.RawEvent +import pw.binom.agui.api.event.RunErrorEvent +import pw.binom.agui.api.event.RunFinishedEvent +import pw.binom.agui.api.event.RunStartedEvent +import pw.binom.agui.api.event.StateDeltaEvent +import pw.binom.agui.api.event.StateSnapshotEvent +import pw.binom.agui.api.event.StepFinishedEvent +import pw.binom.agui.api.event.StepStartedEvent +import pw.binom.agui.api.event.TextMessageContentEvent +import pw.binom.agui.api.event.TextMessageEndEvent +import pw.binom.agui.api.event.TextMessageStartEvent +import pw.binom.agui.api.event.ToolCallArgsEvent +import pw.binom.agui.api.event.ToolCallEndEvent +import pw.binom.agui.api.event.ToolCallResultEvent +import pw.binom.agui.api.event.ToolCallStartEvent import kotlinx.serialization.json.Json import kotlinx.serialization.modules.SerializersModule import kotlinx.serialization.modules.polymorphic diff --git a/api/src/commonMain/kotlin/com/agui/api/state/State.kt b/api/src/commonMain/kotlin/pw/binom/agui/api/state/State.kt similarity index 84% rename from api/src/commonMain/kotlin/com/agui/api/state/State.kt rename to api/src/commonMain/kotlin/pw/binom/agui/api/state/State.kt index c82b076..77f4cdd 100644 --- a/api/src/commonMain/kotlin/com/agui/api/state/State.kt +++ b/api/src/commonMain/kotlin/pw/binom/agui/api/state/State.kt @@ -1,10 +1,10 @@ -package com.agui.api.state +package pw.binom.agui.api.state import kotlinx.serialization.json.JsonElement /** * A loosely-typed, platform-agnostic bag of agent state carried in AG-UI - * `STATE_SNAPSHOT`/`STATE_DELTA` events and in [com.agui.api.run.RunAgentInput.state]. + * `STATE_SNAPSHOT`/`STATE_DELTA` events and in [pw.binom.agui.api.run.RunAgentInput.state]. * * Because the value is a JSON element, it can be any JSON scalar, object or array — the * protocol does not prescribe a concrete schema. diff --git a/api/src/commonMain/kotlin/com/agui/api/tool/Tool.kt b/api/src/commonMain/kotlin/pw/binom/agui/api/tool/Tool.kt similarity index 93% rename from api/src/commonMain/kotlin/com/agui/api/tool/Tool.kt rename to api/src/commonMain/kotlin/pw/binom/agui/api/tool/Tool.kt index e053544..afd5f1a 100644 --- a/api/src/commonMain/kotlin/com/agui/api/tool/Tool.kt +++ b/api/src/commonMain/kotlin/pw/binom/agui/api/tool/Tool.kt @@ -1,4 +1,4 @@ -package com.agui.api.tool +package pw.binom.agui.api.tool import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonObject diff --git a/api/src/commonTest/kotlin/com/agui/api/AgentTest.kt b/api/src/commonTest/kotlin/pw/binom/agui/api/AgentTest.kt similarity index 81% rename from api/src/commonTest/kotlin/com/agui/api/AgentTest.kt rename to api/src/commonTest/kotlin/pw/binom/agui/api/AgentTest.kt index f3a72b4..15e6087 100644 --- a/api/src/commonTest/kotlin/com/agui/api/AgentTest.kt +++ b/api/src/commonTest/kotlin/pw/binom/agui/api/AgentTest.kt @@ -1,19 +1,19 @@ -package com.agui.api +package pw.binom.agui.api -import com.agui.api.agent.AbstractAgent -import com.agui.api.agent.AgentSubscriber -import com.agui.api.agent.EventDispatcher -import com.agui.api.agent.dispatchTo -import com.agui.api.context.Context -import com.agui.api.event.BaseEvent -import com.agui.api.event.CustomEvent -import com.agui.api.event.RunStartedEvent -import com.agui.api.run.RunAgentInput -import com.agui.api.run.RunAgentParameters -import com.agui.api.run.randomRunId -import com.agui.api.run.toParameters -import com.agui.api.run.toRunAgentInput -import com.agui.api.tool.Tool +import pw.binom.agui.api.agent.AbstractAgent +import pw.binom.agui.api.agent.AgentSubscriber +import pw.binom.agui.api.agent.EventDispatcher +import pw.binom.agui.api.agent.dispatchTo +import pw.binom.agui.api.context.Context +import pw.binom.agui.api.event.BaseEvent +import pw.binom.agui.api.event.CustomEvent +import pw.binom.agui.api.event.RunStartedEvent +import pw.binom.agui.api.run.RunAgentInput +import pw.binom.agui.api.run.RunAgentParameters +import pw.binom.agui.api.run.randomRunId +import pw.binom.agui.api.run.toParameters +import pw.binom.agui.api.run.toRunAgentInput +import pw.binom.agui.api.tool.Tool import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.toList import kotlinx.coroutines.test.runTest diff --git a/api/src/commonTest/kotlin/com/agui/api/EventSerializationTest.kt b/api/src/commonTest/kotlin/pw/binom/agui/api/EventSerializationTest.kt similarity index 73% rename from api/src/commonTest/kotlin/com/agui/api/EventSerializationTest.kt rename to api/src/commonTest/kotlin/pw/binom/agui/api/EventSerializationTest.kt index e75fae1..d52e6eb 100644 --- a/api/src/commonTest/kotlin/com/agui/api/EventSerializationTest.kt +++ b/api/src/commonTest/kotlin/pw/binom/agui/api/EventSerializationTest.kt @@ -1,27 +1,27 @@ -package com.agui.api +package pw.binom.agui.api -import com.agui.api.event.BaseEvent -import com.agui.api.event.CustomEvent -import com.agui.api.event.MessagesSnapshotEvent -import com.agui.api.event.RawEvent -import com.agui.api.event.RunErrorEvent -import com.agui.api.event.RunFinishedEvent -import com.agui.api.event.RunStartedEvent -import com.agui.api.event.StateDeltaEvent -import com.agui.api.event.StateSnapshotEvent -import com.agui.api.event.StepFinishedEvent -import com.agui.api.event.StepStartedEvent -import com.agui.api.event.TextMessageContentEvent -import com.agui.api.event.TextMessageEndEvent -import com.agui.api.event.TextMessageStartEvent -import com.agui.api.event.ToolCallArgsEvent -import com.agui.api.event.ToolCallEndEvent -import com.agui.api.event.ToolCallResultEvent -import com.agui.api.event.ToolCallStartEvent -import com.agui.api.message.Message -import com.agui.api.message.MessageRole -import com.agui.api.serialization.AguiJson -import com.agui.api.state.mutableState +import pw.binom.agui.api.event.BaseEvent +import pw.binom.agui.api.event.CustomEvent +import pw.binom.agui.api.event.MessagesSnapshotEvent +import pw.binom.agui.api.event.RawEvent +import pw.binom.agui.api.event.RunErrorEvent +import pw.binom.agui.api.event.RunFinishedEvent +import pw.binom.agui.api.event.RunStartedEvent +import pw.binom.agui.api.event.StateDeltaEvent +import pw.binom.agui.api.event.StateSnapshotEvent +import pw.binom.agui.api.event.StepFinishedEvent +import pw.binom.agui.api.event.StepStartedEvent +import pw.binom.agui.api.event.TextMessageContentEvent +import pw.binom.agui.api.event.TextMessageEndEvent +import pw.binom.agui.api.event.TextMessageStartEvent +import pw.binom.agui.api.event.ToolCallArgsEvent +import pw.binom.agui.api.event.ToolCallEndEvent +import pw.binom.agui.api.event.ToolCallResultEvent +import pw.binom.agui.api.event.ToolCallStartEvent +import pw.binom.agui.api.message.Message +import pw.binom.agui.api.message.MessageRole +import pw.binom.agui.api.serialization.AguiJson +import pw.binom.agui.api.state.mutableState import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.JsonPrimitive diff --git a/build.gradle.kts b/build.gradle.kts index 27800b6..886c1ef 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,6 +4,6 @@ plugins { } allprojects { - group = "com.agui" + group = "pw.binom.agui" version = "0.1.0-SNAPSHOT" } \ No newline at end of file diff --git a/client/build.gradle.kts b/client/build.gradle.kts index 86d7b85..732cd76 100644 --- a/client/build.gradle.kts +++ b/client/build.gradle.kts @@ -6,6 +6,14 @@ plugins { kotlin { jvmToolchain(21) jvm() + macosX64() + macosArm64() + iosX64() + iosArm64() + iosSimulatorArm64() + linuxX64() + linuxArm64() + mingwX64() sourceSets { commonMain.dependencies { @@ -17,6 +25,9 @@ kotlin { jvmMain.dependencies { implementation(libs.ktor.client.cio) } + nativeMain.dependencies { + implementation(libs.ktor.client.cio) + } commonTest.dependencies { implementation(kotlin("test")) } diff --git a/client/src/commonMain/kotlin/com/agui/client/HttpAgent.kt b/client/src/commonMain/kotlin/pw/binom/agui/client/HttpAgent.kt similarity index 87% rename from client/src/commonMain/kotlin/com/agui/client/HttpAgent.kt rename to client/src/commonMain/kotlin/pw/binom/agui/client/HttpAgent.kt index 211fcad..4035dbc 100644 --- a/client/src/commonMain/kotlin/com/agui/client/HttpAgent.kt +++ b/client/src/commonMain/kotlin/pw/binom/agui/client/HttpAgent.kt @@ -1,9 +1,9 @@ -package com.agui.client +package pw.binom.agui.client -import com.agui.api.agent.Agent -import com.agui.api.event.BaseEvent -import com.agui.api.run.RunAgentInput -import com.agui.api.serialization.AguiJson +import pw.binom.agui.api.agent.Agent +import pw.binom.agui.api.event.BaseEvent +import pw.binom.agui.api.run.RunAgentInput +import pw.binom.agui.api.serialization.AguiJson import io.ktor.client.HttpClient import io.ktor.client.plugins.sse.sse import io.ktor.client.request.setBody diff --git a/client/src/jvmMain/kotlin/com/agui/client/HttpAgentFactory.kt b/client/src/jvmMain/kotlin/pw/binom/agui/client/HttpAgentFactory.kt similarity index 96% rename from client/src/jvmMain/kotlin/com/agui/client/HttpAgentFactory.kt rename to client/src/jvmMain/kotlin/pw/binom/agui/client/HttpAgentFactory.kt index 1c5d5a5..669b9a0 100644 --- a/client/src/jvmMain/kotlin/com/agui/client/HttpAgentFactory.kt +++ b/client/src/jvmMain/kotlin/pw/binom/agui/client/HttpAgentFactory.kt @@ -1,4 +1,4 @@ -package com.agui.client +package pw.binom.agui.client import io.ktor.client.HttpClient import io.ktor.client.HttpClientConfig diff --git a/client/src/jvmTest/kotlin/com/agui/client/HttpAgentTest.kt b/client/src/jvmTest/kotlin/pw/binom/agui/client/HttpAgentTest.kt similarity index 79% rename from client/src/jvmTest/kotlin/com/agui/client/HttpAgentTest.kt rename to client/src/jvmTest/kotlin/pw/binom/agui/client/HttpAgentTest.kt index 11f1a3a..632d642 100644 --- a/client/src/jvmTest/kotlin/com/agui/client/HttpAgentTest.kt +++ b/client/src/jvmTest/kotlin/pw/binom/agui/client/HttpAgentTest.kt @@ -1,15 +1,15 @@ -package com.agui.client +package pw.binom.agui.client -import com.agui.api.agent.Agent -import com.agui.api.event.RunFinishedEvent -import com.agui.api.event.RunStartedEvent -import com.agui.api.event.TextMessageContentEvent -import com.agui.api.event.TextMessageEndEvent -import com.agui.api.event.TextMessageStartEvent -import com.agui.api.message.Message -import com.agui.api.message.MessageRole -import com.agui.api.run.RunAgentInput -import com.agui.server.agui +import pw.binom.agui.api.agent.Agent +import pw.binom.agui.api.event.RunFinishedEvent +import pw.binom.agui.api.event.RunStartedEvent +import pw.binom.agui.api.event.TextMessageContentEvent +import pw.binom.agui.api.event.TextMessageEndEvent +import pw.binom.agui.api.event.TextMessageStartEvent +import pw.binom.agui.api.message.Message +import pw.binom.agui.api.message.MessageRole +import pw.binom.agui.api.run.RunAgentInput +import pw.binom.agui.server.agui import io.ktor.client.plugins.sse.SSE import io.ktor.server.application.application import io.ktor.server.testing.testApplication @@ -21,7 +21,7 @@ import kotlin.test.assertEquals import kotlin.test.assertIs /** - * Exercises [HttpAgent] against the real AG-UI endpoint exposed by [com.agui.server.agui], + * Exercises [HttpAgent] against the real AG-UI endpoint exposed by [pw.binom.agui.server.agui], * using the Ktor test host so the SSE transport is exercised end-to-end over HTTP. */ class HttpAgentTest { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1210c8a..7168719 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,6 +12,7 @@ kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serializa ktor-server-core = { module = "io.ktor:ktor-server-core", version.ref = "ktor" } ktor-server-sse = { module = "io.ktor:ktor-server-sse", version.ref = "ktor" } ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" } +ktor-server-cio = { module = "io.ktor:ktor-server-cio", version.ref = "ktor" } ktor-server-content-negotiation = { module = "io.ktor:ktor-server-content-negotiation", version.ref = "ktor" } ktor-server-test-host = { module = "io.ktor:ktor-server-test-host", version.ref = "ktor" } diff --git a/server/build.gradle.kts b/server/build.gradle.kts index d75bb24..7a18d40 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -6,6 +6,14 @@ plugins { kotlin { jvmToolchain(21) jvm() + macosX64() + macosArm64() + iosX64() + iosArm64() + iosSimulatorArm64() + linuxX64() + linuxArm64() + mingwX64() sourceSets { commonMain.dependencies { @@ -18,6 +26,9 @@ kotlin { jvmMain.dependencies { implementation(libs.ktor.server.netty) } + nativeMain.dependencies { + implementation(libs.ktor.server.cio) + } jvmTest.dependencies { implementation(kotlin("test")) implementation(libs.kotlinx.coroutines.test) diff --git a/server/src/commonMain/kotlin/com/agui/server/Agui.kt b/server/src/commonMain/kotlin/pw/binom/agui/server/Agui.kt similarity index 91% rename from server/src/commonMain/kotlin/com/agui/server/Agui.kt rename to server/src/commonMain/kotlin/pw/binom/agui/server/Agui.kt index 8e2e9f6..95b638a 100644 --- a/server/src/commonMain/kotlin/com/agui/server/Agui.kt +++ b/server/src/commonMain/kotlin/pw/binom/agui/server/Agui.kt @@ -1,10 +1,10 @@ -package com.agui.server +package pw.binom.agui.server -import com.agui.api.agent.Agent -import com.agui.api.event.BaseEvent -import com.agui.api.event.RunErrorEvent -import com.agui.api.run.RunAgentInput -import com.agui.api.serialization.AguiJson +import pw.binom.agui.api.agent.Agent +import pw.binom.agui.api.event.BaseEvent +import pw.binom.agui.api.event.RunErrorEvent +import pw.binom.agui.api.run.RunAgentInput +import pw.binom.agui.api.serialization.AguiJson import io.ktor.server.application.Application import io.ktor.server.application.ApplicationCall import io.ktor.server.application.call diff --git a/server/src/jvmMain/kotlin/com/agui/server/demo/SampleServer.kt b/server/src/jvmMain/kotlin/pw/binom/agui/server/demo/SampleServer.kt similarity index 74% rename from server/src/jvmMain/kotlin/com/agui/server/demo/SampleServer.kt rename to server/src/jvmMain/kotlin/pw/binom/agui/server/demo/SampleServer.kt index fd7011a..a0a962d 100644 --- a/server/src/jvmMain/kotlin/com/agui/server/demo/SampleServer.kt +++ b/server/src/jvmMain/kotlin/pw/binom/agui/server/demo/SampleServer.kt @@ -1,13 +1,13 @@ -package com.agui.server.demo +package pw.binom.agui.server.demo -import com.agui.api.agent.Agent -import com.agui.api.event.RunFinishedEvent -import com.agui.api.event.RunStartedEvent -import com.agui.api.event.StateSnapshotEvent -import com.agui.api.event.TextMessageContentEvent -import com.agui.api.event.TextMessageEndEvent -import com.agui.api.event.TextMessageStartEvent -import com.agui.server.agui +import pw.binom.agui.api.agent.Agent +import pw.binom.agui.api.event.RunFinishedEvent +import pw.binom.agui.api.event.RunStartedEvent +import pw.binom.agui.api.event.StateSnapshotEvent +import pw.binom.agui.api.event.TextMessageContentEvent +import pw.binom.agui.api.event.TextMessageEndEvent +import pw.binom.agui.api.event.TextMessageStartEvent +import pw.binom.agui.server.agui import io.ktor.server.engine.embeddedServer import io.ktor.server.netty.Netty import kotlinx.coroutines.flow.flow diff --git a/server/src/jvmTest/kotlin/com/agui/server/AguiServerTest.kt b/server/src/jvmTest/kotlin/pw/binom/agui/server/AguiServerTest.kt similarity index 81% rename from server/src/jvmTest/kotlin/com/agui/server/AguiServerTest.kt rename to server/src/jvmTest/kotlin/pw/binom/agui/server/AguiServerTest.kt index 63a9e58..032abea 100644 --- a/server/src/jvmTest/kotlin/com/agui/server/AguiServerTest.kt +++ b/server/src/jvmTest/kotlin/pw/binom/agui/server/AguiServerTest.kt @@ -1,18 +1,18 @@ -package com.agui.server +package pw.binom.agui.server -import com.agui.api.agent.Agent -import com.agui.api.event.RunErrorEvent -import com.agui.api.event.RunFinishedEvent -import com.agui.api.event.RunStartedEvent -import com.agui.api.event.StateSnapshotEvent -import com.agui.api.event.TextMessageContentEvent -import com.agui.api.event.TextMessageEndEvent -import com.agui.api.event.TextMessageStartEvent -import com.agui.api.message.Message -import com.agui.api.message.MessageRole -import com.agui.api.run.RunAgentInput -import com.agui.api.state.mutableState -import com.agui.client.HttpAgent +import pw.binom.agui.api.agent.Agent +import pw.binom.agui.api.event.RunErrorEvent +import pw.binom.agui.api.event.RunFinishedEvent +import pw.binom.agui.api.event.RunStartedEvent +import pw.binom.agui.api.event.StateSnapshotEvent +import pw.binom.agui.api.event.TextMessageContentEvent +import pw.binom.agui.api.event.TextMessageEndEvent +import pw.binom.agui.api.event.TextMessageStartEvent +import pw.binom.agui.api.message.Message +import pw.binom.agui.api.message.MessageRole +import pw.binom.agui.api.run.RunAgentInput +import pw.binom.agui.api.state.mutableState +import pw.binom.agui.client.HttpAgent import io.ktor.client.plugins.sse.SSE import io.ktor.server.application.application import io.ktor.server.testing.testApplication