alvin-bot 5.6.2 → 5.8.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/CHANGELOG.md +29 -0
- package/README.md +1 -1
- package/dist/claude.js +1 -102
- package/dist/config.js +1 -96
- package/dist/engine.js +1 -90
- package/dist/find-claude-binary.js +1 -98
- package/dist/handlers/async-agent-chunk-handler.js +1 -50
- package/dist/handlers/background-bypass.js +1 -75
- package/dist/handlers/commands.js +1 -2336
- package/dist/handlers/cron-progress.js +1 -52
- package/dist/handlers/document.js +1 -194
- package/dist/handlers/message.js +1 -959
- package/dist/handlers/photo.js +1 -154
- package/dist/handlers/platform-message.js +1 -360
- package/dist/handlers/stuck-timer.js +1 -54
- package/dist/handlers/video.js +1 -237
- package/dist/handlers/voice.js +1 -148
- package/dist/i18n.js +1 -805
- package/dist/index.js +1 -697
- package/dist/init-data-dir.js +1 -98
- package/dist/middleware/auth.js +1 -233
- package/dist/migrate.js +1 -162
- package/dist/paths.js +1 -146
- package/dist/platforms/discord.js +1 -175
- package/dist/platforms/index.js +1 -130
- package/dist/platforms/signal.js +1 -205
- package/dist/platforms/slack-slash-parser.js +1 -32
- package/dist/platforms/slack.js +1 -501
- package/dist/platforms/telegram.js +1 -111
- package/dist/platforms/types.js +1 -8
- package/dist/platforms/whatsapp-auth-helpers.js +1 -53
- package/dist/platforms/whatsapp.js +1 -707
- package/dist/providers/claude-sdk-provider.js +1 -565
- package/dist/providers/codex-cli-provider.js +1 -134
- package/dist/providers/index.js +1 -7
- package/dist/providers/ollama-provider.js +1 -32
- package/dist/providers/openai-compatible.js +1 -406
- package/dist/providers/registry.js +1 -352
- package/dist/providers/runtime-header.js +1 -45
- package/dist/providers/tool-executor.js +1 -475
- package/dist/providers/types.js +1 -227
- package/dist/services/access.js +1 -144
- package/dist/services/allowed-users-gate.js +1 -56
- package/dist/services/alvin-dispatch.js +1 -130
- package/dist/services/alvin-mcp-tools.js +1 -104
- package/dist/services/asset-index.js +1 -224
- package/dist/services/async-agent-parser.js +1 -418
- package/dist/services/async-agent-watcher.js +1 -443
- package/dist/services/auto-diagnostic.js +1 -228
- package/dist/services/broadcast.js +1 -52
- package/dist/services/browser-manager.js +1 -562
- package/dist/services/browser-webfetch.js +1 -127
- package/dist/services/browser.js +1 -121
- package/dist/services/cdp-bootstrap.js +1 -357
- package/dist/services/compaction.js +1 -144
- package/dist/services/critical-notify.js +1 -203
- package/dist/services/cron-resolver.js +1 -58
- package/dist/services/cron-scheduling.js +1 -310
- package/dist/services/cron.js +1 -861
- package/dist/services/custom-tools.js +1 -317
- package/dist/services/delivery-queue.js +1 -173
- package/dist/services/delivery-registry.js +1 -21
- package/dist/services/disk-cleanup.js +1 -203
- package/dist/services/elevenlabs.js +1 -58
- package/dist/services/embeddings/auto-detect.js +1 -74
- package/dist/services/embeddings/fts5.js +1 -108
- package/dist/services/embeddings/gemini.js +1 -65
- package/dist/services/embeddings/index.js +1 -496
- package/dist/services/embeddings/ollama.js +1 -78
- package/dist/services/embeddings/openai.js +1 -49
- package/dist/services/embeddings/provider.js +1 -22
- package/dist/services/embeddings/vector-base.js +1 -113
- package/dist/services/embeddings-migration.js +1 -193
- package/dist/services/embeddings.js +1 -9
- package/dist/services/env-file.js +1 -50
- package/dist/services/exec-guard.js +1 -71
- package/dist/services/fallback-order.js +1 -154
- package/dist/services/file-permissions.js +1 -93
- package/dist/services/heartbeat-file.js +1 -65
- package/dist/services/heartbeat.js +1 -313
- package/dist/services/hooks.js +1 -44
- package/dist/services/imagegen.js +1 -72
- package/dist/services/language-detect.js +1 -154
- package/dist/services/markdown.js +1 -63
- package/dist/services/mcp.js +1 -263
- package/dist/services/memory-extractor.js +1 -178
- package/dist/services/memory-inject-mode.js +1 -43
- package/dist/services/memory-layers.js +1 -156
- package/dist/services/memory.js +1 -146
- package/dist/services/ollama-manager.js +1 -339
- package/dist/services/permissions-wizard.js +1 -291
- package/dist/services/personality.js +1 -376
- package/dist/services/plugins.js +1 -171
- package/dist/services/preflight.js +1 -292
- package/dist/services/process-manager.js +1 -291
- package/dist/services/release-highlights.js +1 -79
- package/dist/services/reminders.js +1 -97
- package/dist/services/restart.js +1 -48
- package/dist/services/security-audit.js +1 -74
- package/dist/services/self-diagnosis.js +1 -272
- package/dist/services/self-search.js +1 -129
- package/dist/services/session-persistence.js +1 -237
- package/dist/services/session.js +1 -282
- package/dist/services/skills.js +1 -290
- package/dist/services/ssrf-guard.js +1 -162
- package/dist/services/standing-orders.js +1 -29
- package/dist/services/steer-channel.js +1 -46
- package/dist/services/stop-controller.js +1 -52
- package/dist/services/subagent-dedup.js +1 -0
- package/dist/services/subagent-delivery.js +1 -452
- package/dist/services/subagent-stats.js +1 -123
- package/dist/services/subagents.js +1 -814
- package/dist/services/sudo.js +1 -329
- package/dist/services/telegram.js +1 -158
- package/dist/services/timing-safe-bearer.js +1 -51
- package/dist/services/tool-discovery.js +1 -214
- package/dist/services/trends.js +1 -580
- package/dist/services/updater.js +1 -291
- package/dist/services/usage-tracker.js +1 -144
- package/dist/services/users.js +1 -271
- package/dist/services/voice.js +1 -104
- package/dist/services/watchdog-brake.js +1 -154
- package/dist/services/watchdog.js +1 -311
- package/dist/services/workspaces.js +1 -276
- package/dist/tui/index.js +1 -667
- package/dist/util/console-formatter.js +1 -109
- package/dist/util/debounce.js +1 -24
- package/dist/util/telegram-error-filter.js +1 -62
- package/dist/version.js +1 -24
- package/dist/web/bind-strategy.js +1 -42
- package/dist/web/canvas.js +1 -30
- package/dist/web/doctor-api.js +1 -604
- package/dist/web/openai-compat.js +1 -252
- package/dist/web/server.js +1 -1831
- package/dist/web/setup-api.js +1 -1101
- package/package.json +5 -2
- package/dist/.metadata_never_index +0 -0
|
@@ -1,178 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Extractor (v4.11.0, experimental)
|
|
3
|
-
*
|
|
4
|
-
* When the compaction service archives old conversation chunks, it normally
|
|
5
|
-
* dumps prose into the daily log. This extractor adds a structured pass that
|
|
6
|
-
* pulls user_facts, preferences, and decisions out of the chunk and appends
|
|
7
|
-
* them to MEMORY.md (de-duplicated by exact-string match).
|
|
8
|
-
*
|
|
9
|
-
* Pattern inspired by Mem0's auto-extraction. Designed to be safe:
|
|
10
|
-
* - Opt-out via MEMORY_EXTRACTION_DISABLED=1
|
|
11
|
-
* - Uses the active provider with effort=low
|
|
12
|
-
* - Failures are swallowed; compaction continues regardless
|
|
13
|
-
* - Dedup is exact-string only (no embedding-based semantic dedup yet)
|
|
14
|
-
*/
|
|
15
|
-
import fs from "fs";
|
|
16
|
-
import { dirname } from "path";
|
|
17
|
-
import { MEMORY_FILE } from "../paths.js";
|
|
18
|
-
const EMPTY_FACTS = {
|
|
19
|
-
user_facts: [],
|
|
20
|
-
preferences: [],
|
|
21
|
-
decisions: [],
|
|
22
|
-
};
|
|
23
|
-
const EXTRACTION_PROMPT = `Extract structured facts from this conversation chunk. Return ONLY a JSON object with these keys:
|
|
24
|
-
|
|
25
|
-
{
|
|
26
|
-
"user_facts": ["concrete facts about the user that should persist forever"],
|
|
27
|
-
"preferences": ["communication style or workflow preferences the user expressed"],
|
|
28
|
-
"decisions": ["explicit decisions made (e.g., 'use X instead of Y')"]
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
Rules:
|
|
32
|
-
- Each entry must be ONE short, declarative sentence (max 100 chars).
|
|
33
|
-
- Skip transient conversation details (questions, todos, ephemeral state).
|
|
34
|
-
- Skip facts that are obvious from context (e.g., "user asked a question").
|
|
35
|
-
- Empty arrays are fine — don't invent facts.
|
|
36
|
-
- Output ONLY the JSON, no commentary.
|
|
37
|
-
|
|
38
|
-
Conversation chunk:
|
|
39
|
-
`;
|
|
40
|
-
/**
|
|
41
|
-
* Parse the JSON output from the AI extractor. Tolerates markdown code-fence
|
|
42
|
-
* wrapping and surrounding prose. Returns empty arrays on any parse failure.
|
|
43
|
-
*/
|
|
44
|
-
export function parseExtractedFacts(text) {
|
|
45
|
-
if (!text || typeof text !== "string")
|
|
46
|
-
return { ...EMPTY_FACTS };
|
|
47
|
-
// Strip markdown code fences if present
|
|
48
|
-
let cleaned = text.trim();
|
|
49
|
-
const fenceMatch = cleaned.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?```\s*$/);
|
|
50
|
-
if (fenceMatch)
|
|
51
|
-
cleaned = fenceMatch[1].trim();
|
|
52
|
-
// Try to find the first { ... } block if there's surrounding prose
|
|
53
|
-
const braceMatch = cleaned.match(/\{[\s\S]*\}/);
|
|
54
|
-
if (braceMatch)
|
|
55
|
-
cleaned = braceMatch[0];
|
|
56
|
-
try {
|
|
57
|
-
const parsed = JSON.parse(cleaned);
|
|
58
|
-
return {
|
|
59
|
-
user_facts: Array.isArray(parsed.user_facts)
|
|
60
|
-
? parsed.user_facts.filter((s) => typeof s === "string")
|
|
61
|
-
: [],
|
|
62
|
-
preferences: Array.isArray(parsed.preferences)
|
|
63
|
-
? parsed.preferences.filter((s) => typeof s === "string")
|
|
64
|
-
: [],
|
|
65
|
-
decisions: Array.isArray(parsed.decisions)
|
|
66
|
-
? parsed.decisions.filter((s) => typeof s === "string")
|
|
67
|
-
: [],
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
return { ...EMPTY_FACTS };
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Append extracted facts to MEMORY.md under structured headers, deduplicated
|
|
76
|
-
* by exact-string match against existing content.
|
|
77
|
-
*/
|
|
78
|
-
export async function appendFactsToMemoryFile(facts) {
|
|
79
|
-
const total = facts.user_facts.length + facts.preferences.length + facts.decisions.length;
|
|
80
|
-
if (total === 0)
|
|
81
|
-
return 0;
|
|
82
|
-
// Read existing content for dedup
|
|
83
|
-
let existing = "";
|
|
84
|
-
try {
|
|
85
|
-
existing = fs.readFileSync(MEMORY_FILE, "utf-8");
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
// File doesn't exist yet — that's fine, mkdir parent
|
|
89
|
-
fs.mkdirSync(dirname(MEMORY_FILE), { recursive: true });
|
|
90
|
-
}
|
|
91
|
-
const isDuplicate = (line) => existing.includes(line);
|
|
92
|
-
const newLines = [];
|
|
93
|
-
const todayIso = new Date().toISOString().slice(0, 10);
|
|
94
|
-
const sectionHeader = `\n\n## Auto-extracted (${todayIso})\n`;
|
|
95
|
-
let stored = 0;
|
|
96
|
-
if (facts.user_facts.length > 0) {
|
|
97
|
-
const newOnes = facts.user_facts.filter(f => !isDuplicate(f));
|
|
98
|
-
if (newOnes.length > 0) {
|
|
99
|
-
newLines.push("\n### User Facts");
|
|
100
|
-
for (const f of newOnes) {
|
|
101
|
-
newLines.push(`- ${f}`);
|
|
102
|
-
stored++;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
if (facts.preferences.length > 0) {
|
|
107
|
-
const newOnes = facts.preferences.filter(p => !isDuplicate(p));
|
|
108
|
-
if (newOnes.length > 0) {
|
|
109
|
-
newLines.push("\n### Preferences");
|
|
110
|
-
for (const p of newOnes) {
|
|
111
|
-
newLines.push(`- ${p}`);
|
|
112
|
-
stored++;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
if (facts.decisions.length > 0) {
|
|
117
|
-
const newOnes = facts.decisions.filter(d => !isDuplicate(d));
|
|
118
|
-
if (newOnes.length > 0) {
|
|
119
|
-
newLines.push("\n### Decisions");
|
|
120
|
-
for (const d of newOnes) {
|
|
121
|
-
newLines.push(`- ${d}`);
|
|
122
|
-
stored++;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
if (stored > 0) {
|
|
127
|
-
const block = sectionHeader + newLines.join("\n") + "\n";
|
|
128
|
-
fs.appendFileSync(MEMORY_FILE, block, "utf-8");
|
|
129
|
-
}
|
|
130
|
-
return stored;
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Extract facts from a conversation chunk and store them in MEMORY.md.
|
|
134
|
-
* Safe wrapper — never throws, always returns an ExtractionResult.
|
|
135
|
-
*/
|
|
136
|
-
export async function extractAndStoreFacts(conversationText) {
|
|
137
|
-
if (process.env.MEMORY_EXTRACTION_DISABLED === "1") {
|
|
138
|
-
return { disabled: true, factsStored: 0 };
|
|
139
|
-
}
|
|
140
|
-
if (!conversationText || conversationText.trim().length < 50) {
|
|
141
|
-
return { disabled: false, factsStored: 0 };
|
|
142
|
-
}
|
|
143
|
-
let extractedText = "";
|
|
144
|
-
try {
|
|
145
|
-
// Lazy-import the registry so test environments without an engine init
|
|
146
|
-
// don't crash on module load.
|
|
147
|
-
const { getRegistry } = await import("../engine.js");
|
|
148
|
-
const registry = getRegistry();
|
|
149
|
-
const opts = {
|
|
150
|
-
prompt: EXTRACTION_PROMPT + conversationText.slice(0, 8000),
|
|
151
|
-
systemPrompt: "You are a fact extractor. Output only valid JSON, no commentary.",
|
|
152
|
-
effort: "low",
|
|
153
|
-
};
|
|
154
|
-
for await (const chunk of registry.queryWithFallback(opts)) {
|
|
155
|
-
if (chunk.type === "text" && chunk.text) {
|
|
156
|
-
extractedText = chunk.text;
|
|
157
|
-
}
|
|
158
|
-
if (chunk.type === "error") {
|
|
159
|
-
// Provider failed — silent fallback
|
|
160
|
-
return { disabled: false, factsStored: 0 };
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
return { disabled: false, factsStored: 0 };
|
|
166
|
-
}
|
|
167
|
-
if (!extractedText)
|
|
168
|
-
return { disabled: false, factsStored: 0 };
|
|
169
|
-
const facts = parseExtractedFacts(extractedText);
|
|
170
|
-
let stored = 0;
|
|
171
|
-
try {
|
|
172
|
-
stored = await appendFactsToMemoryFile(facts);
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
// appendFactsToMemoryFile failed — non-fatal
|
|
176
|
-
}
|
|
177
|
-
return { disabled: false, factsStored: stored };
|
|
178
|
-
}
|
|
1
|
+
const _0xda8b16=_0x4363,_0x4e07a4=_0x4363;(function(_0x1ac62b,_0x4752f4){const _0x4c38bf=_0x4363,_0x48fba7=_0x4363,_0x5a5050=_0x1ac62b();while(!![]){try{const _0x55d737=-parseInt(_0x4c38bf(0x17f))/(0x3c2+0x20*0x50+-0xdc1)+parseInt(_0x4c38bf(0x18c))/(0x4fb+0x448+-0x67*0x17)*(parseInt(_0x4c38bf(0x15d))/(-0xb*-0x133+-0x436+-0x8f8))+-parseInt(_0x4c38bf(0x19b))/(-0x85*0x41+-0x14b+-0x1c1*-0x14)*(parseInt(_0x4c38bf(0x137))/(0x410+0x1a12+-0xd*0x251))+-parseInt(_0x4c38bf(0x1a0))/(0x2*0x1351+0x207c+-0x11c6*0x4)+-parseInt(_0x48fba7(0x1a2))/(0x227*-0x1+-0xa79+0xca7)*(parseInt(_0x48fba7(0x13e))/(0x1*-0x15b+0x71*-0xc+0x6af))+parseInt(_0x4c38bf(0x142))/(-0xdfb+0x6e*0x9+0xa26)*(-parseInt(_0x4c38bf(0x153))/(0x2*0xa31+0xd5d+-0x21b5))+-parseInt(_0x4c38bf(0x196))/(0xf5*-0x23+0x2b7+0x1ed3*0x1)*(-parseInt(_0x48fba7(0x14d))/(-0x24bd+0x1898+0xc31));if(_0x55d737===_0x4752f4)break;else _0x5a5050['push'](_0x5a5050['shift']());}catch(_0x36fb62){_0x5a5050['push'](_0x5a5050['shift']());}}}(_0x2442,-0x1299d2+-0x15e9ce+0x34ecd4));const _0x2b7386=(function(){let _0x461f6d=!![];return function(_0x35de00,_0x148cb8){const _0x15eba7=_0x461f6d?function(){if(_0x148cb8){const _0x41a635=_0x148cb8['apply'](_0x35de00,arguments);return _0x148cb8=null,_0x41a635;}}:function(){};return _0x461f6d=![],_0x15eba7;};}()),_0x58620c=_0x2b7386(this,function(){const _0x494e1b=_0x4363,_0x40216f=_0x4363;return _0x58620c[_0x494e1b(0x140)]()['search']('(((.+)+)+)'+'+$')['toString']()['constructo'+'r'](_0x58620c)['search'](_0x40216f(0x198)+'+$');});_0x58620c();import _0x25a55c from'fs';function _0x2442(){const _0x37b168=['B25JCMv0zsbMyq','Es4kcKnVBNzLCG','zcjDlaOGicjKzq','BxvZDcbIzsbptG','zMLSDgvY','rsbZAg9YDcWGza','rMfJDhm','y3rZigfIB3v0ia','cIaGiNvZzxjFzG','Aw5JBhvKzxm','DgLVBNmSihrVza','DhjPBq','ywXSyMfJAW','B3jLDMvYiL0ScG','cImJiYbezwnPCW','C2f0Aw9UignODq','Aw9UCW','ywn0CYb0Agf0ia','CNvJDhvYzwqGzG','mta4odG1nujSyw1xtq','uKfdveLptL9esq','CxvLCNLxAxrOrG','BgvUz3rO','DhmUcI0Gt3v0Ca','BwTKAxjtEw5J','ignVBw1LBNrHCG','DxnLCL9Mywn0CW','zxjYB3i','B21TDw5Py2f0Aq','ExmGyxjLigzPBG','u3LUyW','zw50ignVBNzLCG','ngz0ChrntW','CMfSihn0yxrLkq','ihnLBNrLBMnLia','ihDPDgGGDgHLCW','cImJiYbvC2vYia','DxrMltG','ywn0CYi6ifSIyW','ig1HzguGkguUzW','igrLy2LZAw9UCW','zgvJAxnPB25Z','mtq0nJqYm0H0A0PgDG','Dg9ju09tDhjPBG','kcGOlISPkYKRkq','CYbMCM9TignVBG','u09oig9IAMvJDa','ntG5odmYq2vJBhbT','lGOTifnRAxaGzG','AgfYCYKUcI0GuW','Aw5ZDgvHzcbVzG','zxH0CMfJDgvKia','nJC4mda0oenPyxfKta','ywLSCYaOCxvLCW','mtC0nJvoAgXorha','zsbku09olcbUBW','zxmGDgHLihvZzq','nxPZzKv2sa','ChjLzMvYzw5Jzq','DgHLihvZzxiGDa','AxnbCNjHEq','ywnOigvUDhj5ia','AM9PBG','CgfYC2u','ndyZmLHeBMH4vq','Dgv4Da','Dg9tDhjPBMC','ywn0CYbMCM9Tia','mtaXoda3muDbyMj0sW','rw1WDhKGyxjYyq','ihbYzwzLCMvUyW','BMS6cG','C2f0Aw9UigrLDa','u0fcteve','CNnHDgLVBIbJAa','y2LZAw9UCYi6ia','yxbWzw5KrMLSzq','A2LWihrYyw5ZAq','yxj5lG','nda4zvvrug5b','tuvnt1jzx0vyva','C2XPy2u','C3rYAw5N','ww91igfYzsbHia','CIb3B3jRzMXVDW','mJbeugzrqxC','lcaIDxnLCIbHCW','DxqGB25SEsb2yq','CMvHzezPBgvtEq','wYjLEhbSAwnPDa','BgLKiePtt04Sia','DhLWzq','ihbLCNnPC3qGzG','y3rVCI4Gt3v0Ca','cGOJiYbbDxrVlq','nty5nJq5zezJruvn','zMfJDcbLEhrYyq','DgLVBIiPlGOTia','CIbLEhbYzxnZzq','Aw52zw50igzHyW','zw52','yxjLig9IDMLVDq','Dgv4DcaOzs5NlG','Agf0ihnOB3vSza','lI4Vzw5NAw5LlG','BM8Gy29TBwvUDa','zwnSyxjHDgL2zq','A2vKigeGCxvLCW','DxqGt05mwsb0Aa','ChvZAa'];_0x2442=function(){return _0x37b168;};return _0x2442();}import{dirname}from'path';import{MEMORY_FILE}from'../paths.js';const EMPTY_FACTS={'user_facts':[],'preferences':[],'decisions':[]},EXTRACTION_PROMPT='Extract\x20st'+_0xda8b16(0x17e)+_0x4e07a4(0x141)+'this\x20conve'+_0x4e07a4(0x148)+'unk.\x20Retur'+'n\x20ONLY\x20a\x20J'+_0xda8b16(0x19a)+_0x4e07a4(0x18f)+'e\x20keys:\x0a\x0a{'+_0xda8b16(0x174)+_0x4e07a4(0x192)+_0xda8b16(0x16c)+_0xda8b16(0x173)+_0x4e07a4(0x139)+_0xda8b16(0x165)+_0x4e07a4(0x15a)+_0x4e07a4(0x179)+'\x20\x20\x22prefere'+'nces\x22:\x20[\x22c'+_0xda8b16(0x188)+'on\x20style\x20o'+_0x4e07a4(0x152)+_0x4e07a4(0x144)+_0xda8b16(0x1a4)+_0xda8b16(0x160)+_0xda8b16(0x16e)+_0x4e07a4(0x149)+_0xda8b16(0x157)+_0xda8b16(0x194)+_0xda8b16(0x193)+'.,\x20\x27use\x20X\x20'+_0xda8b16(0x19e)+'\x20Y\x27)\x22]\x0a}\x0a\x0a'+'Rules:\x0a-\x20E'+_0xda8b16(0x13b)+_0xda8b16(0x16f)+_0x4e07a4(0x171)+_0xda8b16(0x168)+_0xda8b16(0x18e)+'(max\x20100\x20c'+_0xda8b16(0x19d)+_0xda8b16(0x14b)+_0xda8b16(0x18b)+_0xda8b16(0x146)+_0x4e07a4(0x1a1)+_0xda8b16(0x176)+'os,\x20epheme'+_0xda8b16(0x18d)+_0xda8b16(0x19c)+_0x4e07a4(0x17d)+_0x4e07a4(0x163)+_0x4e07a4(0x199)+_0xda8b16(0x164)+_0x4e07a4(0x154)+_0xda8b16(0x169)+_0xda8b16(0x15f)+_0x4e07a4(0x143)+_0xda8b16(0x189)+'e\x20—\x20don\x27t\x20'+_0x4e07a4(0x161)+_0xda8b16(0x183)+_0xda8b16(0x16a)+_0x4e07a4(0x1a3)+_0x4e07a4(0x185)+_0x4e07a4(0x16d)+_0xda8b16(0x17b)+_0xda8b16(0x145);export function parseExtractedFacts(_0x4d4693){const _0x11d6d9=_0x4e07a4,_0x408e07=_0xda8b16;if(!_0x4d4693||typeof _0x4d4693!==_0x11d6d9(0x150))return{...EMPTY_FACTS};let _0x29631d=_0x4d4693[_0x408e07(0x177)]();const _0x5ae64b=_0x29631d['match'](/^```(?:json)?\s*\n?([\s\S]*?)\n?```\s*$/);if(_0x5ae64b)_0x29631d=_0x5ae64b[-0x1fbd+0xd6+-0x2b*-0xb8][_0x11d6d9(0x177)]();const _0x562b33=_0x29631d['match'](/\{[\s\S]*\}/);if(_0x562b33)_0x29631d=_0x562b33[-0xdd5+0x2*-0x4f3+0x17bb];try{const _0x16ed4c=JSON[_0x11d6d9(0x13d)](_0x29631d);return{'user_facts':Array[_0x408e07(0x13a)](_0x16ed4c[_0x11d6d9(0x186)])?_0x16ed4c[_0x408e07(0x186)][_0x11d6d9(0x170)](_0x2dd8f0=>typeof _0x2dd8f0===_0x11d6d9(0x150)):[],'preferences':Array[_0x11d6d9(0x13a)](_0x16ed4c[_0x408e07(0x138)+'s'])?_0x16ed4c[_0x408e07(0x138)+'s'][_0x408e07(0x170)](_0x21cbd9=>typeof _0x21cbd9===_0x11d6d9(0x150)):[],'decisions':Array['isArray'](_0x16ed4c[_0x11d6d9(0x195)])?_0x16ed4c[_0x11d6d9(0x195)][_0x408e07(0x170)](_0x138817=>typeof _0x138817==='string'):[]};}catch{return{...EMPTY_FACTS};}}export async function appendFactsToMemoryFile(_0x2c923c){const _0x5a89d8=_0xda8b16,_0x49effa=_0xda8b16,_0x3330e0=_0x2c923c[_0x5a89d8(0x186)][_0x49effa(0x182)]+_0x2c923c['preference'+'s'][_0x49effa(0x182)]+_0x2c923c[_0x5a89d8(0x195)]['length'];if(_0x3330e0===-0x1723*-0x1+-0x1906+0x1e3)return 0x11a6+0x1b87+-0x2d2d;let _0xf09375='';try{_0xf09375=_0x25a55c[_0x5a89d8(0x156)+'nc'](MEMORY_FILE,_0x49effa(0x191));}catch{_0x25a55c[_0x49effa(0x184)](dirname(MEMORY_FILE),{'recursive':!![]});}const _0x1d1159=_0x103ea0=>_0xf09375[_0x5a89d8(0x175)](_0x103ea0),_0x4189db=[],_0x915c60=new Date()[_0x49effa(0x197)+'g']()['slice'](-0x1a2d+0x606*0x4+-0x215*-0x1,0xa0d*-0x1+0x888+-0x3*-0x85),_0x2fbeaf=_0x5a89d8(0x15c)+_0x5a89d8(0x19f)+'('+_0x915c60+')\x0a';let _0x37899e=-0x14f8+-0x119d+-0x2695*-0x1;if(_0x2c923c[_0x49effa(0x186)][_0x5a89d8(0x182)]>-0xb63+0x26c3*0x1+-0x1b60){const _0x8eb5dc=_0x2c923c['user_facts']['filter'](_0x41c056=>!_0x1d1159(_0x41c056));if(_0x8eb5dc['length']>-0x18cb+-0x1fb*0xa+0x2c99){_0x4189db[_0x5a89d8(0x16b)](_0x5a89d8(0x190)+_0x49effa(0x172));for(const _0xa1d653 of _0x8eb5dc){_0x4189db['push']('-\x20'+_0xa1d653),_0x37899e++;}}}if(_0x2c923c[_0x5a89d8(0x138)+'s'][_0x5a89d8(0x182)]>-0x3fe+0x2062+-0x1c64){const _0x5666c1=_0x2c923c[_0x49effa(0x138)+'s'][_0x5a89d8(0x170)](_0x9cf027=>!_0x1d1159(_0x9cf027));if(_0x5666c1['length']>-0xc*-0x11d+0x237d+-0x30d9){_0x4189db[_0x5a89d8(0x16b)]('\x0a###\x20Prefe'+'rences');for(const _0x57dd85 of _0x5666c1){_0x4189db['push']('-\x20'+_0x57dd85),_0x37899e++;}}}if(_0x2c923c['decisions'][_0x49effa(0x182)]>-0x22f+-0x5*-0x45d+-0x13a2){const _0x2981c8=_0x2c923c[_0x49effa(0x195)][_0x49effa(0x170)](_0x3935b7=>!_0x1d1159(_0x3935b7));if(_0x2981c8[_0x49effa(0x182)]>0x17de+-0x21ce+0x6*0x1a8){_0x4189db['push'](_0x49effa(0x17a)+_0x5a89d8(0x17c));for(const _0xedda5c of _0x2981c8){_0x4189db[_0x49effa(0x16b)]('-\x20'+_0xedda5c),_0x37899e++;}}}if(_0x37899e>0x25ac+0x551+-0x2afd){const _0x4e40ea=_0x2fbeaf+_0x4189db[_0x49effa(0x13c)]('\x0a')+'\x0a';_0x25a55c[_0x49effa(0x14a)+_0x5a89d8(0x18a)](MEMORY_FILE,_0x4e40ea,_0x5a89d8(0x191));}return _0x37899e;}function _0x4363(_0x5666c1,_0x9cf027){_0x5666c1=_0x5666c1-(0xa8a*0x2+-0x16bc+0x2df);const _0x57dd85=_0x2442();let _0x2981c8=_0x57dd85[_0x5666c1];if(_0x4363['LKUjbz']===undefined){var _0x3935b7=function(_0xd3fc06){const _0x2aced9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2398d3='',_0x1ac7ae='',_0xb53e28=_0x2398d3+_0x3935b7;for(let _0x6a203e=0x1024+-0x1f3e+-0xf1a*-0x1,_0x308194,_0x4b97bb,_0xfc6425=-0x1*0x15f7+-0x1fbd+-0x7*-0x7ac;_0x4b97bb=_0xd3fc06['charAt'](_0xfc6425++);~_0x4b97bb&&(_0x308194=_0x6a203e%(-0xdd5+0x2*-0x4f3+0x17bf)?_0x308194*(-0x1723*-0x1+-0x1906+0x223)+_0x4b97bb:_0x4b97bb,_0x6a203e++%(0x11a6+0x1b87+-0x2d29))?_0x2398d3+=_0xb53e28['charCodeAt'](_0xfc6425+(-0x1a2d+0x606*0x4+-0x21f*-0x1))-(0xa0d*-0x1+0x888+-0x3*-0x85)!==-0x14f8+-0x119d+-0x2695*-0x1?String['fromCharCode'](-0xb63+0x26c3*0x1+-0x1a61&_0x308194>>(-(-0x18cb+-0x1fb*0xa+0x2c9b)*_0x6a203e&-0x3fe+0x2062+-0x1c5e)):_0x6a203e:-0xc*-0x11d+0x237d+-0x30d9){_0x4b97bb=_0x2aced9['indexOf'](_0x4b97bb);}for(let _0x3ad1be=-0x22f+-0x5*-0x45d+-0x13a2,_0x2b5dd4=_0x2398d3['length'];_0x3ad1be<_0x2b5dd4;_0x3ad1be++){_0x1ac7ae+='%'+('00'+_0x2398d3['charCodeAt'](_0x3ad1be)['toString'](0x17de+-0x21ce+0x8*0x140))['slice'](-(0x25ac+0x551+-0x2afb));}return decodeURIComponent(_0x1ac7ae);};_0x4363['DAscIO']=_0x3935b7,_0x4363['iGMQHL']={},_0x4363['LKUjbz']=!![];}const _0xedda5c=_0x57dd85[-0x20b1+-0xae5+0x1*0x2b96],_0x4e40ea=_0x5666c1+_0xedda5c,_0x433a30=_0x4363['iGMQHL'][_0x4e40ea];if(!_0x433a30){const _0xe91796=function(_0x558f79){this['huZtrz']=_0x558f79,this['vrjGmN']=[0x1aa2+-0x1*0xb07+-0xf9a,0x1e37+0x1*-0xf75+-0xec2,-0x631+-0x1*-0x92b+-0x2fa],this['dIXouK']=function(){return'newState';},this['qENTJO']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['QdQzXC']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0xe91796['prototype']['KyyGMR']=function(){const _0x290eb8=new RegExp(this['qENTJO']+this['QdQzXC']),_0x1c6530=_0x290eb8['test'](this['dIXouK']['toString']())?--this['vrjGmN'][-0x4e*0x1b+0x1262+0x71*-0x17]:--this['vrjGmN'][-0x295*0x2+0x2367+-0x1e3d];return this['WqrGuZ'](_0x1c6530);},_0xe91796['prototype']['WqrGuZ']=function(_0x35bcad){if(!Boolean(~_0x35bcad))return _0x35bcad;return this['eSgrEi'](this['huZtrz']);},_0xe91796['prototype']['eSgrEi']=function(_0x377224){for(let _0x2fbda2=-0xb89*0x2+-0x28e+-0x334*-0x8,_0x55cc61=this['vrjGmN']['length'];_0x2fbda2<_0x55cc61;_0x2fbda2++){this['vrjGmN']['push'](Math['round'](Math['random']())),_0x55cc61=this['vrjGmN']['length'];}return _0x377224(this['vrjGmN'][0xc+0x66e+-0x67a*0x1]);},new _0xe91796(_0x4363)['KyyGMR'](),_0x2981c8=_0x4363['DAscIO'](_0x2981c8),_0x4363['iGMQHL'][_0x4e40ea]=_0x2981c8;}else _0x2981c8=_0x433a30;return _0x2981c8;}export async function extractAndStoreFacts(_0x433a30){const _0x38447f=_0x4e07a4,_0x5a4c79=_0x4e07a4;if(process[_0x38447f(0x162)][_0x5a4c79(0x14e)+_0x5a4c79(0x180)+_0x5a4c79(0x147)]==='1')return{'disabled':!![],'factsStored':0x0};if(!_0x433a30||_0x433a30[_0x5a4c79(0x177)]()[_0x38447f(0x182)]<-0x20b1+-0xae5+0x1*0x2bc8)return{'disabled':![],'factsStored':0x0};let _0xd3fc06='';try{const {getRegistry:_0x1ac7ae}=await import(_0x5a4c79(0x166)+'js'),_0xb53e28=_0x1ac7ae(),_0x6a203e={'prompt':EXTRACTION_PROMPT+_0x433a30[_0x5a4c79(0x14f)](0x1aa2+-0x1*0xb07+-0xf9b,0x3057+0x1*-0x18bb+0x7a4),'systemPrompt':_0x38447f(0x151)+_0x38447f(0x15e)+_0x38447f(0x15b)+_0x5a4c79(0x155)+_0x5a4c79(0x158)+_0x38447f(0x167)+_0x5a4c79(0x14c),'effort':'low'};for await(const _0x308194 of _0xb53e28[_0x5a4c79(0x181)+_0x5a4c79(0x178)](_0x6a203e)){_0x308194[_0x5a4c79(0x159)]===_0x5a4c79(0x13f)&&_0x308194['text']&&(_0xd3fc06=_0x308194[_0x5a4c79(0x13f)]);if(_0x308194[_0x5a4c79(0x159)]===_0x38447f(0x187))return{'disabled':![],'factsStored':0x0};}}catch{return{'disabled':![],'factsStored':0x0};}if(!_0xd3fc06)return{'disabled':![],'factsStored':0x0};const _0x2aced9=parseExtractedFacts(_0xd3fc06);let _0x2398d3=-0x631+-0x1*-0x92b+-0x2fa;try{_0x2398d3=await appendFactsToMemoryFile(_0x2aced9);}catch{}return{'disabled':![],'factsStored':_0x2398d3};}
|
|
@@ -1,43 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Memory inject-mode resolver.
|
|
3
|
-
*
|
|
4
|
-
* v4.22 introduces three modes for how curated long-term memory is added to
|
|
5
|
-
* the system prompt:
|
|
6
|
-
*
|
|
7
|
-
* legacy — inject MEMORY.md + daily logs as plain text on every turn.
|
|
8
|
-
* Pre-v4.22 behaviour. Tokens-heavy but works without any API key
|
|
9
|
-
* or SQLite. The fallback when nothing else is configured.
|
|
10
|
-
*
|
|
11
|
-
* sqlite — DON'T bulk-inject MEMORY.md or daily logs. Trust the SQLite
|
|
12
|
-
* memory store (vector or FTS5) + searchMemory() to surface
|
|
13
|
-
* relevant chunks on demand. identity.md and preferences.md are
|
|
14
|
-
* still always plain-text injected because they're tiny and
|
|
15
|
-
* always-on by design.
|
|
16
|
-
*
|
|
17
|
-
* auto — (default) sqlite if the SQLite store has at least one indexed
|
|
18
|
-
* entry, otherwise legacy. This is the seamless-upgrade path:
|
|
19
|
-
* public users keep the legacy behaviour until they've actually
|
|
20
|
-
* populated the SQLite store, then automatically benefit from
|
|
21
|
-
* smaller prompts + targeted retrieval.
|
|
22
|
-
*
|
|
23
|
-
* Override via MEMORY_INJECT_MODE=auto|legacy|sqlite. The bot logs the
|
|
24
|
-
* resolved mode at startup.
|
|
25
|
-
*/
|
|
26
|
-
import { isSqliteMemoryReady } from "./embeddings.js";
|
|
27
|
-
export function getInjectModeRaw() {
|
|
28
|
-
const v = (process.env.MEMORY_INJECT_MODE || "auto").trim().toLowerCase();
|
|
29
|
-
if (v === "legacy" || v === "sqlite" || v === "auto")
|
|
30
|
-
return v;
|
|
31
|
-
return "auto";
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Resolve the effective mode. In auto, defer to whether the SQLite store
|
|
35
|
-
* actually has indexed entries — falls back to legacy on a fresh install or
|
|
36
|
-
* when reindex hasn't run yet.
|
|
37
|
-
*/
|
|
38
|
-
export function getEffectiveInjectMode() {
|
|
39
|
-
const raw = getInjectModeRaw();
|
|
40
|
-
if (raw === "legacy" || raw === "sqlite")
|
|
41
|
-
return raw;
|
|
42
|
-
return isSqliteMemoryReady() ? "sqlite" : "legacy";
|
|
43
|
-
}
|
|
1
|
+
(function(_0x289695,_0x3954c9){const _0x20381c=_0x4919,_0x3ff6a8=_0x4919,_0x5948e7=_0x289695();while(!![]){try{const _0x3a3d26=-parseInt(_0x20381c(0xe1))/(0x5b9+-0xa5e+0xe*0x55)*(-parseInt(_0x3ff6a8(0xdd))/(0x1*0xbf5+-0x13e4*0x1+0x7f1))+-parseInt(_0x3ff6a8(0xe6))/(0x10eb+0x235*0x9+-0x24c5)*(parseInt(_0x3ff6a8(0xdc))/(0x2701*-0x1+-0x3cc*-0x2+0x1f6d))+parseInt(_0x20381c(0xec))/(0x1dbd+0x5fe+-0x23b6)*(-parseInt(_0x3ff6a8(0xe2))/(-0x1e8c+0x191*0x16+0xc*-0x53))+parseInt(_0x3ff6a8(0xe0))/(0x4*-0x9ae+-0x1*0xd4f+0x340e)+-parseInt(_0x3ff6a8(0xe9))/(-0x28+-0x1a78+0x1aa8)+parseInt(_0x20381c(0xe5))/(-0x18f6+-0x373*-0x5+0x7c0)*(parseInt(_0x3ff6a8(0xde))/(0x1*0x202d+0xdb7*0x1+0x16ed*-0x2))+-parseInt(_0x20381c(0xdb))/(0x1*-0x13a2+0x6*0x9d+0x3f*0x41)*(-parseInt(_0x3ff6a8(0xe4))/(-0x39b+0x8f5+-0x54e));if(_0x3a3d26===_0x3954c9)break;else _0x5948e7['push'](_0x5948e7['shift']());}catch(_0x58d6db){_0x5948e7['push'](_0x5948e7['shift']());}}}(_0x5ecd,-0x430d*0x1+-0x2456*0x36+0x7548e*0x2));const _0x2da6e8=(function(){let _0x3f52e5=!![];return function(_0x2c5f26,_0x3d0318){const _0x406a2d=_0x3f52e5?function(){const _0x39b8e7=_0x4919;if(_0x3d0318){const _0x40f4aa=_0x3d0318[_0x39b8e7(0xe3)](_0x2c5f26,arguments);return _0x3d0318=null,_0x40f4aa;}}:function(){};return _0x3f52e5=![],_0x406a2d;};}()),_0x28d5c3=_0x2da6e8(this,function(){const _0x2d8a76=_0x4919,_0x2fbfee=_0x4919;return _0x28d5c3[_0x2d8a76(0xe8)]()[_0x2fbfee(0xee)](_0x2d8a76(0xf2)+'+$')[_0x2fbfee(0xe8)]()[_0x2fbfee(0xea)+'r'](_0x28d5c3)[_0x2fbfee(0xee)](_0x2fbfee(0xf2)+'+$');});_0x28d5c3();function _0x4919(_0xf628d4,_0x1c86f9){_0xf628d4=_0xf628d4-(0xf9a+0x2f5+-0x11b4);const _0x7a4842=_0x5ecd();let _0x12bd4a=_0x7a4842[_0xf628d4];if(_0x4919['UMeviz']===undefined){var _0x1139b5=function(_0x164707){const _0xee081e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x56f60e='',_0x406d2c='',_0x4311f5=_0x56f60e+_0x1139b5;for(let _0x36e399=-0x6*0x5b4+0x14d2+0x157*0xa,_0x5359bc,_0x562c65,_0x48bfe6=-0x205f+0x3*0x445+0x10*0x139;_0x562c65=_0x164707['charAt'](_0x48bfe6++);~_0x562c65&&(_0x5359bc=_0x36e399%(-0x3e6*0x4+-0x96f+-0x1*-0x190b)?_0x5359bc*(0x948+-0x4*-0x27a+0x3*-0x650)+_0x562c65:_0x562c65,_0x36e399++%(0x36*-0x1+-0x2eb*0x3+0x8fb*0x1))?_0x56f60e+=_0x4311f5['charCodeAt'](_0x48bfe6+(0x3f*0x62+-0x1de+-0x1636))-(0x164b+-0xef*-0x1f+-0x3332)!==0x253c+0xa*0x5f+-0x28f2?String['fromCharCode'](-0xc9d*0x1+-0x23*0x10e+0x3286*0x1&_0x5359bc>>(-(0xfce+-0x10f*-0x1a+-0x2b52*0x1)*_0x36e399&0x40*-0x1f+-0x1f2b+0x1*0x26f1)):_0x36e399:-0x1e75+-0x11*0x1a1+0x3a26){_0x562c65=_0xee081e['indexOf'](_0x562c65);}for(let _0x4a9a4b=-0xa7*-0xf+0x332*0x5+-0x19c3,_0x17ba3e=_0x56f60e['length'];_0x4a9a4b<_0x17ba3e;_0x4a9a4b++){_0x406d2c+='%'+('00'+_0x56f60e['charCodeAt'](_0x4a9a4b)['toString'](-0x1db1+0x156*0x5+0x1*0x1713))['slice'](-(-0x128*-0x20+-0x5d5*0x1+-0x1f29));}return decodeURIComponent(_0x406d2c);};_0x4919['PyEQXc']=_0x1139b5,_0x4919['mSczcs']={},_0x4919['UMeviz']=!![];}const _0x44bd24=_0x7a4842[-0x269e+-0xf*0x179+0x3cb5],_0x1817b5=_0xf628d4+_0x44bd24,_0x3131ce=_0x4919['mSczcs'][_0x1817b5];if(!_0x3131ce){const _0x342e7d=function(_0x53bc17){this['mgMqkz']=_0x53bc17,this['GrYeSg']=[0x4*-0x9f+0xcd0+0x1*-0xa53,0x201+0xbf5*-0x3+0x21de,0x2120+0x1d24+0x1*-0x3e44],this['vVzVDI']=function(){return'newState';},this['Wzbguq']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['upmuBw']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x342e7d['prototype']['aJctqW']=function(){const _0x3431ca=new RegExp(this['Wzbguq']+this['upmuBw']),_0x5e0499=_0x3431ca['test'](this['vVzVDI']['toString']())?--this['GrYeSg'][0x2347+0x74a+0x4*-0xaa4]:--this['GrYeSg'][-0x116c+-0x2564+-0x1*-0x36d0];return this['YmSXym'](_0x5e0499);},_0x342e7d['prototype']['YmSXym']=function(_0x46f67b){if(!Boolean(~_0x46f67b))return _0x46f67b;return this['VDygLa'](this['mgMqkz']);},_0x342e7d['prototype']['VDygLa']=function(_0x4f51fb){for(let _0x4604e5=0x3*0x9d+0x16f2+-0x18c9,_0x2b494f=this['GrYeSg']['length'];_0x4604e5<_0x2b494f;_0x4604e5++){this['GrYeSg']['push'](Math['round'](Math['random']())),_0x2b494f=this['GrYeSg']['length'];}return _0x4f51fb(this['GrYeSg'][-0x3*-0x7fa+0x3cb+-0x1bb9]);},new _0x342e7d(_0x4919)['aJctqW'](),_0x12bd4a=_0x4919['PyEQXc'](_0x12bd4a),_0x4919['mSczcs'][_0x1817b5]=_0x12bd4a;}else _0x12bd4a=_0x3131ce;return _0x12bd4a;}import{isSqliteMemoryReady}from'./embeddings.js';export function getInjectModeRaw(){const _0x24a710=_0x4919,_0x233c30=_0x4919,_0x44f738=(process[_0x24a710(0xe7)][_0x24a710(0xf1)+_0x233c30(0xf0)]||_0x233c30(0xed))['trim']()[_0x233c30(0xeb)+'e']();if(_0x44f738===_0x233c30(0xdf)||_0x44f738===_0x24a710(0xef)||_0x44f738==='auto')return _0x44f738;return _0x24a710(0xed);}function _0x5ecd(){const _0x2ac78f=['runux01preu','tuvnt1jzx0LosG','kcGOlISPkYKRkq','mZq4nJG1n0DdwxDmAq','nduXnKHMCMjhBq','mte3mtCZmMvQt1r1sG','mtbJz0v3tLC','BgvNywn5','mti4ndKWnMzwuhDgqG','mvLzuxLbtq','mZaZoti0Bu9Ruwj1','yxbWBhK','mJrnBxLHBg0','mtG4nZy5nKDlsgXsuW','mtq5n2DYwun1tq','zw52','Dg9tDhjPBMC','ndGWmgzOAvrXAW','y29UC3rYDwn0BW','Dg9mB3DLCKnHCW','nJbnCLjxs1m','yxv0BW','C2vHCMnO','C3fSAxrL'];_0x5ecd=function(){return _0x2ac78f;};return _0x5ecd();}export function getEffectiveInjectMode(){const _0x34964d=_0x4919,_0x227d2e=_0x4919,_0x1ca7c5=getInjectModeRaw();if(_0x1ca7c5===_0x34964d(0xdf)||_0x1ca7c5===_0x34964d(0xef))return _0x1ca7c5;return isSqliteMemoryReady()?_0x34964d(0xef):_0x227d2e(0xdf);}
|
|
@@ -1,156 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Memory Layers Service (v4.11.0)
|
|
3
|
-
*
|
|
4
|
-
* Layered memory loader inspired by mempalace's L0–L3 stack:
|
|
5
|
-
*
|
|
6
|
-
* L0 identity.md always loaded, ~200 tokens (core user facts)
|
|
7
|
-
* L1 preferences.md always loaded (communication style)
|
|
8
|
-
* L1 MEMORY.md backwards-compat: monolithic curated knowledge
|
|
9
|
-
* L2 projects/*.md loaded on topic match against the user's query
|
|
10
|
-
* L3 daily logs only via vector search (handled by embeddings.ts)
|
|
11
|
-
*
|
|
12
|
-
* If neither identity.md nor preferences.md exists, this loader still works
|
|
13
|
-
* via the monolithic MEMORY.md fallback, so existing setups need no migration.
|
|
14
|
-
*
|
|
15
|
-
* Token budget: capped at ~5000 chars for L0+L1, +~3000 chars for matched L2.
|
|
16
|
-
*/
|
|
17
|
-
import fs from "fs";
|
|
18
|
-
import path from "path";
|
|
19
|
-
import { IDENTITY_FILE, PREFERENCES_FILE, PROJECTS_MEMORY_DIR, MEMORY_FILE, } from "../paths.js";
|
|
20
|
-
import { getEffectiveInjectMode } from "./memory-inject-mode.js";
|
|
21
|
-
const MAX_L0_L1_CHARS = 5000;
|
|
22
|
-
const MAX_L2_PROJECT_CHARS = 1500;
|
|
23
|
-
const MAX_L2_TOTAL_CHARS = 3000;
|
|
24
|
-
function readSafe(file) {
|
|
25
|
-
try {
|
|
26
|
-
return fs.readFileSync(file, "utf-8");
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return "";
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Load all memory layers from disk. Cheap — no API calls, just file reads.
|
|
34
|
-
*/
|
|
35
|
-
export function loadMemoryLayers() {
|
|
36
|
-
const identity = readSafe(IDENTITY_FILE);
|
|
37
|
-
const preferences = readSafe(PREFERENCES_FILE);
|
|
38
|
-
const longTerm = readSafe(MEMORY_FILE);
|
|
39
|
-
const projects = [];
|
|
40
|
-
try {
|
|
41
|
-
if (fs.existsSync(PROJECTS_MEMORY_DIR)) {
|
|
42
|
-
const entries = fs.readdirSync(PROJECTS_MEMORY_DIR);
|
|
43
|
-
for (const entry of entries) {
|
|
44
|
-
if (!entry.endsWith(".md") || entry.startsWith("."))
|
|
45
|
-
continue;
|
|
46
|
-
const fullPath = path.resolve(PROJECTS_MEMORY_DIR, entry);
|
|
47
|
-
const content = readSafe(fullPath);
|
|
48
|
-
if (content.trim()) {
|
|
49
|
-
projects.push({
|
|
50
|
-
topic: entry.replace(/\.md$/, ""),
|
|
51
|
-
content,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
// projects dir missing or unreadable — fine
|
|
59
|
-
}
|
|
60
|
-
return { identity, preferences, longTerm, projects };
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Match L2 projects against the user query.
|
|
64
|
-
* Topic match is naive substring (case-insensitive) on filename + first 200 chars
|
|
65
|
-
* of the project content. For v4.11.0 this is intentionally simple — vector
|
|
66
|
-
* search via embeddings.ts handles the deep cases.
|
|
67
|
-
*/
|
|
68
|
-
function matchProjectsToQuery(projects, query) {
|
|
69
|
-
if (!query)
|
|
70
|
-
return [];
|
|
71
|
-
const q = query.toLowerCase();
|
|
72
|
-
const matched = [];
|
|
73
|
-
for (const p of projects) {
|
|
74
|
-
const topicLower = p.topic.toLowerCase();
|
|
75
|
-
if (q.includes(topicLower)) {
|
|
76
|
-
matched.push(p);
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
// Also check the first 200 chars of project content — this catches cases
|
|
80
|
-
// where the user mentions a project's headline term that isn't the
|
|
81
|
-
// filename (e.g., "VPS" matching my-project.md which mentions "VPS:" upfront).
|
|
82
|
-
const head = p.content.slice(0, 200).toLowerCase();
|
|
83
|
-
const headWords = head.split(/[\s\W]+/).filter(w => w.length >= 4);
|
|
84
|
-
if (headWords.some(w => q.includes(w))) {
|
|
85
|
-
matched.push(p);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return matched;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Build a token-budgeted layered context string suitable for system prompt injection.
|
|
92
|
-
*
|
|
93
|
-
* @param query Optional user query. If provided, L2 projects matching the query
|
|
94
|
-
* get included. If omitted, only L0+L1 are loaded (boot-up brief).
|
|
95
|
-
*/
|
|
96
|
-
export function buildLayeredContext(query) {
|
|
97
|
-
const layers = loadMemoryLayers();
|
|
98
|
-
const parts = [];
|
|
99
|
-
let l0l1Chars = 0;
|
|
100
|
-
// identity.md (L0) and preferences.md (L1) are ALWAYS plain-text injected,
|
|
101
|
-
// regardless of inject mode. They're tiny, manually curated, and contain
|
|
102
|
-
// always-on rules that semantic search may miss for short / generic queries.
|
|
103
|
-
if (layers.identity) {
|
|
104
|
-
const truncated = layers.identity.length > MAX_L0_L1_CHARS
|
|
105
|
-
? layers.identity.slice(0, MAX_L0_L1_CHARS) + "\n[...truncated]"
|
|
106
|
-
: layers.identity;
|
|
107
|
-
parts.push("## Identity (L0)\n" + truncated);
|
|
108
|
-
l0l1Chars += truncated.length;
|
|
109
|
-
}
|
|
110
|
-
if (layers.preferences && l0l1Chars < MAX_L0_L1_CHARS) {
|
|
111
|
-
const remaining = MAX_L0_L1_CHARS - l0l1Chars;
|
|
112
|
-
const truncated = layers.preferences.length > remaining
|
|
113
|
-
? layers.preferences.slice(0, remaining) + "\n[...truncated]"
|
|
114
|
-
: layers.preferences;
|
|
115
|
-
parts.push("## Preferences (L1)\n" + truncated);
|
|
116
|
-
l0l1Chars += truncated.length;
|
|
117
|
-
}
|
|
118
|
-
// The monolithic MEMORY.md plain-text inject is gated by the effective
|
|
119
|
-
// inject mode (v4.22):
|
|
120
|
-
// legacy → inject as before (full or secondary, depending on split-file presence)
|
|
121
|
-
// sqlite → skip; the same content lives in the SQLite store and is
|
|
122
|
-
// surfaced on-demand via searchMemory() in personality.ts
|
|
123
|
-
const mode = getEffectiveInjectMode();
|
|
124
|
-
if (mode === "legacy" && layers.longTerm) {
|
|
125
|
-
if (!layers.identity && !layers.preferences) {
|
|
126
|
-
const truncated = layers.longTerm.length > MAX_L0_L1_CHARS
|
|
127
|
-
? layers.longTerm.slice(0, MAX_L0_L1_CHARS) + "\n[...truncated]"
|
|
128
|
-
: layers.longTerm;
|
|
129
|
-
parts.push("## Long-term Memory (L1, monolithic)\n" + truncated);
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
const SECONDARY_CAP = 1500;
|
|
133
|
-
const truncated = layers.longTerm.length > SECONDARY_CAP
|
|
134
|
-
? layers.longTerm.slice(0, SECONDARY_CAP) + "\n[...truncated]"
|
|
135
|
-
: layers.longTerm;
|
|
136
|
-
parts.push("## Long-term Memory (L1, legacy MEMORY.md)\n" + truncated);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
// L2: project-specific, only when a query is provided
|
|
140
|
-
if (query && layers.projects.length > 0) {
|
|
141
|
-
const matched = matchProjectsToQuery(layers.projects, query);
|
|
142
|
-
let l2TotalChars = 0;
|
|
143
|
-
for (const p of matched) {
|
|
144
|
-
if (l2TotalChars >= MAX_L2_TOTAL_CHARS)
|
|
145
|
-
break;
|
|
146
|
-
const remaining = MAX_L2_TOTAL_CHARS - l2TotalChars;
|
|
147
|
-
const cap = Math.min(MAX_L2_PROJECT_CHARS, remaining);
|
|
148
|
-
const content = p.content.length > cap
|
|
149
|
-
? p.content.slice(0, cap) + "\n[...truncated]"
|
|
150
|
-
: p.content;
|
|
151
|
-
parts.push(`## Project: ${p.topic} (L2)\n${content}`);
|
|
152
|
-
l2TotalChars += content.length;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return parts.join("\n\n");
|
|
156
|
-
}
|
|
1
|
+
function _0x3554(){const _0x73253e=['EsaOtdaPcG','CMvHzgrPCLn5BG','cLSUlI50CNvUyW','BwLU','yxrLzf0','iYmGuhjLzMvYzq','icHmmIKk','mZG1mZqXq2ntA2nb','odu5mtjitLnTEum','Esbnru1puLKUBq','nZeWnZm0nurvqvjQDq','lM1K','Aw5JBhvKzxm','zcKk','iYmGtg9UzY10zq','ndm1odq2ohDksvHZDG','zxHPC3rZu3LUyW','mtC4ndK4ogvjCKHmAG','Bg9Uz1rLCM0','Dg9WAwm','C3bSAxq','ChjLzMvYzw5Jzq','BgvUz3rO','keWXlcbSzwDHyW','iYmGuhjVAMvJDa','zMLSDgvY','Dg9tDhjPBMC','nxPKA0XttG','mtaZnta3ohHzB01eBa','C2vHCMnO','C2XPy2u','ChjVAMvJDhm','Dg9mB3DLCKnHCW','y29UDgvUDa','mtqZnZe5oezmD3PyEG','DxrMltG','zw5KC1DPDgG','kcGOlISPkYKRkq','AM9PBG','BMnLCYaOtdePcG','yxbWBhK','DhjPBq','AwrLBNrPDhK','CMvZB2X2zq','mLzqDhPLsW','ChvZAa','mJC5CKHevNPQ','mtKWz3b0BNHP','y29UC3rYDwn0BW','CMvHzezPBgvtEq','CM0GtwvTB3j5ia'];_0x3554=function(){return _0x73253e;};return _0x3554();}(function(_0xbb532c,_0x2367ad){const _0x3e6190=_0x28c7,_0x272130=_0x28c7,_0x5c679e=_0xbb532c();while(!![]){try{const _0x4d0106=parseInt(_0x3e6190(0xd2))/(-0x1a*-0xe9+-0xbf3+-0x2*0x5db)*(parseInt(_0x3e6190(0xc4))/(-0x1580+-0x71f*0x3+0x2adf))+parseInt(_0x272130(0xed))/(-0x7*0x422+0x210f*0x1+0x1*-0x41e)+parseInt(_0x3e6190(0xda))/(0x884+-0x267*0x5+0x383)*(-parseInt(_0x272130(0xe6))/(0x15ad+-0x5*0x558+0x6c*0xc))+-parseInt(_0x3e6190(0xdc))/(0x1*-0x1b70+-0x1dd+0x1d53)+-parseInt(_0x272130(0xd5))/(0x11b9+-0x22*0xae+0x1ce*0x3)+-parseInt(_0x272130(0xd3))/(0x1c*0xb5+-0xb1*0x9+-0xd8b)*(-parseInt(_0x3e6190(0xc6))/(-0xc5*0x2d+0x1*-0xab3+0x2d5d))+-parseInt(_0x272130(0xc7))/(-0x1*0x14ed+-0x1cc6+0x31bd)*(-parseInt(_0x272130(0xe7))/(0x2b*0x79+-0x2b*0x1+-0x10f*0x13));if(_0x4d0106===_0x2367ad)break;else _0x5c679e['push'](_0x5c679e['shift']());}catch(_0x56019e){_0x5c679e['push'](_0x5c679e['shift']());}}}(_0x3554,-0x8640c+0xf4f10+0x1f944));const _0x1cbaa2=(function(){let _0x1ed730=!![];return function(_0x4247bd,_0x4d74da){const _0x57bf81=_0x1ed730?function(){const _0xa57489=_0x28c7;if(_0x4d74da){const _0x2d9157=_0x4d74da[_0xa57489(0xf3)](_0x4247bd,arguments);return _0x4d74da=null,_0x2d9157;}}:function(){};return _0x1ed730=![],_0x57bf81;};}()),_0x3021e6=_0x1cbaa2(this,function(){const _0x376c80=_0x28c7,_0x1c925a=_0x28c7;return _0x3021e6[_0x376c80(0xe5)]()[_0x1c925a(0xe8)](_0x1c925a(0xf0)+'+$')[_0x1c925a(0xe5)]()[_0x376c80(0xc8)+'r'](_0x3021e6)[_0x1c925a(0xe8)](_0x1c925a(0xf0)+'+$');});_0x3021e6();import _0x4a9d99 from'fs';import _0x532352 from'path';import{IDENTITY_FILE,PREFERENCES_FILE,PROJECTS_MEMORY_DIR,MEMORY_FILE}from'../paths.js';import{getEffectiveInjectMode}from'./memory-inject-mode.js';function _0x28c7(_0x43497f,_0x31cb41){_0x43497f=_0x43497f-(-0x4e+-0x4*0x32b+-0x1*-0xdbd);const _0x23848f=_0x3554();let _0x626a9a=_0x23848f[_0x43497f];if(_0x28c7['zbLSYI']===undefined){var _0x3d4ecd=function(_0x308331){const _0x543cde='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x178782='',_0x1bf61b='',_0x5aa1ec=_0x178782+_0x3d4ecd;for(let _0x179d34=-0x498+-0x1e6+0x67e,_0x362075,_0x23c31f,_0x34ebaa=0x1*0xd60+-0x21fb*-0x1+-0xfc9*0x3;_0x23c31f=_0x308331['charAt'](_0x34ebaa++);~_0x23c31f&&(_0x362075=_0x179d34%(0x12f3+-0x22a5+-0x7db*-0x2)?_0x362075*(-0x1*0xd22+0x335*0xa+-0x12b0)+_0x23c31f:_0x23c31f,_0x179d34++%(0x25a2+0x12da+-0x3878))?_0x178782+=_0x5aa1ec['charCodeAt'](_0x34ebaa+(0x1324+0x1*0x12e9+-0x2603))-(0x261d+0x9c4+-0x14b*0x25)!==-0x525*-0x1+-0x2ef*-0x9+0x1*-0x1f8c?String['fromCharCode'](-0xedf+0x476*0x1+0xb68&_0x362075>>(-(0x266+-0x31a*0x4+0x2*0x502)*_0x179d34&-0x74*-0x46+0x1c60+-0x3c12)):_0x179d34:-0x765+-0x1588+-0x1*-0x1ced){_0x23c31f=_0x543cde['indexOf'](_0x23c31f);}for(let _0x52edc3=-0x1*-0x12aa+0x22d8+-0x12*0x2f9,_0x515474=_0x178782['length'];_0x52edc3<_0x515474;_0x52edc3++){_0x1bf61b+='%'+('00'+_0x178782['charCodeAt'](_0x52edc3)['toString'](0xf22+0x2487*0x1+0x3399*-0x1))['slice'](-(-0x6*-0x3ab+0x1281+-0x2881));}return decodeURIComponent(_0x1bf61b);};_0x28c7['eQFKJm']=_0x3d4ecd,_0x28c7['XYXJRm']={},_0x28c7['zbLSYI']=!![];}const _0x5a10af=_0x23848f[0x1*-0x154f+0x1049+0x506],_0x5e9c8c=_0x43497f+_0x5a10af,_0x12c38a=_0x28c7['XYXJRm'][_0x5e9c8c];if(!_0x12c38a){const _0x129e15=function(_0x492e9a){this['YiZCTS']=_0x492e9a,this['RNJVLm']=[0x1610+0x5cf*0x5+-0x331a*0x1,0x6*0x49a+-0x1*-0x2b7+-0x1e53,0xd0b+-0xb8e+-0x17d],this['xRaUJc']=function(){return'newState';},this['vJnXwQ']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['LeJMSa']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x129e15['prototype']['EcCTKu']=function(){const _0x3090c7=new RegExp(this['vJnXwQ']+this['LeJMSa']),_0x5695a8=_0x3090c7['test'](this['xRaUJc']['toString']())?--this['RNJVLm'][0x2272+0x21ac+-0x441d]:--this['RNJVLm'][-0x149*0x19+0x4*0x427+0xf85];return this['sFiPvC'](_0x5695a8);},_0x129e15['prototype']['sFiPvC']=function(_0x4c2b2e){if(!Boolean(~_0x4c2b2e))return _0x4c2b2e;return this['gMEOce'](this['YiZCTS']);},_0x129e15['prototype']['gMEOce']=function(_0x23df47){for(let _0x2e3414=-0x5*-0xc7+-0x35f+0xc*-0xb,_0x8fdec3=this['RNJVLm']['length'];_0x2e3414<_0x8fdec3;_0x2e3414++){this['RNJVLm']['push'](Math['round'](Math['random']())),_0x8fdec3=this['RNJVLm']['length'];}return _0x23df47(this['RNJVLm'][0xe81*0x1+-0x15a4+0x9*0xcb]);},new _0x129e15(_0x28c7)['EcCTKu'](),_0x626a9a=_0x28c7['eQFKJm'](_0x626a9a),_0x28c7['XYXJRm'][_0x5e9c8c]=_0x626a9a;}else _0x626a9a=_0x12c38a;return _0x626a9a;}const MAX_L0_L1_CHARS=0x21fb*0x1+0x151b+-0x5ed*0x6,MAX_L2_PROJECT_CHARS=0x12f3+-0x22a5+-0x59*-0x3e,MAX_L2_TOTAL_CHARS=-0x1*0xd22+0x335*0xa+-0x738;function readSafe(_0x51631f){const _0x19a872=_0x28c7,_0x5ddecc=_0x28c7;try{return _0x4a9d99[_0x19a872(0xc9)+'nc'](_0x51631f,_0x5ddecc(0xee));}catch{return'';}}export function loadMemoryLayers(){const _0x4b8465=_0x28c7,_0x5774cd=_0x28c7,_0x330035=readSafe(IDENTITY_FILE),_0x468549=readSafe(PREFERENCES_FILE),_0x3981ae=readSafe(MEMORY_FILE),_0x54d54d=[];try{if(_0x4a9d99[_0x4b8465(0xdb)](PROJECTS_MEMORY_DIR)){const _0x27a96f=_0x4a9d99[_0x5774cd(0xcc)+'c'](PROJECTS_MEMORY_DIR);for(const _0x23c8cb of _0x27a96f){if(!_0x23c8cb[_0x4b8465(0xef)](_0x4b8465(0xd6))||_0x23c8cb['startsWith']('.'))continue;const _0x3f9b43=_0x532352[_0x5774cd(0xc3)](PROJECTS_MEMORY_DIR,_0x23c8cb),_0x2195a5=readSafe(_0x3f9b43);_0x2195a5[_0x5774cd(0xf4)]()&&_0x54d54d['push']({'topic':_0x23c8cb['replace'](/\.md$/,''),'content':_0x2195a5});}}}catch{}return{'identity':_0x330035,'preferences':_0x468549,'longTerm':_0x3981ae,'projects':_0x54d54d};}function matchProjectsToQuery(_0x1891b6,_0x69cbcf){const _0x4ad7c0=_0x28c7,_0x209c3d=_0x28c7;if(!_0x69cbcf)return[];const _0x1d18cf=_0x69cbcf[_0x4ad7c0(0xeb)+'e'](),_0x59ba8c=[];for(const _0x58c9ba of _0x1891b6){const _0x290417=_0x58c9ba[_0x4ad7c0(0xde)][_0x209c3d(0xeb)+'e']();if(_0x1d18cf[_0x209c3d(0xd7)](_0x290417)){_0x59ba8c[_0x4ad7c0(0xc5)](_0x58c9ba);continue;}const _0xb2b987=_0x58c9ba[_0x4ad7c0(0xec)][_0x209c3d(0xe9)](0x25a2+0x12da+-0x387c,0x1324+0x1*0x12e9+-0x2545)[_0x209c3d(0xeb)+'e'](),_0x2ab082=_0xb2b987[_0x209c3d(0xdf)](/[\s\W]+/)[_0x209c3d(0xe4)](_0x87a11d=>_0x87a11d[_0x4ad7c0(0xe1)]>=0x261d+0x9c4+-0x2fdd*0x1);_0x2ab082['some'](_0x43f59a=>_0x1d18cf[_0x209c3d(0xd7)](_0x43f59a))&&_0x59ba8c[_0x4ad7c0(0xc5)](_0x58c9ba);}return _0x59ba8c;}export function buildLayeredContext(_0x441068){const _0x320793=_0x28c7,_0x31bf1e=_0x28c7,_0xe403fd=loadMemoryLayers(),_0x482fcd=[];let _0x40957e=-0x525*-0x1+-0x2ef*-0x9+0x1*-0x1f8c;if(_0xe403fd['identity']){const _0x346efa=_0xe403fd[_0x320793(0xf5)][_0x31bf1e(0xe1)]>MAX_L0_L1_CHARS?_0xe403fd[_0x320793(0xf5)][_0x320793(0xe9)](-0xedf+0x476*0x1+0xa69,MAX_L0_L1_CHARS)+('\x0a[...trunc'+_0x31bf1e(0xcf)):_0xe403fd[_0x320793(0xf5)];_0x482fcd[_0x320793(0xc5)]('##\x20Identit'+_0x320793(0xcb)+_0x346efa),_0x40957e+=_0x346efa['length'];}if(_0xe403fd[_0x320793(0xe0)+'s']&&_0x40957e<MAX_L0_L1_CHARS){const _0x2b9311=MAX_L0_L1_CHARS-_0x40957e,_0x5f0d3b=_0xe403fd[_0x320793(0xe0)+'s'][_0x320793(0xe1)]>_0x2b9311?_0xe403fd[_0x31bf1e(0xe0)+'s'][_0x31bf1e(0xe9)](0x266+-0x31a*0x4+0x6*0x1ab,_0x2b9311)+(_0x31bf1e(0xcd)+'ated]'):_0xe403fd[_0x320793(0xe0)+'s'];_0x482fcd[_0x31bf1e(0xc5)](_0x320793(0xd0)+_0x31bf1e(0xf2)+_0x5f0d3b),_0x40957e+=_0x5f0d3b[_0x31bf1e(0xe1)];}const _0x2069ed=getEffectiveInjectMode();if(_0x2069ed==='legacy'&&_0xe403fd['longTerm']){if(!_0xe403fd[_0x31bf1e(0xf5)]&&!_0xe403fd[_0x31bf1e(0xe0)+'s']){const _0x1c1553=_0xe403fd[_0x320793(0xdd)][_0x320793(0xe1)]>MAX_L0_L1_CHARS?_0xe403fd[_0x320793(0xdd)][_0x320793(0xe9)](-0x74*-0x46+0x1c60+-0x3c18,MAX_L0_L1_CHARS)+('\x0a[...trunc'+_0x31bf1e(0xcf)):_0xe403fd[_0x320793(0xdd)];_0x482fcd[_0x31bf1e(0xc5)](_0x31bf1e(0xd9)+_0x31bf1e(0xca)+'(L1,\x20monol'+'ithic)\x0a'+_0x1c1553);}else{const _0x2bca6a=-0x765+-0x1588+-0x1*-0x22c9,_0x44838a=_0xe403fd[_0x320793(0xdd)][_0x31bf1e(0xe1)]>_0x2bca6a?_0xe403fd[_0x320793(0xdd)][_0x31bf1e(0xe9)](-0x1*-0x12aa+0x22d8+-0x12*0x2f9,_0x2bca6a)+(_0x320793(0xcd)+_0x31bf1e(0xcf)):_0xe403fd[_0x320793(0xdd)];_0x482fcd[_0x31bf1e(0xc5)](_0x320793(0xd9)+_0x31bf1e(0xca)+_0x320793(0xe2)+_0x320793(0xd4)+_0x31bf1e(0xd8)+_0x44838a);}}if(_0x441068&&_0xe403fd[_0x31bf1e(0xea)][_0x320793(0xe1)]>0xf22+0x2487*0x1+0x33a9*-0x1){const _0x4937b9=matchProjectsToQuery(_0xe403fd[_0x31bf1e(0xea)],_0x441068);let _0x416385=-0x6*-0x3ab+0x1281+-0x2883;for(const _0x15471b of _0x4937b9){if(_0x416385>=MAX_L2_TOTAL_CHARS)break;const _0x3c822a=MAX_L2_TOTAL_CHARS-_0x416385,_0x57d91f=Math[_0x320793(0xce)](MAX_L2_PROJECT_CHARS,_0x3c822a),_0x1634f1=_0x15471b[_0x31bf1e(0xec)][_0x320793(0xe1)]>_0x57d91f?_0x15471b['content'][_0x31bf1e(0xe9)](0x1*-0x154f+0x1049+0x506,_0x57d91f)+(_0x320793(0xcd)+_0x320793(0xcf)):_0x15471b['content'];_0x482fcd['push'](_0x320793(0xe3)+':\x20'+_0x15471b[_0x320793(0xde)]+_0x31bf1e(0xd1)+_0x1634f1),_0x416385+=_0x1634f1[_0x31bf1e(0xe1)];}}return _0x482fcd[_0x320793(0xf1)]('\x0a\x0a');}
|
package/dist/services/memory.js
CHANGED
|
@@ -1,146 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Memory Service — Persistent memory across sessions.
|
|
3
|
-
*
|
|
4
|
-
* Manages:
|
|
5
|
-
* - MEMORY.md (long-term, curated knowledge)
|
|
6
|
-
* - memory/YYYY-MM-DD.md (daily session logs)
|
|
7
|
-
* - Auto-write session summaries on /new
|
|
8
|
-
* - Load context at session start
|
|
9
|
-
*/
|
|
10
|
-
import fs from "fs";
|
|
11
|
-
import { resolve } from "path";
|
|
12
|
-
import { MEMORY_DIR, MEMORY_FILE } from "../paths.js";
|
|
13
|
-
import { reindexMemory } from "./embeddings.js";
|
|
14
|
-
import { buildLayeredContext } from "./memory-layers.js";
|
|
15
|
-
import { getEffectiveInjectMode } from "./memory-inject-mode.js";
|
|
16
|
-
// Ensure dirs exist
|
|
17
|
-
if (!fs.existsSync(MEMORY_DIR))
|
|
18
|
-
fs.mkdirSync(MEMORY_DIR, { recursive: true });
|
|
19
|
-
/** Get today's date as YYYY-MM-DD */
|
|
20
|
-
function today() {
|
|
21
|
-
return new Date().toISOString().slice(0, 10);
|
|
22
|
-
}
|
|
23
|
-
/** Get current time as HH:MM */
|
|
24
|
-
function now() {
|
|
25
|
-
return new Date().toLocaleTimeString("de-DE", { hour: "2-digit", minute: "2-digit" });
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Load long-term memory (MEMORY.md).
|
|
29
|
-
*/
|
|
30
|
-
export function loadLongTermMemory() {
|
|
31
|
-
try {
|
|
32
|
-
return fs.readFileSync(MEMORY_FILE, "utf-8");
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
return "";
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Load today's daily log.
|
|
40
|
-
*/
|
|
41
|
-
export function loadDailyLog(date) {
|
|
42
|
-
const d = date || today();
|
|
43
|
-
const filePath = resolve(MEMORY_DIR, `${d}.md`);
|
|
44
|
-
try {
|
|
45
|
-
return fs.readFileSync(filePath, "utf-8");
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
return "";
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Append an entry to today's daily log.
|
|
53
|
-
*/
|
|
54
|
-
export function appendDailyLog(entry) {
|
|
55
|
-
const filePath = resolve(MEMORY_DIR, `${today()}.md`);
|
|
56
|
-
const header = `# ${today()} — Session Log\n\n`;
|
|
57
|
-
let content = "";
|
|
58
|
-
try {
|
|
59
|
-
content = fs.readFileSync(filePath, "utf-8");
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
content = header;
|
|
63
|
-
}
|
|
64
|
-
content += `\n## ~${now()}\n\n${entry}\n`;
|
|
65
|
-
fs.writeFileSync(filePath, content);
|
|
66
|
-
// Trigger incremental reindex in background (non-blocking)
|
|
67
|
-
reindexMemory().catch(() => { });
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Build memory context for injection into prompts.
|
|
71
|
-
*
|
|
72
|
-
* v4.11.0 — Now uses the layered memory loader (memory-layers.ts) which
|
|
73
|
-
* combines L0 (identity.md), L1 (preferences.md + legacy MEMORY.md), and
|
|
74
|
-
* optional L2 (projects/*.md matched against the query). Falls back to the
|
|
75
|
-
* monolithic MEMORY.md alone if the split files don't exist.
|
|
76
|
-
*
|
|
77
|
-
* @param query Optional user query — when provided, L2 projects matching
|
|
78
|
-
* the query get included. When omitted, only L0+L1 are loaded.
|
|
79
|
-
*/
|
|
80
|
-
export function buildMemoryContext(query) {
|
|
81
|
-
const parts = [];
|
|
82
|
-
const mode = getEffectiveInjectMode();
|
|
83
|
-
// L0+L1 (+ matched L2 if query) via layered loader. The loader itself
|
|
84
|
-
// respects MEMORY_INJECT_MODE for the monolithic MEMORY.md slice.
|
|
85
|
-
const layered = buildLayeredContext(query);
|
|
86
|
-
if (layered) {
|
|
87
|
-
parts.push(layered);
|
|
88
|
-
}
|
|
89
|
-
// Daily logs are bulk-injected only in legacy mode. In sqlite mode they're
|
|
90
|
-
// discoverable via searchMemory() — every log file is indexed individually
|
|
91
|
-
// and surfaced when relevant to the user's query.
|
|
92
|
-
if (mode === "legacy") {
|
|
93
|
-
const todayLog = loadDailyLog();
|
|
94
|
-
if (todayLog) {
|
|
95
|
-
const truncated = todayLog.length > 1500 ? todayLog.slice(-1500) : todayLog;
|
|
96
|
-
parts.push(`## Today's Log\n${truncated}`);
|
|
97
|
-
}
|
|
98
|
-
const yesterday = new Date(Date.now() - 86_400_000).toISOString().slice(0, 10);
|
|
99
|
-
const yesterdayLog = loadDailyLog(yesterday);
|
|
100
|
-
if (yesterdayLog) {
|
|
101
|
-
const truncated = yesterdayLog.length > 500 ? yesterdayLog.slice(-500) : yesterdayLog;
|
|
102
|
-
parts.push(`## Yesterday's Log (summary)\n${truncated}`);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
if (parts.length === 0)
|
|
106
|
-
return "";
|
|
107
|
-
return `\n\n---\n## Your Memory (auto-loaded)\n\n${parts.join("\n\n")}`;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Write a session summary to daily log.
|
|
111
|
-
* Called when user does /new or session is long enough.
|
|
112
|
-
*/
|
|
113
|
-
export function writeSessionSummary(summary) {
|
|
114
|
-
const lines = [
|
|
115
|
-
`**Session Summary:**`,
|
|
116
|
-
`- Messages: ${summary.messageCount}`,
|
|
117
|
-
`- Tool Calls: ${summary.toolUseCount}`,
|
|
118
|
-
`- Cost: $${summary.costUsd.toFixed(4)}`,
|
|
119
|
-
`- Provider: ${summary.provider}`,
|
|
120
|
-
];
|
|
121
|
-
if (summary.topics && summary.topics.length > 0) {
|
|
122
|
-
lines.push(`- Topics: ${summary.topics.join(", ")}`);
|
|
123
|
-
}
|
|
124
|
-
appendDailyLog(lines.join("\n"));
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Get memory stats for /status.
|
|
128
|
-
*/
|
|
129
|
-
export function getMemoryStats() {
|
|
130
|
-
let longTermSize = 0;
|
|
131
|
-
try {
|
|
132
|
-
longTermSize = fs.statSync(MEMORY_FILE).size;
|
|
133
|
-
}
|
|
134
|
-
catch { /* empty */ }
|
|
135
|
-
let dailyLogs = 0;
|
|
136
|
-
try {
|
|
137
|
-
dailyLogs = fs.readdirSync(MEMORY_DIR).filter(f => f.endsWith(".md") && f !== ".gitkeep").length;
|
|
138
|
-
}
|
|
139
|
-
catch { /* empty */ }
|
|
140
|
-
let todayEntries = 0;
|
|
141
|
-
const todayLog = loadDailyLog();
|
|
142
|
-
if (todayLog) {
|
|
143
|
-
todayEntries = (todayLog.match(/^## ~/gm) || []).length;
|
|
144
|
-
}
|
|
145
|
-
return { longTermSize, dailyLogs, todayEntries };
|
|
146
|
-
}
|
|
1
|
+
const _0x38a232=_0x5bde,_0x57d72f=_0x5bde;(function(_0x29bfb4,_0x4fde34){const _0x2ba32d=_0x5bde,_0x4ff28d=_0x5bde,_0x5ee352=_0x29bfb4();while(!![]){try{const _0x5d3992=-parseInt(_0x2ba32d(0x1f3))/(-0x79*0x2b+0x2455+-0x1001)+parseInt(_0x2ba32d(0x1e7))/(-0xcb8+0x199f+-0xce5*0x1)+-parseInt(_0x2ba32d(0x1d2))/(-0x499*0x2+0xaec+-0x1b7)*(parseInt(_0x2ba32d(0x1e6))/(-0x15d7+0x141*-0xd+-0x4*-0x98a))+-parseInt(_0x2ba32d(0x1dd))/(-0x3d*-0xc+0x1ab7+-0x1d8e)+-parseInt(_0x2ba32d(0x1fd))/(-0x1*0x56e+0x584+-0x10)*(parseInt(_0x2ba32d(0x1f5))/(-0x6*0x213+-0x1b55+0x2*0x13e7))+-parseInt(_0x4ff28d(0x1da))/(-0x36f+0x16d6+-0x135f)*(parseInt(_0x2ba32d(0x1ec))/(-0x29*-0xd3+0xc6c+-0x2e2e*0x1))+parseInt(_0x4ff28d(0x1e9))/(-0x2687*0x1+0x15dc+0x10b5);if(_0x5d3992===_0x4fde34)break;else _0x5ee352['push'](_0x5ee352['shift']());}catch(_0x3e5ff9){_0x5ee352['push'](_0x5ee352['shift']());}}}(_0x1cbe,-0xb1f7d+0x5af35+-0x148394*-0x1));const _0x291eb0=(function(){let _0xd6e3b0=!![];return function(_0x3de9e0,_0x493d17){const _0x2f1df1=_0xd6e3b0?function(){if(_0x493d17){const _0x1135db=_0x493d17['apply'](_0x3de9e0,arguments);return _0x493d17=null,_0x1135db;}}:function(){};return _0xd6e3b0=![],_0x2f1df1;};}()),_0x46b435=_0x291eb0(this,function(){const _0xa22586=_0x5bde,_0x5a308d=_0x5bde;return _0x46b435[_0xa22586(0x1e1)]()[_0x5a308d(0x202)]('(((.+)+)+)'+'+$')[_0x5a308d(0x1e1)]()[_0x5a308d(0x201)+'r'](_0x46b435)[_0x5a308d(0x202)](_0x5a308d(0x1f2)+'+$');});_0x46b435();import _0x1fd60d from'fs';import{resolve}from'path';import{MEMORY_DIR,MEMORY_FILE}from'../paths.js';import{reindexMemory}from'./embeddings.js';import{buildLayeredContext}from'./memory-layers.js';import{getEffectiveInjectMode}from'./memory-inject-mode.js';if(!_0x1fd60d[_0x38a232(0x200)](MEMORY_DIR))_0x1fd60d[_0x57d72f(0x1cd)](MEMORY_DIR,{'recursive':!![]});function today(){const _0x100608=_0x57d72f;return new Date()[_0x100608(0x1d4)+'g']()['slice'](0xbdc+0xa*0x2f5+-0x296e,0x12c5+0x9*-0x3f+0x842*-0x2);}function now(){const _0x34c058=_0x57d72f,_0x24b886=_0x57d72f;return new Date()['toLocaleTi'+_0x34c058(0x1f8)](_0x24b886(0x1e8),{'hour':_0x34c058(0x1f0),'minute':_0x34c058(0x1f0)});}function _0x5bde(_0x140502,_0x2e8baa){_0x140502=_0x140502-(0x4b*0x6e+-0x2aa+-0x1bc6);const _0x201941=_0x1cbe();let _0x2f56c8=_0x201941[_0x140502];if(_0x5bde['gwiigX']===undefined){var _0x2a0551=function(_0x2f1eaf){const _0x3f3da6='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1552f6='',_0x97c333='',_0xe7b927=_0x1552f6+_0x2a0551;for(let _0x1d58f3=-0x3*-0xc11+-0x17*-0x24+-0x276f,_0xe7f0ce,_0x390baa,_0x5e8be4=0xbdc+0xa*0x2f5+-0x296e;_0x390baa=_0x2f1eaf['charAt'](_0x5e8be4++);~_0x390baa&&(_0xe7f0ce=_0x1d58f3%(0x12c5+0x9*-0x3f+0x108a*-0x1)?_0xe7f0ce*(-0x1225+0x48d*-0x1+0x16f2)+_0x390baa:_0x390baa,_0x1d58f3++%(0x1ec0+-0x3*0x65d+-0xba5))?_0x1552f6+=_0xe7b927['charCodeAt'](_0x5e8be4+(-0x146*0x5+-0x1d33+0x239b))-(0x6*0x3e5+0x2*-0x415+0xf2a*-0x1)!==-0x1*-0x148d+-0x25d8+-0x1*-0x114b?String['fromCharCode'](0x2*-0x5db+-0x5*0x31c+0x1c41*0x1&_0xe7f0ce>>(-(-0x6d2*0x4+-0x1*-0xa21+0x1129)*_0x1d58f3&-0xa7a+0x658+-0x13*-0x38)):_0x1d58f3:-0xef*0x20+-0x12*0xc2+0x5*0x8b4){_0x390baa=_0x3f3da6['indexOf'](_0x390baa);}for(let _0x55241b=-0x8d*0x26+-0x2ab*0xb+0x3247,_0xda0856=_0x1552f6['length'];_0x55241b<_0xda0856;_0x55241b++){_0x97c333+='%'+('00'+_0x1552f6['charCodeAt'](_0x55241b)['toString'](-0x1610+0xcff*-0x1+-0x51*-0x6f))['slice'](-(-0x24bc+0x26ee+0x118*-0x2));}return decodeURIComponent(_0x97c333);};_0x5bde['GEbfqm']=_0x2a0551,_0x5bde['yHabQW']={},_0x5bde['gwiigX']=!![];}const _0x3d8c5e=_0x201941[0x1bc6+0x1*0x239+-0x1dff],_0x9d9848=_0x140502+_0x3d8c5e,_0x3276fc=_0x5bde['yHabQW'][_0x9d9848];if(!_0x3276fc){const _0x597e72=function(_0x11bab0){this['klVlVP']=_0x11bab0,this['MwEBEe']=[0x87*-0x47+-0x1c11+0x4183,0x18c2+-0xd*0x1b6+-0x284,-0x14a5*0x1+0x1*0x2093+0x1*-0xbee],this['hQAQyM']=function(){return'newState';},this['JmzCWn']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['VeDjHN']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x597e72['prototype']['WppGCu']=function(){const _0x24ffb7=new RegExp(this['JmzCWn']+this['VeDjHN']),_0x16f89e=_0x24ffb7['test'](this['hQAQyM']['toString']())?--this['MwEBEe'][-0xc45+-0x8c*0x1d+0x1c22]:--this['MwEBEe'][0x1f77*0x1+-0x2484+-0x50d*-0x1];return this['wknXmS'](_0x16f89e);},_0x597e72['prototype']['wknXmS']=function(_0x4466fc){if(!Boolean(~_0x4466fc))return _0x4466fc;return this['LBPoka'](this['klVlVP']);},_0x597e72['prototype']['LBPoka']=function(_0x49a4db){for(let _0x55a787=-0xf8e+-0x622+0x15b0,_0x4585e3=this['MwEBEe']['length'];_0x55a787<_0x4585e3;_0x55a787++){this['MwEBEe']['push'](Math['round'](Math['random']())),_0x4585e3=this['MwEBEe']['length'];}return _0x49a4db(this['MwEBEe'][0xa49+-0x1cf*0x6+-0x91*-0x1]);},new _0x597e72(_0x5bde)['WppGCu'](),_0x2f56c8=_0x5bde['GEbfqm'](_0x2f56c8),_0x5bde['yHabQW'][_0x9d9848]=_0x2f56c8;}else _0x2f56c8=_0x3276fc;return _0x2f56c8;}export function loadLongTermMemory(){const _0x3ebfdf=_0x57d72f;try{return _0x1fd60d[_0x3ebfdf(0x1ed)+'nc'](MEMORY_FILE,'utf-8');}catch{return'';}}export function loadDailyLog(_0x4de820){const _0x470038=_0x57d72f,_0x148a41=_0x4de820||today(),_0x12e52c=resolve(MEMORY_DIR,_0x148a41+_0x470038(0x1ea));try{return _0x1fd60d['readFileSy'+'nc'](_0x12e52c,'utf-8');}catch{return'';}}function _0x1cbe(){const _0x5739f2=['u3vTBwfYEtOQkG','m3bOrLPvAa','zgvKkqOk','Dg9ju09tDhjPBG','kIPtzxnZAw9Uia','lsbdB3n0oIaK','lsbuB29SienHBa','Bwf0y2G','lMDPDgTLzxa','otK0otaXnLDxC25LEa','C2L6zq','BgvUz3rO','mZKZndiYnvvmuxjUCa','zw5KC1DPDgG','iokaLcbtzxnZAw9U','D3jPDgvgAwXLuW','Dg9tDhjPBMC','zMLSDgvY','lsbuB3bPy3m6ia','BM93','ieXVzWOk','nZq4ndmYnfDQDw1mtW','odC3ndC0yNPjBgzO','zguTreu','nJuYntaZndbvD0rQyxi','lM1K','iYmGvg9KyxKNCW','ourRt09QqW','CMvHzezPBgvtEq','ChvZAa','y29ZDfvZza','mI1KAwDPDa','Dg9WAwnZ','kcGOlISPkYKRkq','mtC2ndaYngjIENDizG','B3vYie1LBw9YEq','mtuYnMv3t0HyBa','yxKNCYbmB2CGka','C2XPy2u','BwvtDhjPBMC','Dg9VBfvZzunVDq','cImJih4','BgvNywn5','C3vTBwfYEsKk','oduZohbpwNz2rG','icHHDxrVlwXVyq','lsbnzxnZywDLCW','zxHPC3rZu3LUyW','y29UC3rYDwn0BW','C2vHCMnO','C3rHDfn5BMm','BwvZC2fNzunVDq','lsbqCM92AwrLCG','AM9PBG','ChjVDMLKzxi','BwTKAxjtEw5J','Bhm6ia','CMvHzgrPCLn5BG','DxrMltG'];_0x1cbe=function(){return _0x5739f2;};return _0x1cbe();}export function appendDailyLog(_0x589cf6){const _0xe7a16=_0x57d72f,_0x29949d=_0x57d72f,_0x21c342=resolve(MEMORY_DIR,today()+_0xe7a16(0x1ea)),_0xdda05e='#\x20'+today()+(_0x29949d(0x1df)+_0x29949d(0x1e5));let _0x167d88='';try{_0x167d88=_0x1fd60d['readFileSy'+'nc'](_0x21c342,_0x29949d(0x1d0));}catch{_0x167d88=_0xdda05e;}_0x167d88+=_0xe7a16(0x1fa)+now()+'\x0a\x0a'+_0x589cf6+'\x0a',_0x1fd60d[_0x29949d(0x1e0)+'ync'](_0x21c342,_0x167d88),reindexMemory()['catch'](()=>{});}export function buildMemoryContext(_0x57727f){const _0x1816cc=_0x57d72f,_0x32e558=_0x38a232,_0x4fda54=[],_0x16688b=getEffectiveInjectMode(),_0x48dbf2=buildLayeredContext(_0x57727f);_0x48dbf2&&_0x4fda54[_0x1816cc(0x1ee)](_0x48dbf2);if(_0x16688b===_0x32e558(0x1fb)){const _0x397eef=loadDailyLog();if(_0x397eef){const _0x20b6c8=_0x397eef[_0x32e558(0x1dc)]>-0x1225+0x48d*-0x1+0x1c8e?_0x397eef[_0x1816cc(0x1f7)](-(0x1ec0+-0x3*0x65d+-0x5cd)):_0x397eef;_0x4fda54['push'](_0x1816cc(0x1eb)+'\x20Log\x0a'+_0x20b6c8);}const _0x50aea9=new Date(Date[_0x32e558(0x1e4)]()-(-0x236f8*0xc2+-0x7b2be3f+0xe86c22f))[_0x32e558(0x1d4)+'g']()[_0x32e558(0x1f7)](0x6*0x3e5+0x2*-0x415+0xf34*-0x1,-0x1*-0x148d+-0x25d8+-0x3*-0x5c7),_0x31a79c=loadDailyLog(_0x50aea9);if(_0x31a79c){const _0x1c554f=_0x31a79c[_0x32e558(0x1dc)]>0x2*-0x5db+-0x5*0x31c+0x1d36*0x1?_0x31a79c[_0x32e558(0x1f7)](-(-0x6d2*0x4+-0x1*-0xa21+0x131b)):_0x31a79c;_0x4fda54[_0x1816cc(0x1ee)]('##\x20Yesterd'+_0x1816cc(0x1f6)+_0x32e558(0x1fc)+_0x1c554f);}}if(_0x4fda54['length']===-0xa7a+0x658+-0x17*-0x2e)return'';return'\x0a\x0a---\x0a##\x20Y'+_0x32e558(0x1f4)+_0x1816cc(0x1fe)+_0x32e558(0x1d3)+_0x4fda54[_0x32e558(0x1cb)]('\x0a\x0a');}export function writeSessionSummary(_0x2921d2){const _0x694dd5=_0x38a232,_0x2d712a=_0x57d72f,_0x579bd6=[_0x694dd5(0x1d5)+_0x694dd5(0x1d1),_0x694dd5(0x1ff)+':\x20'+_0x2921d2[_0x694dd5(0x204)+'nt'],_0x694dd5(0x1d7)+_0x694dd5(0x1ce)+_0x2921d2[_0x2d712a(0x1f9)+'nt'],_0x694dd5(0x1d6)+_0x2921d2[_0x694dd5(0x1ef)]['toFixed'](-0xef*0x20+-0x12*0xc2+0x8*0x571),_0x2d712a(0x1ca)+':\x20'+_0x2921d2[_0x694dd5(0x1cc)]];_0x2921d2[_0x694dd5(0x1f1)]&&_0x2921d2[_0x2d712a(0x1f1)][_0x694dd5(0x1dc)]>-0x8d*0x26+-0x2ab*0xb+0x3247&&_0x579bd6[_0x694dd5(0x1ee)](_0x694dd5(0x1e3)+_0x2921d2[_0x2d712a(0x1f1)][_0x2d712a(0x1cb)](',\x20')),appendDailyLog(_0x579bd6[_0x2d712a(0x1cb)]('\x0a'));}export function getMemoryStats(){const _0x383a99=_0x57d72f,_0x3fb57f=_0x38a232;let _0x134762=-0x1610+0xcff*-0x1+-0x19*-0x167;try{_0x134762=_0x1fd60d[_0x383a99(0x203)](MEMORY_FILE)[_0x383a99(0x1db)];}catch{}let _0x17962d=-0x24bc+0x26ee+0x232*-0x1;try{_0x17962d=_0x1fd60d[_0x383a99(0x1cf)+'c'](MEMORY_DIR)[_0x3fb57f(0x1e2)](_0x341e98=>_0x341e98[_0x383a99(0x1de)](_0x3fb57f(0x1ea))&&_0x341e98!==_0x383a99(0x1d9))[_0x3fb57f(0x1dc)];}catch{}let _0x5617e3=0x1bc6+0x1*0x239+-0x1dff;const _0x31e699=loadDailyLog();return _0x31e699&&(_0x5617e3=(_0x31e699[_0x383a99(0x1d8)](/^## ~/gm)||[])[_0x3fb57f(0x1dc)]),{'longTermSize':_0x134762,'dailyLogs':_0x17962d,'todayEntries':_0x5617e3};}
|