@dexto/core 1.6.25 → 1.6.27
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/dist/agent/DextoAgent.cjs +102 -104
- package/dist/agent/DextoAgent.d.ts +11 -10
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +103 -105
- package/dist/agent/error-codes.cjs +1 -0
- package/dist/agent/error-codes.d.ts +1 -0
- package/dist/agent/error-codes.d.ts.map +1 -1
- package/dist/agent/error-codes.js +1 -0
- package/dist/agent/errors.cjs +13 -0
- package/dist/agent/errors.d.ts +6 -0
- package/dist/agent/errors.d.ts.map +1 -1
- package/dist/agent/errors.js +13 -0
- package/dist/agent/index.d.ts +1 -0
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/schemas.d.ts +2 -2
- package/dist/agent/types.d.ts +11 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/approval/factory.cjs +1 -0
- package/dist/approval/factory.d.ts.map +1 -1
- package/dist/approval/factory.js +1 -0
- package/dist/approval/manager.cjs +345 -182
- package/dist/approval/manager.d.ts +45 -31
- package/dist/approval/manager.d.ts.map +1 -1
- package/dist/approval/manager.js +345 -182
- package/dist/approval/schemas.cjs +10 -0
- package/dist/approval/schemas.d.ts +305 -0
- package/dist/approval/schemas.d.ts.map +1 -1
- package/dist/approval/schemas.js +10 -0
- package/dist/approval/session-approval-store.cjs +91 -0
- package/dist/approval/session-approval-store.d.ts +55 -0
- package/dist/approval/session-approval-store.d.ts.map +1 -0
- package/dist/approval/session-approval-store.js +68 -0
- package/dist/events/index.cjs +210 -75
- package/dist/events/index.d.ts +44 -181
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +206 -74
- package/dist/hooks/manager.cjs +5 -2
- package/dist/hooks/manager.d.ts +2 -0
- package/dist/hooks/manager.d.ts.map +1 -1
- package/dist/hooks/manager.js +5 -2
- package/dist/hooks/types.d.ts +3 -0
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/index.browser.d.ts +1 -0
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.cjs +3 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/llm/executor/turn-executor.cjs +15 -7
- package/dist/llm/executor/turn-executor.d.ts +3 -1
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +15 -7
- package/dist/llm/services/factory.cjs +10 -4
- package/dist/llm/services/factory.d.ts +2 -21
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +11 -7
- package/dist/llm/services/types.d.ts +33 -2
- package/dist/llm/services/types.d.ts.map +1 -1
- package/dist/llm/services/vercel.cjs +33 -11
- package/dist/llm/services/vercel.d.ts +6 -3
- package/dist/llm/services/vercel.d.ts.map +1 -1
- package/dist/llm/services/vercel.js +29 -8
- package/dist/logger/default-logger-factory.d.ts +12 -12
- package/dist/logger/v2/schemas.d.ts +6 -6
- package/dist/mcp/manager.cjs +7 -2
- package/dist/mcp/manager.d.ts +3 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +7 -2
- package/dist/mcp/mcp-client.cjs +71 -62
- package/dist/mcp/mcp-client.d.ts +3 -2
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +71 -62
- package/dist/mcp/schemas.d.ts +10 -10
- package/dist/resources/handlers/filesystem-handler.cjs +22 -3
- package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
- package/dist/resources/handlers/filesystem-handler.js +22 -3
- package/dist/runtime/host-runtime.cjs +163 -0
- package/dist/runtime/host-runtime.d.ts +23 -0
- package/dist/runtime/host-runtime.d.ts.map +1 -0
- package/dist/runtime/host-runtime.js +133 -0
- package/dist/runtime/index.cjs +42 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +21 -0
- package/dist/runtime/run-context.cjs +53 -0
- package/dist/runtime/run-context.d.ts +13 -0
- package/dist/runtime/run-context.d.ts.map +1 -0
- package/dist/runtime/run-context.js +34 -0
- package/dist/session/chat-session.cjs +67 -71
- package/dist/session/chat-session.d.ts +25 -25
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/chat-session.js +68 -72
- package/dist/session/error-codes.cjs +1 -0
- package/dist/session/error-codes.d.ts +2 -1
- package/dist/session/error-codes.d.ts.map +1 -1
- package/dist/session/error-codes.js +1 -0
- package/dist/session/errors.cjs +13 -0
- package/dist/session/errors.d.ts +6 -0
- package/dist/session/errors.d.ts.map +1 -1
- package/dist/session/errors.js +13 -0
- package/dist/session/message-queue-store.cjs +75 -0
- package/dist/session/message-queue-store.d.ts +16 -0
- package/dist/session/message-queue-store.d.ts.map +1 -0
- package/dist/session/message-queue-store.js +52 -0
- package/dist/session/message-queue.cjs +140 -46
- package/dist/session/message-queue.d.ts +18 -6
- package/dist/session/message-queue.d.ts.map +1 -1
- package/dist/session/message-queue.js +140 -46
- package/dist/session/session-manager.cjs +130 -25
- package/dist/session/session-manager.d.ts +18 -1
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +130 -25
- package/dist/session/title-generator.cjs +9 -2
- package/dist/session/title-generator.d.ts +2 -0
- package/dist/session/title-generator.d.ts.map +1 -1
- package/dist/session/title-generator.js +9 -2
- package/dist/telemetry/decorators.cjs +75 -57
- package/dist/telemetry/decorators.d.ts +2 -0
- package/dist/telemetry/decorators.d.ts.map +1 -1
- package/dist/telemetry/decorators.js +75 -57
- package/dist/telemetry/errors.cjs +2 -2
- package/dist/telemetry/errors.js +2 -2
- package/dist/telemetry/index.d.ts +1 -1
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +3 -1
- package/dist/telemetry/telemetry.cjs +62 -21
- package/dist/telemetry/telemetry.d.ts +14 -0
- package/dist/telemetry/telemetry.d.ts.map +1 -1
- package/dist/telemetry/telemetry.js +62 -21
- package/dist/telemetry/utils.cjs +9 -6
- package/dist/telemetry/utils.d.ts +3 -0
- package/dist/telemetry/utils.d.ts.map +1 -1
- package/dist/telemetry/utils.js +9 -6
- package/dist/test-utils/session-state-stores.cjs +68 -0
- package/dist/test-utils/session-state-stores.js +42 -0
- package/dist/tools/session-tool-preferences-store.cjs +86 -0
- package/dist/tools/session-tool-preferences-store.d.ts +29 -0
- package/dist/tools/session-tool-preferences-store.d.ts.map +1 -0
- package/dist/tools/session-tool-preferences-store.js +63 -0
- package/dist/tools/tool-manager.cjs +223 -68
- package/dist/tools/tool-manager.d.ts +29 -9
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +223 -68
- package/dist/tools/types.d.ts +7 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/service-initializer.cjs +38 -5
- package/dist/utils/service-initializer.d.ts +11 -1
- package/dist/utils/service-initializer.d.ts.map +1 -1
- package/dist/utils/service-initializer.js +36 -4
- package/package.json +1 -1
|
@@ -46,11 +46,13 @@ class SessionManager {
|
|
|
46
46
|
this.maxSessions = config.maxSessions ?? 100;
|
|
47
47
|
this.sessionTTL = config.sessionTTL ?? 36e5;
|
|
48
48
|
this.sessionLoggerFactory = config.sessionLoggerFactory ?? defaultSessionLoggerFactory;
|
|
49
|
+
this.languageModelFactory = config.languageModelFactory;
|
|
49
50
|
this.logger = logger.createChild(import_types.DextoLogComponent.SESSION);
|
|
50
51
|
}
|
|
51
52
|
sessions = /* @__PURE__ */ new Map();
|
|
52
53
|
maxSessions;
|
|
53
54
|
sessionTTL;
|
|
55
|
+
static MESSAGE_QUEUE_KEY_PREFIX = "session-message-queue:";
|
|
54
56
|
initialized = false;
|
|
55
57
|
cleanupInterval;
|
|
56
58
|
initializationPromise;
|
|
@@ -64,6 +66,16 @@ class SessionManager {
|
|
|
64
66
|
static FORK_TITLE_PREFIX = "Fork: ";
|
|
65
67
|
static FORK_PARENT_ID_PREVIEW_LENGTH = 8;
|
|
66
68
|
sessionLoggerFactory;
|
|
69
|
+
languageModelFactory;
|
|
70
|
+
getChatSessionServices() {
|
|
71
|
+
return {
|
|
72
|
+
...this.services,
|
|
73
|
+
sessionManager: this,
|
|
74
|
+
...this.languageModelFactory !== void 0 && {
|
|
75
|
+
languageModelFactory: this.languageModelFactory
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
67
79
|
/**
|
|
68
80
|
* Initialize the SessionManager with persistent storage.
|
|
69
81
|
* This must be called before using any session operations.
|
|
@@ -72,6 +84,7 @@ class SessionManager {
|
|
|
72
84
|
if (this.initialized) {
|
|
73
85
|
return;
|
|
74
86
|
}
|
|
87
|
+
await this.clearPersistedQueuedMessages("startup");
|
|
75
88
|
await this.restoreSessionsFromStorage();
|
|
76
89
|
const cleanupIntervalMs = Math.min(this.sessionTTL / 4, 15 * 60 * 1e3);
|
|
77
90
|
this.cleanupInterval = setInterval(
|
|
@@ -102,7 +115,11 @@ class SessionManager {
|
|
|
102
115
|
if (now - lastActivity <= this.sessionTTL) {
|
|
103
116
|
this.logger.debug(`Session ${sessionId} restored from storage`);
|
|
104
117
|
} else {
|
|
105
|
-
await
|
|
118
|
+
await Promise.all([
|
|
119
|
+
this.services.storageManager.getDatabase().delete(sessionKey),
|
|
120
|
+
this.services.storageManager.getCache().delete(sessionKey),
|
|
121
|
+
this.deleteSessionInteractionState(sessionId)
|
|
122
|
+
]);
|
|
106
123
|
this.logger.debug(`Expired session ${sessionId} cleaned up during restore`);
|
|
107
124
|
}
|
|
108
125
|
}
|
|
@@ -113,6 +130,31 @@ class SessionManager {
|
|
|
113
130
|
);
|
|
114
131
|
}
|
|
115
132
|
}
|
|
133
|
+
async clearPersistedQueuedMessages(reason) {
|
|
134
|
+
try {
|
|
135
|
+
const queueKeys = await this.services.storageManager.getDatabase().list(SessionManager.MESSAGE_QUEUE_KEY_PREFIX);
|
|
136
|
+
if (queueKeys.length === 0) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
await Promise.all(
|
|
140
|
+
queueKeys.map(
|
|
141
|
+
(key) => this.services.messageQueueStore.delete(
|
|
142
|
+
key.slice(SessionManager.MESSAGE_QUEUE_KEY_PREFIX.length)
|
|
143
|
+
)
|
|
144
|
+
)
|
|
145
|
+
);
|
|
146
|
+
const message = `${reason === "startup" ? "Cleared stale queued follow-up state from previous agent run" : "Cleared queued follow-up state during agent shutdown"} (${queueKeys.length} session bucket(s))`;
|
|
147
|
+
if (reason === "startup") {
|
|
148
|
+
this.logger.info(message);
|
|
149
|
+
} else {
|
|
150
|
+
this.logger.debug(message);
|
|
151
|
+
}
|
|
152
|
+
} catch (error) {
|
|
153
|
+
this.logger.warn(
|
|
154
|
+
`Failed to clear persisted queued follow-up state during ${reason}: ${error instanceof Error ? error.message : String(error)}`
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
116
158
|
/**
|
|
117
159
|
* Ensures the SessionManager is initialized before operations.
|
|
118
160
|
*/
|
|
@@ -304,12 +346,10 @@ class SessionManager {
|
|
|
304
346
|
this.services.stateManager.updateLLM(restoredConfig, id);
|
|
305
347
|
}
|
|
306
348
|
}
|
|
307
|
-
const session2 = new import_chat_session.ChatSession(
|
|
308
|
-
{ ...this.services, sessionManager: this },
|
|
309
|
-
id,
|
|
310
|
-
sessionLogger
|
|
311
|
-
);
|
|
349
|
+
const session2 = new import_chat_session.ChatSession(this.getChatSessionServices(), id, sessionLogger);
|
|
312
350
|
await session2.init();
|
|
351
|
+
await this.services.toolManager.restoreSessionState(id);
|
|
352
|
+
await this.services.approvalManager.restoreSessionState(id);
|
|
313
353
|
this.sessions.set(id, session2);
|
|
314
354
|
this.logger.info(`Restored session from storage: ${id}`);
|
|
315
355
|
return session2;
|
|
@@ -318,6 +358,7 @@ class SessionManager {
|
|
|
318
358
|
if (activeSessionKeys.length >= this.maxSessions) {
|
|
319
359
|
throw import_errors.SessionError.maxSessionsExceeded(activeSessionKeys.length, this.maxSessions);
|
|
320
360
|
}
|
|
361
|
+
await this.deleteSessionInteractionState(id);
|
|
321
362
|
const workspace = await this.services.workspaceManager?.getWorkspace();
|
|
322
363
|
const sessionData = {
|
|
323
364
|
id,
|
|
@@ -343,11 +384,7 @@ class SessionManager {
|
|
|
343
384
|
agentId,
|
|
344
385
|
sessionId: id
|
|
345
386
|
});
|
|
346
|
-
session = new import_chat_session.ChatSession(
|
|
347
|
-
{ ...this.services, sessionManager: this },
|
|
348
|
-
id,
|
|
349
|
-
sessionLogger
|
|
350
|
-
);
|
|
387
|
+
session = new import_chat_session.ChatSession(this.getChatSessionServices(), id, sessionLogger);
|
|
351
388
|
await session.init();
|
|
352
389
|
this.sessions.set(id, session);
|
|
353
390
|
await this.services.storageManager.getCache().set(sessionKey, sessionData, this.sessionTTL / 1e3);
|
|
@@ -406,11 +443,13 @@ class SessionManager {
|
|
|
406
443
|
}
|
|
407
444
|
}
|
|
408
445
|
const session = new import_chat_session.ChatSession(
|
|
409
|
-
|
|
446
|
+
this.getChatSessionServices(),
|
|
410
447
|
sessionId,
|
|
411
448
|
sessionLogger
|
|
412
449
|
);
|
|
413
450
|
await session.init();
|
|
451
|
+
await this.services.toolManager.restoreSessionState(sessionId);
|
|
452
|
+
await this.services.approvalManager.restoreSessionState(sessionId);
|
|
414
453
|
this.sessions.set(sessionId, session);
|
|
415
454
|
return session;
|
|
416
455
|
}
|
|
@@ -432,6 +471,7 @@ class SessionManager {
|
|
|
432
471
|
}
|
|
433
472
|
const sessionKey = `session:${sessionId}`;
|
|
434
473
|
await this.services.storageManager.getCache().delete(sessionKey);
|
|
474
|
+
this.evictSessionInteractionState(sessionId);
|
|
435
475
|
this.logger.debug(
|
|
436
476
|
`Ended session (removed from memory, chat history preserved): ${sessionId}`
|
|
437
477
|
);
|
|
@@ -452,12 +492,13 @@ class SessionManager {
|
|
|
452
492
|
const sessionKey = `session:${sessionId}`;
|
|
453
493
|
await this.services.storageManager.getDatabase().delete(sessionKey);
|
|
454
494
|
await this.services.storageManager.getCache().delete(sessionKey);
|
|
495
|
+
await this.deleteSessionInteractionState(sessionId);
|
|
455
496
|
const messagesKey = `messages:${sessionId}`;
|
|
456
497
|
await this.services.storageManager.getDatabase().delete(messagesKey);
|
|
457
498
|
this.logger.debug(`Deleted session and conversation history: ${sessionId}`);
|
|
458
499
|
}
|
|
459
500
|
/**
|
|
460
|
-
* Resets
|
|
501
|
+
* Resets conversation and session-scoped interaction state while keeping the session alive.
|
|
461
502
|
*
|
|
462
503
|
* @param sessionId The session ID to reset
|
|
463
504
|
* @throws Error if session doesn't exist
|
|
@@ -469,6 +510,15 @@ class SessionManager {
|
|
|
469
510
|
throw import_errors.SessionError.notFound(sessionId);
|
|
470
511
|
}
|
|
471
512
|
await session.reset();
|
|
513
|
+
await session.clearMessageQueue();
|
|
514
|
+
await Promise.all([
|
|
515
|
+
this.services.toolManager.deleteSessionState(sessionId),
|
|
516
|
+
this.services.approvalManager.deleteSessionState(sessionId)
|
|
517
|
+
]);
|
|
518
|
+
if (this.services.stateManager.hasSessionLLMOverride(sessionId)) {
|
|
519
|
+
this.services.stateManager.clearSessionOverride(sessionId);
|
|
520
|
+
await session.switchLLM(this.services.stateManager.getRuntimeConfig().llm);
|
|
521
|
+
}
|
|
472
522
|
await this.runWithSessionDataLock(sessionId, async (sessionKey) => {
|
|
473
523
|
const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
|
|
474
524
|
if (!sessionData) {
|
|
@@ -476,6 +526,7 @@ class SessionManager {
|
|
|
476
526
|
}
|
|
477
527
|
sessionData.messageCount = 0;
|
|
478
528
|
sessionData.lastActivity = Date.now();
|
|
529
|
+
delete sessionData.llmOverride;
|
|
479
530
|
await this.persistSessionData(sessionKey, sessionData);
|
|
480
531
|
});
|
|
481
532
|
this.logger.debug(`Reset session conversation: ${sessionId}`);
|
|
@@ -766,6 +817,7 @@ class SessionManager {
|
|
|
766
817
|
if (session) {
|
|
767
818
|
session.dispose();
|
|
768
819
|
this.sessions.delete(sessionId);
|
|
820
|
+
this.evictSessionInteractionState(sessionId);
|
|
769
821
|
this.logger.debug(
|
|
770
822
|
`Removed expired session from memory: ${sessionId} (chat history preserved)`
|
|
771
823
|
);
|
|
@@ -790,8 +842,7 @@ class SessionManager {
|
|
|
790
842
|
const session = await this.getSession(sId);
|
|
791
843
|
if (session) {
|
|
792
844
|
try {
|
|
793
|
-
this.
|
|
794
|
-
await session.switchLLM(newLLMConfig);
|
|
845
|
+
await this.applySessionLLMSwitch(sId, session, newLLMConfig);
|
|
795
846
|
} catch (error) {
|
|
796
847
|
failedSessions.push(sId);
|
|
797
848
|
this.logger.warn(
|
|
@@ -820,16 +871,7 @@ class SessionManager {
|
|
|
820
871
|
if (!session) {
|
|
821
872
|
throw import_errors.SessionError.notFound(sessionId);
|
|
822
873
|
}
|
|
823
|
-
await
|
|
824
|
-
await this.runWithSessionDataLock(sessionId, async (sessionKey) => {
|
|
825
|
-
const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
|
|
826
|
-
if (!sessionData) {
|
|
827
|
-
return;
|
|
828
|
-
}
|
|
829
|
-
const { apiKey: _apiKey, ...configWithoutApiKey } = newLLMConfig;
|
|
830
|
-
sessionData.llmOverride = configWithoutApiKey;
|
|
831
|
-
await this.persistSessionData(sessionKey, sessionData);
|
|
832
|
-
});
|
|
874
|
+
await this.applySessionLLMSwitch(sessionId, session, newLLMConfig);
|
|
833
875
|
this.services.agentEventBus.emit("llm:switched", {
|
|
834
876
|
newConfig: newLLMConfig,
|
|
835
877
|
historyRetained: true,
|
|
@@ -838,6 +880,68 @@ class SessionManager {
|
|
|
838
880
|
const message = `Successfully switched to ${newLLMConfig.provider}/${newLLMConfig.model} for session ${sessionId}`;
|
|
839
881
|
return { message, warnings: [] };
|
|
840
882
|
}
|
|
883
|
+
async applySessionLLMSwitch(sessionId, session, newLLMConfig) {
|
|
884
|
+
const previousLLMConfig = this.services.stateManager.getRuntimeConfig(sessionId).llm;
|
|
885
|
+
const previousHadOverride = this.services.stateManager.hasSessionLLMOverride(sessionId);
|
|
886
|
+
const previousPersistedOverride = await this.getPersistedSessionLLMOverride(sessionId);
|
|
887
|
+
await this.setPersistedSessionLLMOverride(
|
|
888
|
+
sessionId,
|
|
889
|
+
this.toPersistedLLMConfig(newLLMConfig)
|
|
890
|
+
);
|
|
891
|
+
try {
|
|
892
|
+
this.services.stateManager.updateLLM(newLLMConfig, sessionId);
|
|
893
|
+
await session.switchLLM(newLLMConfig);
|
|
894
|
+
} catch (error) {
|
|
895
|
+
await this.setPersistedSessionLLMOverride(sessionId, previousPersistedOverride);
|
|
896
|
+
if (previousHadOverride) {
|
|
897
|
+
this.services.stateManager.updateLLM(previousLLMConfig, sessionId);
|
|
898
|
+
} else {
|
|
899
|
+
this.services.stateManager.clearSessionOverride(sessionId);
|
|
900
|
+
}
|
|
901
|
+
try {
|
|
902
|
+
await session.switchLLM(previousLLMConfig);
|
|
903
|
+
} catch (rollbackError) {
|
|
904
|
+
this.logger.error(
|
|
905
|
+
`Failed to roll back LLM switch for session ${sessionId}: ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`
|
|
906
|
+
);
|
|
907
|
+
}
|
|
908
|
+
throw error;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
async getPersistedSessionLLMOverride(sessionId) {
|
|
912
|
+
const sessionData = await this.getSessionData(sessionId);
|
|
913
|
+
return sessionData?.llmOverride;
|
|
914
|
+
}
|
|
915
|
+
toPersistedLLMConfig(newLLMConfig) {
|
|
916
|
+
const { apiKey: _apiKey, ...configWithoutApiKey } = newLLMConfig;
|
|
917
|
+
return configWithoutApiKey;
|
|
918
|
+
}
|
|
919
|
+
async setPersistedSessionLLMOverride(sessionId, llmOverride) {
|
|
920
|
+
await this.runWithSessionDataLock(sessionId, async (sessionKey) => {
|
|
921
|
+
const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
|
|
922
|
+
if (!sessionData) {
|
|
923
|
+
return;
|
|
924
|
+
}
|
|
925
|
+
if (llmOverride !== void 0) {
|
|
926
|
+
sessionData.llmOverride = llmOverride;
|
|
927
|
+
} else {
|
|
928
|
+
delete sessionData.llmOverride;
|
|
929
|
+
}
|
|
930
|
+
await this.persistSessionData(sessionKey, sessionData);
|
|
931
|
+
});
|
|
932
|
+
}
|
|
933
|
+
async deleteSessionInteractionState(sessionId) {
|
|
934
|
+
this.services.stateManager.clearSessionOverride(sessionId);
|
|
935
|
+
await Promise.all([
|
|
936
|
+
this.services.toolManager.deleteSessionState(sessionId),
|
|
937
|
+
this.services.approvalManager.deleteSessionState(sessionId),
|
|
938
|
+
this.services.messageQueueStore.delete(sessionId)
|
|
939
|
+
]);
|
|
940
|
+
}
|
|
941
|
+
evictSessionInteractionState(sessionId) {
|
|
942
|
+
this.services.toolManager.evictSessionState(sessionId);
|
|
943
|
+
this.services.approvalManager.evictSessionState(sessionId);
|
|
944
|
+
}
|
|
841
945
|
async runWithSessionDataLock(sessionId, fn) {
|
|
842
946
|
const sessionKey = `session:${sessionId}`;
|
|
843
947
|
const previousLock = this.sessionDataLocks.get(sessionKey) ?? Promise.resolve();
|
|
@@ -898,6 +1002,7 @@ class SessionManager {
|
|
|
898
1002
|
delete this.cleanupInterval;
|
|
899
1003
|
this.logger.debug("Periodic session cleanup stopped");
|
|
900
1004
|
}
|
|
1005
|
+
await this.clearPersistedQueuedMessages("shutdown");
|
|
901
1006
|
const sessionIds = Array.from(this.sessions.keys());
|
|
902
1007
|
for (const sessionId of sessionIds) {
|
|
903
1008
|
try {
|
|
@@ -7,9 +7,12 @@ import type { AgentStateManager } from '../agent/state-manager.js';
|
|
|
7
7
|
import type { ValidatedLLMConfig } from '../llm/schemas.js';
|
|
8
8
|
import type { StorageManager } from '../storage/index.js';
|
|
9
9
|
import type { HookManager } from '../hooks/manager.js';
|
|
10
|
+
import type { ApprovalManager } from '../approval/manager.js';
|
|
10
11
|
import type { TokenUsage } from '../llm/types.js';
|
|
12
|
+
import type { LanguageModelFactory } from '../llm/services/types.js';
|
|
11
13
|
import type { CompactionStrategy } from '../context/compaction/types.js';
|
|
12
14
|
import { type SessionPromptContributor } from '../systemPrompt/schemas.js';
|
|
15
|
+
import type { MessageQueueStore } from './message-queue-store.js';
|
|
13
16
|
export type SessionLoggerFactory = (options: {
|
|
14
17
|
baseLogger: Logger;
|
|
15
18
|
agentId: string;
|
|
@@ -52,6 +55,8 @@ export interface SessionManagerConfig {
|
|
|
52
55
|
sessionTTL?: number;
|
|
53
56
|
/** Host hook for creating a session-scoped logger (e.g. file logger) */
|
|
54
57
|
sessionLoggerFactory?: SessionLoggerFactory;
|
|
58
|
+
/** Host hook for constructing session-scoped LanguageModel instances */
|
|
59
|
+
languageModelFactory?: LanguageModelFactory;
|
|
55
60
|
}
|
|
56
61
|
type PersistedLLMConfig = Omit<ValidatedLLMConfig, 'apiKey'>;
|
|
57
62
|
export interface SessionData {
|
|
@@ -91,6 +96,7 @@ export declare class SessionManager {
|
|
|
91
96
|
private sessions;
|
|
92
97
|
private readonly maxSessions;
|
|
93
98
|
private readonly sessionTTL;
|
|
99
|
+
private static readonly MESSAGE_QUEUE_KEY_PREFIX;
|
|
94
100
|
private initialized;
|
|
95
101
|
private cleanupInterval?;
|
|
96
102
|
private initializationPromise;
|
|
@@ -102,18 +108,22 @@ export declare class SessionManager {
|
|
|
102
108
|
private static readonly FORK_TITLE_PREFIX;
|
|
103
109
|
private static readonly FORK_PARENT_ID_PREVIEW_LENGTH;
|
|
104
110
|
private readonly sessionLoggerFactory;
|
|
111
|
+
private readonly languageModelFactory;
|
|
105
112
|
constructor(services: {
|
|
106
113
|
stateManager: AgentStateManager;
|
|
107
114
|
systemPromptManager: SystemPromptManager;
|
|
108
115
|
toolManager: ToolManager;
|
|
116
|
+
approvalManager: ApprovalManager;
|
|
109
117
|
agentEventBus: AgentEventBus;
|
|
110
118
|
storageManager: StorageManager;
|
|
111
119
|
resourceManager: import('../resources/index.js').ResourceManager;
|
|
112
120
|
hookManager: HookManager;
|
|
113
121
|
mcpManager: import('../mcp/manager.js').MCPManager;
|
|
122
|
+
messageQueueStore: Pick<MessageQueueStore, 'load' | 'save' | 'delete'>;
|
|
114
123
|
compactionStrategy: CompactionStrategy | null;
|
|
115
124
|
workspaceManager?: import('../workspace/manager.js').WorkspaceManager;
|
|
116
125
|
}, config: SessionManagerConfig | undefined, logger: Logger);
|
|
126
|
+
private getChatSessionServices;
|
|
117
127
|
/**
|
|
118
128
|
* Initialize the SessionManager with persistent storage.
|
|
119
129
|
* This must be called before using any session operations.
|
|
@@ -124,6 +134,7 @@ export declare class SessionManager {
|
|
|
124
134
|
* This allows sessions to survive application restarts.
|
|
125
135
|
*/
|
|
126
136
|
private restoreSessionsFromStorage;
|
|
137
|
+
private clearPersistedQueuedMessages;
|
|
127
138
|
/**
|
|
128
139
|
* Ensures the SessionManager is initialized before operations.
|
|
129
140
|
*/
|
|
@@ -178,7 +189,7 @@ export declare class SessionManager {
|
|
|
178
189
|
*/
|
|
179
190
|
deleteSession(sessionId: string): Promise<void>;
|
|
180
191
|
/**
|
|
181
|
-
* Resets
|
|
192
|
+
* Resets conversation and session-scoped interaction state while keeping the session alive.
|
|
182
193
|
*
|
|
183
194
|
* @param sessionId The session ID to reset
|
|
184
195
|
* @throws Error if session doesn't exist
|
|
@@ -276,6 +287,12 @@ export declare class SessionManager {
|
|
|
276
287
|
message: string;
|
|
277
288
|
warnings: string[];
|
|
278
289
|
}>;
|
|
290
|
+
private applySessionLLMSwitch;
|
|
291
|
+
private getPersistedSessionLLMOverride;
|
|
292
|
+
private toPersistedLLMConfig;
|
|
293
|
+
private setPersistedSessionLLMOverride;
|
|
294
|
+
private deleteSessionInteractionState;
|
|
295
|
+
private evictSessionInteractionState;
|
|
279
296
|
private runWithSessionDataLock;
|
|
280
297
|
private persistSessionData;
|
|
281
298
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
|