Files
paseo/packages/server/src/server/agent/provider-session-import.ts
T
Mohamed Boudra 51d1d007ce Import provider sessions as ready agents
Provider listing now returns picker rows only. Importing a selected provider session hydrates its timeline before the daemon publishes the Paseo agent.
2026-06-10 11:29:27 +07:00

78 lines
2.0 KiB
TypeScript

import type {
AgentClient,
AgentPersistenceHandle,
AgentProvider,
AgentSessionConfig,
AgentStreamEvent,
ImportedProviderSession,
ImportedTimelineEntry,
ImportProviderSessionContext,
ImportProviderSessionInput,
} from "./agent-sdk-types.js";
export async function importSessionFromPersistence(input: {
provider: AgentProvider;
request: ImportProviderSessionInput;
context: ImportProviderSessionContext;
resumeSession: AgentClient["resumeSession"];
config?: Partial<AgentSessionConfig>;
persistence?: AgentPersistenceHandle;
}): Promise<ImportedProviderSession> {
const config = {
...input.context.config,
...input.config,
provider: input.provider,
cwd: input.request.cwd,
} as AgentSessionConfig;
const storedConfig = {
...input.context.storedConfig,
...input.config,
provider: input.provider,
cwd: input.request.cwd,
} as AgentSessionConfig;
const persistence =
input.persistence ?? buildImportPersistenceHandle(input.provider, input.request, storedConfig);
const session = await input.resumeSession(persistence, config, input.context.launchContext);
const timeline = await collectImportedTimeline(session.streamHistory());
return {
session,
config: storedConfig,
persistence,
timeline,
};
}
function buildImportPersistenceHandle(
provider: AgentProvider,
input: ImportProviderSessionInput,
config: AgentSessionConfig,
): AgentPersistenceHandle {
return {
provider,
sessionId: input.providerHandleId,
nativeHandle: input.providerHandleId,
metadata: {
...config,
provider,
cwd: input.cwd,
},
};
}
async function collectImportedTimeline(
events: AsyncGenerator<AgentStreamEvent>,
): Promise<ImportedTimelineEntry[]> {
const timeline: ImportedTimelineEntry[] = [];
for await (const event of events) {
if (event.type !== "timeline") {
continue;
}
timeline.push({
item: event.item,
...(event.timestamp ? { timestamp: event.timestamp } : {}),
});
}
return timeline;
}