opencode-graphiti 0.2.4-canary.ff69c1e.20260510125244 → 0.2.4
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/esm/src/handlers/chat.js +2 -2
- package/esm/src/handlers/compacting.d.ts.map +1 -1
- package/esm/src/handlers/compacting.js +3 -3
- package/esm/src/handlers/messages.d.ts.map +1 -1
- package/esm/src/handlers/messages.js +8 -15
- package/esm/src/index.d.ts.map +1 -1
- package/esm/src/index.js +14 -86
- package/esm/src/services/opencode-warning.d.ts +0 -1
- package/esm/src/services/opencode-warning.d.ts.map +1 -1
- package/esm/src/services/opencode-warning.js +0 -3
- package/esm/src/services/redis-snapshot.d.ts +0 -8
- package/esm/src/services/redis-snapshot.d.ts.map +1 -1
- package/esm/src/services/redis-snapshot.js +0 -12
- package/esm/src/services/runtime-teardown.d.ts +0 -1
- package/esm/src/services/runtime-teardown.d.ts.map +1 -1
- package/esm/src/services/runtime-teardown.js +4 -13
- package/esm/src/services/session-mcp-runtime.d.ts +1 -11
- package/esm/src/services/session-mcp-runtime.d.ts.map +1 -1
- package/esm/src/services/session-mcp-runtime.js +30 -169
- package/esm/src/services/session-mcp-types.d.ts +21 -171
- package/esm/src/services/session-mcp-types.d.ts.map +1 -1
- package/esm/src/services/session-mcp-types.js +5 -47
- package/esm/src/session.d.ts +1 -7
- package/esm/src/session.d.ts.map +1 -1
- package/esm/src/session.js +13 -36
- package/esm/src/types/index.d.ts +0 -14
- package/esm/src/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/script/src/handlers/chat.js +2 -2
- package/script/src/handlers/compacting.d.ts.map +1 -1
- package/script/src/handlers/compacting.js +3 -3
- package/script/src/handlers/messages.d.ts.map +1 -1
- package/script/src/handlers/messages.js +8 -15
- package/script/src/index.d.ts.map +1 -1
- package/script/src/index.js +12 -84
- package/script/src/services/opencode-warning.d.ts +0 -1
- package/script/src/services/opencode-warning.d.ts.map +1 -1
- package/script/src/services/opencode-warning.js +1 -5
- package/script/src/services/redis-snapshot.d.ts +0 -8
- package/script/src/services/redis-snapshot.d.ts.map +1 -1
- package/script/src/services/redis-snapshot.js +1 -14
- package/script/src/services/runtime-teardown.d.ts +0 -1
- package/script/src/services/runtime-teardown.d.ts.map +1 -1
- package/script/src/services/runtime-teardown.js +4 -15
- package/script/src/services/session-mcp-runtime.d.ts +1 -11
- package/script/src/services/session-mcp-runtime.d.ts.map +1 -1
- package/script/src/services/session-mcp-runtime.js +31 -170
- package/script/src/services/session-mcp-types.d.ts +21 -171
- package/script/src/services/session-mcp-types.d.ts.map +1 -1
- package/script/src/services/session-mcp-types.js +5 -47
- package/script/src/session.d.ts +1 -7
- package/script/src/session.d.ts.map +1 -1
- package/script/src/session.js +13 -36
- package/script/src/types/index.d.ts +0 -14
- package/script/src/types/index.d.ts.map +1 -1
- package/esm/src/services/dream-store.d.ts +0 -21
- package/esm/src/services/dream-store.d.ts.map +0 -1
- package/esm/src/services/dream-store.js +0 -96
- package/esm/src/services/exact-history.d.ts +0 -10
- package/esm/src/services/exact-history.d.ts.map +0 -1
- package/esm/src/services/exact-history.js +0 -3
- package/esm/src/services/memory-results.d.ts +0 -6
- package/esm/src/services/memory-results.d.ts.map +0 -1
- package/esm/src/services/memory-results.js +0 -23
- package/esm/src/services/memory-search.d.ts +0 -29
- package/esm/src/services/memory-search.d.ts.map +0 -1
- package/esm/src/services/memory-search.js +0 -53
- package/esm/src/services/session-notes.d.ts +0 -70
- package/esm/src/services/session-notes.d.ts.map +0 -1
- package/esm/src/services/session-notes.js +0 -438
- package/script/src/services/dream-store.d.ts +0 -21
- package/script/src/services/dream-store.d.ts.map +0 -1
- package/script/src/services/dream-store.js +0 -100
- package/script/src/services/exact-history.d.ts +0 -10
- package/script/src/services/exact-history.d.ts.map +0 -1
- package/script/src/services/exact-history.js +0 -7
- package/script/src/services/memory-results.d.ts +0 -6
- package/script/src/services/memory-results.d.ts.map +0 -1
- package/script/src/services/memory-results.js +0 -28
- package/script/src/services/memory-search.d.ts +0 -29
- package/script/src/services/memory-search.d.ts.map +0 -1
- package/script/src/services/memory-search.js +0 -58
- package/script/src/services/session-notes.d.ts +0 -70
- package/script/src/services/session-notes.d.ts.map +0 -1
- package/script/src/services/session-notes.js +0 -443
package/esm/src/handlers/chat.js
CHANGED
|
@@ -34,7 +34,7 @@ export function createChatHandler(deps) {
|
|
|
34
34
|
if (prepared) {
|
|
35
35
|
state.injectedMemories = true;
|
|
36
36
|
}
|
|
37
|
-
logger.info("Prepared local memory for chat transform", {
|
|
37
|
+
logger.info("Prepared local session memory for chat transform", {
|
|
38
38
|
sessionID: canonicalSessionId,
|
|
39
39
|
sourceSessionID: sessionID,
|
|
40
40
|
hotTierReady: state.hotTierReady,
|
|
@@ -48,7 +48,7 @@ export function createChatHandler(deps) {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
catch (error) {
|
|
51
|
-
logger.warn("Unable to prepare local memory for chat transform", {
|
|
51
|
+
logger.warn("Unable to prepare local session memory for chat transform", {
|
|
52
52
|
sessionID,
|
|
53
53
|
error,
|
|
54
54
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compacting.d.ts","sourceRoot":"","sources":["../../../src/src/handlers/compacting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,KAAK,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;AAI5E,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,qBAAqB,GAC1B,cAAc,
|
|
1
|
+
{"version":3,"file":"compacting.d.ts","sourceRoot":"","sources":["../../../src/src/handlers/compacting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,KAAK,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;AAI5E,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,qBAAqB,GAC1B,cAAc,CAmChB"}
|
|
@@ -9,19 +9,19 @@ export function createCompactingHandler(deps) {
|
|
|
9
9
|
if (!state?.isMain)
|
|
10
10
|
return;
|
|
11
11
|
sessionManager.markResolvedSessionActive(sessionID, canonicalSessionId);
|
|
12
|
-
const prepared = await sessionManager.prepareInjection(canonicalSessionId
|
|
12
|
+
const prepared = await sessionManager.prepareInjection(canonicalSessionId);
|
|
13
13
|
if (!prepared?.envelope)
|
|
14
14
|
return;
|
|
15
15
|
output.context.push(prepared.envelope);
|
|
16
16
|
sessionManager.clearPendingInjection(state, prepared);
|
|
17
|
-
logger.info("Injected local
|
|
17
|
+
logger.info("Injected local session_memory into compaction context", {
|
|
18
18
|
sessionID: canonicalSessionId,
|
|
19
19
|
sourceSessionID: sessionID,
|
|
20
20
|
hotTierReady: state.hotTierReady,
|
|
21
21
|
});
|
|
22
22
|
}
|
|
23
23
|
catch (error) {
|
|
24
|
-
logger.warn("Unable to prepare local memory for compaction", {
|
|
24
|
+
logger.warn("Unable to prepare local session memory for compaction", {
|
|
25
25
|
sessionID,
|
|
26
26
|
error,
|
|
27
27
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/src/handlers/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,KAAK,qBAAqB,GAAG,WAAW,CACtC,KAAK,CAAC,sCAAsC,CAAC,CAC9C,CAAC;AAIF,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,cAAc,CAAC;CAChC;
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/src/handlers/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,KAAK,qBAAqB,GAAG,WAAW,CACtC,KAAK,CAAC,sCAAsC,CAAC,CAC9C,CAAC;AAIF,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,cAAc,CAAC;CAChC;AAyFD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,GACxB,qBAAqB,CAmEvB"}
|
|
@@ -9,24 +9,16 @@ const getTransformMessage = (input) => {
|
|
|
9
9
|
return typeof message === "string" ? message : undefined;
|
|
10
10
|
};
|
|
11
11
|
const LEADING_SESSION_MEMORY_BLOCK = /^<session_memory\b[^>]*>[\s\S]*?<\/session_memory>(?:\r?\n){0,2}/;
|
|
12
|
-
const
|
|
12
|
+
const LEADING_INJECTED_LEGACY_MEMORY_BLOCK_WITH_UUIDS = /^<memory\b(?=[^>]*\bdata-uuids=(["'])(?:[^"']*)\1)[^>]*>[\s\S]*?<\/memory>(?:\r?\n){0,2}/;
|
|
13
|
+
const LEADING_INJECTED_EMPTY_LEGACY_MEMORY_BLOCK = /^<memory\b(?![^>]*\bdata-uuids=)[^>]*>\s*<\/memory>(?:\r?\n){0,2}/;
|
|
13
14
|
const LEADING_PERSISTENT_MEMORY_BLOCK = /^<persistent_memory\b[^>]*>[\s\S]*?<\/persistent_memory>(?:\r?\n){0,2}/;
|
|
14
15
|
const SESSION_MEMORY_SOURCE_ATTR_PATTERN = /<session_memory\b[^>]*\bsource=(['"])[^'"]+\1/i;
|
|
15
16
|
const SESSION_MEMORY_GENERATED_SECTION_PATTERN = /<(?:session_snapshot|persistent_memory)\b/i;
|
|
16
|
-
const MEMORY_VERSION_ATTR_PATTERN = /<memory\b[^>]*\bversion=(['"])2\1/i;
|
|
17
|
-
const LEGACY_MEMORY_UUID_ATTR_PATTERN = /<memory\b[^>]*\bdata-uuids=(['"])(?:[^'"]*)\1/i;
|
|
18
|
-
const EMPTY_MEMORY_BLOCK_PATTERN = /^<memory\b[^>]*>\s*<\/memory>$/i;
|
|
19
|
-
const MEMORY_GENERATED_SECTION_PATTERN = /<(?:session_snapshot|persistent_memory)\b/i;
|
|
20
17
|
const PERSISTENT_MEMORY_GENERATED_CONTENT_PATTERN = /<(?:node|fact|episode)\b/i;
|
|
21
18
|
const USER_MEMORY_ENVELOPE_TAG_PATTERN = /<\/?(?:session_memory|memory|persistent_memory)\b[^>]*>/gi;
|
|
22
19
|
const looksLikeInjectedSessionMemoryBlock = (block, allowAttrlessFollowup) => SESSION_MEMORY_SOURCE_ATTR_PATTERN.test(block) ||
|
|
23
20
|
SESSION_MEMORY_GENERATED_SECTION_PATTERN.test(block) ||
|
|
24
21
|
allowAttrlessFollowup;
|
|
25
|
-
const looksLikeInjectedMemoryBlock = (block, allowAttrlessFollowup) => MEMORY_VERSION_ATTR_PATTERN.test(block) ||
|
|
26
|
-
LEGACY_MEMORY_UUID_ATTR_PATTERN.test(block) ||
|
|
27
|
-
EMPTY_MEMORY_BLOCK_PATTERN.test(block) ||
|
|
28
|
-
MEMORY_GENERATED_SECTION_PATTERN.test(block) ||
|
|
29
|
-
allowAttrlessFollowup;
|
|
30
22
|
const looksLikeInjectedPersistentMemoryBlock = (block) => PERSISTENT_MEMORY_GENERATED_CONTENT_PATTERN.test(block);
|
|
31
23
|
const scrubPromptMemoryText = (text) => {
|
|
32
24
|
let scrubbed = text;
|
|
@@ -41,10 +33,11 @@ const scrubPromptMemoryText = (text) => {
|
|
|
41
33
|
scrubbedInjectedPrefix = true;
|
|
42
34
|
continue;
|
|
43
35
|
}
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
36
|
+
const next = scrubbed
|
|
37
|
+
.replace(LEADING_INJECTED_LEGACY_MEMORY_BLOCK_WITH_UUIDS, "")
|
|
38
|
+
.replace(LEADING_INJECTED_EMPTY_LEGACY_MEMORY_BLOCK, "");
|
|
39
|
+
if (next !== scrubbed) {
|
|
40
|
+
scrubbed = next;
|
|
48
41
|
scrubbedInjectedPrefix = true;
|
|
49
42
|
continue;
|
|
50
43
|
}
|
|
@@ -90,7 +83,7 @@ export function createMessagesHandler(deps) {
|
|
|
90
83
|
return;
|
|
91
84
|
}
|
|
92
85
|
textPart.text = `${prepared.envelope}\n\n${effectiveUserText}`;
|
|
93
|
-
logger.info("Injected canonical
|
|
86
|
+
logger.info("Injected canonical session_memory block", {
|
|
94
87
|
sessionID: canonicalSessionId,
|
|
95
88
|
sourceSessionID,
|
|
96
89
|
rewroteExistingMemory: scrubbedUserText !== latestUserText,
|
package/esm/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAsE/D,eAAO,MAAM,gCAAgC,GAC3C,WAAW,OAAO,EAClB,UAAU,MAAM,KACf,IAOF,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,WAAW,OAAO,EAClB,UAAU,MAAM,KACf,IAOF,CAAC;AA+BF,eAAO,MAAM,QAAQ,EAAE,MA0OtB,CAAC"}
|
package/esm/src/index.js
CHANGED
|
@@ -11,32 +11,18 @@ import { GraphitiConnectionManager } from "./services/connection-manager.js";
|
|
|
11
11
|
import { GraphitiAsyncService } from "./services/graphiti-async.js";
|
|
12
12
|
import { GraphitiMcpClient } from "./services/graphiti-mcp.js";
|
|
13
13
|
import { redactEndpointUserInfo } from "./services/endpoint-redaction.js";
|
|
14
|
-
import {
|
|
14
|
+
import { notifyGraphitiAvailabilityIssue, setOpenCodeClient, } from "./services/opencode-warning.js";
|
|
15
15
|
import { RedisCacheService } from "./services/redis-cache.js";
|
|
16
16
|
import { RedisClient } from "./services/redis-client.js";
|
|
17
17
|
import { RedisEventsService } from "./services/redis-events.js";
|
|
18
|
-
import { DreamStore } from "./services/dream-store.js";
|
|
19
18
|
import { logger } from "./services/logger.js";
|
|
20
|
-
import { SessionNotesService } from "./services/session-notes.js";
|
|
21
19
|
import { RedisSnapshotService } from "./services/redis-snapshot.js";
|
|
22
20
|
import { registerRuntimeTeardown } from "./services/runtime-teardown.js";
|
|
23
21
|
import { createSessionExecutor } from "./services/session-executor.js";
|
|
24
|
-
import { createSessionMcpRuntime
|
|
22
|
+
import { createSessionMcpRuntime } from "./services/session-mcp-runtime.js";
|
|
25
23
|
import { ToolGuidanceCache } from "./services/tool-guidance-cache.js";
|
|
26
24
|
import { ToolRoutingOutcomeCache } from "./services/tool-routing-outcome-cache.js";
|
|
27
25
|
import { makeGroupId, makeUserGroupId } from "./utils.js";
|
|
28
|
-
const getTrackedRootSessionIds = (sessionManager) => {
|
|
29
|
-
const manager = sessionManager;
|
|
30
|
-
const tracked = manager.getTrackedRootSessionIds;
|
|
31
|
-
if (typeof tracked === "function") {
|
|
32
|
-
return tracked.call(sessionManager);
|
|
33
|
-
}
|
|
34
|
-
if (!(manager.sessions instanceof Map))
|
|
35
|
-
return [];
|
|
36
|
-
return [...manager.sessions.entries()]
|
|
37
|
-
.filter(([, state]) => state?.isMain)
|
|
38
|
-
.map(([sessionId]) => sessionId);
|
|
39
|
-
};
|
|
40
26
|
let activeRuntimeTeardown = null;
|
|
41
27
|
let runtimeInitialization = Promise.resolve();
|
|
42
28
|
export const warnOnGraphitiStartupUnavailable = (connected, endpoint) => {
|
|
@@ -54,7 +40,6 @@ export const warnOnRedisStartupUnavailable = (connected, endpoint) => {
|
|
|
54
40
|
const defaultGraphitiDependencies = {
|
|
55
41
|
loadConfig,
|
|
56
42
|
setOpenCodeClient,
|
|
57
|
-
notifyDreamShutdownDelay,
|
|
58
43
|
warnOnGraphitiStartupUnavailable,
|
|
59
44
|
warnOnRedisStartupUnavailable,
|
|
60
45
|
GraphitiConnectionManager,
|
|
@@ -64,8 +49,6 @@ const defaultGraphitiDependencies = {
|
|
|
64
49
|
RedisEventsService,
|
|
65
50
|
RedisSnapshotService,
|
|
66
51
|
RedisCacheService,
|
|
67
|
-
DreamStore,
|
|
68
|
-
SessionNotesService,
|
|
69
52
|
BatchDrainService,
|
|
70
53
|
GraphitiAsyncService,
|
|
71
54
|
createSessionExecutor,
|
|
@@ -81,7 +64,6 @@ const defaultGraphitiDependencies = {
|
|
|
81
64
|
ToolRoutingOutcomeCache,
|
|
82
65
|
makeGroupId,
|
|
83
66
|
makeUserGroupId,
|
|
84
|
-
now: () => new Date().toISOString(),
|
|
85
67
|
};
|
|
86
68
|
export const graphiti = (input, dependencies = defaultGraphitiDependencies) => {
|
|
87
69
|
const setup = runtimeInitialization.then(async () => {
|
|
@@ -155,17 +137,13 @@ export const graphiti = (input, dependencies = defaultGraphitiDependencies) => {
|
|
|
155
137
|
ttlSeconds: config.redis.cacheTtlSeconds,
|
|
156
138
|
driftThreshold: config.graphiti.driftThreshold,
|
|
157
139
|
});
|
|
158
|
-
const dreamStore = new dependencies.DreamStore(redisClient);
|
|
159
|
-
const defaultGroupId = dependencies.makeGroupId(config.graphiti.groupIdPrefix, input.directory);
|
|
160
|
-
const defaultUserGroupId = dependencies.makeUserGroupId(config.graphiti.groupIdPrefix, input.directory);
|
|
161
|
-
const notesService = new dependencies.SessionNotesService(redisClient, {
|
|
162
|
-
groupId: defaultGroupId,
|
|
163
|
-
});
|
|
164
140
|
const batchDrain = new dependencies.BatchDrainService(redisClient, redisEvents, {
|
|
165
141
|
batchSize: config.redis.batchSize,
|
|
166
142
|
batchMaxBytes: config.redis.batchMaxBytes,
|
|
167
143
|
drainRetryMax: config.redis.drainRetryMax,
|
|
168
144
|
});
|
|
145
|
+
const defaultGroupId = dependencies.makeGroupId(config.graphiti.groupIdPrefix, input.directory);
|
|
146
|
+
const defaultUserGroupId = dependencies.makeUserGroupId(config.graphiti.groupIdPrefix, input.directory);
|
|
169
147
|
const graphitiAsync = new dependencies.GraphitiAsyncService(graphitiClient, redisCache, batchDrain);
|
|
170
148
|
startupCleanupTasks.unshift({
|
|
171
149
|
name: "graphiti-async",
|
|
@@ -175,7 +153,6 @@ export const graphiti = (input, dependencies = defaultGraphitiDependencies) => {
|
|
|
175
153
|
const sessionMcpRuntime = dependencies.createSessionMcpRuntime({
|
|
176
154
|
redisClient,
|
|
177
155
|
graphitiCache: redisCache,
|
|
178
|
-
notesService,
|
|
179
156
|
sessionTtlSeconds: config.redis.sessionTtlSeconds,
|
|
180
157
|
groupId: defaultGroupId,
|
|
181
158
|
sessionExecutor,
|
|
@@ -187,37 +164,12 @@ export const graphiti = (input, dependencies = defaultGraphitiDependencies) => {
|
|
|
187
164
|
});
|
|
188
165
|
const sessionManager = new dependencies.SessionManager(defaultGroupId, defaultUserGroupId, input.client, redisEvents, redisSnapshot, redisCache, {
|
|
189
166
|
idleRetentionMs: config.redis.sessionTtlSeconds * 1000,
|
|
190
|
-
notesService,
|
|
191
167
|
runtimeStateMigrator: sessionMcpRuntime,
|
|
192
168
|
});
|
|
193
169
|
sessionMcpRuntime.setSessionCanonicalizer(sessionManager);
|
|
194
170
|
const toolGuidanceCache = new dependencies.ToolGuidanceCache();
|
|
195
171
|
const toolRoutingOutcomes = new dependencies.ToolRoutingOutcomeCache();
|
|
196
|
-
const sessionBiasState = new Map();
|
|
197
|
-
const chatHandler = dependencies.createChatHandler({
|
|
198
|
-
sessionManager,
|
|
199
|
-
redisEvents,
|
|
200
|
-
graphitiAsync,
|
|
201
|
-
drainTriggerSize: config.redis.batchSize,
|
|
202
|
-
});
|
|
203
|
-
const compactingHandler = dependencies
|
|
204
|
-
.createCompactingHandler({
|
|
205
|
-
sessionManager,
|
|
206
|
-
});
|
|
207
172
|
startupTeardown = dependencies.registerRuntimeTeardown([
|
|
208
|
-
{
|
|
209
|
-
name: "dream-shutdown-warning",
|
|
210
|
-
run: async () => {
|
|
211
|
-
const targetWatermark = dependencies.now();
|
|
212
|
-
for (const rootSessionId of getTrackedRootSessionIds(sessionManager)) {
|
|
213
|
-
const watermark = await dreamStore.getWatermark(rootSessionId);
|
|
214
|
-
if (watermark === null || watermark < targetWatermark) {
|
|
215
|
-
dependencies.notifyDreamShutdownDelay();
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
},
|
|
220
|
-
},
|
|
221
173
|
{
|
|
222
174
|
name: "graphiti-drain-flush",
|
|
223
175
|
run: () => graphitiAsync.flushPendingGroups(sessionManager.getTrackedGroupIds()),
|
|
@@ -252,45 +204,21 @@ export const graphiti = (input, dependencies = defaultGraphitiDependencies) => {
|
|
|
252
204
|
sdkClient: input.client,
|
|
253
205
|
directory: input.directory,
|
|
254
206
|
}),
|
|
255
|
-
"chat.message":
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
},
|
|
266
|
-
"experimental.session.compacting": async (hookInput, output) => {
|
|
267
|
-
const canonicalSessionId = sessionManager.getCachedCanonicalSessionId(hookInput.sessionID) ??
|
|
268
|
-
await sessionManager.resolveCanonicalSessionId(hookInput.sessionID);
|
|
269
|
-
if (canonicalSessionId) {
|
|
270
|
-
sessionBiasState.set(canonicalSessionId, "post-compaction");
|
|
271
|
-
}
|
|
272
|
-
await compactingHandler(hookInput, output);
|
|
273
|
-
},
|
|
207
|
+
"chat.message": dependencies.createChatHandler({
|
|
208
|
+
sessionManager,
|
|
209
|
+
redisEvents,
|
|
210
|
+
graphitiAsync,
|
|
211
|
+
drainTriggerSize: config.redis.batchSize,
|
|
212
|
+
}),
|
|
213
|
+
"experimental.session.compacting": dependencies
|
|
214
|
+
.createCompactingHandler({
|
|
215
|
+
sessionManager,
|
|
216
|
+
}),
|
|
274
217
|
"experimental.chat.messages.transform": dependencies
|
|
275
218
|
.createMessagesHandler({
|
|
276
219
|
sessionManager,
|
|
277
220
|
}),
|
|
278
221
|
tool: sessionMcpRuntime.tools,
|
|
279
|
-
"tool.definition": (hookInput, output) => {
|
|
280
|
-
if (hookInput.toolID !== "session_search")
|
|
281
|
-
return Promise.resolve();
|
|
282
|
-
let anyBiased = false;
|
|
283
|
-
for (const [sessionId, state] of sessionBiasState) {
|
|
284
|
-
if (state === "normal")
|
|
285
|
-
continue;
|
|
286
|
-
anyBiased = true;
|
|
287
|
-
sessionBiasState.delete(sessionId);
|
|
288
|
-
}
|
|
289
|
-
if (anyBiased) {
|
|
290
|
-
output.description = SESSION_SEARCH_STRENGTHENED_DESCRIPTION;
|
|
291
|
-
}
|
|
292
|
-
return Promise.resolve();
|
|
293
|
-
},
|
|
294
222
|
"tool.execute.before": dependencies.createToolBeforeHandler({
|
|
295
223
|
sessionCanonicalizer: sessionManager,
|
|
296
224
|
guidanceThrottle: toolGuidanceCache,
|
|
@@ -6,5 +6,4 @@ export declare const logStructuredWarning: (message: string, extra?: unknown) =>
|
|
|
6
6
|
export declare const showWarningToast: (message: string, extra?: unknown) => boolean;
|
|
7
7
|
export declare const notifyPluginWarning: (message: string, extra?: unknown) => void;
|
|
8
8
|
export declare const notifyGraphitiAvailabilityIssue: (message: string, extra?: unknown) => void;
|
|
9
|
-
export declare const notifyDreamShutdownDelay: () => void;
|
|
10
9
|
//# sourceMappingURL=opencode-warning.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-warning.d.ts","sourceRoot":"","sources":["../../../src/src/services/opencode-warning.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,wCAAwC,QAAO,OAM3D,CAAC;AA6FF,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,OAAO,KACd,IAEF,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,WAAW,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,KACtD,IAIF,CAAC;AAEF,eAAO,MAAM,6CAA6C,GACxD,OAAO,OAAO,GAAG,SAAS,KACzB,IAEF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,EACf,QAAQ,OAAO,KACd,OAEF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,EAAE,QAAQ,OAAO,KAAG,OAEnE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,EACf,QAAQ,OAAO,KACd,IAMF,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAC1C,SAAS,MAAM,EACf,QAAQ,OAAO,KACd,IAEF,CAAC
|
|
1
|
+
{"version":3,"file":"opencode-warning.d.ts","sourceRoot":"","sources":["../../../src/src/services/opencode-warning.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,wCAAwC,QAAO,OAM3D,CAAC;AA6FF,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,OAAO,KACd,IAEF,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,WAAW,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,KACtD,IAIF,CAAC;AAEF,eAAO,MAAM,6CAA6C,GACxD,OAAO,OAAO,GAAG,SAAS,KACzB,IAEF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,EACf,QAAQ,OAAO,KACd,OAEF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,EAAE,QAAQ,OAAO,KAAG,OAEnE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,EACf,QAAQ,OAAO,KACd,IAMF,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAC1C,SAAS,MAAM,EACf,QAAQ,OAAO,KACd,IAEF,CAAC"}
|
|
@@ -105,6 +105,3 @@ export const notifyPluginWarning = (message, extra) => {
|
|
|
105
105
|
export const notifyGraphitiAvailabilityIssue = (message, extra) => {
|
|
106
106
|
notifyPluginWarning(message, extra);
|
|
107
107
|
};
|
|
108
|
-
export const notifyDreamShutdownDelay = () => {
|
|
109
|
-
notifyPluginWarning("Dreaming is still in progress; keep OpenCode open and wait for dreaming to complete before exiting.");
|
|
110
|
-
};
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
import { type SessionEvent } from "../types/index.js";
|
|
2
2
|
import type { RedisClient } from "./redis-client.js";
|
|
3
|
-
import type { NormalizedMemoryResult } from "../types/index.js";
|
|
4
|
-
export declare const createSnapshotSummaryResult: (input: {
|
|
5
|
-
rootSessionId: string;
|
|
6
|
-
created_at: string;
|
|
7
|
-
snippet: string;
|
|
8
|
-
id?: string;
|
|
9
|
-
granularity?: string;
|
|
10
|
-
}) => NormalizedMemoryResult;
|
|
11
3
|
export declare const buildSessionSnapshotXml: (sessionId: string, events: SessionEvent[]) => string;
|
|
12
4
|
export interface RedisSnapshotServiceOptions {
|
|
13
5
|
ttlSeconds: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-snapshot.d.ts","sourceRoot":"","sources":["../../../src/src/services/redis-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"redis-snapshot.d.ts","sourceRoot":"","sources":["../../../src/src/services/redis-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAgCrD,eAAO,MAAM,uBAAuB,GAClC,WAAW,MAAM,EACjB,QAAQ,YAAY,EAAE,KACrB,MAiOF,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,2BAA2B;IAGjD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAItD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhE,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EAAE,GACrB,OAAO,CAAC,MAAM,CAAC;CAKnB"}
|
|
@@ -3,18 +3,6 @@ import { sessionSnapshotKey } from "./redis-events.js";
|
|
|
3
3
|
import { escapeXml, normalizeMemoryText, renderXmlListSection, renderXmlSingleSection, sanitizeMemoryInput, uniqueNormalizedValues, } from "./render-utils.js";
|
|
4
4
|
const SNAPSHOT_BUDGET = 3_000;
|
|
5
5
|
const BLOCKER_PATTERN = /\b(blocker|blocked|blocking)\b/i;
|
|
6
|
-
export const createSnapshotSummaryResult = (input) => ({
|
|
7
|
-
type: "summary",
|
|
8
|
-
ref: `session:${input.rootSessionId}:summary:snapshot:${input.id ?? input.created_at}`,
|
|
9
|
-
snippet: input.snippet,
|
|
10
|
-
score: 1,
|
|
11
|
-
created_at: input.created_at,
|
|
12
|
-
id: input.id ?? input.created_at,
|
|
13
|
-
root_session_id: input.rootSessionId,
|
|
14
|
-
scope: "session",
|
|
15
|
-
granularity: input.granularity ?? "session",
|
|
16
|
-
source: "snapshot",
|
|
17
|
-
});
|
|
18
6
|
const selectRecent = (events, predicate, map, limit, excludedNormalized = new Set()) => uniqueNormalizedValues(events.flatMap((event) => {
|
|
19
7
|
if (!predicate(event))
|
|
20
8
|
return [];
|
|
@@ -2,7 +2,6 @@ export type RuntimeTeardownTask = {
|
|
|
2
2
|
name: string;
|
|
3
3
|
run: () => void | Promise<void>;
|
|
4
4
|
};
|
|
5
|
-
export declare const createRuntimeTeardownTask: (name: string, run: () => void | Promise<void>) => RuntimeTeardownTask;
|
|
6
5
|
export interface RuntimeTeardownRegistration {
|
|
7
6
|
run(): Promise<void>;
|
|
8
7
|
dispose(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-teardown.d.ts","sourceRoot":"","sources":["../../../src/src/services/runtime-teardown.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"runtime-teardown.d.ts","sourceRoot":"","sources":["../../../src/src/services/runtime-teardown.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC1C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,OAAO,IAAI,IAAI,CAAC;CACjB;AAUD,KAAK,2BAA2B,GAAG;IACjC,gBAAgB,CAAC,EAAE,CACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,EACjC,OAAO,CAAC,EAAE,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KACtD,IAAI,CAAC;IACV,mBAAmB,CAAC,EAAE,CACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,EACjC,OAAO,CAAC,EAAE,OAAO,GAAG,oBAAoB,KACrC,IAAI,CAAC;IACV,IAAI,CAAC,EAAE;QACL,iBAAiB,CAAC,EAAE,CAClB,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,IAAI,KAChB,IAAI,CAAC;QACV,oBAAoB,CAAC,EAAE,CACrB,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,IAAI,KAChB,IAAI,CAAC;QACV,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC;KACjC,CAAC;IACF,OAAO,CAAC,EAAE;QACR,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;QAClD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;QACnD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAAC;AAwBF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,mBAAmB,EAAE,EAC5B,OAAO,GAAE,2BAC6C,GACrD,2BAA2B,CA0K7B"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as dntShim from "../../_dnt.shims.js";
|
|
2
2
|
import { logger } from "./logger.js";
|
|
3
|
-
export const createRuntimeTeardownTask = (name, run) => ({ name, run });
|
|
4
3
|
const SHUTDOWN_EVENTS = ["unload", "beforeunload"];
|
|
5
4
|
const SHUTDOWN_SIGNALS = ["SIGINT", "SIGTERM"];
|
|
6
5
|
const SHUTDOWN_EXIT_CODE = {
|
|
@@ -39,12 +38,8 @@ export function registerRuntimeTeardown(tasks, runtime = dntShim.dntGlobalThis)
|
|
|
39
38
|
return;
|
|
40
39
|
signalListenersDisposed = true;
|
|
41
40
|
for (const { signal, handler } of signalListeners) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
runtime.process?.off?.(signal, handler);
|
|
47
|
-
}
|
|
41
|
+
runtime.Deno?.removeSignalListener?.(signal, handler);
|
|
42
|
+
runtime.process?.off?.(signal, handler);
|
|
48
43
|
}
|
|
49
44
|
for (const { event, handler } of processEventListeners) {
|
|
50
45
|
runtime.process?.off?.(event, handler);
|
|
@@ -148,12 +143,8 @@ export function registerRuntimeTeardown(tasks, runtime = dntShim.dntGlobalThis)
|
|
|
148
143
|
}
|
|
149
144
|
beginGracefulShutdown({ kind: "signal", signal });
|
|
150
145
|
};
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
runtime.process?.on?.(signal, handler);
|
|
156
|
-
}
|
|
146
|
+
runtime.Deno?.addSignalListener?.(signal, handler);
|
|
147
|
+
runtime.process?.on?.(signal, handler);
|
|
157
148
|
signalListeners.push({ signal, handler });
|
|
158
149
|
}
|
|
159
150
|
const beforeExitHandler = () => {
|
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import { type ToolContext, type ToolDefinition } from "@opencode-ai/plugin";
|
|
2
|
-
import { RedisClient } from "./redis-client.js";
|
|
2
|
+
import type { RedisClient } from "./redis-client.js";
|
|
3
3
|
import type { RedisCacheService } from "./redis-cache.js";
|
|
4
4
|
import { createSessionCorpusService } from "./session-corpus.js";
|
|
5
5
|
import { createSessionExecutor, type SessionExecutor } from "./session-executor.js";
|
|
6
|
-
import { type ExactHistoryAdapter } from "./exact-history.js";
|
|
7
|
-
import { type SummarySearchAdapter } from "./memory-search.js";
|
|
8
6
|
import { type SessionMcpRequestMap, type SessionMcpResponseMap, type SessionMcpToolName } from "./session-mcp-types.js";
|
|
9
|
-
import { SessionNotesService } from "./session-notes.js";
|
|
10
7
|
import type { RuntimeRootSessionValidator } from "../session.js";
|
|
11
8
|
export declare const SESSION_MCP_RESPONSE_BUDGET_BYTES: number;
|
|
12
|
-
export declare const SESSION_NOTES_WRITE_DESCRIPTION: string;
|
|
13
|
-
export declare const SESSION_NOTES_READ_DESCRIPTION: string;
|
|
14
|
-
export declare const SESSION_SEARCH_BASELINE_DESCRIPTION: string;
|
|
15
|
-
export declare const SESSION_SEARCH_STRENGTHENED_DESCRIPTION: string;
|
|
16
9
|
type SessionMcpHandler<TToolName extends SessionMcpToolName> = (request: SessionMcpRequestMap[TToolName], context: ToolContext) => Promise<SessionMcpResponseMap[TToolName]>;
|
|
17
10
|
type SessionMcpHandlerMap = {
|
|
18
11
|
[K in SessionMcpToolName]: SessionMcpHandler<K>;
|
|
@@ -21,14 +14,11 @@ type SessionMcpRuntimeOptions = {
|
|
|
21
14
|
handlers?: Partial<SessionMcpHandlerMap>;
|
|
22
15
|
redisClient?: RedisClient;
|
|
23
16
|
graphitiCache?: RedisCacheService | object;
|
|
24
|
-
notesService?: SessionNotesService;
|
|
25
17
|
sessionTtlSeconds?: number;
|
|
26
18
|
groupId?: string;
|
|
27
19
|
createSessionCorpusService?: typeof createSessionCorpusService;
|
|
28
20
|
createSessionExecutor?: typeof createSessionExecutor;
|
|
29
21
|
sessionExecutor?: SessionExecutor;
|
|
30
|
-
exactHistoryAdapter?: ExactHistoryAdapter;
|
|
31
|
-
summarySearchAdapter?: SummarySearchAdapter;
|
|
32
22
|
sessionCanonicalizer?: RuntimeRootSessionValidator;
|
|
33
23
|
readSessionIndexFile?: (filePath: string) => Promise<string>;
|
|
34
24
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-mcp-runtime.d.ts","sourceRoot":"","sources":["../../../src/src/services/session-mcp-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-mcp-runtime.d.ts","sourceRoot":"","sources":["../../../src/src/services/session-mcp-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EACL,0BAA0B,EAE3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EAIrB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,KAAK,oBAAoB,EAEzB,KAAK,qBAAqB,EAE1B,KAAK,kBAAkB,EACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAIjE,eAAO,MAAM,iCAAiC,QAAW,CAAC;AA8D1D,KAAK,iBAAiB,CAAC,SAAS,SAAS,kBAAkB,IAAI,CAC7D,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,EACxC,OAAO,EAAE,WAAW,KACjB,OAAO,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;AAE/C,KAAK,oBAAoB,GAAG;KACzB,CAAC,IAAI,kBAAkB,GAAG,iBAAiB,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B,CAAC,EAAE,OAAO,0BAA0B,CAAC;IAC/D,qBAAqB,CAAC,EAAE,OAAO,qBAAqB,CAAC;IACrD,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,oBAAoB,CAAC,EAAE,2BAA2B,CAAC;IACnD,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D,CAAC;AAkBF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,uBAAuB,EAAE,CACvB,oBAAoB,EAAE,2BAA2B,GAAG,SAAS,KAC1D,IAAI,CAAC;IACV,uBAAuB,EAAE,CACvB,mBAAmB,EAAE,MAAM,EAC3B,mBAAmB,EAAE,MAAM,KACxB,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AA0MF,eAAO,MAAM,uBAAuB,GAClC,UAAS,wBAA6B,KACrC,iBA6mBF,CAAC"}
|