Auto-clear completed todo trees

This commit is contained in:
jb
2026-08-26 18:07:46 -04:00
parent 91a019de29
commit fbe8baf18c
9 changed files with 283 additions and 17 deletions
+29 -3
View File
@@ -1,31 +1,57 @@
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
import { createCompletedTaskAutoClear } from "./src/auto-clear.ts";
import { clearCurrentTask, reportCurrentTask } from "./src/herdr.ts";
import {
COMPACTION_REMINDER,
COMPACTION_REMINDER_TYPE,
hasUnfinishedTasks,
} from "./src/prompt.ts";
import { TaskState } from "./src/state.ts";
import { TASK_STATE_ENTRY_TYPE, TaskState } from "./src/state.ts";
import { registerTaskTools } from "./src/tools.ts";
import { clearTaskWidget, updateTaskWidget } from "./src/widget.ts";
export default function piTodoHerdr(pi: ExtensionAPI): void {
const state = new TaskState();
let widgetVisible = true;
let activeContext: ExtensionContext | undefined;
const refresh = (ctx: ExtensionContext) => {
const autoClear = createCompletedTaskAutoClear(state, () => {
try {
pi.appendEntry(TASK_STATE_ENTRY_TYPE, { tasks: [], nextId: 1 });
} catch (error) {
console.error("[pi-todo-herdr] failed to persist automatic task clear; retrying:", error);
return false;
}
state.set("replace", [], false);
if (activeContext !== undefined) {
try {
updateTaskWidget(state, activeContext, widgetVisible);
void reportCurrentTask(state.list());
} catch (error) {
console.error("[pi-todo-herdr] failed to refresh task UI after automatic clear:", error);
}
}
return true;
});
const refresh = (ctx: ExtensionContext, restartAutoClear = false) => {
activeContext = ctx;
updateTaskWidget(state, ctx, widgetVisible);
void reportCurrentTask(state.list());
autoClear.sync(restartAutoClear);
};
const restore = (ctx: ExtensionContext) => {
state.loadFromSession(ctx);
refresh(ctx);
refresh(ctx, true);
};
pi.on("session_start", async (_event, ctx) => restore(ctx));
pi.on("session_tree", async (_event, ctx) => restore(ctx));
pi.on("session_shutdown", async (event) => {
autoClear.cancel();
activeContext = undefined;
if (event.reason === "quit") await clearCurrentTask();
});
pi.on("session_compact", () => {