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.
Files changed (130) hide show
  1. package/README.md +226 -383
  2. package/dist/package.json +13 -4
  3. package/dist/src/agent/DraconicCapabilityRouter.js +556 -0
  4. package/dist/src/agent/DraconicCapabilityRouter.js.map +1 -0
  5. package/dist/src/agent/DraconicErrorClassifier.js +606 -0
  6. package/dist/src/agent/DraconicErrorClassifier.js.map +1 -0
  7. package/dist/src/agent/DraconicRunRegistry.js +460 -0
  8. package/dist/src/agent/DraconicRunRegistry.js.map +1 -0
  9. package/dist/src/agent/DraconicTokenPredictor.js +500 -0
  10. package/dist/src/agent/DraconicTokenPredictor.js.map +1 -0
  11. package/dist/src/agent/embedded-runner.js +3 -2
  12. package/dist/src/agent/embedded-runner.js.map +1 -1
  13. package/dist/src/cli/commands/doctor.js +199 -0
  14. package/dist/src/cli/commands/doctor.js.map +1 -0
  15. package/dist/src/cli/commands/migrate-from-openclaw.js +39 -0
  16. package/dist/src/cli/commands/migrate-from-openclaw.js.map +1 -0
  17. package/dist/src/cli/commands/migrate.js +6 -4
  18. package/dist/src/cli/commands/migrate.js.map +1 -1
  19. package/dist/src/cli/program.js +3 -1
  20. package/dist/src/cli/program.js.map +1 -1
  21. package/dist/src/config/unified-config.js +195 -0
  22. package/dist/src/config/unified-config.js.map +1 -0
  23. package/dist/src/cron/notifications.js +1 -1
  24. package/dist/src/cron/notifications.js.map +1 -1
  25. package/dist/src/cron/runner.js +9 -3
  26. package/dist/src/cron/runner.js.map +1 -1
  27. package/dist/src/event-bus/index.js +3 -1
  28. package/dist/src/event-bus/index.js.map +1 -1
  29. package/dist/src/extensions/community/draconic-messenger-wrapper.js +35 -0
  30. package/dist/src/extensions/community/draconic-messenger-wrapper.js.map +1 -0
  31. package/dist/src/extensions/community/draconic-subagents-wrapper.js +115 -0
  32. package/dist/src/extensions/community/draconic-subagents-wrapper.js.map +1 -0
  33. package/dist/src/extensions/core/compaction-safeguard-v2.js +95 -0
  34. package/dist/src/extensions/core/compaction-safeguard-v2.js.map +1 -0
  35. package/dist/src/extensions/core/compaction-safeguard.js +206 -137
  36. package/dist/src/extensions/core/compaction-safeguard.js.map +1 -1
  37. package/dist/src/extensions/core/config-extension.js +122 -0
  38. package/dist/src/extensions/core/config-extension.js.map +1 -0
  39. package/dist/src/extensions/core/draconic-hoard-extension.js +194 -0
  40. package/dist/src/extensions/core/draconic-hoard-extension.js.map +1 -0
  41. package/dist/src/extensions/core/draconic-lair-extension.js +146 -0
  42. package/dist/src/extensions/core/draconic-lair-extension.js.map +1 -0
  43. package/dist/src/extensions/core/draconic-safety-extension.js +402 -0
  44. package/dist/src/extensions/core/draconic-safety-extension.js.map +1 -0
  45. package/dist/src/extensions/core/ext-manager.js +40 -0
  46. package/dist/src/extensions/core/ext-manager.js.map +1 -0
  47. package/dist/src/extensions/core/gateway-extension.js +413 -624
  48. package/dist/src/extensions/core/gateway-extension.js.map +1 -1
  49. package/dist/src/extensions/core/generative-agents-extension.js +704 -0
  50. package/dist/src/extensions/core/generative-agents-extension.js.map +1 -0
  51. package/dist/src/extensions/core/memory-bootstrap-extension.js +279 -0
  52. package/dist/src/extensions/core/memory-bootstrap-extension.js.map +1 -0
  53. package/dist/src/extensions/core/ollama-extension.js +442 -0
  54. package/dist/src/extensions/core/ollama-extension.js.map +1 -0
  55. package/dist/src/extensions/core/ollama-router-extension.js +34 -93
  56. package/dist/src/extensions/core/ollama-router-extension.js.map +1 -1
  57. package/dist/src/extensions/core/perennial-memory-extension.js +5 -2
  58. package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
  59. package/dist/src/extensions/core/persona-loader-extension.js +41 -15
  60. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
  61. package/dist/src/extensions/core/pi-notify-extension.js +6 -0
  62. package/dist/src/extensions/core/pi-notify-extension.js.map +1 -1
  63. package/dist/src/extensions/core/session-bridge-extension.js +8 -72
  64. package/dist/src/extensions/core/session-bridge-extension.js.map +1 -1
  65. package/dist/src/extensions/core/tui-integration-extension-fixed.js +3 -0
  66. package/dist/src/extensions/core/tui-integration-extension-fixed.js.map +1 -0
  67. package/dist/src/extensions/core/tui-integration-extension.js +984 -0
  68. package/dist/src/extensions/core/tui-integration-extension.js.map +1 -0
  69. package/dist/src/gateway/persistence/AgentStore.js +399 -0
  70. package/dist/src/gateway/persistence/AgentStore.js.map +1 -0
  71. package/dist/src/gateway/persistence/index.js +9 -0
  72. package/dist/src/gateway/persistence/index.js.map +1 -0
  73. package/dist/src/hoard/DraconicHoardSystem.js +465 -0
  74. package/dist/src/hoard/DraconicHoardSystem.js.map +1 -0
  75. package/dist/src/index.js +7 -5
  76. package/dist/src/index.js.map +1 -1
  77. package/dist/src/infra/DraconicConnectionPool.js +492 -0
  78. package/dist/src/infra/DraconicConnectionPool.js.map +1 -0
  79. package/dist/src/lair/DraconicLairSystem.js +387 -0
  80. package/dist/src/lair/DraconicLairSystem.js.map +1 -0
  81. package/dist/src/llm/ollama.js +143 -99
  82. package/dist/src/llm/ollama.js.map +1 -1
  83. package/dist/src/migration/openclaw.js +5 -5
  84. package/dist/src/migration/openclaw.js.map +1 -1
  85. package/dist/src/pi-config.js +52 -27
  86. package/dist/src/pi-config.js.map +1 -1
  87. package/dist/src/sessions/SessionManager.js +416 -0
  88. package/dist/src/sessions/SessionManager.js.map +1 -0
  89. package/dist/src/sessions/SessionStore.js +580 -0
  90. package/dist/src/sessions/SessionStore.js.map +1 -0
  91. package/dist/src/sessions/UnifiedSessionBridge.js +394 -0
  92. package/dist/src/sessions/UnifiedSessionBridge.js.map +1 -0
  93. package/dist/src/sessions/index.js +15 -0
  94. package/dist/src/sessions/index.js.map +1 -0
  95. package/dist/src/sessions/migration/index.js +156 -0
  96. package/dist/src/sessions/migration/index.js.map +1 -0
  97. package/dist/src/sessions/types.js +8 -0
  98. package/dist/src/sessions/types.js.map +1 -0
  99. package/dist/src/skills/framework.js +1 -1
  100. package/dist/src/skills/framework.js.map +1 -1
  101. package/dist/src/tui/commands/final-functions.js +39 -0
  102. package/dist/src/tui/commands/final-functions.js.map +1 -0
  103. package/dist/src/tui/commands/natural-language-commands.js +231 -0
  104. package/dist/src/tui/commands/natural-language-commands.js.map +1 -0
  105. package/dist/src/tui/commands/orchestration-commands.js +340 -0
  106. package/dist/src/tui/commands/orchestration-commands.js.map +1 -0
  107. package/dist/src/tui/commands/orchestration-final-section.js +84 -0
  108. package/dist/src/tui/commands/orchestration-final-section.js.map +1 -0
  109. package/dist/src/tui/components/agent-tree-overlay.js +210 -0
  110. package/dist/src/tui/components/agent-tree-overlay.js.map +1 -0
  111. package/dist/src/tui/components/agent-tree-panel.js +229 -0
  112. package/dist/src/tui/components/agent-tree-panel.js.map +1 -0
  113. package/dist/src/tui/components/sidebar.js +82 -0
  114. package/dist/src/tui/components/sidebar.js.map +1 -0
  115. package/dist/src/tui/components/status-bar.js +115 -0
  116. package/dist/src/tui/components/status-bar.js.map +1 -0
  117. package/dist/src/tui/components/tree-header.js +85 -0
  118. package/dist/src/tui/components/tree-header.js.map +1 -0
  119. package/dist/src/tui/draconic-tui.js +291 -0
  120. package/dist/src/tui/draconic-tui.js.map +1 -0
  121. package/dist/src/tui/index.js +93 -0
  122. package/dist/src/tui/index.js.map +1 -0
  123. package/dist/src/tui/pi-tui-integration.js +260 -0
  124. package/dist/src/tui/pi-tui-integration.js.map +1 -0
  125. package/dist/src/utils/nl-patterns.js +145 -0
  126. package/dist/src/utils/nl-patterns.js.map +1 -0
  127. package/package.json +13 -4
  128. package/scripts/migrate-from-openclaw.sh +498 -0
  129. package/HEARTBEAT.md +0 -121
  130. 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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"}