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,655 @@
|
|
|
1
|
+
import { createAgentSession, SessionManager, } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { mkdir, rename, readdir, stat } from "node:fs/promises";
|
|
3
|
+
import { createAskUserQuestionTool } from "./ask-user-question/tool.js";
|
|
4
|
+
import { join, basename } from "node:path";
|
|
5
|
+
import { config } from "./config.js";
|
|
6
|
+
import { isOrchestrationEnabled } from "./orchestration/config.js";
|
|
7
|
+
import { isSupervisor } from "./orchestration/store.js";
|
|
8
|
+
import { createOrchestrationTools } from "./orchestration/tools.js";
|
|
9
|
+
import { bridgeWorkerAgentEvent } from "./orchestration/event-bridge.js";
|
|
10
|
+
import { notifySupervisorDisposed, notifySupervisorIdle } from "./orchestration/inbox.js";
|
|
11
|
+
/**
|
|
12
|
+
* Build the ExtensionBindings for a session with real command context
|
|
13
|
+
* actions (navigateTree, fork, etc.) so extension commands like
|
|
14
|
+
* pi-rewind's `/rewind` can navigate the conversation tree.
|
|
15
|
+
*
|
|
16
|
+
* Without this, `ctx.navigateTree()` is a no-op that returns
|
|
17
|
+
* `{ cancelled: false }` without actually navigating.
|
|
18
|
+
*/
|
|
19
|
+
export function buildBindings(session) {
|
|
20
|
+
return {
|
|
21
|
+
commandContextActions: {
|
|
22
|
+
waitForIdle: async () => { },
|
|
23
|
+
newSession: async () => ({ cancelled: false }),
|
|
24
|
+
fork: async () => ({ cancelled: false }),
|
|
25
|
+
switchSession: async () => ({ cancelled: false }),
|
|
26
|
+
reload: async () => { },
|
|
27
|
+
navigateTree: async (targetId, options) => {
|
|
28
|
+
return session.navigateTree(targetId, options);
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const registry = new Map();
|
|
34
|
+
function sessionDirFor(projectId) {
|
|
35
|
+
return join(config.sessionDir, projectId);
|
|
36
|
+
}
|
|
37
|
+
async function ensureSessionDir(projectId) {
|
|
38
|
+
const dir = sessionDirFor(projectId);
|
|
39
|
+
await mkdir(dir, { recursive: true });
|
|
40
|
+
return dir;
|
|
41
|
+
}
|
|
42
|
+
export async function discoverSessionsOnDisk(projectId, workspacePath) {
|
|
43
|
+
const dir = sessionDirFor(projectId);
|
|
44
|
+
try {
|
|
45
|
+
const infos = await SessionManager.list(workspacePath, dir);
|
|
46
|
+
return infos.map((info) => ({
|
|
47
|
+
sessionId: info.id,
|
|
48
|
+
path: info.path,
|
|
49
|
+
createdAt: info.created,
|
|
50
|
+
modifiedAt: info.modified,
|
|
51
|
+
messageCount: info.messageCount,
|
|
52
|
+
name: info.name,
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
if (err.code === "ENOENT")
|
|
57
|
+
return [];
|
|
58
|
+
throw err;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export async function listSessionsForProject(projectId, workspacePath) {
|
|
62
|
+
const live = listSessions(projectId);
|
|
63
|
+
const liveById = new Map(live.map((l) => [
|
|
64
|
+
l.sessionId,
|
|
65
|
+
{
|
|
66
|
+
sessionId: l.sessionId,
|
|
67
|
+
projectId: l.projectId,
|
|
68
|
+
isLive: true,
|
|
69
|
+
name: l.name ?? l.session.sessionName,
|
|
70
|
+
createdAt: l.createdAt,
|
|
71
|
+
lastActivityAt: l.lastActivityAt,
|
|
72
|
+
messageCount: l.session.messages.length,
|
|
73
|
+
},
|
|
74
|
+
]));
|
|
75
|
+
const disk = await discoverSessionsOnDisk(projectId, workspacePath);
|
|
76
|
+
for (const d of disk) {
|
|
77
|
+
const merged = liveById.get(d.sessionId);
|
|
78
|
+
if (merged !== undefined) {
|
|
79
|
+
merged.messageCount = d.messageCount;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
liveById.set(d.sessionId, {
|
|
83
|
+
sessionId: d.sessionId,
|
|
84
|
+
projectId,
|
|
85
|
+
isLive: false,
|
|
86
|
+
name: d.name,
|
|
87
|
+
createdAt: d.createdAt,
|
|
88
|
+
lastActivityAt: d.modifiedAt,
|
|
89
|
+
messageCount: d.messageCount,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return Array.from(liveById.values()).sort((a, b) => b.lastActivityAt.getTime() - a.lastActivityAt.getTime());
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Create a new session. Uses disk-backed SessionManager for persistence.
|
|
96
|
+
*/
|
|
97
|
+
export async function createSession(projectId, workspacePath) {
|
|
98
|
+
const dir = await ensureSessionDir(projectId);
|
|
99
|
+
const sessionManager = SessionManager.create(workspacePath, dir);
|
|
100
|
+
const sessionId = sessionManager.getSessionId();
|
|
101
|
+
const orchestrationTools = await resolveOrchestrationTools(sessionId);
|
|
102
|
+
const customTools = [
|
|
103
|
+
createAskUserQuestionTool(sessionId),
|
|
104
|
+
...orchestrationTools,
|
|
105
|
+
];
|
|
106
|
+
const { session } = await createAgentSession({
|
|
107
|
+
cwd: workspacePath,
|
|
108
|
+
sessionManager,
|
|
109
|
+
agentDir: config.piConfigDir,
|
|
110
|
+
customTools,
|
|
111
|
+
});
|
|
112
|
+
// Trigger session_start event and wire real command context actions
|
|
113
|
+
// (navigateTree, etc.) so extension commands like /rewind can
|
|
114
|
+
// navigate the conversation tree.
|
|
115
|
+
await session.bindExtensions(buildBindings(session)).catch(() => {
|
|
116
|
+
// best-effort
|
|
117
|
+
});
|
|
118
|
+
const now = new Date();
|
|
119
|
+
const live = {
|
|
120
|
+
session,
|
|
121
|
+
sessionId: session.sessionId,
|
|
122
|
+
projectId,
|
|
123
|
+
workspacePath,
|
|
124
|
+
sessionManager,
|
|
125
|
+
clients: new Set(),
|
|
126
|
+
createdAt: now,
|
|
127
|
+
lastActivityAt: now,
|
|
128
|
+
lastAgentStartIndex: undefined,
|
|
129
|
+
unsubscribe: () => undefined,
|
|
130
|
+
name: sessionManager.getSessionName(),
|
|
131
|
+
};
|
|
132
|
+
// Wire the registry's event subscription
|
|
133
|
+
live.unsubscribe = session.subscribe((event) => {
|
|
134
|
+
live.lastActivityAt = new Date();
|
|
135
|
+
if (event.type === "agent_start") {
|
|
136
|
+
live.lastAgentStartIndex = live.session.messages.length;
|
|
137
|
+
}
|
|
138
|
+
// Bridge orchestration lifecycle events (fire-and-forget)
|
|
139
|
+
if (event.type === "agent_start" || event.type === "agent_end") {
|
|
140
|
+
void bridgeWorkerAgentEvent({ sessionId: live.sessionId, session: live.session }, event);
|
|
141
|
+
}
|
|
142
|
+
// Notify supervisor idle — compatibility recovery for undelivered items
|
|
143
|
+
if (event.type === "agent_end") {
|
|
144
|
+
void notifySupervisorIdle(live.sessionId);
|
|
145
|
+
}
|
|
146
|
+
// Fan out to all connected SSE clients
|
|
147
|
+
for (const client of live.clients) {
|
|
148
|
+
try {
|
|
149
|
+
client.send(event);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
live.clients.delete(client);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
registry.set(live.sessionId, live);
|
|
157
|
+
return live;
|
|
158
|
+
}
|
|
159
|
+
/** Get a live session by id. Returns undefined if not in the registry. */
|
|
160
|
+
export function getSession(sessionId) {
|
|
161
|
+
return registry.get(sessionId);
|
|
162
|
+
}
|
|
163
|
+
/** List live sessions, optionally filtered by projectId. */
|
|
164
|
+
export function listSessions(projectId) {
|
|
165
|
+
const all = Array.from(registry.values());
|
|
166
|
+
return projectId === undefined ? all : all.filter((s) => s.projectId === projectId);
|
|
167
|
+
}
|
|
168
|
+
/** Number of active sessions. */
|
|
169
|
+
export function sessionCount() {
|
|
170
|
+
return registry.size;
|
|
171
|
+
}
|
|
172
|
+
/** Register a session in the registry (used by session resume). */
|
|
173
|
+
export function registerSession(live) {
|
|
174
|
+
registry.set(live.sessionId, live);
|
|
175
|
+
}
|
|
176
|
+
/* ── Archive / Unarchive ── */
|
|
177
|
+
function archivedDirFor(projectId) {
|
|
178
|
+
return join(config.sessionDir, projectId, "_archived");
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Archive a session: move JSONL to _archived/ subfolder, remove from live registry.
|
|
182
|
+
* Works for both live and disk-only sessions.
|
|
183
|
+
* Returns true if archived, false if not found on disk or in registry.
|
|
184
|
+
*/
|
|
185
|
+
export async function archiveSession(sessionId, projectId) {
|
|
186
|
+
// Always check registry first — live session takes precedence
|
|
187
|
+
const live = registry.get(sessionId);
|
|
188
|
+
const resolvedProjectId = live?.projectId ?? projectId;
|
|
189
|
+
if (resolvedProjectId === undefined)
|
|
190
|
+
return false;
|
|
191
|
+
const pid = resolvedProjectId;
|
|
192
|
+
const srcDir = join(config.sessionDir, pid);
|
|
193
|
+
let fileMoved = false;
|
|
194
|
+
// Find and move the JSONL file
|
|
195
|
+
try {
|
|
196
|
+
const files = await readdir(srcDir);
|
|
197
|
+
const match = files.find((f) => f.endsWith(".jsonl") && f.includes(sessionId));
|
|
198
|
+
if (match) {
|
|
199
|
+
const archiveDir = archivedDirFor(pid);
|
|
200
|
+
await mkdir(archiveDir, { recursive: true });
|
|
201
|
+
await rename(join(srcDir, match), join(archiveDir, match));
|
|
202
|
+
fileMoved = true;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// best-effort file move
|
|
207
|
+
}
|
|
208
|
+
// Remove from live registry if present
|
|
209
|
+
if (live !== undefined) {
|
|
210
|
+
try {
|
|
211
|
+
await live.session.abort();
|
|
212
|
+
}
|
|
213
|
+
catch { }
|
|
214
|
+
try {
|
|
215
|
+
live.unsubscribe();
|
|
216
|
+
}
|
|
217
|
+
catch { }
|
|
218
|
+
for (const client of live.clients) {
|
|
219
|
+
try {
|
|
220
|
+
client.close();
|
|
221
|
+
}
|
|
222
|
+
catch { }
|
|
223
|
+
}
|
|
224
|
+
live.clients.clear();
|
|
225
|
+
try {
|
|
226
|
+
live.session.dispose();
|
|
227
|
+
}
|
|
228
|
+
catch { }
|
|
229
|
+
registry.delete(sessionId);
|
|
230
|
+
}
|
|
231
|
+
return fileMoved || live !== undefined;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Unarchive a session: move JSONL back from _archived/ to main dir.
|
|
235
|
+
* Does NOT warm it back into the live registry — that happens on SSE connect.
|
|
236
|
+
* Returns true if restored, false if no archive file found.
|
|
237
|
+
*/
|
|
238
|
+
export async function unarchiveSession(sessionId, projectId) {
|
|
239
|
+
const archiveDir = archivedDirFor(projectId);
|
|
240
|
+
try {
|
|
241
|
+
const files = await readdir(archiveDir);
|
|
242
|
+
const match = files.find((f) => f.endsWith(".jsonl") && f.includes(sessionId));
|
|
243
|
+
if (!match)
|
|
244
|
+
return false;
|
|
245
|
+
const srcDir = join(config.sessionDir, projectId);
|
|
246
|
+
await rename(join(archiveDir, match), join(srcDir, match));
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* List archived sessions for a project.
|
|
255
|
+
*/
|
|
256
|
+
export async function listArchivedSessions(projectId, workspacePath) {
|
|
257
|
+
const archiveDir = archivedDirFor(projectId);
|
|
258
|
+
try {
|
|
259
|
+
await stat(archiveDir);
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
return []; // archive dir doesn't exist
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
const files = await readdir(archiveDir);
|
|
266
|
+
const jsonls = files.filter((f) => f.endsWith(".jsonl"));
|
|
267
|
+
const results = [];
|
|
268
|
+
for (const file of jsonls) {
|
|
269
|
+
try {
|
|
270
|
+
const sessionPath = join(archiveDir, file);
|
|
271
|
+
const sm = SessionManager.open(sessionPath);
|
|
272
|
+
// Derive sessionId from the filename (UUID after timestamp prefix)
|
|
273
|
+
const base = basename(file, ".jsonl");
|
|
274
|
+
const underscoreIdx = base.indexOf("_");
|
|
275
|
+
const sessionId = underscoreIdx !== -1 ? base.slice(underscoreIdx + 1) : base;
|
|
276
|
+
const ctx = sm.buildSessionContext();
|
|
277
|
+
const info = SessionManager.list(workspacePath, archiveDir);
|
|
278
|
+
const match = (await info).find((i) => i.id === sessionId);
|
|
279
|
+
results.push({
|
|
280
|
+
sessionId,
|
|
281
|
+
projectId,
|
|
282
|
+
isLive: false,
|
|
283
|
+
name: match?.name ?? sm.getSessionName(),
|
|
284
|
+
createdAt: match?.created ?? new Date(0),
|
|
285
|
+
lastActivityAt: match?.modified ?? new Date(0),
|
|
286
|
+
messageCount: ctx.messages.length,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
// skip corrupt files
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return results.sort((a, b) => b.lastActivityAt.getTime() - a.lastActivityAt.getTime());
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
return [];
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Rename a live session. Persists via SessionManager.appendSessionInfo.
|
|
301
|
+
* Returns true if renamed, false if session not live.
|
|
302
|
+
*/
|
|
303
|
+
export function renameSession(sessionId, name) {
|
|
304
|
+
const live = registry.get(sessionId);
|
|
305
|
+
if (live === undefined)
|
|
306
|
+
return false;
|
|
307
|
+
const trimmed = name.trim();
|
|
308
|
+
if (trimmed.length === 0)
|
|
309
|
+
return false;
|
|
310
|
+
live.sessionManager.appendSessionInfo(trimmed);
|
|
311
|
+
live.name = trimmed;
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Auto-name a session from the first user prompt text.
|
|
316
|
+
* Called when the first prompt is sent. Truncates to 60 chars.
|
|
317
|
+
*/
|
|
318
|
+
export function autoNameSession(sessionId, promptText) {
|
|
319
|
+
const live = registry.get(sessionId);
|
|
320
|
+
if (live === undefined)
|
|
321
|
+
return;
|
|
322
|
+
// Only auto-name if no name is already set
|
|
323
|
+
if (live.name !== undefined)
|
|
324
|
+
return;
|
|
325
|
+
const name = promptText.trim().slice(0, 60).replace(/\n/g, " ");
|
|
326
|
+
if (name.length === 0)
|
|
327
|
+
return;
|
|
328
|
+
live.sessionManager.appendSessionInfo(name);
|
|
329
|
+
live.name = name;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Resolve orchestration tools for a session, if supervisor mode is active.
|
|
333
|
+
* Returns empty array when orchestration is disabled or the session isn't
|
|
334
|
+
* a registered supervisor.
|
|
335
|
+
*/
|
|
336
|
+
async function resolveOrchestrationTools(sessionId) {
|
|
337
|
+
if (!isOrchestrationEnabled())
|
|
338
|
+
return [];
|
|
339
|
+
try {
|
|
340
|
+
if (!(await isSupervisor(sessionId)))
|
|
341
|
+
return [];
|
|
342
|
+
return createOrchestrationTools(sessionId);
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
return [];
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Rebuild a live session's AgentSession with updated custom tools.
|
|
350
|
+
* Preserves the SessionManager (messages intact), SSE clients stay
|
|
351
|
+
* attached, and the old session is disposed cleanly.
|
|
352
|
+
*/
|
|
353
|
+
export async function rebuildSessionTools(sessionId) {
|
|
354
|
+
const live = registry.get(sessionId);
|
|
355
|
+
if (live === undefined)
|
|
356
|
+
return;
|
|
357
|
+
const orchestrationTools = await resolveOrchestrationTools(sessionId);
|
|
358
|
+
const customTools = [
|
|
359
|
+
createAskUserQuestionTool(sessionId),
|
|
360
|
+
...orchestrationTools,
|
|
361
|
+
];
|
|
362
|
+
// Unsubscribe old subscription, abort any in-flight turn
|
|
363
|
+
try {
|
|
364
|
+
live.unsubscribe();
|
|
365
|
+
}
|
|
366
|
+
catch { /* ignore */ }
|
|
367
|
+
try {
|
|
368
|
+
await live.session.abort();
|
|
369
|
+
}
|
|
370
|
+
catch { /* ignore */ }
|
|
371
|
+
// Create new AgentSession with same SessionManager but updated tools
|
|
372
|
+
const { session } = await createAgentSession({
|
|
373
|
+
cwd: live.workspacePath,
|
|
374
|
+
sessionManager: live.sessionManager,
|
|
375
|
+
agentDir: config.piConfigDir,
|
|
376
|
+
customTools,
|
|
377
|
+
});
|
|
378
|
+
// Wire real command context actions (navigateTree, etc.) so
|
|
379
|
+
// extension commands like /rewind can navigate the conversation.
|
|
380
|
+
await session.bindExtensions(buildBindings(session)).catch(() => {
|
|
381
|
+
// best-effort
|
|
382
|
+
});
|
|
383
|
+
// Dispose old session
|
|
384
|
+
try {
|
|
385
|
+
live.session.dispose();
|
|
386
|
+
}
|
|
387
|
+
catch { /* ignore */ }
|
|
388
|
+
// Swap in new session
|
|
389
|
+
live.session = session;
|
|
390
|
+
// Re-subscribe
|
|
391
|
+
live.unsubscribe = session.subscribe((event) => {
|
|
392
|
+
live.lastActivityAt = new Date();
|
|
393
|
+
if (event.type === "agent_start") {
|
|
394
|
+
live.lastAgentStartIndex = live.session.messages.length;
|
|
395
|
+
}
|
|
396
|
+
if (event.type === "agent_start" || event.type === "agent_end") {
|
|
397
|
+
void bridgeWorkerAgentEvent({ sessionId: live.sessionId, session: live.session }, event);
|
|
398
|
+
}
|
|
399
|
+
if (event.type === "agent_end") {
|
|
400
|
+
void notifySupervisorIdle(live.sessionId);
|
|
401
|
+
}
|
|
402
|
+
for (const client of live.clients) {
|
|
403
|
+
try {
|
|
404
|
+
client.send(event);
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
live.clients.delete(client);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
// Notify SSE clients about the rebuild
|
|
412
|
+
for (const client of live.clients) {
|
|
413
|
+
try {
|
|
414
|
+
client.send({
|
|
415
|
+
type: "custom_tools_changed",
|
|
416
|
+
sessionId: live.sessionId,
|
|
417
|
+
toolCount: customTools.length,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
live.clients.delete(client);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
/** Dispose a live session — abort, unsubscribe, close clients, remove from registry. */
|
|
426
|
+
export async function disposeSession(sessionId) {
|
|
427
|
+
const live = registry.get(sessionId);
|
|
428
|
+
if (live === undefined)
|
|
429
|
+
return false;
|
|
430
|
+
try {
|
|
431
|
+
await live.session.abort();
|
|
432
|
+
}
|
|
433
|
+
catch {
|
|
434
|
+
// best-effort
|
|
435
|
+
}
|
|
436
|
+
try {
|
|
437
|
+
live.unsubscribe();
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
// ignore
|
|
441
|
+
}
|
|
442
|
+
for (const client of live.clients) {
|
|
443
|
+
try {
|
|
444
|
+
client.close();
|
|
445
|
+
}
|
|
446
|
+
catch {
|
|
447
|
+
// ignore
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
live.clients.clear();
|
|
451
|
+
try {
|
|
452
|
+
live.session.dispose();
|
|
453
|
+
}
|
|
454
|
+
catch {
|
|
455
|
+
// ignore
|
|
456
|
+
}
|
|
457
|
+
registry.delete(live.sessionId);
|
|
458
|
+
// Clean up orchestration dedupe state for this session
|
|
459
|
+
notifySupervisorDisposed(live.sessionId);
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
462
|
+
/** Dispose all sessions (called on server shutdown). */
|
|
463
|
+
export async function disposeAllSessions() {
|
|
464
|
+
const ids = Array.from(registry.keys());
|
|
465
|
+
await Promise.all(ids.map((id) => disposeSession(id)));
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Find a session's location on disk. Returns projectId and workspacePath
|
|
469
|
+
* by scanning all project session dirs.
|
|
470
|
+
*/
|
|
471
|
+
export async function findSessionLocation(sessionId) {
|
|
472
|
+
// Check all project directories
|
|
473
|
+
const { readProjects } = await import("./project-manager.js");
|
|
474
|
+
try {
|
|
475
|
+
const projects = await readProjects();
|
|
476
|
+
for (const project of projects) {
|
|
477
|
+
const dir = join(config.sessionDir, project.id);
|
|
478
|
+
try {
|
|
479
|
+
const files = await readdir(dir);
|
|
480
|
+
if (files.some((f) => f.includes(sessionId))) {
|
|
481
|
+
return { projectId: project.id, workspacePath: project.path };
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
catch {
|
|
485
|
+
// dir doesn't exist, skip
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
catch {
|
|
490
|
+
// can't read projects
|
|
491
|
+
}
|
|
492
|
+
return undefined;
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Resume a cold session from disk. Opens the JSONL, creates an AgentSession,
|
|
496
|
+
* registers it in the registry, and returns the LiveSession.
|
|
497
|
+
*/
|
|
498
|
+
export async function resumeSessionById(sessionId) {
|
|
499
|
+
const loc = await findSessionLocation(sessionId);
|
|
500
|
+
if (loc === undefined) {
|
|
501
|
+
throw new Error(`session_not_found: ${sessionId}`);
|
|
502
|
+
}
|
|
503
|
+
const dir = join(config.sessionDir, loc.projectId);
|
|
504
|
+
const files = await readdir(dir);
|
|
505
|
+
const match = files.find((f) => f.endsWith(".jsonl") && f.includes(sessionId));
|
|
506
|
+
if (match === undefined) {
|
|
507
|
+
throw new Error(`session_not_found: ${sessionId}`);
|
|
508
|
+
}
|
|
509
|
+
const sessionPath = join(dir, match);
|
|
510
|
+
const sessionManager = SessionManager.open(sessionPath);
|
|
511
|
+
const orchestrationTools = await resolveOrchestrationTools(sessionId);
|
|
512
|
+
const customTools = [
|
|
513
|
+
createAskUserQuestionTool(sessionId),
|
|
514
|
+
...orchestrationTools,
|
|
515
|
+
];
|
|
516
|
+
const { session } = await createAgentSession({
|
|
517
|
+
cwd: loc.workspacePath,
|
|
518
|
+
sessionManager,
|
|
519
|
+
agentDir: config.piConfigDir,
|
|
520
|
+
customTools,
|
|
521
|
+
});
|
|
522
|
+
// Wire real command context actions (navigateTree, etc.) so
|
|
523
|
+
// extension commands like /rewind can navigate the conversation.
|
|
524
|
+
await session.bindExtensions(buildBindings(session)).catch(() => {
|
|
525
|
+
// best-effort
|
|
526
|
+
});
|
|
527
|
+
const now = new Date();
|
|
528
|
+
const live = {
|
|
529
|
+
session,
|
|
530
|
+
sessionId,
|
|
531
|
+
projectId: loc.projectId,
|
|
532
|
+
workspacePath: loc.workspacePath,
|
|
533
|
+
sessionManager,
|
|
534
|
+
clients: new Set(),
|
|
535
|
+
createdAt: now,
|
|
536
|
+
lastActivityAt: now,
|
|
537
|
+
lastAgentStartIndex: undefined,
|
|
538
|
+
unsubscribe: () => undefined,
|
|
539
|
+
name: sessionManager.getSessionName(),
|
|
540
|
+
};
|
|
541
|
+
live.unsubscribe = session.subscribe((event) => {
|
|
542
|
+
live.lastActivityAt = new Date();
|
|
543
|
+
if (event.type === "agent_start") {
|
|
544
|
+
live.lastAgentStartIndex = live.session.messages.length;
|
|
545
|
+
}
|
|
546
|
+
// Bridge orchestration lifecycle events (fire-and-forget)
|
|
547
|
+
if (event.type === "agent_start" || event.type === "agent_end") {
|
|
548
|
+
void bridgeWorkerAgentEvent({ sessionId: live.sessionId, session: live.session }, event);
|
|
549
|
+
}
|
|
550
|
+
// Notify supervisor idle on agent_end
|
|
551
|
+
if (event.type === "agent_end") {
|
|
552
|
+
void notifySupervisorIdle(live.sessionId);
|
|
553
|
+
}
|
|
554
|
+
for (const client of live.clients) {
|
|
555
|
+
try {
|
|
556
|
+
client.send(event);
|
|
557
|
+
}
|
|
558
|
+
catch {
|
|
559
|
+
live.clients.delete(client);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
registry.set(live.sessionId, live);
|
|
564
|
+
return live;
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Fork a session at a given entry. Creates a new JSONL file containing
|
|
568
|
+
* the path-to-leaf from root to the given entry, registers the new
|
|
569
|
+
* session, and returns it.
|
|
570
|
+
*
|
|
571
|
+
* NOTE: `createBranchedSession` mutates the source session's in-memory
|
|
572
|
+
* file reference to point at the new fork (SDK behavior). We handle this
|
|
573
|
+
* by capturing the source file before and re-opening the source after.
|
|
574
|
+
*/
|
|
575
|
+
export async function forkSession(sessionId, entryId) {
|
|
576
|
+
const sourceLive = registry.get(sessionId);
|
|
577
|
+
if (sourceLive === undefined) {
|
|
578
|
+
// Try to resume cold first, then fork
|
|
579
|
+
const resumed = await resumeSessionById(sessionId);
|
|
580
|
+
return forkSession(resumed.sessionId, entryId);
|
|
581
|
+
}
|
|
582
|
+
// Capture the source file path BEFORE createBranchedSession mutates it
|
|
583
|
+
const sourceSessionFile = sourceLive.sessionManager.getSessionFile();
|
|
584
|
+
if (sourceSessionFile === undefined) {
|
|
585
|
+
throw new Error("fork_failed: source session has no file (in-memory only)");
|
|
586
|
+
}
|
|
587
|
+
const sourceDir = join(config.sessionDir, sourceLive.projectId);
|
|
588
|
+
// Create the branched session file
|
|
589
|
+
const newPath = sourceLive.sessionManager.createBranchedSession(entryId);
|
|
590
|
+
if (newPath === undefined) {
|
|
591
|
+
throw new Error("fork_failed: createBranchedSession returned undefined");
|
|
592
|
+
}
|
|
593
|
+
// Re-open the SOURCE session from the original file to undo SDK mutation
|
|
594
|
+
const restoredSourceSM = SessionManager.open(sourceSessionFile, sourceDir, sourceLive.workspacePath);
|
|
595
|
+
sourceLive.sessionManager = restoredSourceSM;
|
|
596
|
+
// Open the new fork as a SessionManager
|
|
597
|
+
const dir = join(config.sessionDir, sourceLive.projectId);
|
|
598
|
+
const forkedSM = SessionManager.open(newPath, dir, sourceLive.workspacePath);
|
|
599
|
+
const forkedId = forkedSM.getSessionId();
|
|
600
|
+
const orchestrationTools = await resolveOrchestrationTools(forkedId);
|
|
601
|
+
const customTools = [
|
|
602
|
+
createAskUserQuestionTool(forkedId),
|
|
603
|
+
...orchestrationTools,
|
|
604
|
+
];
|
|
605
|
+
const { session } = await createAgentSession({
|
|
606
|
+
cwd: sourceLive.workspacePath,
|
|
607
|
+
sessionManager: forkedSM,
|
|
608
|
+
agentDir: config.piConfigDir,
|
|
609
|
+
customTools,
|
|
610
|
+
});
|
|
611
|
+
// Wire real command context actions (navigateTree, etc.) so
|
|
612
|
+
// extension commands like /rewind can navigate the conversation.
|
|
613
|
+
await session.bindExtensions(buildBindings(session)).catch(() => {
|
|
614
|
+
// best-effort
|
|
615
|
+
});
|
|
616
|
+
const now = new Date();
|
|
617
|
+
const forkedLive = {
|
|
618
|
+
session,
|
|
619
|
+
sessionId: session.sessionId,
|
|
620
|
+
projectId: sourceLive.projectId,
|
|
621
|
+
workspacePath: sourceLive.workspacePath,
|
|
622
|
+
sessionManager: forkedSM,
|
|
623
|
+
clients: new Set(),
|
|
624
|
+
createdAt: now,
|
|
625
|
+
lastActivityAt: now,
|
|
626
|
+
lastAgentStartIndex: undefined,
|
|
627
|
+
unsubscribe: () => undefined,
|
|
628
|
+
name: forkedSM.getSessionName(),
|
|
629
|
+
};
|
|
630
|
+
forkedLive.unsubscribe = session.subscribe((event) => {
|
|
631
|
+
forkedLive.lastActivityAt = new Date();
|
|
632
|
+
if (event.type === "agent_start") {
|
|
633
|
+
forkedLive.lastAgentStartIndex = forkedLive.session.messages.length;
|
|
634
|
+
}
|
|
635
|
+
// Bridge orchestration lifecycle events (fire-and-forget)
|
|
636
|
+
if (event.type === "agent_start" || event.type === "agent_end") {
|
|
637
|
+
void bridgeWorkerAgentEvent({ sessionId: forkedLive.sessionId, session: forkedLive.session }, event);
|
|
638
|
+
}
|
|
639
|
+
// Notify supervisor idle on agent_end
|
|
640
|
+
if (event.type === "agent_end") {
|
|
641
|
+
void notifySupervisorIdle(forkedLive.sessionId);
|
|
642
|
+
}
|
|
643
|
+
for (const client of forkedLive.clients) {
|
|
644
|
+
try {
|
|
645
|
+
client.send(event);
|
|
646
|
+
}
|
|
647
|
+
catch {
|
|
648
|
+
forkedLive.clients.delete(client);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
registry.set(forkedLive.sessionId, forkedLive);
|
|
653
|
+
return forkedLive;
|
|
654
|
+
}
|
|
655
|
+
//# sourceMappingURL=session-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"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"}
|