@tom2012/cc-web 1.5.91 → 1.5.93
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/backend/dist/memory-pool/buoyancy.d.ts +2 -0
- package/backend/dist/memory-pool/buoyancy.d.ts.map +1 -0
- package/backend/dist/memory-pool/buoyancy.js +12 -0
- package/backend/dist/memory-pool/buoyancy.js.map +1 -0
- package/backend/dist/memory-pool/global-pool-manager.d.ts +21 -0
- package/backend/dist/memory-pool/global-pool-manager.d.ts.map +1 -0
- package/backend/dist/memory-pool/global-pool-manager.js +396 -0
- package/backend/dist/memory-pool/global-pool-manager.js.map +1 -0
- package/backend/dist/memory-pool/pool-manager.d.ts +23 -0
- package/backend/dist/memory-pool/pool-manager.d.ts.map +1 -0
- package/backend/dist/memory-pool/pool-manager.js +230 -0
- package/backend/dist/memory-pool/pool-manager.js.map +1 -0
- package/backend/dist/memory-pool/templates.d.ts.map +1 -1
- package/backend/dist/memory-pool/templates.js +98 -133
- package/backend/dist/memory-pool/templates.js.map +1 -1
- package/backend/dist/memory-pool/types.d.ts +65 -0
- package/backend/dist/memory-pool/types.d.ts.map +1 -0
- package/backend/dist/memory-pool/types.js +4 -0
- package/backend/dist/memory-pool/types.js.map +1 -0
- package/backend/dist/routes/memory-pool.d.ts.map +1 -1
- package/backend/dist/routes/memory-pool.js +273 -15
- package/backend/dist/routes/memory-pool.js.map +1 -1
- package/frontend/dist/assets/{GraphPreview-5Ad7E5P5.js → GraphPreview-CSZTNhQX.js} +1 -1
- package/frontend/dist/assets/{OfficePreview-BtdfzoUf.js → OfficePreview-DZmKFnER.js} +2 -2
- package/frontend/dist/assets/{PlanPanel-BzxuZna7.js → PlanPanel-DuAa0AZZ.js} +1 -1
- package/frontend/dist/assets/{ProjectPage-DJSpIIb2.js → ProjectPage-BxuE0x69.js} +5 -5
- package/frontend/dist/assets/{SettingsPage-CufDI4cE.js → SettingsPage-DSnQze4Z.js} +2 -2
- package/frontend/dist/assets/{ShareViewPage-CLuAfYtv.js → ShareViewPage-Dmur70tT.js} +1 -1
- package/frontend/dist/assets/{SkillHubPage-DOXGJ-X_.js → SkillHubPage-DnGb0OHx.js} +2 -2
- package/frontend/dist/assets/{bot-CMOVWzMR.js → bot-DKy4a5yK.js} +1 -1
- package/frontend/dist/assets/{chevron-down-pBWSO11H.js → chevron-down-B-GU2wv8.js} +1 -1
- package/frontend/dist/assets/{download-A2dvNFij.js → download-CsOUNuPy.js} +1 -1
- package/frontend/dist/assets/index-BiVVvGoh.css +1 -0
- package/frontend/dist/assets/{index-DduZUNeK.js → index-C202jcvT.js} +9 -9
- package/frontend/dist/assets/{index-DLG7lJu-.js → index-I4_xf4g_.js} +1 -1
- package/frontend/dist/assets/{jszip.min-DAk2qj6r.js → jszip.min-Dc0FmeMP.js} +1 -1
- package/frontend/dist/assets/{matter-Egqv9e3Y.js → matter-Da3rDMpe.js} +1 -1
- package/frontend/dist/assets/{maximize-2-Dw4chVid.js → maximize-2-BEyzEiyH.js} +1 -1
- package/frontend/dist/assets/{save-Dbdk54Dm.js → save-BYSx9fYK.js} +1 -1
- package/frontend/dist/assets/{user-CT9EiLL3.js → user-D3KuBJwv.js} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-DCC68aQn.css +0 -1
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// backend/src/memory-pool/pool-manager.ts
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.readPool = readPool;
|
|
38
|
+
exports.writePool = writePool;
|
|
39
|
+
exports.readBallContent = readBallContent;
|
|
40
|
+
exports.writeBallContent = writeBallContent;
|
|
41
|
+
exports.enrichBallsWithBuoyancy = enrichBallsWithBuoyancy;
|
|
42
|
+
exports.generateSnapshot = generateSnapshot;
|
|
43
|
+
exports.migrateV1toV2 = migrateV1toV2;
|
|
44
|
+
exports.needsUpgrade = needsUpgrade;
|
|
45
|
+
exports.isInitialized = isInitialized;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const config_1 = require("../config");
|
|
49
|
+
const buoyancy_1 = require("./buoyancy");
|
|
50
|
+
const POOL_FILE = 'pool.json';
|
|
51
|
+
const BALLS_DIR = 'balls';
|
|
52
|
+
const FRONTMATTER_RE = /^---\r?\n[\s\S]*?\r?\n---\r?\n?/;
|
|
53
|
+
function readPool(poolDir) {
|
|
54
|
+
const file = path.join(poolDir, POOL_FILE);
|
|
55
|
+
if (!fs.existsSync(file))
|
|
56
|
+
return null;
|
|
57
|
+
try {
|
|
58
|
+
return JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function writePool(poolDir, pool) {
|
|
65
|
+
(0, config_1.atomicWriteSync)(path.join(poolDir, POOL_FILE), JSON.stringify(pool, null, 2));
|
|
66
|
+
}
|
|
67
|
+
function readBallContent(poolDir, ballId) {
|
|
68
|
+
const file = path.join(poolDir, BALLS_DIR, `${ballId}.md`);
|
|
69
|
+
if (!fs.existsSync(file))
|
|
70
|
+
return null;
|
|
71
|
+
try {
|
|
72
|
+
return fs.readFileSync(file, 'utf-8');
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function writeBallContent(poolDir, ballId, content) {
|
|
79
|
+
const dir = path.join(poolDir, BALLS_DIR);
|
|
80
|
+
if (!fs.existsSync(dir))
|
|
81
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
82
|
+
(0, config_1.atomicWriteSync)(path.join(dir, `${ballId}.md`), content);
|
|
83
|
+
}
|
|
84
|
+
function enrichBallsWithBuoyancy(pool) {
|
|
85
|
+
const { lambda, alpha, t } = pool;
|
|
86
|
+
return pool.balls
|
|
87
|
+
.map((ball) => ({
|
|
88
|
+
...ball,
|
|
89
|
+
buoyancy: (0, buoyancy_1.computeBuoyancy)(ball.B0, ball.H, alpha, lambda, t, ball.t_last, ball.permanent),
|
|
90
|
+
}))
|
|
91
|
+
.sort((a, b) => b.buoyancy - a.buoyancy);
|
|
92
|
+
}
|
|
93
|
+
function generateSnapshot(pool) {
|
|
94
|
+
const balls = enrichBallsWithBuoyancy(pool);
|
|
95
|
+
const cap = pool.active_capacity;
|
|
96
|
+
const active = balls.slice(0, cap);
|
|
97
|
+
const deep = balls.slice(cap);
|
|
98
|
+
const lines = [`## Memory Pool Snapshot (t=${pool.t})`, '### Active (sorted by buoyancy)'];
|
|
99
|
+
active.forEach((b, i) => {
|
|
100
|
+
const perm = b.permanent ? ', permanent' : '';
|
|
101
|
+
lines.push(`${i + 1}. [${b.type}] ${b.summary} (B=${b.buoyancy.toFixed(1)}${perm})`);
|
|
102
|
+
});
|
|
103
|
+
if (deep.length > 0) {
|
|
104
|
+
const lowest = deep[deep.length - 1].buoyancy;
|
|
105
|
+
lines.push(`### Deep (${deep.length} balls, lowest B=${lowest.toFixed(2)})`);
|
|
106
|
+
}
|
|
107
|
+
return lines.join('\n');
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Migrate from v1 (state.json + index.json + frontmatter balls) to v2 (pool.json + pure content balls).
|
|
111
|
+
* Idempotent: if pool.json already exists with version >= 2, returns empty changes.
|
|
112
|
+
*/
|
|
113
|
+
function migrateV1toV2(poolDir) {
|
|
114
|
+
const changes = [];
|
|
115
|
+
// Check if already migrated
|
|
116
|
+
const existing = readPool(poolDir);
|
|
117
|
+
if (existing && existing.version >= 2)
|
|
118
|
+
return { changes };
|
|
119
|
+
// Read old state.json
|
|
120
|
+
const stateFile = path.join(poolDir, 'state.json');
|
|
121
|
+
if (!fs.existsSync(stateFile))
|
|
122
|
+
return { changes: ['no state.json found, skipping'] };
|
|
123
|
+
let state;
|
|
124
|
+
try {
|
|
125
|
+
state = JSON.parse(fs.readFileSync(stateFile, 'utf-8'));
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
throw new Error('state.json is corrupt: ' + (e.message || e));
|
|
129
|
+
}
|
|
130
|
+
// Read old index.json
|
|
131
|
+
const indexFile = path.join(poolDir, 'index.json');
|
|
132
|
+
let oldBalls = [];
|
|
133
|
+
if (fs.existsSync(indexFile)) {
|
|
134
|
+
try {
|
|
135
|
+
const idx = JSON.parse(fs.readFileSync(indexFile, 'utf-8'));
|
|
136
|
+
oldBalls = idx.balls || [];
|
|
137
|
+
}
|
|
138
|
+
catch { /* empty */ }
|
|
139
|
+
}
|
|
140
|
+
// Build ball metadata from index.json entries, enriching with frontmatter data where available
|
|
141
|
+
const ballsMeta = oldBalls.map((b) => {
|
|
142
|
+
// Try to read created_at from ball frontmatter
|
|
143
|
+
let created_at = new Date().toISOString();
|
|
144
|
+
const ballFile = path.join(poolDir, BALLS_DIR, `${b.id}.md`);
|
|
145
|
+
if (fs.existsSync(ballFile)) {
|
|
146
|
+
const raw = fs.readFileSync(ballFile, 'utf-8');
|
|
147
|
+
const match = raw.match(/created_at:\s*"?([^"\n]+)"?/);
|
|
148
|
+
if (match)
|
|
149
|
+
created_at = match[1].trim();
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
id: b.id,
|
|
153
|
+
type: b.type || 'project',
|
|
154
|
+
summary: b.summary || '',
|
|
155
|
+
B0: b.B0 ?? 5,
|
|
156
|
+
H: b.H ?? 0,
|
|
157
|
+
t_last: b.t_last ?? 0,
|
|
158
|
+
hardness: b.hardness ?? 5,
|
|
159
|
+
permanent: false,
|
|
160
|
+
links: b.links || [],
|
|
161
|
+
created_at,
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
// Strip frontmatter from ball files FIRST (before writing pool.json as the v2 gate)
|
|
165
|
+
const ballsDir = path.join(poolDir, BALLS_DIR);
|
|
166
|
+
if (fs.existsSync(ballsDir)) {
|
|
167
|
+
const files = fs.readdirSync(ballsDir).filter((f) => f.endsWith('.md'));
|
|
168
|
+
let stripped = 0;
|
|
169
|
+
for (const file of files) {
|
|
170
|
+
try {
|
|
171
|
+
const filePath = path.join(ballsDir, file);
|
|
172
|
+
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
173
|
+
if (raw.startsWith('---')) {
|
|
174
|
+
const clean = raw.replace(FRONTMATTER_RE, '').trimStart();
|
|
175
|
+
(0, config_1.atomicWriteSync)(filePath, clean);
|
|
176
|
+
stripped++;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (e) {
|
|
180
|
+
changes.push(`warning: failed to strip frontmatter from ${file}: ${e.message}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (stripped > 0)
|
|
184
|
+
changes.push(`stripped frontmatter from ${stripped} ball files`);
|
|
185
|
+
}
|
|
186
|
+
// Write pool.json LAST — this is the v2 gate, so partial migration can be retried
|
|
187
|
+
const pool = {
|
|
188
|
+
version: 2,
|
|
189
|
+
t: state.t ?? 0,
|
|
190
|
+
lambda: state.lambda ?? 0.97,
|
|
191
|
+
alpha: state.alpha ?? 1.0,
|
|
192
|
+
active_capacity: state.active_capacity ?? 20,
|
|
193
|
+
next_id: state.next_id ?? 1,
|
|
194
|
+
pool: state.pool ?? 'project',
|
|
195
|
+
initialized_at: state.initialized_at ?? new Date().toISOString(),
|
|
196
|
+
balls: ballsMeta,
|
|
197
|
+
};
|
|
198
|
+
writePool(poolDir, pool);
|
|
199
|
+
changes.push(`created pool.json with ${ballsMeta.length} balls`);
|
|
200
|
+
// Backup old files (rename, not delete)
|
|
201
|
+
try {
|
|
202
|
+
fs.renameSync(stateFile, stateFile + '.v1bak');
|
|
203
|
+
changes.push('backed up state.json → state.json.v1bak');
|
|
204
|
+
}
|
|
205
|
+
catch { /* non-fatal */ }
|
|
206
|
+
if (fs.existsSync(indexFile)) {
|
|
207
|
+
try {
|
|
208
|
+
fs.renameSync(indexFile, indexFile + '.v1bak');
|
|
209
|
+
changes.push('backed up index.json → index.json.v1bak');
|
|
210
|
+
}
|
|
211
|
+
catch { /* non-fatal */ }
|
|
212
|
+
}
|
|
213
|
+
return { changes };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Check if pool directory uses v1 format (has state.json but no pool.json).
|
|
217
|
+
*/
|
|
218
|
+
function needsUpgrade(poolDir) {
|
|
219
|
+
const hasPool = fs.existsSync(path.join(poolDir, POOL_FILE));
|
|
220
|
+
const hasState = fs.existsSync(path.join(poolDir, 'state.json'));
|
|
221
|
+
return hasState && !hasPool;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Check if pool is initialized (either v1 or v2 format).
|
|
225
|
+
*/
|
|
226
|
+
function isInitialized(poolDir) {
|
|
227
|
+
return (fs.existsSync(path.join(poolDir, POOL_FILE)) ||
|
|
228
|
+
fs.existsSync(path.join(poolDir, 'state.json')));
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=pool-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool-manager.js","sourceRoot":"","sources":["../../src/memory-pool/pool-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/memory-pool/templates.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/memory-pool/templates.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,IAAI,MAAM,CAkJvC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CA2D3C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAiB9C"}
|
|
@@ -7,17 +7,19 @@ exports.generateClaudeMdBlock = generateClaudeMdBlock;
|
|
|
7
7
|
function generateSpecMd() {
|
|
8
8
|
return `# Memory Pool 规范文档 (SPEC.md)
|
|
9
9
|
|
|
10
|
-
>
|
|
10
|
+
> 本文档定义了记忆池系统��完整规范。AI 应在执行复杂记忆操作时参考本文档。
|
|
11
11
|
> 日常操作请使用 QUICK-REF.md。
|
|
12
12
|
|
|
13
13
|
## 一、核心模型:楔形容器与浮球系统
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
记忆池是一个**楔形容器**——利用物理几何来施加计算层面的容量约束。每条记忆是容器中的一个**浮球**,对应 \`.memory-pool/balls/\` 下的一个 \`.md\` 文件。
|
|
16
16
|
|
|
17
|
-
- **活跃层**:浮力最高的 Top-N 个球(N = \`
|
|
17
|
+
- **活跃层**:浮力最高的 Top-N 个球(N = \`pool.json\` 中的 \`active_capacity\`),AI 每次对话应优先加载
|
|
18
18
|
- **深层**:其余球,不主动加载,但可通过查询或连线召回
|
|
19
19
|
- **永不消失**:浮力趋近于零但永远不为零,任何记忆都可被召回
|
|
20
20
|
|
|
21
|
+
物理特性——浮力、碰撞、衰减——驱动记忆的自动筛选、重新排序和重构。可视化是附带收益,而非设计目标。
|
|
22
|
+
|
|
21
23
|
## 二、浮力公式
|
|
22
24
|
|
|
23
25
|
\`\`\`
|
|
@@ -26,24 +28,28 @@ B(t) = (B₀ + α · H) · λ^(t - t_last)
|
|
|
26
28
|
|
|
27
29
|
| 符号 | 含义 | 来源 |
|
|
28
30
|
|------|------|------|
|
|
29
|
-
| B₀ | 初始浮力 |
|
|
30
|
-
| H | 累计命中次数 |
|
|
31
|
-
| α | 查询增益系数 | \`
|
|
32
|
-
| λ | 衰减率 | \`
|
|
33
|
-
| t | 当前全局轮次 | \`
|
|
34
|
-
| t_last | 上次访问轮次 |
|
|
31
|
+
| B₀ | 初始浮力 | \`pool.json\` 球条目 \`B0\` |
|
|
32
|
+
| H | 累计命中次数 | \`pool.json\` 球条目 \`H\` |
|
|
33
|
+
| α | 查询增益系数 | \`pool.json\` → \`alpha\`(默认 1.0) |
|
|
34
|
+
| λ | 衰减率 | \`pool.json\` → \`lambda\`(默认 0.97) |
|
|
35
|
+
| t | 当前全局轮次 | \`pool.json\` → \`t\` |
|
|
36
|
+
| t_last | 上次访问轮次 | \`pool.json\` 球条目 \`t_last\` |
|
|
37
|
+
|
|
38
|
+
**浮力动态计算**:buoyancy 不存储在文件中,每次读取时由后端根据公式实时计算。
|
|
35
39
|
|
|
36
|
-
|
|
40
|
+
**永久标记**:\`permanent: true\` 的球跳过衰减项,\`B(t) = B₀ + α · H\`。
|
|
37
41
|
|
|
38
|
-
|
|
42
|
+
**轮次规则**:每条用户消息算一轮。\`t\` 由系统 hook 自动递增,AI 无需手动管理。
|
|
43
|
+
|
|
44
|
+
## 三、球的属性
|
|
39
45
|
|
|
40
46
|
| 属性 | 字段 | 说明 |
|
|
41
47
|
|------|------|------|
|
|
42
48
|
| 体积 | (正文长度) | 信息的 token 数或字数,越长越大 |
|
|
43
49
|
| 浮力 | \`B0\`, \`H\`, \`t_last\` | 由公式计算,决定检索优先级 |
|
|
44
50
|
| 硬度 | \`hardness\` (0-10) | 抗拆解能力,硬度高的球抵抗分化 |
|
|
45
|
-
| 连线 | \`links[]\` |
|
|
46
|
-
|
|
|
51
|
+
| 连线 | \`links[]\` | 与其他球的关联(ID 数组) |
|
|
52
|
+
| 永久 | \`permanent\` | true 时不参与衰减 |
|
|
47
53
|
|
|
48
54
|
## 四、球的四种类型
|
|
49
55
|
|
|
@@ -54,124 +60,95 @@ B(t) = (B₀ + α · H) · λ^(t - t_last)
|
|
|
54
60
|
| \`project\` | 4-6 | 项目上下文、技术决策、进度状态 |
|
|
55
61
|
| \`reference\` | 2-4 | 外部资源指针(URL、文档位置等) |
|
|
56
62
|
|
|
57
|
-
##
|
|
63
|
+
## 五、文件结构
|
|
58
64
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
t_last: 156
|
|
68
|
-
hardness: 7
|
|
69
|
-
fusion_potential: 0.3
|
|
70
|
-
links:
|
|
71
|
-
- target: ball_0015
|
|
72
|
-
strength: strong
|
|
73
|
-
- target: ball_0038
|
|
74
|
-
strength: weak
|
|
75
|
-
created_at: "2026-04-03T10:00:00Z"
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
(记忆正文内容)
|
|
65
|
+
\`\`\`
|
|
66
|
+
.memory-pool/
|
|
67
|
+
├── pool.json # 唯一的元数据文件(全局参数 + 所有球的元数据)
|
|
68
|
+
├── balls/ # 球文件,纯 markdown 内容(无 YAML frontmatter)
|
|
69
|
+
│ ├── ball_0001.md
|
|
70
|
+
│ └── ...
|
|
71
|
+
├── QUICK-REF.md # 日常操作参考
|
|
72
|
+
└── SPEC.md # 本文档
|
|
79
73
|
\`\`\`
|
|
80
74
|
|
|
81
|
-
|
|
82
|
-
- \`id\`:与文件名一致,格式 \`ball_XXXX\`(从 \`state.json\` 的 \`next_id\` 获取,创建后自增)
|
|
83
|
-
- \`type\`:必须是 \`user\` / \`feedback\` / \`project\` / \`reference\` 之一
|
|
84
|
-
- \`B0\`:初始浮力,参考上方类型表
|
|
85
|
-
- \`H\`:初始为 0,每次被查询/使用时 +1
|
|
86
|
-
- \`t_last\`:初始为创建时的 \`t\` 值,每次被访问时重置为当前 \`t\`
|
|
87
|
-
- \`hardness\`:0-10,评估语义完整性(拆了就丧失意义的信息硬度高)
|
|
88
|
-
- \`fusion_potential\`:0-1,初始为 0,多次共现检索时累积
|
|
89
|
-
- \`links\`:数组,每项包含 \`target\`(目标球 ID)和 \`strength\`(\`strong\` 或 \`weak\`)
|
|
90
|
-
- \`created_at\`:ISO 8601 时间戳
|
|
91
|
-
|
|
92
|
-
## 六、state.json 格式
|
|
75
|
+
### 5.1 pool.json 格式
|
|
93
76
|
|
|
94
77
|
\`\`\`json
|
|
95
78
|
{
|
|
79
|
+
"version": 2,
|
|
96
80
|
"t": 0,
|
|
97
81
|
"lambda": 0.97,
|
|
98
82
|
"alpha": 1.0,
|
|
99
83
|
"active_capacity": 20,
|
|
100
84
|
"next_id": 1,
|
|
101
85
|
"pool": "project",
|
|
102
|
-
"initialized_at": "2026-04-03T10:00:00Z"
|
|
103
|
-
}
|
|
104
|
-
\`\`\`
|
|
105
|
-
|
|
106
|
-
## 七、index.json 格式
|
|
107
|
-
|
|
108
|
-
AI 每次修改球文件后必须同步更新 index.json。前端读取此文件渲染列表。
|
|
109
|
-
|
|
110
|
-
\`\`\`json
|
|
111
|
-
{
|
|
112
|
-
"t": 156,
|
|
113
|
-
"updated_at": "2026-04-03T12:30:00Z",
|
|
86
|
+
"initialized_at": "2026-04-03T10:00:00Z",
|
|
114
87
|
"balls": [
|
|
115
88
|
{
|
|
116
|
-
"id": "
|
|
89
|
+
"id": "ball_0001",
|
|
117
90
|
"type": "feedback",
|
|
118
|
-
"summary": "
|
|
91
|
+
"summary": "不在代码中��加多余注释",
|
|
119
92
|
"B0": 8,
|
|
120
93
|
"H": 3,
|
|
121
94
|
"t_last": 156,
|
|
122
|
-
"buoyancy": 8.2,
|
|
123
95
|
"hardness": 7,
|
|
124
|
-
"
|
|
96
|
+
"permanent": false,
|
|
97
|
+
"links": ["ball_0015", "ball_0038"],
|
|
98
|
+
"created_at": "2026-04-03T10:00:00Z"
|
|
125
99
|
}
|
|
126
100
|
]
|
|
127
101
|
}
|
|
128
102
|
\`\`\`
|
|
129
103
|
|
|
130
|
-
|
|
104
|
+
### 5.2 球文件格式
|
|
131
105
|
|
|
132
|
-
|
|
106
|
+
文件路径:\`.memory-pool/balls/ball_XXXX.md\`
|
|
107
|
+
|
|
108
|
+
球���件为纯 markdown,不包含 YAML frontmatter。所有元数据存储在 \`pool.json\` 中。
|
|
133
109
|
|
|
134
|
-
|
|
110
|
+
## 六、操作流程
|
|
135
111
|
|
|
136
|
-
|
|
137
|
-
2. 创建 \`balls/ball_XXXX.md\`,填写 frontmatter 和正文
|
|
138
|
-
3. \`state.json\` 的 \`next_id\` += 1
|
|
139
|
-
4. 更新 \`index.json\`:添加新球条目,重新计算所有球的 \`buoyancy\`,按浮力降序排列
|
|
112
|
+
### 6.1 创建球
|
|
140
113
|
|
|
141
|
-
|
|
114
|
+
1. 读取 \`pool.json\`,获取 \`next_id\` 和当前 \`t\`
|
|
115
|
+
2. 创建 \`balls/ball_XXXX.md\`,写入纯 markdown 正文
|
|
116
|
+
3. 在 \`pool.json\` 的 \`balls\` 数组中添加新球条目
|
|
117
|
+
4. \`pool.json\` 的 \`next_id\` += 1
|
|
118
|
+
5. 写回 \`pool.json\`
|
|
119
|
+
|
|
120
|
+
### 6.2 查询/使用球(命中更新)
|
|
142
121
|
|
|
143
122
|
每次在对话中使用某个球的信息时:
|
|
144
|
-
1.
|
|
145
|
-
2. \`t_last\` = 当前 \`t\`
|
|
146
|
-
3.
|
|
123
|
+
1. 在 \`pool.json\` 中找到该球条目
|
|
124
|
+
2. \`H\` += 1,\`t_last\` = 当前 \`t\`
|
|
125
|
+
3. 写回 \`pool.json\`
|
|
147
126
|
|
|
148
|
-
###
|
|
127
|
+
### 6.3 维护
|
|
149
128
|
|
|
150
|
-
**衰减**:不需要显式操作——浮力公式中的 \`λ^(t - t_last)\`
|
|
129
|
+
**衰减**:不需要显式操作——浮力公式中的 \`λ^(t - t_last)\` 自动完成衰减,由后端在读取时动态计算。
|
|
151
130
|
|
|
152
131
|
**分化**(大球拆为多个小球):
|
|
153
132
|
- 触发条件:活跃层空间不足,且存在体积大的球
|
|
154
|
-
-
|
|
155
|
-
-
|
|
156
|
-
|
|
133
|
+
- 硬度约束��硬度 ≥ 7 的球不拆
|
|
134
|
+
- 操作:删除原球文件和元数据,创建多个新球,新球之间建立连线
|
|
135
|
+
|
|
136
|
+
### 6.4 连线召回
|
|
157
137
|
|
|
158
|
-
|
|
159
|
-
- 触发条件:\`fusion_potential\` > 0.7 的多个球
|
|
160
|
-
- 操作:合并源球内容为新球,重新评估 B₀ 和硬度,继承外部连线,删除源球文件
|
|
138
|
+
查询命中活跃层某球时,检查其 \`links\`,拉出关联球(H+=1, t_last 重置)。
|
|
161
139
|
|
|
162
|
-
###
|
|
140
|
+
### 6.5 轮次自增
|
|
163
141
|
|
|
164
|
-
|
|
165
|
-
- \`strong\` 连线:直接拉出关联球(H+=1, t_last 重置)
|
|
166
|
-
- \`weak\` 连线:仅当该连线已被多次激活时触发
|
|
142
|
+
\`t\` 由系统 hook 自动递增(每条用户消息 +1)。AI 无需手动管理轮次。
|
|
167
143
|
|
|
168
|
-
|
|
144
|
+
## 七、多容器架构
|
|
169
145
|
|
|
170
|
-
|
|
146
|
+
系统支持两层记忆池:
|
|
171
147
|
|
|
172
|
-
|
|
148
|
+
- **项目池**(\`pool: "project"\`):位于项目目录下 \`.memory-pool/\`,\`lambda: 0.97\`,记录项目内的局部经验
|
|
149
|
+
- **全局池**(\`pool: "global"\`):位于 \`~/.ccweb/memory-pool/\`,\`lambda: 0.99\`,汇总所有项目的通用经验
|
|
173
150
|
|
|
174
|
-
|
|
151
|
+
全局池的 \`t\` 按日历天数递增,通用性记忆自然上浮。项目池初始化/更新时自动注册到全局池。
|
|
175
152
|
`;
|
|
176
153
|
}
|
|
177
154
|
function generateQuickRefMd() {
|
|
@@ -181,31 +158,26 @@ function generateQuickRefMd() {
|
|
|
181
158
|
|
|
182
159
|
## 创建球
|
|
183
160
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
\`\`\`
|
|
161
|
+
1. 读取 \`pool.json\`,获取 \`next_id\` 和 \`t\`
|
|
162
|
+
2. 创建 \`balls/ball_XXXX.md\`(纯 markdown,无 frontmatter)
|
|
163
|
+
3. 在 \`pool.json\` 的 \`balls\` 数组中添加条目:
|
|
188
164
|
|
|
189
|
-
\`\`\`
|
|
190
|
-
|
|
191
|
-
id:
|
|
192
|
-
type: feedback
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
{记忆正文}
|
|
165
|
+
\`\`\`json
|
|
166
|
+
{
|
|
167
|
+
"id": "ball_XXXX",
|
|
168
|
+
"type": "feedback",
|
|
169
|
+
"summary": "简短摘要",
|
|
170
|
+
"B0": 8,
|
|
171
|
+
"H": 0,
|
|
172
|
+
"t_last": 当前t,
|
|
173
|
+
"hardness": 7,
|
|
174
|
+
"permanent": false,
|
|
175
|
+
"links": [],
|
|
176
|
+
"created_at": "ISO时间"
|
|
177
|
+
}
|
|
203
178
|
\`\`\`
|
|
204
179
|
|
|
205
|
-
|
|
206
|
-
# 3. state.json next_id += 1
|
|
207
|
-
# 4. 更新 index.json(重算所有 buoyancy,降序排列)
|
|
208
|
-
\`\`\`
|
|
180
|
+
4. \`next_id\` += 1,写回 \`pool.json\`
|
|
209
181
|
|
|
210
182
|
**B₀ 参考**:feedback=8-10 | user=5-7 | project=4-6 | reference=2-4
|
|
211
183
|
|
|
@@ -215,51 +187,44 @@ created_at: "{ISO时间}"
|
|
|
215
187
|
B(t) = (B0 + alpha * H) * lambda^(t - t_last)
|
|
216
188
|
\`\`\`
|
|
217
189
|
|
|
218
|
-
默认参数在
|
|
190
|
+
默认参数在 pool.json:lambda=0.97, alpha=1.0
|
|
191
|
+
永久球(permanent=true)不乘衰减项。
|
|
192
|
+
buoyancy 由后端动态计算,不存储在文件中。
|
|
219
193
|
|
|
220
194
|
## 命中更新
|
|
221
195
|
|
|
222
|
-
|
|
196
|
+
使用某球信息时:在 pool.json 中找到该球,H += 1, t_last = 当前 t,写回 pool.json
|
|
223
197
|
|
|
224
198
|
## 维护流程
|
|
225
199
|
|
|
226
|
-
1. 读取
|
|
227
|
-
2.
|
|
228
|
-
3.
|
|
229
|
-
4.
|
|
230
|
-
5. 检查是否需要分化(活跃层满 + 大球 + 硬度 < 7)
|
|
231
|
-
6. 检查是否需要融合(fusion_potential > 0.7 的共现球组)
|
|
232
|
-
7. 写回所有修改的球文件 + index.json
|
|
200
|
+
1. 读取 pool.json
|
|
201
|
+
2. 浮力由后端动态计算,无需手动重算
|
|
202
|
+
3. 检查是否需要分化(活跃层满 + 大球 + 硬度 < 7)
|
|
203
|
+
4. 写回 pool.json
|
|
233
204
|
|
|
234
205
|
## 轮次管理
|
|
235
206
|
|
|
236
|
-
|
|
207
|
+
\`t\` 由系统 hook 自动递增,AI 无需手动管理。
|
|
237
208
|
|
|
238
|
-
##
|
|
209
|
+
## pool.json 更新
|
|
239
210
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
\`\`\`json
|
|
243
|
-
{ "id", "type", "summary"(正文首行或摘要), "B0", "H", "t_last", "buoyancy"(计算值), "hardness", "links"(ID数组) }
|
|
244
|
-
\`\`\`
|
|
211
|
+
每次修改球信息后写回 pool.json。只需操作这一个文件(+ 球的 markdown 文件)。
|
|
245
212
|
`;
|
|
246
213
|
}
|
|
247
214
|
function generateClaudeMdBlock() {
|
|
248
|
-
return
|
|
249
|
-
## 记忆池(Memory Pool)
|
|
215
|
+
return `## 记忆池(Memory Pool)
|
|
250
216
|
|
|
251
217
|
本项目已启用记忆池系统。
|
|
252
218
|
|
|
253
219
|
**每次对话开始时:**
|
|
254
220
|
1. 读取 \`.memory-pool/QUICK-REF.md\` 了解操作规范
|
|
255
|
-
2. 读取 \`.memory-pool/
|
|
256
|
-
3.
|
|
257
|
-
4. 将活跃层记忆纳入当前对话上下文
|
|
221
|
+
2. 读取 \`.memory-pool/pool.json\` 加载全局参数和活跃层记忆
|
|
222
|
+
3. 将活跃层记忆纳入当前对话上下文
|
|
258
223
|
|
|
259
224
|
**对话过程中:**
|
|
260
225
|
- 遇到重要信息时主动提议存入记忆池
|
|
261
226
|
- 用户要求记忆操作时参照 QUICK-REF.md 执行
|
|
262
|
-
- 每次操作后更新
|
|
227
|
+
- 每次操作后更新 pool.json
|
|
263
228
|
|
|
264
229
|
**完整规范:** \`.memory-pool/SPEC.md\`
|
|
265
230
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/memory-pool/templates.ts"],"names":[],"mappings":";AAAA,uCAAuC;;AAEvC,
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/memory-pool/templates.ts"],"names":[],"mappings":";AAAA,uCAAuC;;AAEvC,wCAkJC;AAED,gDA2DC;AAED,sDAiBC;AAlOD,SAAgB,cAAc;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgJR,CAAC;AACF,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDR,CAAC;AACF,CAAC;AAED,SAAgB,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;CAeR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export interface GlobalBallOrigin {
|
|
2
|
+
source_project: string;
|
|
3
|
+
source_ball_id: string;
|
|
4
|
+
synced_at: string;
|
|
5
|
+
}
|
|
6
|
+
export interface PoolBallMeta {
|
|
7
|
+
id: string;
|
|
8
|
+
type: 'user' | 'feedback' | 'project' | 'reference';
|
|
9
|
+
summary: string;
|
|
10
|
+
B0: number;
|
|
11
|
+
H: number;
|
|
12
|
+
t_last: number;
|
|
13
|
+
hardness: number;
|
|
14
|
+
permanent: boolean;
|
|
15
|
+
links: string[];
|
|
16
|
+
created_at: string;
|
|
17
|
+
origins?: GlobalBallOrigin[];
|
|
18
|
+
orphaned?: boolean;
|
|
19
|
+
pre_orphan_B0?: number;
|
|
20
|
+
global_ball_id?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface PoolJson {
|
|
23
|
+
version: number;
|
|
24
|
+
t: number;
|
|
25
|
+
lambda: number;
|
|
26
|
+
alpha: number;
|
|
27
|
+
active_capacity: number;
|
|
28
|
+
next_id: number;
|
|
29
|
+
pool: string;
|
|
30
|
+
initialized_at: string;
|
|
31
|
+
balls: PoolBallMeta[];
|
|
32
|
+
global_pool_path?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface PoolBallWithBuoyancy extends PoolBallMeta {
|
|
35
|
+
buoyancy: number;
|
|
36
|
+
}
|
|
37
|
+
export interface SourceEntry {
|
|
38
|
+
project_id: string;
|
|
39
|
+
project_name: string;
|
|
40
|
+
pool_path: string;
|
|
41
|
+
registered_at: string;
|
|
42
|
+
last_synced_at: string | null;
|
|
43
|
+
status: 'active' | 'unreachable';
|
|
44
|
+
unreachable_count?: number;
|
|
45
|
+
}
|
|
46
|
+
export interface SourcesJson {
|
|
47
|
+
version: number;
|
|
48
|
+
sources: SourceEntry[];
|
|
49
|
+
}
|
|
50
|
+
export interface SyncResult {
|
|
51
|
+
added: number;
|
|
52
|
+
updated: number;
|
|
53
|
+
skipped: number;
|
|
54
|
+
orphaned: number;
|
|
55
|
+
unreachable_projects: string[];
|
|
56
|
+
synced_projects: string[];
|
|
57
|
+
}
|
|
58
|
+
export interface ImportPreviewBall {
|
|
59
|
+
global_ball_id: string;
|
|
60
|
+
type: string;
|
|
61
|
+
summary: string;
|
|
62
|
+
buoyancy: number;
|
|
63
|
+
origins_count: number;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=types.d.ts.map
|