openclaw-engram 0.2.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/availability.d.ts +34 -0
- package/dist/availability.d.ts.map +1 -0
- package/dist/availability.js +70 -0
- package/dist/availability.js.map +1 -0
- package/dist/client.d.ts +147 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +199 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/memory.d.ts +11 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +49 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/remember.d.ts +15 -0
- package/dist/commands/remember.d.ts.map +1 -0
- package/dist/commands/remember.js +61 -0
- package/dist/commands/remember.js.map +1 -0
- package/dist/config.d.ts +73 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +81 -0
- package/dist/config.js.map +1 -0
- package/dist/context/formatter.d.ts +33 -0
- package/dist/context/formatter.d.ts.map +1 -0
- package/dist/context/formatter.js +193 -0
- package/dist/context/formatter.js.map +1 -0
- package/dist/hooks/after-tool-call.d.ts +19 -0
- package/dist/hooks/after-tool-call.d.ts.map +1 -0
- package/dist/hooks/after-tool-call.js +53 -0
- package/dist/hooks/after-tool-call.js.map +1 -0
- package/dist/hooks/before-compaction.d.ts +19 -0
- package/dist/hooks/before-compaction.d.ts.map +1 -0
- package/dist/hooks/before-compaction.js +60 -0
- package/dist/hooks/before-compaction.js.map +1 -0
- package/dist/hooks/before-prompt-build.d.ts +20 -0
- package/dist/hooks/before-prompt-build.d.ts.map +1 -0
- package/dist/hooks/before-prompt-build.js +76 -0
- package/dist/hooks/before-prompt-build.js.map +1 -0
- package/dist/hooks/session-end.d.ts +18 -0
- package/dist/hooks/session-end.d.ts.map +1 -0
- package/dist/hooks/session-end.js +57 -0
- package/dist/hooks/session-end.js.map +1 -0
- package/dist/hooks/session-start.d.ts +17 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +77 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/identity.d.ts +36 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +106 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +208 -0
- package/dist/index.js.map +1 -0
- package/dist/services/file-watcher.d.ts +11 -0
- package/dist/services/file-watcher.d.ts.map +1 -0
- package/dist/services/file-watcher.js +139 -0
- package/dist/services/file-watcher.js.map +1 -0
- package/dist/tools/engram-decisions.d.ts +8 -0
- package/dist/tools/engram-decisions.d.ts.map +1 -0
- package/dist/tools/engram-decisions.js +70 -0
- package/dist/tools/engram-decisions.js.map +1 -0
- package/dist/tools/engram-remember.d.ts +9 -0
- package/dist/tools/engram-remember.d.ts.map +1 -0
- package/dist/tools/engram-remember.js +116 -0
- package/dist/tools/engram-remember.js.map +1 -0
- package/dist/tools/engram-search.d.ts +9 -0
- package/dist/tools/engram-search.d.ts.map +1 -0
- package/dist/tools/engram-search.js +62 -0
- package/dist/tools/engram-search.js.map +1 -0
- package/dist/tools/memory-forget.d.ts +10 -0
- package/dist/tools/memory-forget.d.ts.map +1 -0
- package/dist/tools/memory-forget.js +41 -0
- package/dist/tools/memory-forget.js.map +1 -0
- package/dist/tools/memory-get.d.ts +11 -0
- package/dist/tools/memory-get.d.ts.map +1 -0
- package/dist/tools/memory-get.js +86 -0
- package/dist/tools/memory-get.js.map +1 -0
- package/dist/tools/memory-migrate.d.ts +11 -0
- package/dist/tools/memory-migrate.d.ts.map +1 -0
- package/dist/tools/memory-migrate.js +180 -0
- package/dist/tools/memory-migrate.js.map +1 -0
- package/dist/types/openclaw.d.ts +212 -0
- package/dist/types/openclaw.d.ts.map +1 -0
- package/dist/types/openclaw.js +9 -0
- package/dist/types/openclaw.js.map +1 -0
- package/dist/utils/memory-files.d.ts +25 -0
- package/dist/utils/memory-files.d.ts.map +1 -0
- package/dist/utils/memory-files.js +187 -0
- package/dist/utils/memory-files.js.map +1 -0
- package/openclaw.plugin.json +86 -0
- package/package.json +45 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* engram_search + memory_search — search engram memory.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createEngramSearchTool = createEngramSearchTool;
|
|
7
|
+
exports.createMemorySearchTool = createMemorySearchTool;
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
const typebox_1 = require("@sinclair/typebox");
|
|
10
|
+
const identity_js_1 = require("../identity.js");
|
|
11
|
+
const formatter_js_1 = require("../context/formatter.js");
|
|
12
|
+
const SearchParamsSchema = zod_1.z.object({
|
|
13
|
+
query: zod_1.z.string().min(1),
|
|
14
|
+
limit: zod_1.z.number().int().positive().max(50).optional(),
|
|
15
|
+
});
|
|
16
|
+
const searchParameters = typebox_1.Type.Object({
|
|
17
|
+
query: typebox_1.Type.String({ description: 'Search query for engram memory' }),
|
|
18
|
+
limit: typebox_1.Type.Optional(typebox_1.Type.Number({ description: 'Maximum number of results (default: 10)' })),
|
|
19
|
+
});
|
|
20
|
+
function createSearchTool(name, ctx, client, config) {
|
|
21
|
+
return {
|
|
22
|
+
name,
|
|
23
|
+
description: 'Search engram persistent memory for observations relevant to your query. ' +
|
|
24
|
+
'Use this before starting work on a topic to surface prior decisions, patterns, and changes.',
|
|
25
|
+
parameters: searchParameters,
|
|
26
|
+
async execute(_toolCallId, params) {
|
|
27
|
+
const parsed = SearchParamsSchema.safeParse(params);
|
|
28
|
+
if (!parsed.success) {
|
|
29
|
+
return `Invalid parameters: ${parsed.error.message}`;
|
|
30
|
+
}
|
|
31
|
+
if (!client.isAvailable()) {
|
|
32
|
+
return 'engram is currently unreachable — memory search unavailable';
|
|
33
|
+
}
|
|
34
|
+
const identity = (0, identity_js_1.resolveIdentity)(ctx.agentId ?? '', ctx.workspaceDir);
|
|
35
|
+
const project = config.project ?? identity.projectId;
|
|
36
|
+
const response = await client.searchContext({
|
|
37
|
+
project,
|
|
38
|
+
query: parsed.data.query,
|
|
39
|
+
cwd: ctx.workspaceDir,
|
|
40
|
+
agent_id: ctx.agentId,
|
|
41
|
+
});
|
|
42
|
+
if (!response) {
|
|
43
|
+
return 'engram search failed — server returned no response';
|
|
44
|
+
}
|
|
45
|
+
const allObservations = Array.isArray(response.observations) ? response.observations : [];
|
|
46
|
+
if (allObservations.length === 0) {
|
|
47
|
+
return 'No relevant observations found for this query.';
|
|
48
|
+
}
|
|
49
|
+
const limit = parsed.data.limit ?? allObservations.length;
|
|
50
|
+
const observations = allObservations.slice(0, limit);
|
|
51
|
+
const { context } = (0, formatter_js_1.formatContext)(observations, { tokenBudget: config.tokenBudget });
|
|
52
|
+
return context || `Found ${observations.length} observation(s) but could not format context.`;
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function createEngramSearchTool(ctx, client, config) {
|
|
57
|
+
return createSearchTool('engram_search', ctx, client, config);
|
|
58
|
+
}
|
|
59
|
+
function createMemorySearchTool(ctx, client, config) {
|
|
60
|
+
return createSearchTool('memory_search', ctx, client, config);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=engram-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engram-search.js","sourceRoot":"","sources":["../../src/tools/engram-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* memory_forget — delete observations from engram by ID.
|
|
3
|
+
*
|
|
4
|
+
* Maps to engram's bulk_delete_observations endpoint.
|
|
5
|
+
*/
|
|
6
|
+
import type { EngramRestClient } from '../client.js';
|
|
7
|
+
import type { PluginConfig } from '../config.js';
|
|
8
|
+
import type { AnyAgentTool, OpenClawPluginToolContext } from '../types/openclaw.js';
|
|
9
|
+
export declare function createMemoryForgetTool(_ctx: OpenClawPluginToolContext, client: EngramRestClient, _config: PluginConfig): AnyAgentTool;
|
|
10
|
+
//# sourceMappingURL=memory-forget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-forget.d.ts","sourceRoot":"","sources":["../../src/tools/memory-forget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAUpF,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,yBAAyB,EAC/B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,YAAY,GACpB,YAAY,CA2Bd"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* memory_forget — delete observations from engram by ID.
|
|
4
|
+
*
|
|
5
|
+
* Maps to engram's bulk_delete_observations endpoint.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.createMemoryForgetTool = createMemoryForgetTool;
|
|
9
|
+
const zod_1 = require("zod");
|
|
10
|
+
const typebox_1 = require("@sinclair/typebox");
|
|
11
|
+
const ForgetParamsSchema = zod_1.z.object({
|
|
12
|
+
id: zod_1.z.string().min(1),
|
|
13
|
+
});
|
|
14
|
+
const forgetParameters = typebox_1.Type.Object({
|
|
15
|
+
id: typebox_1.Type.String({ description: 'Observation UUID to delete' }),
|
|
16
|
+
});
|
|
17
|
+
function createMemoryForgetTool(_ctx, client, _config) {
|
|
18
|
+
return {
|
|
19
|
+
name: 'memory_forget',
|
|
20
|
+
label: 'Forget Memory',
|
|
21
|
+
description: 'Delete a specific observation from engram memory by its ID.',
|
|
22
|
+
parameters: forgetParameters,
|
|
23
|
+
async execute(_toolCallId, params) {
|
|
24
|
+
const parsed = ForgetParamsSchema.safeParse(params);
|
|
25
|
+
if (!parsed.success) {
|
|
26
|
+
return `Invalid parameters: ${parsed.error.message}`;
|
|
27
|
+
}
|
|
28
|
+
if (!client.isAvailable()) {
|
|
29
|
+
return 'engram is currently unreachable — memory forget unavailable';
|
|
30
|
+
}
|
|
31
|
+
const response = await client.bulkDelete([parsed.data.id]);
|
|
32
|
+
if (!response) {
|
|
33
|
+
return 'engram delete failed — server returned no response';
|
|
34
|
+
}
|
|
35
|
+
return response.deleted > 0
|
|
36
|
+
? `Deleted observation: ${parsed.data.id}`
|
|
37
|
+
: `Observation not found or already deleted: ${parsed.data.id}`;
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=memory-forget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-forget.js","sourceRoot":"","sources":["../../src/tools/memory-forget.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAgBH,wDA+BC;AA7CD,6BAAwB;AACxB,+CAAyC;AAKzC,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACtB,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,cAAI,CAAC,MAAM,CAAC;IACnC,EAAE,EAAE,cAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;CAC/D,CAAC,CAAC;AAEH,SAAgB,sBAAsB,CACpC,IAA+B,EAC/B,MAAwB,EACxB,OAAqB;IAErB,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,6DAA6D;QAC1E,UAAU,EAAE,gBAAgB;QAE5B,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAA+B;YAChE,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,uBAAuB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACvD,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC1B,OAAO,6DAA6D,CAAC;YACvE,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,oDAAoD,CAAC;YAC9D,CAAC;YAED,OAAO,QAAQ,CAAC,OAAO,GAAG,CAAC;gBACzB,CAAC,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE;gBAC1C,CAAC,CAAC,6CAA6C,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACpE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* memory_get — dual-mode memory retrieval.
|
|
3
|
+
*
|
|
4
|
+
* If `path` param is provided: reads a local workspace .md file.
|
|
5
|
+
* Otherwise: performs an engram search as fallback.
|
|
6
|
+
*/
|
|
7
|
+
import type { EngramRestClient } from '../client.js';
|
|
8
|
+
import type { PluginConfig } from '../config.js';
|
|
9
|
+
import type { AnyAgentTool, OpenClawPluginToolContext, OpenClawPluginApi } from '../types/openclaw.js';
|
|
10
|
+
export declare function createMemoryGetTool(ctx: OpenClawPluginToolContext, client: EngramRestClient, config: PluginConfig, api: OpenClawPluginApi): AnyAgentTool;
|
|
11
|
+
//# sourceMappingURL=memory-get.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-get.d.ts","sourceRoot":"","sources":["../../src/tools/memory-get.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAYvG,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,yBAAyB,EAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,iBAAiB,GACrB,YAAY,CA2Bd"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* memory_get — dual-mode memory retrieval.
|
|
4
|
+
*
|
|
5
|
+
* If `path` param is provided: reads a local workspace .md file.
|
|
6
|
+
* Otherwise: performs an engram search as fallback.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createMemoryGetTool = createMemoryGetTool;
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const typebox_1 = require("@sinclair/typebox");
|
|
12
|
+
const promises_1 = require("node:fs/promises");
|
|
13
|
+
const identity_js_1 = require("../identity.js");
|
|
14
|
+
const formatter_js_1 = require("../context/formatter.js");
|
|
15
|
+
const GetParamsSchema = zod_1.z.object({
|
|
16
|
+
path: zod_1.z.string().optional(),
|
|
17
|
+
query: zod_1.z.string().optional(),
|
|
18
|
+
}).refine((d) => Boolean(d.path || d.query), { message: 'Either path or query is required' });
|
|
19
|
+
const getParameters = typebox_1.Type.Object({
|
|
20
|
+
path: typebox_1.Type.Optional(typebox_1.Type.String({ description: 'Workspace-relative path to a .md file' })),
|
|
21
|
+
query: typebox_1.Type.Optional(typebox_1.Type.String({ description: 'Search query (used if path not provided)' })),
|
|
22
|
+
});
|
|
23
|
+
function createMemoryGetTool(ctx, client, config, api) {
|
|
24
|
+
return {
|
|
25
|
+
name: 'memory_get',
|
|
26
|
+
label: 'Get Memory',
|
|
27
|
+
description: 'Retrieve a memory by file path (workspace .md files) or search query (engram fallback).',
|
|
28
|
+
parameters: getParameters,
|
|
29
|
+
async execute(_toolCallId, params) {
|
|
30
|
+
const parsed = GetParamsSchema.safeParse(params);
|
|
31
|
+
if (!parsed.success) {
|
|
32
|
+
return `Invalid parameters: ${parsed.error.message}`;
|
|
33
|
+
}
|
|
34
|
+
// Mode 1: Local file read
|
|
35
|
+
if (parsed.data.path) {
|
|
36
|
+
return readLocalFile(parsed.data.path, api);
|
|
37
|
+
}
|
|
38
|
+
// Mode 2: Engram search fallback
|
|
39
|
+
if (parsed.data.query) {
|
|
40
|
+
return searchEngram(parsed.data.query, ctx, client, config);
|
|
41
|
+
}
|
|
42
|
+
return 'Either path or query must be provided.';
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async function readLocalFile(filePath, api) {
|
|
47
|
+
try {
|
|
48
|
+
const resolved = api.resolvePath(filePath);
|
|
49
|
+
// Security: only allow markdown files
|
|
50
|
+
if (!/\.(md|markdown)$/i.test(resolved)) {
|
|
51
|
+
return `Refused to read "${filePath}": only .md and .markdown files are allowed.`;
|
|
52
|
+
}
|
|
53
|
+
const content = await (0, promises_1.readFile)(resolved, 'utf-8');
|
|
54
|
+
if (!content.trim()) {
|
|
55
|
+
return `File is empty: ${filePath}`;
|
|
56
|
+
}
|
|
57
|
+
return content;
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
61
|
+
return `Failed to read file "${filePath}": ${msg}`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function searchEngram(query, ctx, client, config) {
|
|
65
|
+
if (!client.isAvailable()) {
|
|
66
|
+
return 'engram is currently unreachable — memory get unavailable';
|
|
67
|
+
}
|
|
68
|
+
const identity = (0, identity_js_1.resolveIdentity)(ctx.agentId ?? '', ctx.workspaceDir);
|
|
69
|
+
const project = config.project ?? identity.projectId;
|
|
70
|
+
const response = await client.searchContext({
|
|
71
|
+
project,
|
|
72
|
+
query,
|
|
73
|
+
cwd: ctx.workspaceDir,
|
|
74
|
+
agent_id: ctx.agentId,
|
|
75
|
+
});
|
|
76
|
+
if (!response) {
|
|
77
|
+
return 'engram search failed — server returned no response';
|
|
78
|
+
}
|
|
79
|
+
const observations = Array.isArray(response.observations) ? response.observations : [];
|
|
80
|
+
if (observations.length === 0) {
|
|
81
|
+
return 'No relevant memories found.';
|
|
82
|
+
}
|
|
83
|
+
const { context } = (0, formatter_js_1.formatContext)(observations, { tokenBudget: config.tokenBudget });
|
|
84
|
+
return context || `Found ${observations.length} observation(s) but could not format context.`;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=memory-get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-get.js","sourceRoot":"","sources":["../../src/tools/memory-get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* memory_migrate — import local memory files into engram.
|
|
3
|
+
*
|
|
4
|
+
* Reads MEMORY.md and memory/**\/*.md from the workspace, splits by ## headers,
|
|
5
|
+
* and bulk-imports into engram. Uses a marker file for idempotency.
|
|
6
|
+
*/
|
|
7
|
+
import type { EngramRestClient } from '../client.js';
|
|
8
|
+
import type { PluginConfig } from '../config.js';
|
|
9
|
+
import type { AnyAgentTool, OpenClawPluginToolContext, OpenClawPluginApi } from '../types/openclaw.js';
|
|
10
|
+
export declare function createMemoryMigrateTool(ctx: OpenClawPluginToolContext, client: EngramRestClient, config: PluginConfig, api: OpenClawPluginApi): AnyAgentTool;
|
|
11
|
+
//# sourceMappingURL=memory-migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-migrate.d.ts","sourceRoot":"","sources":["../../src/tools/memory-migrate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAqB,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EACV,YAAY,EACZ,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAkC9B,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,yBAAyB,EAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,iBAAiB,GACrB,YAAY,CAsBd"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* memory_migrate — import local memory files into engram.
|
|
4
|
+
*
|
|
5
|
+
* Reads MEMORY.md and memory/**\/*.md from the workspace, splits by ## headers,
|
|
6
|
+
* and bulk-imports into engram. Uses a marker file for idempotency.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createMemoryMigrateTool = createMemoryMigrateTool;
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const typebox_1 = require("@sinclair/typebox");
|
|
12
|
+
const node_path_1 = require("node:path");
|
|
13
|
+
const node_crypto_1 = require("node:crypto");
|
|
14
|
+
const identity_js_1 = require("../identity.js");
|
|
15
|
+
const memory_files_js_1 = require("../utils/memory-files.js");
|
|
16
|
+
// Single source of truth: Zod schema defines shape, TypeBox schema exposes it to SDK.
|
|
17
|
+
// If you add/remove a field, update BOTH the Zod schema AND the TypeBox schema below.
|
|
18
|
+
const MigrateParamsSchema = zod_1.z.object({
|
|
19
|
+
dryRun: zod_1.z.boolean().optional().default(false),
|
|
20
|
+
path: zod_1.z.string().optional(),
|
|
21
|
+
force: zod_1.z.boolean().optional().default(false),
|
|
22
|
+
});
|
|
23
|
+
const migrateParameters = typebox_1.Type.Object({
|
|
24
|
+
dryRun: typebox_1.Type.Optional(typebox_1.Type.Boolean({ description: 'Preview what would be imported without writing', default: false })),
|
|
25
|
+
path: typebox_1.Type.Optional(typebox_1.Type.String({ description: 'Specific file path to migrate (default: MEMORY.md + memory/**/*.md)' })),
|
|
26
|
+
force: typebox_1.Type.Optional(typebox_1.Type.Boolean({ description: 'Ignore migration marker, re-import everything', default: false })),
|
|
27
|
+
});
|
|
28
|
+
// Compile-time drift guard: if Zod and TypeBox schemas diverge in field names,
|
|
29
|
+
// this assignment will produce a TypeScript error.
|
|
30
|
+
const _schemaCheck = {
|
|
31
|
+
dryRun: true, path: true, force: true,
|
|
32
|
+
};
|
|
33
|
+
void _schemaCheck;
|
|
34
|
+
function createMemoryMigrateTool(ctx, client, config, api) {
|
|
35
|
+
return {
|
|
36
|
+
name: 'memory_migrate',
|
|
37
|
+
label: 'Migrate Memory',
|
|
38
|
+
description: 'Import local workspace memory files (MEMORY.md, memory/**/*.md) into engram. ' +
|
|
39
|
+
'Use dryRun=true to preview. Idempotent — skips already-migrated files unless force=true.',
|
|
40
|
+
parameters: migrateParameters,
|
|
41
|
+
async execute(_toolCallId, params) {
|
|
42
|
+
const parsed = MigrateParamsSchema.safeParse(params);
|
|
43
|
+
if (!parsed.success) {
|
|
44
|
+
return `Invalid parameters: ${parsed.error.message}`;
|
|
45
|
+
}
|
|
46
|
+
if (!parsed.data.dryRun && !client.isAvailable()) {
|
|
47
|
+
return 'engram is currently unreachable — migration unavailable';
|
|
48
|
+
}
|
|
49
|
+
return runMigration(parsed.data, ctx, client, config, api);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function runMigration(params, ctx, client, config, api) {
|
|
54
|
+
const workspaceDir = ctx.workspaceDir;
|
|
55
|
+
if (!workspaceDir) {
|
|
56
|
+
return 'No workspace directory available — cannot locate memory files.';
|
|
57
|
+
}
|
|
58
|
+
// Load existing marker
|
|
59
|
+
const markerPath = (0, node_path_1.join)(workspaceDir, memory_files_js_1.MARKER_FILE);
|
|
60
|
+
const marker = await (0, memory_files_js_1.loadMarker)(markerPath);
|
|
61
|
+
// Discover files
|
|
62
|
+
let filePaths;
|
|
63
|
+
if (params.path) {
|
|
64
|
+
const resolved = (0, node_path_1.normalize)((0, node_path_1.resolve)(api.resolvePath(params.path)));
|
|
65
|
+
const normalizedWs = (0, node_path_1.normalize)((0, node_path_1.resolve)(workspaceDir));
|
|
66
|
+
const rel = (0, node_path_1.relative)(normalizedWs, resolved);
|
|
67
|
+
if (rel.startsWith('..') || (0, node_path_1.isAbsolute)(rel)) {
|
|
68
|
+
return `Path "${params.path}" resolves outside the workspace — access denied.`;
|
|
69
|
+
}
|
|
70
|
+
filePaths = [resolved];
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
filePaths = await (0, memory_files_js_1.discoverMemoryFiles)(workspaceDir);
|
|
74
|
+
}
|
|
75
|
+
if (filePaths.length === 0) {
|
|
76
|
+
return 'No memory files found in workspace (checked MEMORY.md and memory/**/*.md).';
|
|
77
|
+
}
|
|
78
|
+
// Read and chunk files
|
|
79
|
+
const allChunks = [];
|
|
80
|
+
const newFileHashes = {};
|
|
81
|
+
const skippedFiles = [];
|
|
82
|
+
for (const filePath of filePaths) {
|
|
83
|
+
const relPath = (0, node_path_1.relative)(workspaceDir, filePath);
|
|
84
|
+
const fileContent = await (0, memory_files_js_1.safeReadFile)(filePath);
|
|
85
|
+
if (!fileContent)
|
|
86
|
+
continue;
|
|
87
|
+
const hash = (0, node_crypto_1.createHash)('sha256').update(fileContent).digest('hex');
|
|
88
|
+
newFileHashes[relPath] = hash;
|
|
89
|
+
// Skip if already migrated with same hash (unless force)
|
|
90
|
+
if (!params.force && marker?.files[relPath] === hash) {
|
|
91
|
+
skippedFiles.push(relPath);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const chunks = (0, memory_files_js_1.splitIntoChunks)(fileContent, relPath);
|
|
95
|
+
allChunks.push(...chunks);
|
|
96
|
+
}
|
|
97
|
+
if (allChunks.length === 0 && skippedFiles.length > 0) {
|
|
98
|
+
return `All ${skippedFiles.length} file(s) already migrated. Use force=true to re-import.`;
|
|
99
|
+
}
|
|
100
|
+
if (allChunks.length === 0) {
|
|
101
|
+
return 'No content to migrate (files were empty or could not be read).';
|
|
102
|
+
}
|
|
103
|
+
// Dry run — show summary with first 5 chunks
|
|
104
|
+
if (params.dryRun) {
|
|
105
|
+
const fileCount = filePaths.length - skippedFiles.length;
|
|
106
|
+
const lines = [
|
|
107
|
+
`Dry run: ${allChunks.length} chunk(s) from ${fileCount} file(s) would be imported.`,
|
|
108
|
+
];
|
|
109
|
+
if (skippedFiles.length > 0) {
|
|
110
|
+
lines.push(`Skipped (already migrated): ${skippedFiles.length} file(s)`);
|
|
111
|
+
}
|
|
112
|
+
lines.push('Chunks (first 5):');
|
|
113
|
+
const preview = allChunks.slice(0, 5);
|
|
114
|
+
for (const chunk of preview) {
|
|
115
|
+
const contentPreview = chunk.content.length > 80
|
|
116
|
+
? chunk.content.slice(0, 77) + '...'
|
|
117
|
+
: chunk.content;
|
|
118
|
+
lines.push(`- [${chunk.type}] "${chunk.title}" (from ${chunk.sourcePath}): ${contentPreview}`);
|
|
119
|
+
}
|
|
120
|
+
if (allChunks.length > 5) {
|
|
121
|
+
lines.push(`... and ${allChunks.length - 5} more chunk(s)`);
|
|
122
|
+
}
|
|
123
|
+
return lines.join('\n');
|
|
124
|
+
}
|
|
125
|
+
// Import
|
|
126
|
+
const identity = (0, identity_js_1.resolveIdentity)(ctx.agentId ?? '', workspaceDir);
|
|
127
|
+
const project = config.project ?? identity.projectId;
|
|
128
|
+
const observations = allChunks.map((chunk) => ({
|
|
129
|
+
title: chunk.title,
|
|
130
|
+
content: chunk.content,
|
|
131
|
+
type: chunk.type,
|
|
132
|
+
project,
|
|
133
|
+
scope: 'project',
|
|
134
|
+
tags: ['migrated', `source:${chunk.sourcePath}`],
|
|
135
|
+
}));
|
|
136
|
+
// Batch import (max 50 per request)
|
|
137
|
+
let totalImported = 0;
|
|
138
|
+
let totalSkipped = 0;
|
|
139
|
+
const errors = [];
|
|
140
|
+
let hasFailures = false;
|
|
141
|
+
for (let i = 0; i < observations.length; i += 50) {
|
|
142
|
+
const batch = observations.slice(i, i + 50);
|
|
143
|
+
const response = await client.bulkImport(batch);
|
|
144
|
+
if (response) {
|
|
145
|
+
totalImported += response.imported;
|
|
146
|
+
totalSkipped += response.skipped_duplicates;
|
|
147
|
+
if (response.errors) {
|
|
148
|
+
errors.push(...response.errors);
|
|
149
|
+
hasFailures = true;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
errors.push(`Batch ${Math.floor(i / 50) + 1} failed — server returned no response`);
|
|
154
|
+
hasFailures = true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Save marker only if ALL batches succeeded — partial failure must not
|
|
158
|
+
// mark files as "done" or subsequent runs will silently skip them.
|
|
159
|
+
if (!hasFailures) {
|
|
160
|
+
const updatedMarker = {
|
|
161
|
+
lastMigrated: new Date().toISOString(),
|
|
162
|
+
files: { ...(marker?.files ?? {}), ...newFileHashes },
|
|
163
|
+
};
|
|
164
|
+
await (0, memory_files_js_1.saveMarker)(markerPath, updatedMarker);
|
|
165
|
+
}
|
|
166
|
+
// Report
|
|
167
|
+
const lines = [];
|
|
168
|
+
lines.push(`Migration complete.`);
|
|
169
|
+
lines.push(` Imported: ${totalImported} observation(s)`);
|
|
170
|
+
if (totalSkipped > 0)
|
|
171
|
+
lines.push(` Skipped (duplicates): ${totalSkipped}`);
|
|
172
|
+
if (skippedFiles.length > 0)
|
|
173
|
+
lines.push(` Skipped files (already migrated): ${skippedFiles.length}`);
|
|
174
|
+
if (errors.length > 0) {
|
|
175
|
+
lines.push(` Errors: ${errors.join(', ')}`);
|
|
176
|
+
lines.push(` Note: marker NOT saved due to errors — re-run to retry failed chunks.`);
|
|
177
|
+
}
|
|
178
|
+
return lines.join('\n');
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=memory-migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-migrate.js","sourceRoot":"","sources":["../../src/tools/memory-migrate.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA+CH,0DA2BC;AAxED,6BAAwB;AACxB,+CAAyC;AACzC,yCAA2E;AAC3E,6CAAyC;AAGzC,gDAAiD;AAMjD,8DASkC;AAElC,sFAAsF;AACtF,sFAAsF;AACtF,MAAM,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7C,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CAC7C,CAAC,CAAC;AAIH,MAAM,iBAAiB,GAAG,cAAI,CAAC,MAAM,CAAC;IACpC,MAAM,EAAE,cAAI,CAAC,QAAQ,CAAC,cAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,gDAAgD,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACtH,IAAI,EAAE,cAAI,CAAC,QAAQ,CAAC,cAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qEAAqE,EAAE,CAAC,CAAC;IACxH,KAAK,EAAE,cAAI,CAAC,QAAQ,CAAC,cAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,+CAA+C,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;CACrH,CAAC,CAAC;AAEH,+EAA+E;AAC/E,mDAAmD;AACnD,MAAM,YAAY,GAAsC;IACtD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;CACtC,CAAC;AAAC,KAAK,YAAY,CAAC;AAErB,SAAgB,uBAAuB,CACrC,GAA8B,EAC9B,MAAwB,EACxB,MAAoB,EACpB,GAAsB;IAEtB,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACT,+EAA+E;YAC/E,0FAA0F;QAC5F,UAAU,EAAE,iBAAiB;QAE7B,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAA+B;YAChE,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,uBAAuB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACvD,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;gBACjD,OAAO,yDAAyD,CAAC;YACnE,CAAC;YAED,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,MAA0D,EAC1D,GAA8B,EAC9B,MAAwB,EACxB,MAAoB,EACpB,GAAsB;IAEtB,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;IACtC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,gEAAgE,CAAC;IAC1E,CAAC;IAED,uBAAuB;IACvB,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,YAAY,EAAE,6BAAW,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAU,EAAC,UAAU,CAAC,CAAC;IAE5C,iBAAiB;IACjB,IAAI,SAAmB,CAAC;IACxB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAA,qBAAS,EAAC,IAAA,mBAAO,EAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,IAAA,qBAAS,EAAC,IAAA,mBAAO,EAAC,YAAY,CAAC,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,IAAA,oBAAQ,EAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAA,sBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,SAAS,MAAM,CAAC,IAAI,mDAAmD,CAAC;QACjF,CAAC;QACD,SAAS,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,MAAM,IAAA,qCAAmB,EAAC,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,4EAA4E,CAAC;IACtF,CAAC;IAED,uBAAuB;IACvB,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,MAAM,aAAa,GAA2B,EAAE,CAAC;IACjD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAA,oBAAQ,EAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,MAAM,IAAA,8BAAY,EAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW;YAAE,SAAS;QAE3B,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;QAE9B,yDAAyD;QACzD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YACrD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,iCAAe,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACrD,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,OAAO,OAAO,YAAY,CAAC,MAAM,yDAAyD,CAAC;IAC7F,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,gEAAgE,CAAC;IAC1E,CAAC;IAED,6CAA6C;IAC7C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;QACzD,MAAM,KAAK,GAAa;YACtB,YAAY,SAAS,CAAC,MAAM,kBAAkB,SAAS,6BAA6B;SACrF,CAAC;QACF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,+BAA+B,YAAY,CAAC,MAAM,UAAU,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE;gBAC9C,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;gBACpC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,UAAU,MAAM,cAAc,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,WAAW,SAAS,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS;IACT,MAAM,QAAQ,GAAG,IAAA,6BAAe,EAAC,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC;IAErD,MAAM,YAAY,GAAwB,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClE,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO;QACP,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,CAAC,UAAU,EAAE,CAAC;KACjD,CAAC,CAAC,CAAC;IAEJ,oCAAoC;IACpC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,aAAa,IAAI,QAAQ,CAAC,QAAQ,CAAC;YACnC,YAAY,IAAI,QAAQ,CAAC,kBAAkB,CAAC;YAC5C,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAChC,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACpF,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,mEAAmE;IACnE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,aAAa,GAAoB;YACrC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtC,KAAK,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,aAAa,EAAE;SACtD,CAAC;QACF,MAAM,IAAA,4BAAU,EAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC9C,CAAC;IAED,SAAS;IACT,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,eAAe,aAAa,iBAAiB,CAAC,CAAC;IAC1D,IAAI,YAAY,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;IAC5E,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,uCAAuC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IACtG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|