惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
J
Java Code Geeks
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
A
About on SuperTechFans
腾讯CDC
B
Blog RSS Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Azure Blog
Microsoft Azure Blog
D
Docker
Y
Y Combinator Blog
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
I
InfoQ
博客园 - 【当耐特】
美团技术团队
GbyAI
GbyAI
量子位
宝玉的分享
宝玉的分享
爱范儿
爱范儿
有赞技术团队
有赞技术团队
博客园 - Franky
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
fix #95495: [Bug]: 2026.6.9 silently relocates memory sto...
mushuiyu886 · 2026-06-24 · via Recent Commits to openclaw:main
11

// Memory schema tests cover canonical table creation and shipped-name migration.

2+

import fs from "node:fs";

3+

import os from "node:os";

4+

import path from "node:path";

25

import { DatabaseSync } from "node:sqlite";

36

import { describe, expect, it } from "vitest";

47

import { ensureMemoryIndexSchema } from "./memory-schema.js";

@@ -87,6 +90,79 @@ describe("memory index schema", () => {

8790

}

8891

});

899293+

it("does not import a legacy sidecar memory database during schema startup", () => {

94+

const rootDir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-memory-sidecar-"));

95+

const legacyPath = path.join(rootDir, "memory", "main.sqlite");

96+

const agentPath = path.join(rootDir, "agents", "main", "agent", "openclaw-agent.sqlite");

97+

fs.mkdirSync(path.dirname(legacyPath), { recursive: true });

98+

fs.mkdirSync(path.dirname(agentPath), { recursive: true });

99+

const legacyDb = new DatabaseSync(legacyPath);

100+

try {

101+

legacyDb.exec(`

102+

CREATE TABLE meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);

103+

CREATE TABLE files (

104+

path TEXT PRIMARY KEY,

105+

source TEXT NOT NULL DEFAULT 'memory',

106+

hash TEXT NOT NULL,

107+

mtime INTEGER NOT NULL,

108+

size INTEGER NOT NULL

109+

);

110+

CREATE TABLE chunks (

111+

id TEXT PRIMARY KEY,

112+

path TEXT NOT NULL,

113+

source TEXT NOT NULL DEFAULT 'memory',

114+

start_line INTEGER NOT NULL,

115+

end_line INTEGER NOT NULL,

116+

hash TEXT NOT NULL,

117+

model TEXT NOT NULL,

118+

text TEXT NOT NULL,

119+

embedding TEXT NOT NULL,

120+

updated_at INTEGER NOT NULL

121+

);

122+

CREATE TABLE embedding_cache (

123+

provider TEXT NOT NULL,

124+

model TEXT NOT NULL,

125+

provider_key TEXT NOT NULL,

126+

hash TEXT NOT NULL,

127+

embedding TEXT NOT NULL,

128+

dims INTEGER,

129+

updated_at INTEGER NOT NULL,

130+

PRIMARY KEY (provider, model, provider_key, hash)

131+

);

132+

INSERT INTO meta VALUES ('memory_index_meta_v1', '{"vectorDims":3}');

133+

INSERT INTO files VALUES ('MEMORY.md', 'memory', 'file-hash', 10, 20);

134+

INSERT INTO chunks VALUES (

135+

'chunk-1', 'MEMORY.md', 'memory', 1, 2, 'chunk-hash', 'embed-model',

136+

'remember this', '[1,0,0]', 30

137+

);

138+

INSERT INTO embedding_cache VALUES (

139+

'openai', 'embed-model', 'key', 'chunk-hash', '[1,0,0]', 3, 40

140+

);

141+

`);

142+

} finally {

143+

legacyDb.close();

144+

}

145+146+

const db = new DatabaseSync(agentPath);

147+

try {

148+

const result = ensureMemoryIndexSchema({

149+

db,

150+

cacheEnabled: true,

151+

ftsEnabled: true,

152+

});

153+154+

expect(result.ftsAvailable).toBe(true);

155+

expect(db.prepare("SELECT * FROM memory_index_sources").all()).toEqual([]);

156+

expect(db.prepare("SELECT id, text FROM memory_index_chunks").all()).toEqual([]);

157+

expect(db.prepare("SELECT id, text FROM memory_index_chunks_fts").all()).toEqual([]);

158+

expect(db.prepare("SELECT provider, hash FROM memory_embedding_cache").all()).toEqual([]);

159+

expect(fs.existsSync(legacyPath)).toBe(true);

160+

} finally {

161+

db.close();

162+

fs.rmSync(rootDir, { recursive: true, force: true });

163+

}

164+

});

165+90166

it("stores source records with the same path in separate sources", () => {

91167

const db = new DatabaseSync(":memory:");

92168

try {