This commit is contained in:
Jonas H
2026-03-07 21:16:43 +01:00
parent c4da7c9f84
commit 683c770cbc
19 changed files with 2163 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
/**
* new-with-context extension
*
* Provides a /new-with-context command that starts a fresh session but carries
* only the last message from the current conversation into the new session.
*
* Usage:
* /new-with-context
*
* What it does:
* 1. Finds the last user or assistant message in the current branch
* 2. Starts a new session
* 3. Injects that last message as the opening context
*/
import type { ExtensionAPI, SessionEntry } from "@mariozechner/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.registerCommand("new-with-context", {
description: "Start a new session keeping only the last message as context",
handler: async (args, ctx) => {
await ctx.waitForIdle();
// Collect all message entries from the current branch
const branch = ctx.sessionManager.getBranch();
const messageEntries = branch.filter(
(entry): entry is SessionEntry & { type: "message" } => entry.type === "message",
);
if (messageEntries.length === 0) {
ctx.ui.notify("No messages in current session to carry over.", "info");
await ctx.newSession();
return;
}
// Grab the last message entry
const lastEntry = messageEntries[messageEntries.length - 1];
const lastMessage = lastEntry.message;
const currentSessionFile = ctx.sessionManager.getSessionFile();
// Create a new session and inject the last message as opening context
const result = await ctx.newSession({
parentSession: currentSessionFile ?? undefined,
setup: async (sm) => {
sm.appendMessage(lastMessage);
},
});
if (result.cancelled) {
ctx.ui.notify("New session cancelled.", "info");
return;
}
// Give a brief summary of what was carried over
const role = lastMessage.role;
let preview = "";
if (role === "user" || role === "assistant") {
const content = lastMessage.content;
if (typeof content === "string") {
preview = content.slice(0, 80);
} else if (Array.isArray(content)) {
const textBlock = content.find((c: any) => c.type === "text");
if (textBlock && "text" in textBlock) {
preview = (textBlock as { type: "text"; text: string }).text.slice(0, 80);
}
}
} else if (role === "toolResult") {
preview = `[tool result: ${(lastMessage as any).toolName}]`;
} else {
preview = `[${role} message]`;
}
if (preview.length === 80) preview += "…";
ctx.ui.notify(
`New session started. Carried over last message (${role}): "${preview}"`,
"success",
);
},
});
}