Merge pull request #4391 from yzhg1983/fix/sdk-example-session-dispose
fix(coding-agent): dispose SDK example sessions
This commit is contained in:
@@ -9,14 +9,18 @@ import { createAgentSession } from "@earendil-works/pi-coding-agent";
|
|||||||
|
|
||||||
const { session } = await createAgentSession();
|
const { session } = await createAgentSession();
|
||||||
|
|
||||||
session.subscribe((event) => {
|
try {
|
||||||
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
session.subscribe((event) => {
|
||||||
process.stdout.write(event.assistantMessageEvent.delta);
|
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
||||||
}
|
process.stdout.write(event.assistantMessageEvent.delta);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
|
||||||
await session.prompt("What files are in the current directory?");
|
await session.prompt("What files are in the current directory?");
|
||||||
session.state.messages.forEach((msg) => {
|
session.state.messages.forEach((msg) => {
|
||||||
console.log(msg);
|
console.log(msg);
|
||||||
});
|
});
|
||||||
console.log();
|
console.log();
|
||||||
|
} finally {
|
||||||
|
session.dispose();
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,12 +38,16 @@ if (available.length > 0) {
|
|||||||
modelRegistry,
|
modelRegistry,
|
||||||
});
|
});
|
||||||
|
|
||||||
session.subscribe((event) => {
|
try {
|
||||||
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
session.subscribe((event) => {
|
||||||
process.stdout.write(event.assistantMessageEvent.delta);
|
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
||||||
}
|
process.stdout.write(event.assistantMessageEvent.delta);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
|
||||||
await session.prompt("Say hello in one sentence.");
|
await session.prompt("Say hello in one sentence.");
|
||||||
console.log();
|
console.log();
|
||||||
|
} finally {
|
||||||
|
session.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,15 +30,19 @@ const { session: session1 } = await createAgentSession({
|
|||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
});
|
});
|
||||||
|
|
||||||
session1.subscribe((event) => {
|
try {
|
||||||
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
session1.subscribe((event) => {
|
||||||
process.stdout.write(event.assistantMessageEvent.delta);
|
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
||||||
}
|
process.stdout.write(event.assistantMessageEvent.delta);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
|
||||||
console.log("=== Replace prompt ===");
|
console.log("=== Replace prompt ===");
|
||||||
await session1.prompt("What is 2 + 2?");
|
await session1.prompt("What is 2 + 2?");
|
||||||
console.log("\n");
|
console.log("\n");
|
||||||
|
} finally {
|
||||||
|
session1.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
// Option 2: Append instructions to the default prompt
|
// Option 2: Append instructions to the default prompt
|
||||||
const loader2 = new DefaultResourceLoader({
|
const loader2 = new DefaultResourceLoader({
|
||||||
@@ -56,12 +60,16 @@ const { session: session2 } = await createAgentSession({
|
|||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
});
|
});
|
||||||
|
|
||||||
session2.subscribe((event) => {
|
try {
|
||||||
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
session2.subscribe((event) => {
|
||||||
process.stdout.write(event.assistantMessageEvent.delta);
|
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
||||||
}
|
process.stdout.write(event.assistantMessageEvent.delta);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
|
||||||
console.log("=== Modify prompt ===");
|
console.log("=== Modify prompt ===");
|
||||||
await session2.prompt("List 3 benefits of TypeScript.");
|
await session2.prompt("List 3 benefits of TypeScript.");
|
||||||
console.log();
|
console.log();
|
||||||
|
} finally {
|
||||||
|
session2.dispose();
|
||||||
|
}
|
||||||
|
|||||||
@@ -47,9 +47,9 @@ if (diagnostics.length > 0) {
|
|||||||
console.log("Warnings:", diagnostics);
|
console.log("Warnings:", diagnostics);
|
||||||
}
|
}
|
||||||
|
|
||||||
await createAgentSession({
|
const { session } = await createAgentSession({
|
||||||
resourceLoader: loader,
|
resourceLoader: loader,
|
||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("Session created with filtered skills");
|
console.log("Session created with filtered skills");
|
||||||
|
session.dispose();
|
||||||
|
|||||||
@@ -13,32 +13,36 @@
|
|||||||
import { createAgentSession, SessionManager } from "@earendil-works/pi-coding-agent";
|
import { createAgentSession, SessionManager } from "@earendil-works/pi-coding-agent";
|
||||||
|
|
||||||
// Read-only mode (no edit/write)
|
// Read-only mode (no edit/write)
|
||||||
await createAgentSession({
|
const { session: readOnlySession } = await createAgentSession({
|
||||||
tools: ["read", "grep", "find", "ls"],
|
tools: ["read", "grep", "find", "ls"],
|
||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
});
|
});
|
||||||
console.log("Read-only session created");
|
console.log("Read-only session created");
|
||||||
|
readOnlySession.dispose();
|
||||||
|
|
||||||
// Custom tool selection
|
// Custom tool selection
|
||||||
await createAgentSession({
|
const { session: customToolsSession } = await createAgentSession({
|
||||||
tools: ["read", "bash", "grep"],
|
tools: ["read", "bash", "grep"],
|
||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
});
|
});
|
||||||
console.log("Custom tools session created");
|
console.log("Custom tools session created");
|
||||||
|
customToolsSession.dispose();
|
||||||
|
|
||||||
// With custom cwd
|
// With custom cwd
|
||||||
const customCwd = "/path/to/project";
|
const customCwd = "/path/to/project";
|
||||||
await createAgentSession({
|
const { session: customCwdSession } = await createAgentSession({
|
||||||
cwd: customCwd,
|
cwd: customCwd,
|
||||||
tools: ["read", "bash", "edit", "write"],
|
tools: ["read", "bash", "edit", "write"],
|
||||||
sessionManager: SessionManager.inMemory(customCwd),
|
sessionManager: SessionManager.inMemory(customCwd),
|
||||||
});
|
});
|
||||||
console.log("Custom cwd session created");
|
console.log("Custom cwd session created");
|
||||||
|
customCwdSession.dispose();
|
||||||
|
|
||||||
// Or pick specific tools for custom cwd
|
// Or pick specific tools for custom cwd
|
||||||
await createAgentSession({
|
const { session: specificToolsSession } = await createAgentSession({
|
||||||
cwd: customCwd,
|
cwd: customCwd,
|
||||||
tools: ["read", "bash", "grep"],
|
tools: ["read", "bash", "grep"],
|
||||||
sessionManager: SessionManager.inMemory(customCwd),
|
sessionManager: SessionManager.inMemory(customCwd),
|
||||||
});
|
});
|
||||||
console.log("Specific tools with custom cwd session created");
|
console.log("Specific tools with custom cwd session created");
|
||||||
|
specificToolsSession.dispose();
|
||||||
|
|||||||
@@ -42,14 +42,18 @@ const { session } = await createAgentSession({
|
|||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
});
|
});
|
||||||
|
|
||||||
session.subscribe((event) => {
|
try {
|
||||||
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
session.subscribe((event) => {
|
||||||
process.stdout.write(event.assistantMessageEvent.delta);
|
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
||||||
}
|
process.stdout.write(event.assistantMessageEvent.delta);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
|
||||||
await session.prompt("List files in the current directory.");
|
await session.prompt("List files in the current directory.");
|
||||||
console.log();
|
console.log();
|
||||||
|
} finally {
|
||||||
|
session.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
// Example extension file (./my-logging-extension.ts):
|
// Example extension file (./my-logging-extension.ts):
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -39,9 +39,9 @@ for (const file of discovered) {
|
|||||||
console.log(` - ${file.path} (${file.content.length} chars)`);
|
console.log(` - ${file.path} (${file.content.length} chars)`);
|
||||||
}
|
}
|
||||||
|
|
||||||
await createAgentSession({
|
const { session } = await createAgentSession({
|
||||||
resourceLoader: loader,
|
resourceLoader: loader,
|
||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(`Session created with ${discovered.length + 1} context files`);
|
console.log(`Session created with ${discovered.length + 1} context files`);
|
||||||
|
session.dispose();
|
||||||
|
|||||||
@@ -43,9 +43,9 @@ for (const template of discovered) {
|
|||||||
console.log(` /${template.name}: ${template.description}`);
|
console.log(` /${template.name}: ${template.description}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
await createAgentSession({
|
const { session } = await createAgentSession({
|
||||||
resourceLoader: loader,
|
resourceLoader: loader,
|
||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(`Session created with ${discovered.length + 1} prompt templates`);
|
console.log(`Session created with ${discovered.length + 1} prompt templates`);
|
||||||
|
session.dispose();
|
||||||
|
|||||||
@@ -11,38 +11,42 @@ import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "
|
|||||||
const authStorage = AuthStorage.create();
|
const authStorage = AuthStorage.create();
|
||||||
const modelRegistry = ModelRegistry.create(authStorage);
|
const modelRegistry = ModelRegistry.create(authStorage);
|
||||||
|
|
||||||
await createAgentSession({
|
const { session: defaultAuthSession } = await createAgentSession({
|
||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
authStorage,
|
authStorage,
|
||||||
modelRegistry,
|
modelRegistry,
|
||||||
});
|
});
|
||||||
console.log("Session with default auth storage and model registry");
|
console.log("Session with default auth storage and model registry");
|
||||||
|
defaultAuthSession.dispose();
|
||||||
|
|
||||||
// Custom auth storage location
|
// Custom auth storage location
|
||||||
const customAuthStorage = AuthStorage.create("/tmp/my-app/auth.json");
|
const customAuthStorage = AuthStorage.create("/tmp/my-app/auth.json");
|
||||||
const customModelRegistry = ModelRegistry.create(customAuthStorage, "/tmp/my-app/models.json");
|
const customModelRegistry = ModelRegistry.create(customAuthStorage, "/tmp/my-app/models.json");
|
||||||
|
|
||||||
await createAgentSession({
|
const { session: customAuthSession } = await createAgentSession({
|
||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
authStorage: customAuthStorage,
|
authStorage: customAuthStorage,
|
||||||
modelRegistry: customModelRegistry,
|
modelRegistry: customModelRegistry,
|
||||||
});
|
});
|
||||||
console.log("Session with custom auth storage location");
|
console.log("Session with custom auth storage location");
|
||||||
|
customAuthSession.dispose();
|
||||||
|
|
||||||
// Runtime API key override (not persisted to disk)
|
// Runtime API key override (not persisted to disk)
|
||||||
authStorage.setRuntimeApiKey("anthropic", "sk-my-temp-key");
|
authStorage.setRuntimeApiKey("anthropic", "sk-my-temp-key");
|
||||||
await createAgentSession({
|
const { session: runtimeKeySession } = await createAgentSession({
|
||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
authStorage,
|
authStorage,
|
||||||
modelRegistry,
|
modelRegistry,
|
||||||
});
|
});
|
||||||
console.log("Session with runtime API key override");
|
console.log("Session with runtime API key override");
|
||||||
|
runtimeKeySession.dispose();
|
||||||
|
|
||||||
// No models.json - only built-in models
|
// No models.json - only built-in models
|
||||||
const simpleRegistry = ModelRegistry.inMemory(authStorage);
|
const simpleRegistry = ModelRegistry.inMemory(authStorage);
|
||||||
await createAgentSession({
|
const { session: builtInModelsSession } = await createAgentSession({
|
||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
authStorage,
|
authStorage,
|
||||||
modelRegistry: simpleRegistry,
|
modelRegistry: simpleRegistry,
|
||||||
});
|
});
|
||||||
console.log("Session with only built-in models");
|
console.log("Session with only built-in models");
|
||||||
|
builtInModelsSession.dispose();
|
||||||
|
|||||||
@@ -19,12 +19,12 @@ settingsManager.applyOverrides({
|
|||||||
retry: { enabled: true, maxRetries: 5, baseDelayMs: 1000 },
|
retry: { enabled: true, maxRetries: 5, baseDelayMs: 1000 },
|
||||||
});
|
});
|
||||||
|
|
||||||
await createAgentSession({
|
const { session: customSettingsSession } = await createAgentSession({
|
||||||
settingsManager,
|
settingsManager,
|
||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("Session created with custom settings");
|
console.log("Session created with custom settings");
|
||||||
|
customSettingsSession.dispose();
|
||||||
|
|
||||||
// Setters update memory immediately and queue persistence writes.
|
// Setters update memory immediately and queue persistence writes.
|
||||||
// Call flush() when you need a durability boundary.
|
// Call flush() when you need a durability boundary.
|
||||||
@@ -45,9 +45,9 @@ const inMemorySettings = SettingsManager.inMemory({
|
|||||||
retry: { enabled: false },
|
retry: { enabled: false },
|
||||||
});
|
});
|
||||||
|
|
||||||
await createAgentSession({
|
const { session: testSession } = await createAgentSession({
|
||||||
settingsManager: inMemorySettings,
|
settingsManager: inMemorySettings,
|
||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("Test session created with in-memory settings");
|
console.log("Test session created with in-memory settings");
|
||||||
|
testSession.dispose();
|
||||||
|
|||||||
@@ -11,12 +11,14 @@ const { session: inMemory } = await createAgentSession({
|
|||||||
sessionManager: SessionManager.inMemory(),
|
sessionManager: SessionManager.inMemory(),
|
||||||
});
|
});
|
||||||
console.log("In-memory session:", inMemory.sessionFile ?? "(none)");
|
console.log("In-memory session:", inMemory.sessionFile ?? "(none)");
|
||||||
|
inMemory.dispose();
|
||||||
|
|
||||||
// New persistent session
|
// New persistent session
|
||||||
const { session: newSession } = await createAgentSession({
|
const { session: newSession } = await createAgentSession({
|
||||||
sessionManager: SessionManager.create(process.cwd()),
|
sessionManager: SessionManager.create(process.cwd()),
|
||||||
});
|
});
|
||||||
console.log("New session file:", newSession.sessionFile);
|
console.log("New session file:", newSession.sessionFile);
|
||||||
|
newSession.dispose();
|
||||||
|
|
||||||
// Continue most recent session (or create new if none)
|
// Continue most recent session (or create new if none)
|
||||||
const { session: continued, modelFallbackMessage } = await createAgentSession({
|
const { session: continued, modelFallbackMessage } = await createAgentSession({
|
||||||
@@ -24,6 +26,7 @@ const { session: continued, modelFallbackMessage } = await createAgentSession({
|
|||||||
});
|
});
|
||||||
if (modelFallbackMessage) console.log("Note:", modelFallbackMessage);
|
if (modelFallbackMessage) console.log("Note:", modelFallbackMessage);
|
||||||
console.log("Continued session:", continued.sessionFile);
|
console.log("Continued session:", continued.sessionFile);
|
||||||
|
continued.dispose();
|
||||||
|
|
||||||
// List and open specific session
|
// List and open specific session
|
||||||
const sessions = await SessionManager.list(process.cwd());
|
const sessions = await SessionManager.list(process.cwd());
|
||||||
@@ -37,6 +40,7 @@ if (sessions.length > 0) {
|
|||||||
sessionManager: SessionManager.open(sessions[0].path),
|
sessionManager: SessionManager.open(sessions[0].path),
|
||||||
});
|
});
|
||||||
console.log(`\nOpened: ${opened.sessionId}`);
|
console.log(`\nOpened: ${opened.sessionId}`);
|
||||||
|
opened.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Custom session directory (no cwd encoding)
|
// Custom session directory (no cwd encoding)
|
||||||
|
|||||||
@@ -63,11 +63,15 @@ const { session } = await createAgentSession({
|
|||||||
settingsManager,
|
settingsManager,
|
||||||
});
|
});
|
||||||
|
|
||||||
session.subscribe((event) => {
|
try {
|
||||||
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
session.subscribe((event) => {
|
||||||
process.stdout.write(event.assistantMessageEvent.delta);
|
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
|
||||||
}
|
process.stdout.write(event.assistantMessageEvent.delta);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
|
||||||
await session.prompt("List files in the current directory.");
|
await session.prompt("List files in the current directory.");
|
||||||
console.log();
|
console.log();
|
||||||
|
} finally {
|
||||||
|
session.dispose();
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user