aboutsummaryrefslogtreecommitdiff
path: root/crates/dinggerd/assets/pi/pi-agent-state.ts
diff options
context:
space:
mode:
Diffstat (limited to 'crates/dinggerd/assets/pi/pi-agent-state.ts')
-rw-r--r--crates/dinggerd/assets/pi/pi-agent-state.ts16
1 files changed, 16 insertions, 0 deletions
diff --git a/crates/dinggerd/assets/pi/pi-agent-state.ts b/crates/dinggerd/assets/pi/pi-agent-state.ts
index df9e4e2..ff893e7 100644
--- a/crates/dinggerd/assets/pi/pi-agent-state.ts
+++ b/crates/dinggerd/assets/pi/pi-agent-state.ts
@@ -56,6 +56,19 @@ async function sendRequest(request: unknown): Promise<void> {
type AgentState = "working" | "blocked" | "idle";
+// The session file, so `dingger restore` can resume this session with
+// `pi --session <file>`. It changes with /new, /resume, and forks.
+let sessionFile: string | undefined;
+
+function updateSessionFile(ctx: any): void {
+ try {
+ const file = ctx?.sessionManager?.getSessionFile?.();
+ sessionFile = typeof file === "string" && file.length > 0 ? file : undefined;
+ } catch {
+ sessionFile = undefined;
+ }
+}
+
function report(state: AgentState, message?: string): Promise<void> {
return sendRequest({
id: `${source}:${Date.now()}:${Math.random().toString(36).slice(2)}`,
@@ -67,6 +80,7 @@ function report(state: AgentState, message?: string): Promise<void> {
state,
message,
seq: Date.now() * 1000,
+ ...(sessionFile ? { agent_session_path: sessionFile } : {}),
},
});
}
@@ -154,11 +168,13 @@ export default function (pi) {
}
// A reload can replace this extension mid-run without emitting another agent_start.
agentActive = ctx?.isIdle?.() === false;
+ updateSessionFile(ctx);
publishState(true);
});
pi.on("agent_start", (_event, ctx) => {
agentActive = true;
+ updateSessionFile(ctx);
publishState();
});