Provider listing now returns picker rows only. Importing a selected provider session hydrates its timeline before the daemon publishes the Paseo agent.
78 lines
2.0 KiB
TypeScript
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;
|
|
}
|