import { Database } from "bun:sqlite"; import * as path from "node:path"; import { AuthStorage, createAgentSession, ModelRegistry, SessionManager, Settings, SqliteAuthCredentialStore, type CreateAgentSessionResult, } from "@oh-my-pi/pi-coding-agent"; import { createFieldNotesExtension } from "./factory"; /** Caller supplies a scratch directory; this function never prompts a provider. */ export async function openNotebookSession(scratchDirectory: string): Promise<{ result: CreateAgentSessionResult; close: () => Promise; }> { const auth = new AuthStorage(new SqliteAuthCredentialStore(new Database(":memory:"))); try { const result = await createAgentSession({ cwd: scratchDirectory, agentDir: path.join(scratchDirectory, "agent"), authStorage: auth, modelRegistry: new ModelRegistry(auth, path.join(scratchDirectory, "models.yml")), settings: Settings.isolated(), sessionManager: SessionManager.inMemory(scratchDirectory), disableExtensionDiscovery: true, extensions: [createFieldNotesExtension("Fictional field notebook")], enableMCP: false, enableLsp: false, skipPythonPreflight: true, preloadedCustomToolPaths: [], skills: [], rules: [], contextFiles: [], promptTemplates: [], slashCommands: [], toolNames: [], }); return { result, close: async () => { try { await result.session.dispose(); } finally { auth.close(); } } }; } catch (error) { auth.close(); throw error; } }