@dexto/core 1.8.11 → 1.9.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/dist/approval/manager.cjs +37 -325
- package/dist/approval/manager.d.ts +10 -109
- package/dist/approval/manager.d.ts.map +1 -1
- package/dist/approval/manager.js +37 -316
- package/dist/approval/schemas.cjs +8 -51
- package/dist/approval/schemas.d.ts +5 -179
- package/dist/approval/schemas.d.ts.map +1 -1
- package/dist/approval/schemas.js +8 -47
- package/dist/approval/types.cjs +0 -6
- package/dist/approval/types.d.ts +2 -27
- package/dist/approval/types.d.ts.map +1 -1
- package/dist/approval/types.js +0 -6
- package/dist/context/content-clone.cjs +12 -8
- package/dist/context/content-clone.d.ts.map +1 -1
- package/dist/context/content-clone.js +12 -8
- package/dist/errors/DextoRuntimeError.cjs +3 -1
- package/dist/errors/DextoRuntimeError.d.ts +5 -3
- package/dist/errors/DextoRuntimeError.d.ts.map +1 -1
- package/dist/errors/DextoRuntimeError.js +3 -1
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/types.d.ts +1 -0
- package/dist/errors/types.d.ts.map +1 -1
- package/dist/events/index.d.ts +2 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/llm/executor/provider-error.cjs +25 -4
- package/dist/llm/executor/provider-error.d.ts.map +1 -1
- package/dist/llm/executor/provider-error.js +25 -4
- package/dist/llm/executor/stream-processor.cjs +61 -0
- package/dist/llm/executor/stream-processor.d.ts.map +1 -1
- package/dist/llm/executor/stream-processor.js +61 -0
- package/dist/llm/executor/turn-executor.cjs +93 -26
- package/dist/llm/executor/turn-executor.d.ts +2 -0
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +93 -26
- package/dist/llm/formatters/vercel.cjs +66 -0
- package/dist/llm/formatters/vercel.d.ts.map +1 -1
- package/dist/llm/formatters/vercel.js +66 -0
- package/dist/llm/services/factory.cjs +3 -2
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +3 -2
- package/dist/llm/services/types.d.ts +8 -0
- package/dist/llm/services/types.d.ts.map +1 -1
- package/dist/llm/services/vercel.cjs +6 -1
- package/dist/llm/services/vercel.d.ts +3 -2
- package/dist/llm/services/vercel.d.ts.map +1 -1
- package/dist/llm/services/vercel.js +6 -1
- package/dist/session/chat-session.cjs +3 -0
- package/dist/session/chat-session.d.ts +2 -1
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/chat-session.js +3 -0
- package/dist/session/message-queue.cjs +48 -75
- package/dist/session/message-queue.d.ts +1 -2
- package/dist/session/message-queue.d.ts.map +1 -1
- package/dist/session/message-queue.js +48 -75
- package/dist/session/session-manager.cjs +14 -32
- package/dist/session/session-manager.d.ts +5 -2
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +14 -32
- package/dist/storage/approvals/types.cjs +2 -9
- package/dist/storage/approvals/types.d.ts +4 -16
- package/dist/storage/approvals/types.d.ts.map +1 -1
- package/dist/storage/approvals/types.js +2 -8
- package/dist/storage/database/types.d.ts +5 -0
- package/dist/storage/database/types.d.ts.map +1 -1
- package/dist/storage/index.cjs +0 -2
- package/dist/storage/index.d.ts +2 -2
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -2
- package/dist/storage/message-queue/types.d.ts +14 -6
- package/dist/storage/message-queue/types.d.ts.map +1 -1
- package/dist/storage/stores/backend.cjs +68 -32
- package/dist/storage/stores/backend.d.ts +17 -8
- package/dist/storage/stores/backend.d.ts.map +1 -1
- package/dist/storage/stores/backend.js +69 -33
- package/dist/storage/stores/in-memory.cjs +26 -11
- package/dist/storage/stores/in-memory.d.ts.map +1 -1
- package/dist/storage/stores/in-memory.js +27 -12
- package/dist/test-utils/in-memory-storage.cjs +11 -0
- package/dist/test-utils/in-memory-storage.js +11 -0
- package/dist/test-utils/session-state-stores.cjs +25 -9
- package/dist/test-utils/session-state-stores.js +26 -10
- package/dist/tools/approval/tool-approval-policy.cjs +87 -0
- package/dist/tools/approval/tool-approval-policy.d.ts +34 -0
- package/dist/tools/approval/tool-approval-policy.d.ts.map +1 -0
- package/dist/tools/approval/tool-approval-policy.js +64 -0
- package/dist/tools/error-codes.cjs +0 -1
- package/dist/tools/error-codes.d.ts +0 -1
- package/dist/tools/error-codes.d.ts.map +1 -1
- package/dist/tools/error-codes.js +0 -1
- package/dist/tools/errors.cjs +0 -15
- package/dist/tools/errors.d.ts +0 -9
- package/dist/tools/errors.d.ts.map +1 -1
- package/dist/tools/errors.js +0 -15
- package/dist/tools/index.cjs +2 -0
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +5 -1
- package/dist/tools/tool-manager.cjs +94 -312
- package/dist/tools/tool-manager.d.ts +4 -19
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +95 -316
- package/dist/tools/types.d.ts +10 -9
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/service-initializer.cjs +3 -0
- package/dist/utils/service-initializer.d.ts +2 -1
- package/dist/utils/service-initializer.d.ts.map +1 -1
- package/dist/utils/service-initializer.js +3 -0
- package/package.json +2 -2
- package/dist/tools/pattern-utils.cjs +0 -33
- package/dist/tools/pattern-utils.d.ts +0 -20
- package/dist/tools/pattern-utils.d.ts.map +0 -1
- package/dist/tools/pattern-utils.js +0 -10
|
@@ -49,6 +49,7 @@ class SessionManager {
|
|
|
49
49
|
this.sessionLoggerFactory = config.sessionLoggerFactory ?? defaultSessionLoggerFactory;
|
|
50
50
|
this.languageModelFactory = config.languageModelFactory;
|
|
51
51
|
this.authResolver = config.authResolver ?? null;
|
|
52
|
+
this.executionControl = config.executionControl;
|
|
52
53
|
this.logger = logger.createChild(import_types.DextoLogComponent.SESSION);
|
|
53
54
|
}
|
|
54
55
|
sessions = /* @__PURE__ */ new Map();
|
|
@@ -68,6 +69,7 @@ class SessionManager {
|
|
|
68
69
|
sessionLoggerFactory;
|
|
69
70
|
languageModelFactory;
|
|
70
71
|
authResolver;
|
|
72
|
+
executionControl;
|
|
71
73
|
getChatSessionServices() {
|
|
72
74
|
return {
|
|
73
75
|
...this.services,
|
|
@@ -75,7 +77,10 @@ class SessionManager {
|
|
|
75
77
|
...this.languageModelFactory !== void 0 && {
|
|
76
78
|
languageModelFactory: this.languageModelFactory
|
|
77
79
|
},
|
|
78
|
-
authResolver: this.authResolver
|
|
80
|
+
authResolver: this.authResolver,
|
|
81
|
+
...this.executionControl !== void 0 && {
|
|
82
|
+
executionControl: this.executionControl
|
|
83
|
+
}
|
|
79
84
|
};
|
|
80
85
|
}
|
|
81
86
|
/**
|
|
@@ -86,7 +91,6 @@ class SessionManager {
|
|
|
86
91
|
if (this.initialized) {
|
|
87
92
|
return;
|
|
88
93
|
}
|
|
89
|
-
await this.clearPersistedQueuedMessages("startup");
|
|
90
94
|
await this.restoreSessionsFromStorage();
|
|
91
95
|
const cleanupIntervalMs = Math.min(this.sessionTTL / 4, 15 * 60 * 1e3);
|
|
92
96
|
this.cleanupInterval = setInterval(
|
|
@@ -130,32 +134,6 @@ class SessionManager {
|
|
|
130
134
|
);
|
|
131
135
|
}
|
|
132
136
|
}
|
|
133
|
-
async clearPersistedQueuedMessages(reason) {
|
|
134
|
-
try {
|
|
135
|
-
const steerSessionIds = await this.services.steerQueueStore.listSessionIds();
|
|
136
|
-
const followUpSessionIds = await this.services.followUpQueueStore.listSessionIds();
|
|
137
|
-
const sessionIds = Array.from(/* @__PURE__ */ new Set([...steerSessionIds, ...followUpSessionIds]));
|
|
138
|
-
if (sessionIds.length === 0) {
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
await Promise.all(
|
|
142
|
-
sessionIds.flatMap((sessionId) => [
|
|
143
|
-
this.services.steerQueueStore.delete({ sessionId }),
|
|
144
|
-
this.services.followUpQueueStore.delete({ sessionId })
|
|
145
|
-
])
|
|
146
|
-
);
|
|
147
|
-
const message = `${reason === "startup" ? "Cleared stale pending input state from previous agent run" : "Cleared pending input state during agent shutdown"} (${sessionIds.length} session bucket(s))`;
|
|
148
|
-
if (reason === "startup") {
|
|
149
|
-
this.logger.info(message);
|
|
150
|
-
} else {
|
|
151
|
-
this.logger.debug(message);
|
|
152
|
-
}
|
|
153
|
-
} catch (error) {
|
|
154
|
-
this.logger.warn(
|
|
155
|
-
`Failed to clear persisted queued follow-up state during ${reason}: ${error instanceof Error ? error.message : String(error)}`
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
137
|
/**
|
|
160
138
|
* Ensures the SessionManager is initialized before operations.
|
|
161
139
|
*/
|
|
@@ -481,6 +459,7 @@ class SessionManager {
|
|
|
481
459
|
}
|
|
482
460
|
await this.services.sessionStore.deleteSession({ sessionId });
|
|
483
461
|
await this.deleteSessionInteractionState(sessionId);
|
|
462
|
+
await this.deleteSessionPendingInput(sessionId);
|
|
484
463
|
await this.services.conversationStore.clearMessages({ sessionId });
|
|
485
464
|
this.logger.debug(`Deleted session and conversation history: ${sessionId}`);
|
|
486
465
|
}
|
|
@@ -918,9 +897,13 @@ class SessionManager {
|
|
|
918
897
|
this.services.stateManager.clearSessionOverride(sessionId);
|
|
919
898
|
await Promise.all([
|
|
920
899
|
this.services.toolManager.deleteSessionState(sessionId),
|
|
921
|
-
this.services.approvalManager.deleteSessionState(sessionId)
|
|
922
|
-
|
|
923
|
-
|
|
900
|
+
this.services.approvalManager.deleteSessionState(sessionId)
|
|
901
|
+
]);
|
|
902
|
+
}
|
|
903
|
+
async deleteSessionPendingInput(sessionId) {
|
|
904
|
+
await Promise.all([
|
|
905
|
+
this.services.steerQueueStore.clear({ sessionId }),
|
|
906
|
+
this.services.followUpQueueStore.clear({ sessionId })
|
|
924
907
|
]);
|
|
925
908
|
}
|
|
926
909
|
evictSessionInteractionState(sessionId) {
|
|
@@ -989,7 +972,6 @@ class SessionManager {
|
|
|
989
972
|
delete this.cleanupInterval;
|
|
990
973
|
this.logger.debug("Periodic session cleanup stopped");
|
|
991
974
|
}
|
|
992
|
-
await this.clearPersistedQueuedMessages("shutdown");
|
|
993
975
|
const sessionIds = Array.from(this.sessions.keys());
|
|
994
976
|
for (const sessionId of sessionIds) {
|
|
995
977
|
try {
|
|
@@ -8,7 +8,7 @@ import type { ValidatedLLMConfig } from '../llm/schemas.js';
|
|
|
8
8
|
import type { HookManager } from '../hooks/manager.js';
|
|
9
9
|
import type { ApprovalManager } from '../approval/manager.js';
|
|
10
10
|
import type { TokenUsage } from '@dexto/llm';
|
|
11
|
-
import type { LanguageModelFactory } from '../llm/services/types.js';
|
|
11
|
+
import type { LLMExecutionControl, LanguageModelFactory } from '../llm/services/types.js';
|
|
12
12
|
import type { LlmAuthResolver } from '../llm/auth/index.js';
|
|
13
13
|
import type { CompactionStrategy } from '../context/compaction/types.js';
|
|
14
14
|
import { type SessionPromptContributor } from '../systemPrompt/schemas.js';
|
|
@@ -61,6 +61,8 @@ export interface SessionManagerConfig {
|
|
|
61
61
|
languageModelFactory?: LanguageModelFactory;
|
|
62
62
|
/** Host hook for resolving runtime provider auth from local/cloud profiles */
|
|
63
63
|
authResolver?: LlmAuthResolver | null;
|
|
64
|
+
/** Host control for queue continuation behavior. CLI defaults preserve core-owned follow-ups. */
|
|
65
|
+
executionControl?: LLMExecutionControl | undefined;
|
|
64
66
|
}
|
|
65
67
|
type PersistedLLMConfig = Omit<ValidatedLLMConfig, 'apiKey'>;
|
|
66
68
|
export interface SessionData {
|
|
@@ -112,6 +114,7 @@ export declare class SessionManager {
|
|
|
112
114
|
private readonly sessionLoggerFactory;
|
|
113
115
|
private readonly languageModelFactory;
|
|
114
116
|
private readonly authResolver;
|
|
117
|
+
private readonly executionControl;
|
|
115
118
|
constructor(services: {
|
|
116
119
|
stateManager: AgentStateManager;
|
|
117
120
|
systemPromptManager: SystemPromptManager;
|
|
@@ -139,7 +142,6 @@ export declare class SessionManager {
|
|
|
139
142
|
* This allows sessions to survive application restarts.
|
|
140
143
|
*/
|
|
141
144
|
private restoreSessionsFromStorage;
|
|
142
|
-
private clearPersistedQueuedMessages;
|
|
143
145
|
/**
|
|
144
146
|
* Ensures the SessionManager is initialized before operations.
|
|
145
147
|
*/
|
|
@@ -297,6 +299,7 @@ export declare class SessionManager {
|
|
|
297
299
|
private toPersistedLLMConfig;
|
|
298
300
|
private setPersistedSessionLLMOverride;
|
|
299
301
|
private deleteSessionInteractionState;
|
|
302
|
+
private deleteSessionPendingInput;
|
|
300
303
|
private evictSessionInteractionState;
|
|
301
304
|
private runWithSessionDataLock;
|
|
302
305
|
private persistSessionData;
|
|
@@ -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,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ class SessionManager {
|
|
|
19
19
|
this.sessionLoggerFactory = config.sessionLoggerFactory ?? defaultSessionLoggerFactory;
|
|
20
20
|
this.languageModelFactory = config.languageModelFactory;
|
|
21
21
|
this.authResolver = config.authResolver ?? null;
|
|
22
|
+
this.executionControl = config.executionControl;
|
|
22
23
|
this.logger = logger.createChild(DextoLogComponent.SESSION);
|
|
23
24
|
}
|
|
24
25
|
sessions = /* @__PURE__ */ new Map();
|
|
@@ -38,6 +39,7 @@ class SessionManager {
|
|
|
38
39
|
sessionLoggerFactory;
|
|
39
40
|
languageModelFactory;
|
|
40
41
|
authResolver;
|
|
42
|
+
executionControl;
|
|
41
43
|
getChatSessionServices() {
|
|
42
44
|
return {
|
|
43
45
|
...this.services,
|
|
@@ -45,7 +47,10 @@ class SessionManager {
|
|
|
45
47
|
...this.languageModelFactory !== void 0 && {
|
|
46
48
|
languageModelFactory: this.languageModelFactory
|
|
47
49
|
},
|
|
48
|
-
authResolver: this.authResolver
|
|
50
|
+
authResolver: this.authResolver,
|
|
51
|
+
...this.executionControl !== void 0 && {
|
|
52
|
+
executionControl: this.executionControl
|
|
53
|
+
}
|
|
49
54
|
};
|
|
50
55
|
}
|
|
51
56
|
/**
|
|
@@ -56,7 +61,6 @@ class SessionManager {
|
|
|
56
61
|
if (this.initialized) {
|
|
57
62
|
return;
|
|
58
63
|
}
|
|
59
|
-
await this.clearPersistedQueuedMessages("startup");
|
|
60
64
|
await this.restoreSessionsFromStorage();
|
|
61
65
|
const cleanupIntervalMs = Math.min(this.sessionTTL / 4, 15 * 60 * 1e3);
|
|
62
66
|
this.cleanupInterval = setInterval(
|
|
@@ -100,32 +104,6 @@ class SessionManager {
|
|
|
100
104
|
);
|
|
101
105
|
}
|
|
102
106
|
}
|
|
103
|
-
async clearPersistedQueuedMessages(reason) {
|
|
104
|
-
try {
|
|
105
|
-
const steerSessionIds = await this.services.steerQueueStore.listSessionIds();
|
|
106
|
-
const followUpSessionIds = await this.services.followUpQueueStore.listSessionIds();
|
|
107
|
-
const sessionIds = Array.from(/* @__PURE__ */ new Set([...steerSessionIds, ...followUpSessionIds]));
|
|
108
|
-
if (sessionIds.length === 0) {
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
await Promise.all(
|
|
112
|
-
sessionIds.flatMap((sessionId) => [
|
|
113
|
-
this.services.steerQueueStore.delete({ sessionId }),
|
|
114
|
-
this.services.followUpQueueStore.delete({ sessionId })
|
|
115
|
-
])
|
|
116
|
-
);
|
|
117
|
-
const message = `${reason === "startup" ? "Cleared stale pending input state from previous agent run" : "Cleared pending input state during agent shutdown"} (${sessionIds.length} session bucket(s))`;
|
|
118
|
-
if (reason === "startup") {
|
|
119
|
-
this.logger.info(message);
|
|
120
|
-
} else {
|
|
121
|
-
this.logger.debug(message);
|
|
122
|
-
}
|
|
123
|
-
} catch (error) {
|
|
124
|
-
this.logger.warn(
|
|
125
|
-
`Failed to clear persisted queued follow-up state during ${reason}: ${error instanceof Error ? error.message : String(error)}`
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
107
|
/**
|
|
130
108
|
* Ensures the SessionManager is initialized before operations.
|
|
131
109
|
*/
|
|
@@ -451,6 +429,7 @@ class SessionManager {
|
|
|
451
429
|
}
|
|
452
430
|
await this.services.sessionStore.deleteSession({ sessionId });
|
|
453
431
|
await this.deleteSessionInteractionState(sessionId);
|
|
432
|
+
await this.deleteSessionPendingInput(sessionId);
|
|
454
433
|
await this.services.conversationStore.clearMessages({ sessionId });
|
|
455
434
|
this.logger.debug(`Deleted session and conversation history: ${sessionId}`);
|
|
456
435
|
}
|
|
@@ -888,9 +867,13 @@ class SessionManager {
|
|
|
888
867
|
this.services.stateManager.clearSessionOverride(sessionId);
|
|
889
868
|
await Promise.all([
|
|
890
869
|
this.services.toolManager.deleteSessionState(sessionId),
|
|
891
|
-
this.services.approvalManager.deleteSessionState(sessionId)
|
|
892
|
-
|
|
893
|
-
|
|
870
|
+
this.services.approvalManager.deleteSessionState(sessionId)
|
|
871
|
+
]);
|
|
872
|
+
}
|
|
873
|
+
async deleteSessionPendingInput(sessionId) {
|
|
874
|
+
await Promise.all([
|
|
875
|
+
this.services.steerQueueStore.clear({ sessionId }),
|
|
876
|
+
this.services.followUpQueueStore.clear({ sessionId })
|
|
894
877
|
]);
|
|
895
878
|
}
|
|
896
879
|
evictSessionInteractionState(sessionId) {
|
|
@@ -959,7 +942,6 @@ class SessionManager {
|
|
|
959
942
|
delete this.cleanupInterval;
|
|
960
943
|
this.logger.debug("Periodic session cleanup stopped");
|
|
961
944
|
}
|
|
962
|
-
await this.clearPersistedQueuedMessages("shutdown");
|
|
963
945
|
const sessionIds = Array.from(this.sessions.keys());
|
|
964
946
|
for (const sessionId of sessionIds) {
|
|
965
947
|
try {
|
|
@@ -18,21 +18,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var types_exports = {};
|
|
20
20
|
__export(types_exports, {
|
|
21
|
-
PersistedApprovedDirectorySchema: () => PersistedApprovedDirectorySchema,
|
|
22
21
|
SessionApprovalStateSchema: () => SessionApprovalStateSchema
|
|
23
22
|
});
|
|
24
23
|
module.exports = __toCommonJS(types_exports);
|
|
25
24
|
var import_zod = require("zod");
|
|
26
|
-
const PersistedApprovedDirectorySchema = import_zod.z.object({
|
|
27
|
-
path: import_zod.z.string(),
|
|
28
|
-
type: import_zod.z.enum(["session", "once"])
|
|
29
|
-
}).strict();
|
|
30
25
|
const SessionApprovalStateSchema = import_zod.z.object({
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}).strict();
|
|
26
|
+
approvedKeys: import_zod.z.record(import_zod.z.string(), import_zod.z.enum(["session", "once"])).default({})
|
|
27
|
+
}).strip();
|
|
34
28
|
// Annotate the CommonJS export names for ESM import in node:
|
|
35
29
|
0 && (module.exports = {
|
|
36
|
-
PersistedApprovedDirectorySchema,
|
|
37
30
|
SessionApprovalStateSchema
|
|
38
31
|
});
|
|
@@ -1,23 +1,11 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import type { ApprovalRequest, ApprovalResponse } from '../../approval/types.js';
|
|
3
|
-
export declare const
|
|
4
|
-
|
|
5
|
-
type: z.ZodEnum<{
|
|
3
|
+
export declare const SessionApprovalStateSchema: z.ZodObject<{
|
|
4
|
+
approvedKeys: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodEnum<{
|
|
6
5
|
session: "session";
|
|
7
6
|
once: "once";
|
|
8
|
-
}
|
|
9
|
-
}, z.core.$
|
|
10
|
-
export declare const SessionApprovalStateSchema: z.ZodObject<{
|
|
11
|
-
toolPatterns: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
|
|
12
|
-
approvedDirectories: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
13
|
-
path: z.ZodString;
|
|
14
|
-
type: z.ZodEnum<{
|
|
15
|
-
session: "session";
|
|
16
|
-
once: "once";
|
|
17
|
-
}>;
|
|
18
|
-
}, z.core.$strict>>>;
|
|
19
|
-
}, z.core.$strict>;
|
|
20
|
-
export type PersistedApprovedDirectory = z.output<typeof PersistedApprovedDirectorySchema>;
|
|
7
|
+
}>>>;
|
|
8
|
+
}, z.core.$strip>;
|
|
21
9
|
export type SessionApprovalState = z.output<typeof SessionApprovalStateSchema>;
|
|
22
10
|
export interface ApprovalStore {
|
|
23
11
|
/** Persist the request if the approval id is not already present. Must not overwrite. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/storage/approvals/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/storage/approvals/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,eAAO,MAAM,0BAA0B;;;;;iBAI3B,CAAC;AAEb,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE/E,MAAM,WAAW,aAAa;IAC1B,yFAAyF;IACzF,aAAa,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,eAAe,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7E,UAAU,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IAChF,WAAW,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACvE,2FAA2F;IAC3F,YAAY,CAAC,KAAK,EAAE;QAChB,QAAQ,EAAE,gBAAgB,CAAC;KAC9B,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAAA;KAAE,CAAC,CAAC;IAC5E,WAAW,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAClF,gBAAgB,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC/E,gBAAgB,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,oBAAoB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,kBAAkB,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE"}
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import "../../chunk-C6A6W6XS.js";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
const PersistedApprovedDirectorySchema = z.object({
|
|
4
|
-
path: z.string(),
|
|
5
|
-
type: z.enum(["session", "once"])
|
|
6
|
-
}).strict();
|
|
7
3
|
const SessionApprovalStateSchema = z.object({
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}).strict();
|
|
4
|
+
approvedKeys: z.record(z.string(), z.enum(["session", "once"])).default({})
|
|
5
|
+
}).strip();
|
|
11
6
|
export {
|
|
12
|
-
PersistedApprovedDirectorySchema,
|
|
13
7
|
SessionApprovalStateSchema
|
|
14
8
|
};
|
|
@@ -12,6 +12,11 @@ export interface Database {
|
|
|
12
12
|
delete(key: string): Promise<void>;
|
|
13
13
|
list(prefix: string): Promise<string[]>;
|
|
14
14
|
append<T>(key: string, item: T): Promise<void>;
|
|
15
|
+
/** Atomically replace a list with the updater result for one key. */
|
|
16
|
+
updateList<T, R>(key: string, updater: (items: T[]) => {
|
|
17
|
+
items: T[];
|
|
18
|
+
result: R;
|
|
19
|
+
}): Promise<R>;
|
|
15
20
|
/** Get a range of items in chronological order (oldest first, matching insertion order) */
|
|
16
21
|
getRange<T>(key: string, start: number, count: number): Promise<T[]>;
|
|
17
22
|
connect(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/storage/database/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,QAAQ;IAErB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC5C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAChF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGnC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAGxC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,2FAA2F;IAC3F,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAGrE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC;IACvB,YAAY,IAAI,MAAM,CAAC;CAC1B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/storage/database/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,QAAQ;IAErB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC5C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAChF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGnC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAGxC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,qEAAqE;IACrE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK;QAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAAC,MAAM,EAAE,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9F,2FAA2F;IAC3F,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAGrE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC;IACvB,YAAY,IAAI,MAAM,CAAC;CAC1B"}
|
package/dist/storage/index.cjs
CHANGED
|
@@ -32,7 +32,6 @@ __export(storage_exports, {
|
|
|
32
32
|
DatabaseBackedWorkspaceStore: () => import_backend.DatabaseBackedWorkspaceStore,
|
|
33
33
|
DatabaseConversationStore: () => import_database.DatabaseConversationStore,
|
|
34
34
|
InMemoryDextoStores: () => import_in_memory.InMemoryDextoStores,
|
|
35
|
-
PersistedApprovedDirectorySchema: () => import_types.PersistedApprovedDirectorySchema,
|
|
36
35
|
SESSION_FOLLOW_UP_QUEUE_KEY_PREFIX: () => import_backend.SESSION_FOLLOW_UP_QUEUE_KEY_PREFIX,
|
|
37
36
|
SESSION_STEER_QUEUE_KEY_PREFIX: () => import_backend.SESSION_STEER_QUEUE_KEY_PREFIX,
|
|
38
37
|
SessionApprovalStateSchema: () => import_types.SessionApprovalStateSchema,
|
|
@@ -62,7 +61,6 @@ var import_types = require("./approvals/types.js");
|
|
|
62
61
|
DatabaseBackedWorkspaceStore,
|
|
63
62
|
DatabaseConversationStore,
|
|
64
63
|
InMemoryDextoStores,
|
|
65
|
-
PersistedApprovedDirectorySchema,
|
|
66
64
|
SESSION_FOLLOW_UP_QUEUE_KEY_PREFIX,
|
|
67
65
|
SESSION_STEER_QUEUE_KEY_PREFIX,
|
|
68
66
|
SessionApprovalStateSchema,
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -19,8 +19,8 @@ export type { SessionStore } from './sessions/types.js';
|
|
|
19
19
|
export type { MemoryStore } from './memories/types.js';
|
|
20
20
|
export type { WorkspaceStore } from './workspaces/types.js';
|
|
21
21
|
export type { CustomPromptStore } from './prompts/types.js';
|
|
22
|
-
export {
|
|
23
|
-
export type { ApprovalStore,
|
|
22
|
+
export { SessionApprovalStateSchema } from './approvals/types.js';
|
|
23
|
+
export type { ApprovalStore, SessionApprovalState } from './approvals/types.js';
|
|
24
24
|
export type { ToolPreferenceStore } from './tool-preferences/types.js';
|
|
25
25
|
export type { ToolStateStore } from './tool-state/types.js';
|
|
26
26
|
export type { SessionMessageQueueStore } from './message-queue/types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EACR,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACR,SAAS,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACH,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAC3B,+BAA+B,EAC/B,yBAAyB,EACzB,+BAA+B,EAC/B,sCAAsC,EACtC,0BAA0B,EAC1B,gCAAgC,EAChC,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,EAC5B,kCAAkC,EAClC,8BAA8B,GACjC,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EACR,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACR,SAAS,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACH,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAC3B,+BAA+B,EAC/B,yBAAyB,EACzB,+BAA+B,EAC/B,sCAAsC,EACtC,0BAA0B,EAC1B,gCAAgC,EAChC,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,EAC5B,kCAAkC,EAClC,8BAA8B,GACjC,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChF,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EACR,YAAY,EACZ,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,sBAAsB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACvF,YAAY,EACR,4BAA4B,EAC5B,4BAA4B,EAC5B,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,GACrB,MAAM,4BAA4B,CAAC"}
|
package/dist/storage/index.js
CHANGED
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
SESSION_STEER_QUEUE_KEY_PREFIX
|
|
20
20
|
} from "./stores/backend.js";
|
|
21
21
|
import { DatabaseConversationStore } from "./conversation/database.js";
|
|
22
|
-
import {
|
|
22
|
+
import { SessionApprovalStateSchema } from "./approvals/types.js";
|
|
23
23
|
export {
|
|
24
24
|
BackendDextoStores,
|
|
25
25
|
DatabaseBackedApprovalStore,
|
|
@@ -35,7 +35,6 @@ export {
|
|
|
35
35
|
DatabaseBackedWorkspaceStore,
|
|
36
36
|
DatabaseConversationStore,
|
|
37
37
|
InMemoryDextoStores,
|
|
38
|
-
PersistedApprovedDirectorySchema,
|
|
39
38
|
SESSION_FOLLOW_UP_QUEUE_KEY_PREFIX,
|
|
40
39
|
SESSION_STEER_QUEUE_KEY_PREFIX,
|
|
41
40
|
SessionApprovalStateSchema,
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
import type { QueuedMessage } from '../../session/types.js';
|
|
2
2
|
export interface SessionMessageQueueStore {
|
|
3
|
-
|
|
4
|
-
load(input: {
|
|
3
|
+
list(input: {
|
|
5
4
|
sessionId: string;
|
|
6
5
|
}): Promise<QueuedMessage[]>;
|
|
7
|
-
|
|
6
|
+
append(input: {
|
|
8
7
|
sessionId: string;
|
|
9
|
-
|
|
10
|
-
}): Promise<
|
|
11
|
-
|
|
8
|
+
message: QueuedMessage;
|
|
9
|
+
}): Promise<{
|
|
10
|
+
position: number;
|
|
11
|
+
}>;
|
|
12
|
+
takeAll(input: {
|
|
13
|
+
sessionId: string;
|
|
14
|
+
}): Promise<QueuedMessage[]>;
|
|
15
|
+
remove(input: {
|
|
16
|
+
sessionId: string;
|
|
17
|
+
id: string;
|
|
18
|
+
}): Promise<boolean>;
|
|
19
|
+
clear(input: {
|
|
12
20
|
sessionId: string;
|
|
13
21
|
}): Promise<void>;
|
|
14
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/storage/message-queue/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,WAAW,wBAAwB;IACrC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/storage/message-queue/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,WAAW,wBAAwB;IACrC,IAAI,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5F,OAAO,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD"}
|
|
@@ -45,6 +45,7 @@ const MEMORY_KEY_PREFIX = "memory:item:";
|
|
|
45
45
|
const CUSTOM_PROMPT_KEY_PREFIX = "prompt:custom:";
|
|
46
46
|
const RUNTIME_EVENTS_KEY = "runtime-events";
|
|
47
47
|
const RUNTIME_EVENTS_LIMIT = 1e4;
|
|
48
|
+
const SESSION_MESSAGE_QUEUE_READ_LIMIT = 1e4;
|
|
48
49
|
const TOOL_EXECUTION_KEY_PREFIX = "tool-execution:";
|
|
49
50
|
const TOOL_STATE_KEY_PREFIX = "tool-state:";
|
|
50
51
|
const WORKSPACE_KEY_PREFIX = "workspace:item:";
|
|
@@ -52,8 +53,7 @@ const WORKSPACE_CURRENT_KEY = "workspace:current";
|
|
|
52
53
|
const SESSION_STEER_QUEUE_KEY_PREFIX = "session-steer-queue";
|
|
53
54
|
const SESSION_FOLLOW_UP_QUEUE_KEY_PREFIX = "session-follow-up-queue";
|
|
54
55
|
const DEFAULT_APPROVAL_STATE = {
|
|
55
|
-
|
|
56
|
-
approvedDirectories: []
|
|
56
|
+
approvedKeys: {}
|
|
57
57
|
};
|
|
58
58
|
const DEFAULT_TOOL_PREFERENCES = {
|
|
59
59
|
userAutoApproveTools: [],
|
|
@@ -431,51 +431,87 @@ class DatabaseBackedToolPreferenceStore {
|
|
|
431
431
|
}
|
|
432
432
|
}
|
|
433
433
|
class DatabaseBackedSessionMessageQueueStore {
|
|
434
|
-
constructor(database,
|
|
434
|
+
constructor(database, logger, keyPrefix) {
|
|
435
435
|
this.database = database;
|
|
436
|
-
this.cache = cache;
|
|
437
436
|
this.logger = logger;
|
|
438
437
|
this.keyPrefix = keyPrefix;
|
|
439
438
|
}
|
|
440
|
-
async
|
|
441
|
-
|
|
442
|
-
const keys = await this.database.list(prefix);
|
|
443
|
-
return keys.map((key) => key.replace(prefix, ""));
|
|
439
|
+
async list(input) {
|
|
440
|
+
return await this.loadQueue(input.sessionId);
|
|
444
441
|
}
|
|
445
|
-
async
|
|
442
|
+
async append(input) {
|
|
446
443
|
const key = this.key(input.sessionId);
|
|
447
|
-
const
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
444
|
+
const result = await this.database.updateList(
|
|
445
|
+
key,
|
|
446
|
+
(stored) => {
|
|
447
|
+
const queue = this.parseQueue(key, stored);
|
|
448
|
+
const nextQueue = [...queue, (0, import_queue_clone.cloneQueuedMessage)(input.message)];
|
|
449
|
+
return {
|
|
450
|
+
items: nextQueue,
|
|
451
|
+
result: {
|
|
452
|
+
position: nextQueue.length
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
);
|
|
457
|
+
return result;
|
|
458
|
+
}
|
|
459
|
+
async takeAll(input) {
|
|
460
|
+
const key = this.key(input.sessionId);
|
|
461
|
+
const queue = await this.database.updateList(key, (stored) => ({
|
|
462
|
+
items: [],
|
|
463
|
+
result: this.parseQueue(key, stored)
|
|
464
|
+
}));
|
|
465
|
+
return queue;
|
|
466
|
+
}
|
|
467
|
+
async remove(input) {
|
|
468
|
+
const key = this.key(input.sessionId);
|
|
469
|
+
const removed = await this.database.updateList(key, (stored) => {
|
|
470
|
+
const queue = this.parseQueue(key, stored);
|
|
471
|
+
const updatedQueue = queue.filter((message) => message.id !== input.id);
|
|
472
|
+
return {
|
|
473
|
+
items: updatedQueue,
|
|
474
|
+
result: updatedQueue.length !== queue.length
|
|
475
|
+
};
|
|
476
|
+
});
|
|
477
|
+
return removed;
|
|
478
|
+
}
|
|
479
|
+
async clear(input) {
|
|
480
|
+
const key = this.key(input.sessionId);
|
|
481
|
+
await this.database.updateList(key, () => ({
|
|
482
|
+
items: [],
|
|
483
|
+
result: void 0
|
|
484
|
+
}));
|
|
485
|
+
}
|
|
486
|
+
async loadQueue(sessionId) {
|
|
487
|
+
const key = this.key(sessionId);
|
|
488
|
+
const stored = [];
|
|
489
|
+
let offset = 0;
|
|
490
|
+
while (true) {
|
|
491
|
+
const page = await this.database.getRange(
|
|
492
|
+
key,
|
|
493
|
+
offset,
|
|
494
|
+
SESSION_MESSAGE_QUEUE_READ_LIMIT
|
|
495
|
+
);
|
|
496
|
+
stored.push(...page);
|
|
497
|
+
if (page.length < SESSION_MESSAGE_QUEUE_READ_LIMIT) {
|
|
498
|
+
break;
|
|
499
|
+
}
|
|
500
|
+
offset += SESSION_MESSAGE_QUEUE_READ_LIMIT;
|
|
451
501
|
}
|
|
452
|
-
|
|
502
|
+
return this.parseQueue(key, stored);
|
|
503
|
+
}
|
|
504
|
+
parseQueue(key, stored) {
|
|
453
505
|
const storedQueue = import_types.QueuedMessagesSchema.safeParse(stored);
|
|
454
506
|
if (!storedQueue.success) {
|
|
455
|
-
if (stored
|
|
507
|
+
if (stored.length > 0) {
|
|
456
508
|
this.logger.warn("Invalid persisted message queue encountered; ignoring state", {
|
|
457
509
|
key
|
|
458
510
|
});
|
|
459
511
|
}
|
|
460
512
|
return [];
|
|
461
513
|
}
|
|
462
|
-
|
|
463
|
-
await this.cache.set(key, queue, 3600);
|
|
464
|
-
return (0, import_queue_clone.cloneQueuedMessages)(queue);
|
|
465
|
-
}
|
|
466
|
-
async save(input) {
|
|
467
|
-
const key = this.key(input.sessionId);
|
|
468
|
-
if (input.queue.length === 0) {
|
|
469
|
-
await this.delete({ sessionId: input.sessionId });
|
|
470
|
-
return;
|
|
471
|
-
}
|
|
472
|
-
const queue = (0, import_queue_clone.cloneQueuedMessages)(input.queue);
|
|
473
|
-
await this.database.set(key, queue);
|
|
474
|
-
await this.cache.set(key, queue, 3600);
|
|
475
|
-
}
|
|
476
|
-
async delete(input) {
|
|
477
|
-
const key = this.key(input.sessionId);
|
|
478
|
-
await Promise.all([this.database.delete(key), this.cache.delete(key)]);
|
|
514
|
+
return (0, import_queue_clone.cloneQueuedMessages)(storedQueue.data);
|
|
479
515
|
}
|
|
480
516
|
key(sessionId) {
|
|
481
517
|
return `${this.keyPrefix}:${sessionId}`;
|
|
@@ -188,21 +188,30 @@ export declare class DatabaseBackedToolPreferenceStore implements ToolPreference
|
|
|
188
188
|
}
|
|
189
189
|
export declare class DatabaseBackedSessionMessageQueueStore implements SessionMessageQueueStore {
|
|
190
190
|
private readonly database;
|
|
191
|
-
private readonly cache;
|
|
192
191
|
private readonly logger;
|
|
193
192
|
private readonly keyPrefix;
|
|
194
|
-
constructor(database: Database,
|
|
195
|
-
|
|
196
|
-
load(input: {
|
|
193
|
+
constructor(database: Database, logger: Logger, keyPrefix: SessionMessageQueueKeyPrefix);
|
|
194
|
+
list(input: {
|
|
197
195
|
sessionId: string;
|
|
198
196
|
}): Promise<QueuedMessage[]>;
|
|
199
|
-
|
|
197
|
+
append(input: {
|
|
200
198
|
sessionId: string;
|
|
201
|
-
|
|
202
|
-
}): Promise<
|
|
203
|
-
|
|
199
|
+
message: QueuedMessage;
|
|
200
|
+
}): Promise<{
|
|
201
|
+
position: number;
|
|
202
|
+
}>;
|
|
203
|
+
takeAll(input: {
|
|
204
|
+
sessionId: string;
|
|
205
|
+
}): Promise<QueuedMessage[]>;
|
|
206
|
+
remove(input: {
|
|
207
|
+
sessionId: string;
|
|
208
|
+
id: string;
|
|
209
|
+
}): Promise<boolean>;
|
|
210
|
+
clear(input: {
|
|
204
211
|
sessionId: string;
|
|
205
212
|
}): Promise<void>;
|
|
213
|
+
private loadQueue;
|
|
214
|
+
private parseQueue;
|
|
206
215
|
private key;
|
|
207
216
|
}
|
|
208
217
|
export declare class DatabaseBackedCustomPromptStore implements CustomPromptStore {
|