0xkobold 0.4.3 → 0.5.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 +226 -383
- package/dist/package.json +13 -4
- package/dist/src/agent/DraconicCapabilityRouter.js +556 -0
- package/dist/src/agent/DraconicCapabilityRouter.js.map +1 -0
- package/dist/src/agent/DraconicErrorClassifier.js +606 -0
- package/dist/src/agent/DraconicErrorClassifier.js.map +1 -0
- package/dist/src/agent/DraconicRunRegistry.js +460 -0
- package/dist/src/agent/DraconicRunRegistry.js.map +1 -0
- package/dist/src/agent/DraconicTokenPredictor.js +500 -0
- package/dist/src/agent/DraconicTokenPredictor.js.map +1 -0
- package/dist/src/agent/embedded-runner.js +3 -2
- package/dist/src/agent/embedded-runner.js.map +1 -1
- package/dist/src/cli/commands/doctor.js +199 -0
- package/dist/src/cli/commands/doctor.js.map +1 -0
- package/dist/src/cli/commands/migrate-from-openclaw.js +39 -0
- package/dist/src/cli/commands/migrate-from-openclaw.js.map +1 -0
- package/dist/src/cli/commands/migrate.js +6 -4
- package/dist/src/cli/commands/migrate.js.map +1 -1
- package/dist/src/cli/program.js +3 -1
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/unified-config.js +195 -0
- package/dist/src/config/unified-config.js.map +1 -0
- package/dist/src/cron/notifications.js +1 -1
- package/dist/src/cron/notifications.js.map +1 -1
- package/dist/src/cron/runner.js +9 -3
- package/dist/src/cron/runner.js.map +1 -1
- package/dist/src/event-bus/index.js +3 -1
- package/dist/src/event-bus/index.js.map +1 -1
- package/dist/src/extensions/community/draconic-messenger-wrapper.js +35 -0
- package/dist/src/extensions/community/draconic-messenger-wrapper.js.map +1 -0
- package/dist/src/extensions/community/draconic-subagents-wrapper.js +115 -0
- package/dist/src/extensions/community/draconic-subagents-wrapper.js.map +1 -0
- package/dist/src/extensions/core/compaction-safeguard-v2.js +95 -0
- package/dist/src/extensions/core/compaction-safeguard-v2.js.map +1 -0
- package/dist/src/extensions/core/compaction-safeguard.js +206 -137
- package/dist/src/extensions/core/compaction-safeguard.js.map +1 -1
- package/dist/src/extensions/core/config-extension.js +122 -0
- package/dist/src/extensions/core/config-extension.js.map +1 -0
- package/dist/src/extensions/core/draconic-hoard-extension.js +194 -0
- package/dist/src/extensions/core/draconic-hoard-extension.js.map +1 -0
- package/dist/src/extensions/core/draconic-lair-extension.js +146 -0
- package/dist/src/extensions/core/draconic-lair-extension.js.map +1 -0
- package/dist/src/extensions/core/draconic-safety-extension.js +402 -0
- package/dist/src/extensions/core/draconic-safety-extension.js.map +1 -0
- package/dist/src/extensions/core/ext-manager.js +40 -0
- package/dist/src/extensions/core/ext-manager.js.map +1 -0
- package/dist/src/extensions/core/gateway-extension.js +413 -624
- package/dist/src/extensions/core/gateway-extension.js.map +1 -1
- package/dist/src/extensions/core/generative-agents-extension.js +704 -0
- package/dist/src/extensions/core/generative-agents-extension.js.map +1 -0
- package/dist/src/extensions/core/memory-bootstrap-extension.js +279 -0
- package/dist/src/extensions/core/memory-bootstrap-extension.js.map +1 -0
- package/dist/src/extensions/core/ollama-extension.js +442 -0
- package/dist/src/extensions/core/ollama-extension.js.map +1 -0
- package/dist/src/extensions/core/ollama-router-extension.js +34 -93
- package/dist/src/extensions/core/ollama-router-extension.js.map +1 -1
- package/dist/src/extensions/core/perennial-memory-extension.js +5 -2
- package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
- package/dist/src/extensions/core/persona-loader-extension.js +41 -15
- package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
- package/dist/src/extensions/core/pi-notify-extension.js +6 -0
- package/dist/src/extensions/core/pi-notify-extension.js.map +1 -1
- package/dist/src/extensions/core/session-bridge-extension.js +8 -72
- package/dist/src/extensions/core/session-bridge-extension.js.map +1 -1
- package/dist/src/extensions/core/tui-integration-extension-fixed.js +3 -0
- package/dist/src/extensions/core/tui-integration-extension-fixed.js.map +1 -0
- package/dist/src/extensions/core/tui-integration-extension.js +984 -0
- package/dist/src/extensions/core/tui-integration-extension.js.map +1 -0
- package/dist/src/gateway/persistence/AgentStore.js +399 -0
- package/dist/src/gateway/persistence/AgentStore.js.map +1 -0
- package/dist/src/gateway/persistence/index.js +9 -0
- package/dist/src/gateway/persistence/index.js.map +1 -0
- package/dist/src/hoard/DraconicHoardSystem.js +465 -0
- package/dist/src/hoard/DraconicHoardSystem.js.map +1 -0
- package/dist/src/index.js +7 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/infra/DraconicConnectionPool.js +492 -0
- package/dist/src/infra/DraconicConnectionPool.js.map +1 -0
- package/dist/src/lair/DraconicLairSystem.js +387 -0
- package/dist/src/lair/DraconicLairSystem.js.map +1 -0
- package/dist/src/llm/ollama.js +143 -99
- package/dist/src/llm/ollama.js.map +1 -1
- package/dist/src/migration/openclaw.js +5 -5
- package/dist/src/migration/openclaw.js.map +1 -1
- package/dist/src/pi-config.js +52 -27
- package/dist/src/pi-config.js.map +1 -1
- package/dist/src/sessions/SessionManager.js +416 -0
- package/dist/src/sessions/SessionManager.js.map +1 -0
- package/dist/src/sessions/SessionStore.js +580 -0
- package/dist/src/sessions/SessionStore.js.map +1 -0
- package/dist/src/sessions/UnifiedSessionBridge.js +394 -0
- package/dist/src/sessions/UnifiedSessionBridge.js.map +1 -0
- package/dist/src/sessions/index.js +15 -0
- package/dist/src/sessions/index.js.map +1 -0
- package/dist/src/sessions/migration/index.js +156 -0
- package/dist/src/sessions/migration/index.js.map +1 -0
- package/dist/src/sessions/types.js +8 -0
- package/dist/src/sessions/types.js.map +1 -0
- package/dist/src/skills/framework.js +1 -1
- package/dist/src/skills/framework.js.map +1 -1
- package/dist/src/tui/commands/final-functions.js +39 -0
- package/dist/src/tui/commands/final-functions.js.map +1 -0
- package/dist/src/tui/commands/natural-language-commands.js +231 -0
- package/dist/src/tui/commands/natural-language-commands.js.map +1 -0
- package/dist/src/tui/commands/orchestration-commands.js +340 -0
- package/dist/src/tui/commands/orchestration-commands.js.map +1 -0
- package/dist/src/tui/commands/orchestration-final-section.js +84 -0
- package/dist/src/tui/commands/orchestration-final-section.js.map +1 -0
- package/dist/src/tui/components/agent-tree-overlay.js +210 -0
- package/dist/src/tui/components/agent-tree-overlay.js.map +1 -0
- package/dist/src/tui/components/agent-tree-panel.js +229 -0
- package/dist/src/tui/components/agent-tree-panel.js.map +1 -0
- package/dist/src/tui/components/sidebar.js +82 -0
- package/dist/src/tui/components/sidebar.js.map +1 -0
- package/dist/src/tui/components/status-bar.js +115 -0
- package/dist/src/tui/components/status-bar.js.map +1 -0
- package/dist/src/tui/components/tree-header.js +85 -0
- package/dist/src/tui/components/tree-header.js.map +1 -0
- package/dist/src/tui/draconic-tui.js +291 -0
- package/dist/src/tui/draconic-tui.js.map +1 -0
- package/dist/src/tui/index.js +93 -0
- package/dist/src/tui/index.js.map +1 -0
- package/dist/src/tui/pi-tui-integration.js +260 -0
- package/dist/src/tui/pi-tui-integration.js.map +1 -0
- package/dist/src/utils/nl-patterns.js +145 -0
- package/dist/src/utils/nl-patterns.js.map +1 -0
- package/package.json +13 -4
- package/scripts/migrate-from-openclaw.sh +498 -0
- package/HEARTBEAT.md +0 -121
- package/USAGE.md +0 -191
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Session Manager
|
|
3
|
+
*
|
|
4
|
+
* High-level session lifecycle management that coordinates
|
|
5
|
+
* all 0xKobold subsystems under a unified session model.
|
|
6
|
+
*/
|
|
7
|
+
import { homedir } from "os";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
import { existsSync, mkdirSync } from "fs";
|
|
10
|
+
import { SessionStore } from "./SessionStore.js";
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Configuration
|
|
13
|
+
// ============================================================================
|
|
14
|
+
const KOBOLD_DIR = join(homedir(), ".0xkobold");
|
|
15
|
+
const SESSIONS_DB_PATH = join(KOBOLD_DIR, "sessions.db");
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Session Manager
|
|
18
|
+
// ============================================================================
|
|
19
|
+
export class SessionManager {
|
|
20
|
+
store;
|
|
21
|
+
currentSessionId;
|
|
22
|
+
config;
|
|
23
|
+
restorePromise;
|
|
24
|
+
constructor(config = {}) {
|
|
25
|
+
this.ensureDirectories();
|
|
26
|
+
this.store = new SessionStore(SESSIONS_DB_PATH);
|
|
27
|
+
this.config = {
|
|
28
|
+
autoResume: true,
|
|
29
|
+
resumeMaxAgeHours: 168, // 1 week
|
|
30
|
+
snapshotInterval: 5 * 60 * 1000, // 5 minutes
|
|
31
|
+
cleanupAgeHours: 168,
|
|
32
|
+
...config,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// Lifecycle
|
|
37
|
+
// ============================================================================
|
|
38
|
+
/**
|
|
39
|
+
* Initialize with pi-coding-agent extension
|
|
40
|
+
*/
|
|
41
|
+
async initialize(pi) {
|
|
42
|
+
console.log("[SessionManager] Initializing...");
|
|
43
|
+
// Auto-resume previous sessions
|
|
44
|
+
if (this.config.autoResume) {
|
|
45
|
+
this.restorePromise = this.restoreSessions();
|
|
46
|
+
}
|
|
47
|
+
// Set up periodic maintenance
|
|
48
|
+
this.startMaintenanceLoop();
|
|
49
|
+
// Hook into pi events if available
|
|
50
|
+
if (pi) {
|
|
51
|
+
this.hookIntoPi(pi);
|
|
52
|
+
}
|
|
53
|
+
console.log("[SessionManager] Initialized");
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Hook into pi-coding-agent events
|
|
57
|
+
*/
|
|
58
|
+
hookIntoPi(pi) {
|
|
59
|
+
// Session start - create/get unified session
|
|
60
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
61
|
+
const piSessionId = ctx.sessionManager.getSessionId();
|
|
62
|
+
const { session, created } = await this.getOrCreateSession(piSessionId, {
|
|
63
|
+
source: this.detectSource(),
|
|
64
|
+
cwd: ctx.sessionManager.getCwd(),
|
|
65
|
+
piSessionFile: this.findPiSessionFile(piSessionId),
|
|
66
|
+
});
|
|
67
|
+
this.currentSessionId = session.id;
|
|
68
|
+
// Set environment for subsystems
|
|
69
|
+
process.env.KOBOLD_UNIFIED_SESSION_ID = session.id;
|
|
70
|
+
process.env.KOBOLD_SESSION_STATE = session.state;
|
|
71
|
+
if (created) {
|
|
72
|
+
console.log(`[SessionManager] Created unified session: ${session.id.slice(0, 16)}...`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.log(`[SessionManager] Resumed unified session: ${session.id.slice(0, 16)}...`);
|
|
76
|
+
}
|
|
77
|
+
// Emit event for extensions
|
|
78
|
+
// @ts-ignore Display property required by API
|
|
79
|
+
pi.sendMessage?.({
|
|
80
|
+
customType: "session.unified.start",
|
|
81
|
+
content: [{ type: "text", text: `Unified session: ${session.id}` }],
|
|
82
|
+
display: false,
|
|
83
|
+
details: { sessionId: session.id, created },
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
// Session switch - track current session
|
|
87
|
+
pi.on("session_switch", async (_event, ctx) => {
|
|
88
|
+
const piSessionId = ctx.sessionManager.getSessionId();
|
|
89
|
+
const { session } = await this.getOrCreateSession(piSessionId);
|
|
90
|
+
this.currentSessionId = session.id;
|
|
91
|
+
process.env.KOBOLD_UNIFIED_SESSION_ID = session.id;
|
|
92
|
+
console.log(`[SessionManager] Switched to session: ${session.id.slice(0, 16)}...`);
|
|
93
|
+
});
|
|
94
|
+
// Session fork - create child session
|
|
95
|
+
// @ts-ignore SessionForkEvent type mismatch - event.childSessionId not in type
|
|
96
|
+
pi.on("session_fork", async (event, ctx) => {
|
|
97
|
+
const parentPiId = ctx.sessionManager.getSessionId();
|
|
98
|
+
// @ts-ignore Extension event has extra properties at runtime
|
|
99
|
+
const childPiId = event.childSessionId;
|
|
100
|
+
const parentSession = await this.getOrCreateSession(parentPiId);
|
|
101
|
+
// @ts-ignore Runtime properties
|
|
102
|
+
const childSession = await this.forkSession(parentSession.session.id, childPiId,
|
|
103
|
+
// @ts-ignore SessionForkEvent doesn't have reason property in API types
|
|
104
|
+
event.reason || "fork");
|
|
105
|
+
this.currentSessionId = childSession.id;
|
|
106
|
+
process.env.KOBOLD_UNIFIED_SESSION_ID = childSession.id;
|
|
107
|
+
console.log(`[SessionManager] Forked session: ${childSession.id.slice(0, 16)} from ${parentSession.session.id.slice(0, 16)}`);
|
|
108
|
+
});
|
|
109
|
+
// Shutdown - suspend current session
|
|
110
|
+
// @ts-ignore "shutdown" is not a valid event type in ExtensionAPI - using session_shutdown
|
|
111
|
+
pi.on("shutdown", async () => {
|
|
112
|
+
await this.suspendCurrentSession();
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// ============================================================================
|
|
116
|
+
// Session Operations
|
|
117
|
+
// ============================================================================
|
|
118
|
+
/**
|
|
119
|
+
* Get the current unified session ID
|
|
120
|
+
*/
|
|
121
|
+
getCurrentSessionId() {
|
|
122
|
+
return this.currentSessionId;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get current session
|
|
126
|
+
*/
|
|
127
|
+
async getCurrentSession() {
|
|
128
|
+
if (!this.currentSessionId)
|
|
129
|
+
return null;
|
|
130
|
+
return this.store.getSession(this.currentSessionId);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get or create session (idempotent, stable ID)
|
|
134
|
+
*/
|
|
135
|
+
async getOrCreateSession(piSessionId, data) {
|
|
136
|
+
return this.store.getOrCreateSession(piSessionId, data);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Fork a session (for subagents)
|
|
140
|
+
*/
|
|
141
|
+
async forkSession(parentId, childPiSessionId, reason, spawnedBy) {
|
|
142
|
+
// Get parent info
|
|
143
|
+
const parentHier = await this.store.getHierarchy(parentId);
|
|
144
|
+
const parent = await this.store.getSession(parentId);
|
|
145
|
+
if (!parent) {
|
|
146
|
+
throw new Error(`Parent session ${parentId} not found`);
|
|
147
|
+
}
|
|
148
|
+
// Create child session
|
|
149
|
+
// @ts-ignore Additional properties stored in metadata/hierarchy tracked separately
|
|
150
|
+
const { session: child } = await this.store.getOrCreateSession(childPiSessionId, {
|
|
151
|
+
// @ts-ignore parent/root tracked in hierarchy, not on session
|
|
152
|
+
parentSessionId: parentId,
|
|
153
|
+
// @ts-ignore
|
|
154
|
+
rootSessionId: parentHier?.rootSessionId || parentId,
|
|
155
|
+
// @ts-ignore mode "forked" stored as metadata
|
|
156
|
+
mode: "forked",
|
|
157
|
+
source: parent.source,
|
|
158
|
+
cwd: parent.cwd,
|
|
159
|
+
deviceId: parent.deviceId,
|
|
160
|
+
userId: parent.userId,
|
|
161
|
+
});
|
|
162
|
+
// Create hierarchy entry
|
|
163
|
+
await this.store.createHierarchy(child.id, {
|
|
164
|
+
parentSessionId: parentId,
|
|
165
|
+
rootSessionId: parentHier?.rootSessionId || parentId,
|
|
166
|
+
spawnDepth: (parentHier?.spawnDepth || 0) + 1,
|
|
167
|
+
spawnReason: reason,
|
|
168
|
+
spawnMethod: "auto",
|
|
169
|
+
spawnedBy,
|
|
170
|
+
spawnedAt: Date.now(),
|
|
171
|
+
isFork: true,
|
|
172
|
+
});
|
|
173
|
+
// Create snapshot of parent at fork point
|
|
174
|
+
await this.store.createSnapshot(parentId, "pre_spawn", {
|
|
175
|
+
triggeredBy: "fork",
|
|
176
|
+
conversationHistory: [], // Would be passed in real implementation
|
|
177
|
+
});
|
|
178
|
+
// Log event
|
|
179
|
+
await this.store.logEvent(child.id, "forked", {
|
|
180
|
+
parentId,
|
|
181
|
+
reason,
|
|
182
|
+
spawnedBy,
|
|
183
|
+
});
|
|
184
|
+
return child;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Suspend current session (on shutdown/lost connection)
|
|
188
|
+
*/
|
|
189
|
+
async suspendCurrentSession() {
|
|
190
|
+
if (!this.currentSessionId)
|
|
191
|
+
return;
|
|
192
|
+
const session = await this.store.getSession(this.currentSessionId);
|
|
193
|
+
if (!session)
|
|
194
|
+
return;
|
|
195
|
+
// Create final snapshot
|
|
196
|
+
await this.createSnapshot(this.currentSessionId, "checkpoint");
|
|
197
|
+
// Suspend if active
|
|
198
|
+
if (session.state === "active") {
|
|
199
|
+
await this.store.setState(this.currentSessionId, "suspended", {
|
|
200
|
+
reason: "shutdown",
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Checkpoint database
|
|
204
|
+
await this.store.checkpoint();
|
|
205
|
+
console.log(`[SessionManager] Suspended session: ${this.currentSessionId.slice(0, 16)}...`);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Resume a suspended session
|
|
209
|
+
*/
|
|
210
|
+
async resumeSession(sessionId) {
|
|
211
|
+
const session = await this.store.getSession(sessionId);
|
|
212
|
+
if (!session) {
|
|
213
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
214
|
+
}
|
|
215
|
+
if (session.state === "suspended" || session.state === "idle") {
|
|
216
|
+
await this.store.setState(sessionId, "active");
|
|
217
|
+
}
|
|
218
|
+
this.currentSessionId = sessionId;
|
|
219
|
+
process.env.KOBOLD_UNIFIED_SESSION_ID = sessionId;
|
|
220
|
+
return session;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Complete a session
|
|
224
|
+
*/
|
|
225
|
+
async completeSession(sessionId, summary) {
|
|
226
|
+
await this.store.updateSession(sessionId, {
|
|
227
|
+
state: "completed",
|
|
228
|
+
completedAt: Date.now(),
|
|
229
|
+
});
|
|
230
|
+
await this.store.setState(sessionId, "completed", { summary });
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Record session activity
|
|
234
|
+
*/
|
|
235
|
+
async recordActivity(tokens, turns = 1) {
|
|
236
|
+
if (!this.currentSessionId)
|
|
237
|
+
return;
|
|
238
|
+
const session = await this.store.getSession(this.currentSessionId);
|
|
239
|
+
if (!session)
|
|
240
|
+
return;
|
|
241
|
+
await this.store.updateSession(this.currentSessionId, {
|
|
242
|
+
lastActivityAt: Date.now(),
|
|
243
|
+
totalTurns: session.totalTurns + turns,
|
|
244
|
+
totalTokens: {
|
|
245
|
+
input: session.totalTokens.input + (tokens?.input || 0),
|
|
246
|
+
output: session.totalTokens.output + (tokens?.output || 0),
|
|
247
|
+
},
|
|
248
|
+
state: session.state === "idle" ? "active" : session.state,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
// ============================================================================
|
|
252
|
+
// Snapshots
|
|
253
|
+
// ============================================================================
|
|
254
|
+
/**
|
|
255
|
+
* Create session snapshot
|
|
256
|
+
*/
|
|
257
|
+
async createSnapshot(sessionId, type = "manual", data) {
|
|
258
|
+
return this.store.createSnapshot(sessionId, type, {
|
|
259
|
+
triggeredBy: data?.triggeredBy || this.currentSessionId,
|
|
260
|
+
...data,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Restore session from snapshot
|
|
265
|
+
*/
|
|
266
|
+
async restoreFromSnapshot(sessionId) {
|
|
267
|
+
const snapshot = await this.store.getLatestSnapshot(sessionId);
|
|
268
|
+
if (!snapshot)
|
|
269
|
+
return null;
|
|
270
|
+
// Restore to active state if needed
|
|
271
|
+
// @ts-ignore "resumed" is treated as metadata, actual state becomes "active"
|
|
272
|
+
await this.store.setState(sessionId, "active", {
|
|
273
|
+
// @ts-ignore Custom event type
|
|
274
|
+
eventType: "resumed",
|
|
275
|
+
fromSnapshot: snapshot.id,
|
|
276
|
+
});
|
|
277
|
+
return snapshot;
|
|
278
|
+
}
|
|
279
|
+
// ============================================================================
|
|
280
|
+
// Queries
|
|
281
|
+
// ============================================================================
|
|
282
|
+
/**
|
|
283
|
+
* List sessions
|
|
284
|
+
*/
|
|
285
|
+
async listSessions(filter, limit) {
|
|
286
|
+
return this.store.listSessions(filter, limit);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get active sessions
|
|
290
|
+
*/
|
|
291
|
+
async getActiveSessions() {
|
|
292
|
+
return this.store.getActiveSessions();
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get session tree
|
|
296
|
+
*/
|
|
297
|
+
async getSessionTree(rootId) {
|
|
298
|
+
return this.store.getSessionTree(rootId);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Get session statistics
|
|
302
|
+
*/
|
|
303
|
+
async getStats() {
|
|
304
|
+
const stats = await this.store.getStats();
|
|
305
|
+
return {
|
|
306
|
+
total: stats.total,
|
|
307
|
+
active: stats.active,
|
|
308
|
+
idle: stats.idle,
|
|
309
|
+
totalTokens: stats.totalInputTokens + stats.totalOutputTokens,
|
|
310
|
+
totalTurns: stats.totalTurns,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
// ============================================================================
|
|
314
|
+
// Subsystem Integration
|
|
315
|
+
// ============================================================================
|
|
316
|
+
/**
|
|
317
|
+
* Register subsystem reference
|
|
318
|
+
*/
|
|
319
|
+
async registerSubsystemRef(sessionId, subsystem, recordId, metadata) {
|
|
320
|
+
// This links subsystem records to unified sessions
|
|
321
|
+
// Implementation in SessionStore
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Get session references across subsystems
|
|
325
|
+
*/
|
|
326
|
+
async getSubsystemRefs(sessionId) {
|
|
327
|
+
// Return all subsystem records linked to this session
|
|
328
|
+
return [];
|
|
329
|
+
}
|
|
330
|
+
// ============================================================================
|
|
331
|
+
// Restore All Sessions
|
|
332
|
+
// ============================================================================
|
|
333
|
+
async restoreSessions() {
|
|
334
|
+
const sessions = await this.store.getSessionsForResume(this.config.resumeMaxAgeHours);
|
|
335
|
+
if (sessions.length === 0) {
|
|
336
|
+
console.log("[SessionManager] No sessions to restore");
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
console.log(`[SessionManager] Found ${sessions.length} sessions to restore`);
|
|
340
|
+
for (const session of sessions) {
|
|
341
|
+
// Only restore active sessions automatically
|
|
342
|
+
if (session.state === "active") {
|
|
343
|
+
await this.restoreFromSnapshot(session.id);
|
|
344
|
+
console.log(`[SessionManager] Restored session: ${session.id.slice(0, 16)}...`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// ============================================================================
|
|
349
|
+
// Utilities
|
|
350
|
+
// ============================================================================
|
|
351
|
+
ensureDirectories() {
|
|
352
|
+
if (!existsSync(KOBOLD_DIR)) {
|
|
353
|
+
mkdirSync(KOBOLD_DIR, { recursive: true });
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
detectSource() {
|
|
357
|
+
// Detect how this session was created
|
|
358
|
+
if (process.env.DISCORD_TOKEN || process.env.KOBOLD_CHANNEL_TYPE === "discord") {
|
|
359
|
+
return "discord";
|
|
360
|
+
}
|
|
361
|
+
if (process.env.KOBOLD_SUBAGENT === "true") {
|
|
362
|
+
return "api";
|
|
363
|
+
}
|
|
364
|
+
if (process.argv.includes("--cron")) {
|
|
365
|
+
return "cron";
|
|
366
|
+
}
|
|
367
|
+
return "tui";
|
|
368
|
+
}
|
|
369
|
+
findPiSessionFile(piSessionId) {
|
|
370
|
+
// Attempt to find the pi-coding-agent session file
|
|
371
|
+
const possiblePaths = [
|
|
372
|
+
join(KOBOLD_DIR, ".pi-session-*"),
|
|
373
|
+
join(process.cwd(), ".pi-session-*"),
|
|
374
|
+
join(homedir(), ".local", "share", "pi-coding-agent", "sessions", "*"),
|
|
375
|
+
];
|
|
376
|
+
// Return first match containing piSessionId
|
|
377
|
+
// Simplified - real implementation would search
|
|
378
|
+
return undefined;
|
|
379
|
+
}
|
|
380
|
+
startMaintenanceLoop() {
|
|
381
|
+
if (this.config.snapshotInterval > 0) {
|
|
382
|
+
setInterval(async () => {
|
|
383
|
+
if (this.currentSessionId && this.config.snapshotInterval) {
|
|
384
|
+
await this.createSnapshot(this.currentSessionId, "auto").catch(() => { });
|
|
385
|
+
}
|
|
386
|
+
}, this.config.snapshotInterval);
|
|
387
|
+
}
|
|
388
|
+
if (this.config.cleanupAgeHours > 0) {
|
|
389
|
+
// Daily cleanup
|
|
390
|
+
setInterval(async () => {
|
|
391
|
+
const result = await this.store.cleanup(this.config.cleanupAgeHours);
|
|
392
|
+
console.log(`[SessionManager] Cleanup: ${result.sessionsDeleted} sessions, ${result.snapshotsDeleted} snapshots`);
|
|
393
|
+
}, 24 * 60 * 60 * 1000);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// ============================================================================
|
|
398
|
+
// Singleton Instance
|
|
399
|
+
// ============================================================================
|
|
400
|
+
let globalSessionManager = null;
|
|
401
|
+
export function getSessionManager(config) {
|
|
402
|
+
if (!globalSessionManager) {
|
|
403
|
+
globalSessionManager = new SessionManager(config);
|
|
404
|
+
}
|
|
405
|
+
return globalSessionManager;
|
|
406
|
+
}
|
|
407
|
+
export function setSessionManager(manager) {
|
|
408
|
+
globalSessionManager = manager;
|
|
409
|
+
}
|
|
410
|
+
// Convenience function for getting current unified session ID
|
|
411
|
+
export function getCurrentUnifiedSessionId() {
|
|
412
|
+
return (process.env.KOBOLD_UNIFIED_SESSION_ID ||
|
|
413
|
+
globalSessionManager?.getCurrentSessionId());
|
|
414
|
+
}
|
|
415
|
+
export default SessionManager;
|
|
416
|
+
//# sourceMappingURL=SessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../../src/sessions/SessionManager.ts"],"names":[],"mappings":"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"}
|