Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "kit"
version = "0.1.120"
version = "0.1.121"
edition = "2024"
rust-version = "1.94.0"
publish = false
Expand Down
2 changes: 1 addition & 1 deletion macos/Config/Version.xcconfig
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// Generated by scripts/generate-macos-project.sh from Cargo.toml.
KIT_VERSION = 0.1.120
KIT_VERSION = 0.1.121
39 changes: 36 additions & 3 deletions src/protocols/acp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ use tokio::{
time::timeout,
};

mod skill_catalog;
pub mod v2;

use crate::{
Expand Down Expand Up @@ -849,15 +850,19 @@ impl Server {
let tasks = driver.tasks.clone();
let structured_completion = driver.structured_completion;
let canonical_transcript = driver.canonical_transcript;
let skill_catalog = skill_catalog::SkillCatalogMonitor::new(&driver.skills)
.map_err(|error| record_acp_runtime_failure(&session_id, "skill_catalog", error))?;
let (tx, rx) = mpsc::channel(8);
let actor = SessionActor {
session_id: session_id.clone(),
runtime: Arc::clone(&self.runtime),
integration: Arc::clone(&self.integration),
binding,
driver: driver.driver,
tasks: driver.tasks,
background_jobs: background_jobs.clone(),
structured_completion,
skill_catalog,
adapter: driver.adapter,
catalog,
commands: rx,
Expand Down Expand Up @@ -1077,12 +1082,14 @@ pub(super) async fn detach_compose_call(

struct SessionActor<S: ModelSession> {
session_id: agentkit_acp::SessionId,
runtime: Arc<Runtime>,
integration: Arc<AcpIntegration>,
binding: SessionBindingGuard,
driver: LoopDriver<S>,
tasks: TaskManagerHandle,
background_jobs: BackgroundJobs,
structured_completion: bool,
skill_catalog: skill_catalog::SkillCatalogMonitor,
adapter: SelectableAdapter,
catalog: Vec<ModelGroup>,
commands: mpsc::Receiver<Command>,
Expand All @@ -1093,12 +1100,14 @@ struct SessionActor<S: ModelSession> {
async fn session_actor<S: ModelSession>(actor: SessionActor<S>) {
let SessionActor {
session_id,
runtime,
integration,
binding,
mut driver,
tasks,
background_jobs,
structured_completion,
mut skill_catalog,
adapter,
catalog,
mut commands,
Expand All @@ -1114,9 +1123,12 @@ async fn session_actor<S: ModelSession>(actor: SessionActor<S>) {
biased;
command = commands.recv() => match command {
Some(Command::Prompt { request, reply }) => {
let skills = runtime.current_skills().await;
let result = drive_prompt(
&session_id,
&skills,
&integration,
&mut skill_catalog,
&mut driver,
request,
&tasks,
Expand Down Expand Up @@ -1420,9 +1432,12 @@ fn record_acp_loop_failure(
}
}

#[allow(clippy::too_many_arguments)]
async fn drive_prompt<S: ModelSession>(
session_id: &agentkit_acp::SessionId,
skills: &[agentkit_tool_skills::Skill],
integration: &AcpIntegration,
skill_catalog: &mut skill_catalog::SkillCatalogMonitor,
driver: &mut LoopDriver<S>,
request: PromptRequest,
tasks: &TaskManagerHandle,
Expand All @@ -1434,9 +1449,16 @@ async fn drive_prompt<S: ModelSession>(
}
background_jobs.begin_turn();
let items = integration.input_port().prompt_to_items(&request)?;
driver
.submit_input(items)
.map_err(|error| record_acp_loop_failure(session_id, &error))?;
skill_catalog
.submit(skills, items, |items| driver.submit_input(items))
.map_err(|error| match error {
skill_catalog::SubmitError::Catalog(error) => {
record_acp_runtime_failure(session_id, "skill_catalog", error)
}
skill_catalog::SubmitError::Submit(error) => {
record_acp_loop_failure(session_id, &error)
}
})?;
let response = match drive_until_pause(
session_id,
integration,
Expand Down Expand Up @@ -2705,9 +2727,12 @@ pub(super) mod tests {
let task_manager = AsyncTaskManager::new();
let tasks = task_manager.handle();
let background_jobs = BackgroundJobs::default();
let mut skill_catalog = skill_catalog::SkillCatalogMonitor::new(&[]).unwrap();
let response = drive_prompt(
&acp_session_id,
&[],
&integration,
&mut skill_catalog,
&mut driver,
PromptRequest::new(
acp_session_id.clone(),
Expand Down Expand Up @@ -2788,6 +2813,7 @@ pub(super) mod tests {
.await
.unwrap();
let background_jobs = BackgroundJobs::default();
let mut skill_catalog = skill_catalog::SkillCatalogMonitor::new(&[]).unwrap();
let request = PromptRequest::new(
acp_session_id.clone(),
vec![agentkit_acp::ContentBlock::Text(
Expand All @@ -2796,7 +2822,9 @@ pub(super) mod tests {
);
let prompt = drive_prompt(
&acp_session_id,
&[],
&integration,
&mut skill_catalog,
&mut driver,
request,
&tasks,
Expand Down Expand Up @@ -2928,14 +2956,19 @@ pub(super) mod tests {
let (turn_states_tx, mut turn_states_rx) = mpsc::unbounded_channel();
let test_mcp = crate::tools::mcp::empty();
let mcp_events = test_mcp.subscribe(acp_session_id.to_string());
let root = tempfile::tempdir().unwrap();
let runtime = Runtime::new(root.path(), "gpt-5.4").unwrap();
let skills = runtime.current_skills().await;
let actor = tokio::spawn(session_actor(SessionActor {
session_id: acp_session_id.clone(),
runtime,
integration: Arc::clone(&integration),
binding: SessionBindingGuard::new(Arc::clone(&integration), acp_session_id.clone()),
driver,
tasks: tasks.clone(),
background_jobs: background_jobs.clone(),
structured_completion: false,
skill_catalog: skill_catalog::SkillCatalogMonitor::new(&skills).unwrap(),
adapter: SelectableAdapter::new(crate::ProviderKind::OpenAiSubscription, "gpt-5.4")
.unwrap(),
catalog: Vec::new(),
Expand Down
Loading
Loading