Skip to content
This repository was archived by the owner on Apr 14, 2026. It is now read-only.
Open
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
3 changes: 2 additions & 1 deletion src-tauri/src/commands/acp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,14 +188,15 @@ pub async fn acp_load_session(
session_id: String,
goose_session_id: String,
working_dir: Option<String>,
provider_id: Option<String>,
) -> Result<(), String> {
let current_dir = std::env::current_dir()
.map_err(|error| format!("Failed to determine current working directory: {error}"))?;
let working_dir = resolve_working_dir(working_dir, &current_dir)?;

let manager = GooseAcpManager::start(app_handle).await?;
manager
.load_session(session_id, goose_session_id, working_dir)
.load_session(session_id, goose_session_id, working_dir, provider_id)
.await
}

Expand Down
3 changes: 3 additions & 0 deletions src-tauri/src/services/acp/manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ enum ManagerCommand {
local_session_id: String,
goose_session_id: String,
working_dir: PathBuf,
provider_id: Option<String>,
response: oneshot::Sender<Result<(), String>>,
},
PrepareSession {
Expand Down Expand Up @@ -128,13 +129,15 @@ impl GooseAcpManager {
local_session_id: String,
goose_session_id: String,
working_dir: PathBuf,
provider_id: Option<String>,
) -> Result<(), String> {
let (response_tx, response_rx) = oneshot::channel();
self.command_tx
.send(ManagerCommand::LoadSession {
local_session_id,
goose_session_id,
working_dir,
provider_id,
response: response_tx,
})
.map_err(|_| "Goose ACP manager is unavailable".to_string())?;
Expand Down
2 changes: 2 additions & 0 deletions src-tauri/src/services/acp/manager/command_dispatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ pub(super) async fn dispatch_commands(
local_session_id,
goose_session_id,
working_dir,
provider_id,
response,
} => {
let connection = Arc::clone(&connection);
Expand All @@ -73,6 +74,7 @@ pub(super) async fn dispatch_commands(
&local_session_id,
&goose_session_id,
working_dir,
provider_id.as_deref(),
)
.await;
let _ = response.send(result);
Expand Down
7 changes: 7 additions & 0 deletions src-tauri/src/services/acp/manager/dispatcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -424,13 +424,20 @@ impl Client for SessionEventDispatcher {
} else {
// Start a new assistant message
let new_id = uuid::Uuid::new_v4().to_string();
let route_provider_id = {
let routes = self.routes.lock().await;
routes
.get(&goose_session_id)
.and_then(|r| r.provider_id.clone())
};
let _ = self.app_handle.emit(
"acp:message_created",
MessageCreatedPayload {
session_id: local_session_id.clone(),
message_id: new_id.clone(),
persona_id: None,
persona_name: None,
provider_id: route_provider_id,
},
);
let mut routes = self.routes.lock().await;
Expand Down
3 changes: 2 additions & 1 deletion src-tauri/src/services/acp/manager/session_ops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -426,9 +426,10 @@ pub(super) async fn load_session_inner(
local_session_id: &str,
goose_session_id: &str,
working_dir: PathBuf,
provider_id: Option<&str>,
) -> Result<(), String> {
dispatcher
.bind_session(goose_session_id, local_session_id, None)
.bind_session(goose_session_id, local_session_id, provider_id)
.await;

let response = connection
Expand Down
1 change: 1 addition & 0 deletions src-tauri/src/services/acp/payloads.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ pub(crate) struct MessageCreatedPayload {
pub message_id: String,
pub persona_id: Option<String>,
pub persona_name: Option<String>,
pub provider_id: Option<String>,
}

/// Payload for the `acp:text` event.
Expand Down
1 change: 1 addition & 0 deletions src-tauri/src/services/acp/writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ impl TauriMessageWriter {
message_id: assistant_message_id.clone(),
persona_id: persona_id.clone(),
persona_name: persona_name.clone(),
provider_id: provider_id.clone(),
},
);

Expand Down
7 changes: 6 additions & 1 deletion src/app/AppShell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,12 @@ export function AppShell({ children }: { children?: React.ReactNode }) {
(!project
? resolveEffectiveWorkingDir(null, await getHomeDir())
: undefined);
await acpLoadSession(sessionId, gooseSessionId, workingDir);
await acpLoadSession(
sessionId,
gooseSessionId,
workingDir,
session?.providerId,
);
const t3 = performance.now();
console.log(
`[perf:load] ${sessionId.slice(0, 8)} acpLoadSession resolved in ${(t3 - t2).toFixed(1)}ms (total ${(t3 - t0).toFixed(1)}ms)`,
Expand Down
6 changes: 5 additions & 1 deletion src/features/chat/hooks/useAcpStream.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ interface AcpMessageCreatedPayload {
messageId: string;
personaId?: string;
personaName?: string;
providerId?: string;
}

interface AcpTextPayload {
Expand Down Expand Up @@ -198,7 +199,8 @@ export function useAcpStream(enabled: boolean): void {
listen<AcpMessageCreatedPayload>("acp:message_created", (event) => {
if (!active) return;
const store = useChatStore.getState();
const { sessionId, messageId, personaId, personaName } = event.payload;
const { sessionId, messageId, personaId, personaName, providerId } =
event.payload;

if (store.loadingSessionIds.has(sessionId)) {
if (!getBufferedMessage(sessionId, messageId)) {
Expand All @@ -212,6 +214,7 @@ export function useAcpStream(enabled: boolean): void {
agentVisible: true,
personaId,
personaName,
providerId,
completionStatus: "inProgress",
},
});
Expand All @@ -238,6 +241,7 @@ export function useAcpStream(enabled: boolean): void {
agentVisible: true,
personaId,
personaName,
providerId,
completionStatus: "inProgress",
},
});
Expand Down
2 changes: 2 additions & 0 deletions src/shared/api/acp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,13 @@ export async function acpLoadSession(
sessionId: string,
gooseSessionId: string,
workingDir?: string,
providerId?: string,
): Promise<void> {
return invoke("acp_load_session", {
sessionId,
gooseSessionId,
workingDir: workingDir ?? null,
providerId: providerId ?? null,
});
}

Expand Down
1 change: 1 addition & 0 deletions src/shared/types/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ export interface MessageMetadata {
/** Persona that generated this assistant message (set on send). */
personaId?: string;
personaName?: string;
providerId?: string;
/** Which persona this user message is addressed to. */
targetPersonaId?: string;
targetPersonaName?: string;
Expand Down
Loading