pi-kot 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -0
- package/bin/pi-kot.mjs +125 -0
- package/dist/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/client/assets/index-UJgsBs6a.js +361 -0
- package/dist/client/assets/index-UJgsBs6a.js.map +1 -0
- package/dist/client/assets/index-ZuTc_0YY.css +1 -0
- package/dist/client/index.html +14 -0
- package/dist/server/ask-user-question/envelope.d.ts +11 -0
- package/dist/server/ask-user-question/envelope.d.ts.map +1 -0
- package/dist/server/ask-user-question/envelope.js +41 -0
- package/dist/server/ask-user-question/envelope.js.map +1 -0
- package/dist/server/ask-user-question/prompt-strings.d.ts +4 -0
- package/dist/server/ask-user-question/prompt-strings.d.ts.map +1 -0
- package/dist/server/ask-user-question/prompt-strings.js +18 -0
- package/dist/server/ask-user-question/prompt-strings.js.map +1 -0
- package/dist/server/ask-user-question/registry.d.ts +39 -0
- package/dist/server/ask-user-question/registry.d.ts.map +1 -0
- package/dist/server/ask-user-question/registry.js +124 -0
- package/dist/server/ask-user-question/registry.js.map +1 -0
- package/dist/server/ask-user-question/tool.d.ts +4 -0
- package/dist/server/ask-user-question/tool.d.ts.map +1 -0
- package/dist/server/ask-user-question/tool.js +68 -0
- package/dist/server/ask-user-question/tool.js.map +1 -0
- package/dist/server/ask-user-question/types.d.ts +50 -0
- package/dist/server/ask-user-question/types.d.ts.map +1 -0
- package/dist/server/ask-user-question/types.js +7 -0
- package/dist/server/ask-user-question/types.js.map +1 -0
- package/dist/server/ask-user-question/validate.d.ts +3 -0
- package/dist/server/ask-user-question/validate.d.ts.map +1 -0
- package/dist/server/ask-user-question/validate.js +67 -0
- package/dist/server/ask-user-question/validate.js.map +1 -0
- package/dist/server/config-manager.d.ts +47 -0
- package/dist/server/config-manager.d.ts.map +1 -0
- package/dist/server/config-manager.js +182 -0
- package/dist/server/config-manager.js.map +1 -0
- package/dist/server/config.d.ts +20 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +58 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/extension-manager.d.ts +70 -0
- package/dist/server/extension-manager.d.ts.map +1 -0
- package/dist/server/extension-manager.js +401 -0
- package/dist/server/extension-manager.js.map +1 -0
- package/dist/server/extension-ui-bridge.d.ts +35 -0
- package/dist/server/extension-ui-bridge.d.ts.map +1 -0
- package/dist/server/extension-ui-bridge.js +228 -0
- package/dist/server/extension-ui-bridge.js.map +1 -0
- package/dist/server/file-manager.d.ts +79 -0
- package/dist/server/file-manager.d.ts.map +1 -0
- package/dist/server/file-manager.js +526 -0
- package/dist/server/file-manager.js.map +1 -0
- package/dist/server/file-searcher.d.ts +29 -0
- package/dist/server/file-searcher.d.ts.map +1 -0
- package/dist/server/file-searcher.js +318 -0
- package/dist/server/file-searcher.js.map +1 -0
- package/dist/server/git-clone.d.ts +56 -0
- package/dist/server/git-clone.d.ts.map +1 -0
- package/dist/server/git-clone.js +173 -0
- package/dist/server/git-clone.js.map +1 -0
- package/dist/server/index.d.ts +22 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +196 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lifecycle-notifications.d.ts +28 -0
- package/dist/server/lifecycle-notifications.d.ts.map +1 -0
- package/dist/server/lifecycle-notifications.js +38 -0
- package/dist/server/lifecycle-notifications.js.map +1 -0
- package/dist/server/orchestration/config.d.ts +5 -0
- package/dist/server/orchestration/config.d.ts.map +1 -0
- package/dist/server/orchestration/config.js +35 -0
- package/dist/server/orchestration/config.js.map +1 -0
- package/dist/server/orchestration/event-bridge.d.ts +32 -0
- package/dist/server/orchestration/event-bridge.d.ts.map +1 -0
- package/dist/server/orchestration/event-bridge.js +110 -0
- package/dist/server/orchestration/event-bridge.js.map +1 -0
- package/dist/server/orchestration/inbox.d.ts +9 -0
- package/dist/server/orchestration/inbox.d.ts.map +1 -0
- package/dist/server/orchestration/inbox.js +186 -0
- package/dist/server/orchestration/inbox.js.map +1 -0
- package/dist/server/orchestration/init.d.ts +2 -0
- package/dist/server/orchestration/init.d.ts.map +1 -0
- package/dist/server/orchestration/init.js +22 -0
- package/dist/server/orchestration/init.js.map +1 -0
- package/dist/server/orchestration/store.d.ts +33 -0
- package/dist/server/orchestration/store.d.ts.map +1 -0
- package/dist/server/orchestration/store.js +331 -0
- package/dist/server/orchestration/store.js.map +1 -0
- package/dist/server/orchestration/tools.d.ts +15 -0
- package/dist/server/orchestration/tools.d.ts.map +1 -0
- package/dist/server/orchestration/tools.js +621 -0
- package/dist/server/orchestration/tools.js.map +1 -0
- package/dist/server/orchestration/types.d.ts +68 -0
- package/dist/server/orchestration/types.d.ts.map +1 -0
- package/dist/server/orchestration/types.js +43 -0
- package/dist/server/orchestration/types.js.map +1 -0
- package/dist/server/orchestration/worker-lifecycle.d.ts +15 -0
- package/dist/server/orchestration/worker-lifecycle.d.ts.map +1 -0
- package/dist/server/orchestration/worker-lifecycle.js +45 -0
- package/dist/server/orchestration/worker-lifecycle.js.map +1 -0
- package/dist/server/project-manager.d.ts +25 -0
- package/dist/server/project-manager.d.ts.map +1 -0
- package/dist/server/project-manager.js +157 -0
- package/dist/server/project-manager.js.map +1 -0
- package/dist/server/routes/_schemas.d.ts +16 -0
- package/dist/server/routes/_schemas.d.ts.map +1 -0
- package/dist/server/routes/_schemas.js +12 -0
- package/dist/server/routes/_schemas.js.map +1 -0
- package/dist/server/routes/ask-user-question.d.ts +3 -0
- package/dist/server/routes/ask-user-question.d.ts.map +1 -0
- package/dist/server/routes/ask-user-question.js +105 -0
- package/dist/server/routes/ask-user-question.js.map +1 -0
- package/dist/server/routes/auth.d.ts +7 -0
- package/dist/server/routes/auth.d.ts.map +1 -0
- package/dist/server/routes/auth.js +126 -0
- package/dist/server/routes/auth.js.map +1 -0
- package/dist/server/routes/config.d.ts +3 -0
- package/dist/server/routes/config.d.ts.map +1 -0
- package/dist/server/routes/config.js +203 -0
- package/dist/server/routes/config.js.map +1 -0
- package/dist/server/routes/control.d.ts +3 -0
- package/dist/server/routes/control.d.ts.map +1 -0
- package/dist/server/routes/control.js +180 -0
- package/dist/server/routes/control.js.map +1 -0
- package/dist/server/routes/extension-commands.d.ts +22 -0
- package/dist/server/routes/extension-commands.d.ts.map +1 -0
- package/dist/server/routes/extension-commands.js +178 -0
- package/dist/server/routes/extension-commands.js.map +1 -0
- package/dist/server/routes/extensions.d.ts +8 -0
- package/dist/server/routes/extensions.d.ts.map +1 -0
- package/dist/server/routes/extensions.js +169 -0
- package/dist/server/routes/extensions.js.map +1 -0
- package/dist/server/routes/files.d.ts +3 -0
- package/dist/server/routes/files.d.ts.map +1 -0
- package/dist/server/routes/files.js +549 -0
- package/dist/server/routes/files.js.map +1 -0
- package/dist/server/routes/orchestration.d.ts +3 -0
- package/dist/server/routes/orchestration.d.ts.map +1 -0
- package/dist/server/routes/orchestration.js +251 -0
- package/dist/server/routes/orchestration.js.map +1 -0
- package/dist/server/routes/projects.d.ts +3 -0
- package/dist/server/routes/projects.d.ts.map +1 -0
- package/dist/server/routes/projects.js +412 -0
- package/dist/server/routes/projects.js.map +1 -0
- package/dist/server/routes/prompt.d.ts +3 -0
- package/dist/server/routes/prompt.d.ts.map +1 -0
- package/dist/server/routes/prompt.js +192 -0
- package/dist/server/routes/prompt.js.map +1 -0
- package/dist/server/routes/sessions.d.ts +3 -0
- package/dist/server/routes/sessions.d.ts.map +1 -0
- package/dist/server/routes/sessions.js +581 -0
- package/dist/server/routes/sessions.js.map +1 -0
- package/dist/server/routes/stream.d.ts +3 -0
- package/dist/server/routes/stream.d.ts.map +1 -0
- package/dist/server/routes/stream.js +109 -0
- package/dist/server/routes/stream.js.map +1 -0
- package/dist/server/session-registry.d.ts +151 -0
- package/dist/server/session-registry.d.ts.map +1 -0
- package/dist/server/session-registry.js +655 -0
- package/dist/server/session-registry.js.map +1 -0
- package/dist/server/sse-bridge.d.ts +31 -0
- package/dist/server/sse-bridge.d.ts.map +1 -0
- package/dist/server/sse-bridge.js +126 -0
- package/dist/server/sse-bridge.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { SessionManager, createAgentSession } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { buildBindings, getSession, registerSession, } from "../session-registry.js";
|
|
3
|
+
import { createSSEClient } from "../sse-bridge.js";
|
|
4
|
+
import { config } from "../config.js";
|
|
5
|
+
async function warmUpSession(sessionId) {
|
|
6
|
+
const { readdir } = await import("node:fs/promises");
|
|
7
|
+
const { join } = await import("node:path");
|
|
8
|
+
try {
|
|
9
|
+
const projectDirs = await readdir(config.sessionDir, { withFileTypes: true });
|
|
10
|
+
for (const dir of projectDirs) {
|
|
11
|
+
if (!dir.isDirectory())
|
|
12
|
+
continue;
|
|
13
|
+
const projectDir = join(config.sessionDir, dir.name);
|
|
14
|
+
const files = await readdir(projectDir);
|
|
15
|
+
const matchFile = files.find((f) => f.endsWith(".jsonl") && f.includes(sessionId));
|
|
16
|
+
if (matchFile) {
|
|
17
|
+
const sessionPath = join(projectDir, matchFile);
|
|
18
|
+
const sm = SessionManager.open(sessionPath);
|
|
19
|
+
const cwd = sm.getCwd();
|
|
20
|
+
// Build a live session wrapping the existing SessionManager
|
|
21
|
+
const { session } = await createAgentSession({
|
|
22
|
+
cwd,
|
|
23
|
+
sessionManager: sm,
|
|
24
|
+
agentDir: config.piConfigDir,
|
|
25
|
+
});
|
|
26
|
+
// Trigger session_start and wire real command context actions
|
|
27
|
+
// (navigateTree, etc.) so extension commands like /rewind can
|
|
28
|
+
// navigate the conversation tree.
|
|
29
|
+
await session.bindExtensions(buildBindings(session)).catch(() => {
|
|
30
|
+
// best-effort
|
|
31
|
+
});
|
|
32
|
+
const now = new Date();
|
|
33
|
+
const live = {
|
|
34
|
+
session,
|
|
35
|
+
sessionId: session.sessionId,
|
|
36
|
+
projectId: dir.name,
|
|
37
|
+
workspacePath: cwd,
|
|
38
|
+
sessionManager: sm,
|
|
39
|
+
clients: new Set(),
|
|
40
|
+
createdAt: now,
|
|
41
|
+
lastActivityAt: now,
|
|
42
|
+
lastAgentStartIndex: undefined,
|
|
43
|
+
unsubscribe: () => undefined,
|
|
44
|
+
name: sm.getSessionName(),
|
|
45
|
+
};
|
|
46
|
+
// Wire event subscription
|
|
47
|
+
live.unsubscribe = session.subscribe((event) => {
|
|
48
|
+
live.lastActivityAt = new Date();
|
|
49
|
+
if (event.type === "agent_start") {
|
|
50
|
+
live.lastAgentStartIndex = live.session.messages.length;
|
|
51
|
+
}
|
|
52
|
+
for (const client of live.clients) {
|
|
53
|
+
try {
|
|
54
|
+
client.send(event);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
live.clients.delete(client);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
registerSession(live);
|
|
62
|
+
return live;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// not found
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
export const streamRoutes = async (fastify) => {
|
|
72
|
+
// GET /api/v1/sessions/:id/stream — SSE stream of agent events
|
|
73
|
+
fastify.get("/sessions/:id/stream", {
|
|
74
|
+
schema: {
|
|
75
|
+
description: "Open an SSE stream for a session. Sends a `snapshot` event on " +
|
|
76
|
+
"connect, then forwards filtered AgentSessionEvents until the " +
|
|
77
|
+
"client disconnects.\n\n" +
|
|
78
|
+
"Auto-warms up disk sessions (cold session resume).\n\n" +
|
|
79
|
+
"NOTE: This route uses reply.hijack() — it does NOT return a " +
|
|
80
|
+
"standard Fastify response. The connection stays open indefinitely.",
|
|
81
|
+
tags: ["sessions"],
|
|
82
|
+
params: {
|
|
83
|
+
type: "object",
|
|
84
|
+
required: ["id"],
|
|
85
|
+
properties: { id: { type: "string" } },
|
|
86
|
+
},
|
|
87
|
+
response: {
|
|
88
|
+
404: {
|
|
89
|
+
type: "object",
|
|
90
|
+
properties: { error: { type: "string" } },
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
}, async (req, reply) => {
|
|
95
|
+
let live = getSession(req.params.id);
|
|
96
|
+
// Warm up disk session if not live
|
|
97
|
+
if (live === undefined) {
|
|
98
|
+
live = await warmUpSession(req.params.id);
|
|
99
|
+
}
|
|
100
|
+
if (live === undefined) {
|
|
101
|
+
return reply.code(404).send({ error: "session_not_found" });
|
|
102
|
+
}
|
|
103
|
+
createSSEClient(reply, live);
|
|
104
|
+
// createSSEClient calls reply.hijack() — we return reply to satisfy
|
|
105
|
+
// the type system, but the response is already being driven manually.
|
|
106
|
+
return reply;
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/routes/stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { type AgentSessionEvent } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
/**
|
|
3
|
+
* Build the ExtensionBindings for a session with real command context
|
|
4
|
+
* actions (navigateTree, fork, etc.) so extension commands like
|
|
5
|
+
* pi-rewind's `/rewind` can navigate the conversation tree.
|
|
6
|
+
*
|
|
7
|
+
* Without this, `ctx.navigateTree()` is a no-op that returns
|
|
8
|
+
* `{ cancelled: false }` without actually navigating.
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildBindings(session: {
|
|
11
|
+
navigateTree: (targetId: string, options?: {
|
|
12
|
+
summarize?: boolean;
|
|
13
|
+
customInstructions?: string;
|
|
14
|
+
label?: string;
|
|
15
|
+
}) => Promise<{
|
|
16
|
+
cancelled: boolean;
|
|
17
|
+
}>;
|
|
18
|
+
}): Record<string, unknown>;
|
|
19
|
+
/**
|
|
20
|
+
* Minimal SSE client contract — the concrete implementation lives in
|
|
21
|
+
* sse-bridge.ts.
|
|
22
|
+
*/
|
|
23
|
+
export interface SSEClient {
|
|
24
|
+
readonly id: string;
|
|
25
|
+
send(event: AgentSessionEvent | {
|
|
26
|
+
type: string;
|
|
27
|
+
[k: string]: unknown;
|
|
28
|
+
}): void;
|
|
29
|
+
close(): void;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A live session in the in-memory registry. Wraps an SDK AgentSession
|
|
33
|
+
* plus metadata and connected SSE clients.
|
|
34
|
+
*/
|
|
35
|
+
export interface LiveSession {
|
|
36
|
+
session: import("@earendil-works/pi-coding-agent").AgentSession;
|
|
37
|
+
sessionId: string;
|
|
38
|
+
projectId: string;
|
|
39
|
+
workspacePath: string;
|
|
40
|
+
/** The SDK SessionManager for this session (exposed for rename, fork, etc.). */
|
|
41
|
+
sessionManager: import("@earendil-works/pi-coding-agent").SessionManager;
|
|
42
|
+
clients: Set<SSEClient>;
|
|
43
|
+
createdAt: Date;
|
|
44
|
+
lastActivityAt: Date;
|
|
45
|
+
/** Index of the first message of the latest agent turn (for turn-diff). */
|
|
46
|
+
lastAgentStartIndex: number | undefined;
|
|
47
|
+
/** Internal — call to detach the registry's own subscription on dispose. */
|
|
48
|
+
unsubscribe: () => void;
|
|
49
|
+
/** The session name set via appendSessionInfo, if any. */
|
|
50
|
+
name: string | undefined;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Discover session JSONL files on disk for a project.
|
|
54
|
+
* Returns basic metadata without loading the full session state.
|
|
55
|
+
*/
|
|
56
|
+
export interface DiscoveredSession {
|
|
57
|
+
sessionId: string;
|
|
58
|
+
path: string;
|
|
59
|
+
createdAt: Date;
|
|
60
|
+
modifiedAt: Date;
|
|
61
|
+
messageCount: number;
|
|
62
|
+
/** Session name from the SDK's session_info, if any. */
|
|
63
|
+
name?: string;
|
|
64
|
+
}
|
|
65
|
+
export declare function discoverSessionsOnDisk(projectId: string, workspacePath: string): Promise<DiscoveredSession[]>;
|
|
66
|
+
/**
|
|
67
|
+
* List all known sessions (live + disk) for a project.
|
|
68
|
+
* Returns UnifiedSession view sorted by recency.
|
|
69
|
+
*/
|
|
70
|
+
export interface UnifiedSession {
|
|
71
|
+
sessionId: string;
|
|
72
|
+
projectId: string;
|
|
73
|
+
isLive: boolean;
|
|
74
|
+
name: string | undefined;
|
|
75
|
+
createdAt: Date;
|
|
76
|
+
lastActivityAt: Date;
|
|
77
|
+
messageCount: number;
|
|
78
|
+
}
|
|
79
|
+
export declare function listSessionsForProject(projectId: string, workspacePath: string): Promise<UnifiedSession[]>;
|
|
80
|
+
/**
|
|
81
|
+
* Create a new session. Uses disk-backed SessionManager for persistence.
|
|
82
|
+
*/
|
|
83
|
+
export declare function createSession(projectId: string, workspacePath: string): Promise<LiveSession>;
|
|
84
|
+
/** Get a live session by id. Returns undefined if not in the registry. */
|
|
85
|
+
export declare function getSession(sessionId: string): LiveSession | undefined;
|
|
86
|
+
/** List live sessions, optionally filtered by projectId. */
|
|
87
|
+
export declare function listSessions(projectId?: string): LiveSession[];
|
|
88
|
+
/** Number of active sessions. */
|
|
89
|
+
export declare function sessionCount(): number;
|
|
90
|
+
/** Register a session in the registry (used by session resume). */
|
|
91
|
+
export declare function registerSession(live: LiveSession): void;
|
|
92
|
+
/**
|
|
93
|
+
* Archive a session: move JSONL to _archived/ subfolder, remove from live registry.
|
|
94
|
+
* Works for both live and disk-only sessions.
|
|
95
|
+
* Returns true if archived, false if not found on disk or in registry.
|
|
96
|
+
*/
|
|
97
|
+
export declare function archiveSession(sessionId: string, projectId?: string): Promise<boolean>;
|
|
98
|
+
/**
|
|
99
|
+
* Unarchive a session: move JSONL back from _archived/ to main dir.
|
|
100
|
+
* Does NOT warm it back into the live registry — that happens on SSE connect.
|
|
101
|
+
* Returns true if restored, false if no archive file found.
|
|
102
|
+
*/
|
|
103
|
+
export declare function unarchiveSession(sessionId: string, projectId: string): Promise<boolean>;
|
|
104
|
+
/**
|
|
105
|
+
* List archived sessions for a project.
|
|
106
|
+
*/
|
|
107
|
+
export declare function listArchivedSessions(projectId: string, workspacePath: string): Promise<UnifiedSession[]>;
|
|
108
|
+
/**
|
|
109
|
+
* Rename a live session. Persists via SessionManager.appendSessionInfo.
|
|
110
|
+
* Returns true if renamed, false if session not live.
|
|
111
|
+
*/
|
|
112
|
+
export declare function renameSession(sessionId: string, name: string): boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Auto-name a session from the first user prompt text.
|
|
115
|
+
* Called when the first prompt is sent. Truncates to 60 chars.
|
|
116
|
+
*/
|
|
117
|
+
export declare function autoNameSession(sessionId: string, promptText: string): void;
|
|
118
|
+
/**
|
|
119
|
+
* Rebuild a live session's AgentSession with updated custom tools.
|
|
120
|
+
* Preserves the SessionManager (messages intact), SSE clients stay
|
|
121
|
+
* attached, and the old session is disposed cleanly.
|
|
122
|
+
*/
|
|
123
|
+
export declare function rebuildSessionTools(sessionId: string): Promise<void>;
|
|
124
|
+
/** Dispose a live session — abort, unsubscribe, close clients, remove from registry. */
|
|
125
|
+
export declare function disposeSession(sessionId: string): Promise<boolean>;
|
|
126
|
+
/** Dispose all sessions (called on server shutdown). */
|
|
127
|
+
export declare function disposeAllSessions(): Promise<void>;
|
|
128
|
+
/**
|
|
129
|
+
* Find a session's location on disk. Returns projectId and workspacePath
|
|
130
|
+
* by scanning all project session dirs.
|
|
131
|
+
*/
|
|
132
|
+
export declare function findSessionLocation(sessionId: string): Promise<{
|
|
133
|
+
projectId: string;
|
|
134
|
+
workspacePath: string;
|
|
135
|
+
} | undefined>;
|
|
136
|
+
/**
|
|
137
|
+
* Resume a cold session from disk. Opens the JSONL, creates an AgentSession,
|
|
138
|
+
* registers it in the registry, and returns the LiveSession.
|
|
139
|
+
*/
|
|
140
|
+
export declare function resumeSessionById(sessionId: string): Promise<LiveSession>;
|
|
141
|
+
/**
|
|
142
|
+
* Fork a session at a given entry. Creates a new JSONL file containing
|
|
143
|
+
* the path-to-leaf from root to the given entry, registers the new
|
|
144
|
+
* session, and returns it.
|
|
145
|
+
*
|
|
146
|
+
* NOTE: `createBranchedSession` mutates the source session's in-memory
|
|
147
|
+
* file reference to point at the new fork (SDK behavior). We handle this
|
|
148
|
+
* by capturing the source file before and re-opening the source after.
|
|
149
|
+
*/
|
|
150
|
+
export declare function forkSession(sessionId: string, entryId: string): Promise<LiveSession>;
|
|
151
|
+
//# sourceMappingURL=session-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"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"}
|