@tom2012/cc-web 1.5.91 → 1.5.92

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.
Files changed (39) hide show
  1. package/backend/dist/memory-pool/buoyancy.d.ts +2 -0
  2. package/backend/dist/memory-pool/buoyancy.d.ts.map +1 -0
  3. package/backend/dist/memory-pool/buoyancy.js +12 -0
  4. package/backend/dist/memory-pool/buoyancy.js.map +1 -0
  5. package/backend/dist/memory-pool/pool-manager.d.ts +23 -0
  6. package/backend/dist/memory-pool/pool-manager.d.ts.map +1 -0
  7. package/backend/dist/memory-pool/pool-manager.js +230 -0
  8. package/backend/dist/memory-pool/pool-manager.js.map +1 -0
  9. package/backend/dist/memory-pool/templates.d.ts.map +1 -1
  10. package/backend/dist/memory-pool/templates.js +94 -134
  11. package/backend/dist/memory-pool/templates.js.map +1 -1
  12. package/backend/dist/memory-pool/types.d.ts +27 -0
  13. package/backend/dist/memory-pool/types.d.ts.map +1 -0
  14. package/backend/dist/memory-pool/types.js +4 -0
  15. package/backend/dist/memory-pool/types.js.map +1 -0
  16. package/backend/dist/routes/memory-pool.d.ts.map +1 -1
  17. package/backend/dist/routes/memory-pool.js +124 -16
  18. package/backend/dist/routes/memory-pool.js.map +1 -1
  19. package/frontend/dist/assets/{GraphPreview-5Ad7E5P5.js → GraphPreview-QiSxy4LP.js} +1 -1
  20. package/frontend/dist/assets/{OfficePreview-BtdfzoUf.js → OfficePreview-DlUCjmFD.js} +2 -2
  21. package/frontend/dist/assets/{PlanPanel-BzxuZna7.js → PlanPanel-Dn5PCqCc.js} +1 -1
  22. package/frontend/dist/assets/{ProjectPage-DJSpIIb2.js → ProjectPage-XG9MZm7t.js} +5 -5
  23. package/frontend/dist/assets/{SettingsPage-CufDI4cE.js → SettingsPage-ofs1M1K_.js} +1 -1
  24. package/frontend/dist/assets/{ShareViewPage-CLuAfYtv.js → ShareViewPage-u8FXEdhC.js} +1 -1
  25. package/frontend/dist/assets/{SkillHubPage-DOXGJ-X_.js → SkillHubPage-DYQ3--oW.js} +2 -2
  26. package/frontend/dist/assets/{bot-CMOVWzMR.js → bot-63iGenXw.js} +1 -1
  27. package/frontend/dist/assets/{chevron-down-pBWSO11H.js → chevron-down-CzkwkeMW.js} +1 -1
  28. package/frontend/dist/assets/{download-A2dvNFij.js → download-DhFx0Fu-.js} +1 -1
  29. package/frontend/dist/assets/{index-DduZUNeK.js → index-C8aR4tRp.js} +4 -4
  30. package/frontend/dist/assets/{index-DLG7lJu-.js → index-DKsG2yPY.js} +1 -1
  31. package/frontend/dist/assets/index-DVUjdhq8.css +1 -0
  32. package/frontend/dist/assets/{jszip.min-DAk2qj6r.js → jszip.min-B9vwwWDL.js} +1 -1
  33. package/frontend/dist/assets/{matter-Egqv9e3Y.js → matter-CCkX66fz.js} +1 -1
  34. package/frontend/dist/assets/{maximize-2-Dw4chVid.js → maximize-2-B3mAuuFs.js} +1 -1
  35. package/frontend/dist/assets/{save-Dbdk54Dm.js → save-CxQAMJ-_.js} +1 -1
  36. package/frontend/dist/assets/{user-CT9EiLL3.js → user-DxwkzcYb.js} +1 -1
  37. package/frontend/dist/index.html +2 -2
  38. package/package.json +1 -1
  39. package/frontend/dist/assets/index-DCC68aQn.css +0 -1
@@ -0,0 +1,2 @@
1
+ export declare function computeBuoyancy(B0: number, H: number, alpha: number, lambda: number, t: number, t_last: number, permanent: boolean): number;
2
+ //# sourceMappingURL=buoyancy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buoyancy.d.ts","sourceRoot":"","sources":["../../src/memory-pool/buoyancy.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,OAAO,GACjB,MAAM,CAKR"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ // backend/src/memory-pool/buoyancy.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.computeBuoyancy = computeBuoyancy;
5
+ function computeBuoyancy(B0, H, alpha, lambda, t, t_last, permanent) {
6
+ const base = B0 + alpha * H;
7
+ if (permanent)
8
+ return Math.round(base * 100) / 100;
9
+ const decay = Math.pow(lambda, Math.max(0, t - t_last));
10
+ return Math.round(base * decay * 100) / 100;
11
+ }
12
+ //# sourceMappingURL=buoyancy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buoyancy.js","sourceRoot":"","sources":["../../src/memory-pool/buoyancy.ts"],"names":[],"mappings":";AAAA,sCAAsC;;AAEtC,0CAaC;AAbD,SAAgB,eAAe,CAC7B,EAAU,EACV,CAAS,EACT,KAAa,EACb,MAAc,EACd,CAAS,EACT,MAAc,EACd,SAAkB;IAElB,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;IAC5B,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { PoolJson, PoolBallWithBuoyancy } from './types';
2
+ export declare function readPool(poolDir: string): PoolJson | null;
3
+ export declare function writePool(poolDir: string, pool: PoolJson): void;
4
+ export declare function readBallContent(poolDir: string, ballId: string): string | null;
5
+ export declare function writeBallContent(poolDir: string, ballId: string, content: string): void;
6
+ export declare function enrichBallsWithBuoyancy(pool: PoolJson): PoolBallWithBuoyancy[];
7
+ export declare function generateSnapshot(pool: PoolJson): string;
8
+ /**
9
+ * Migrate from v1 (state.json + index.json + frontmatter balls) to v2 (pool.json + pure content balls).
10
+ * Idempotent: if pool.json already exists with version >= 2, returns empty changes.
11
+ */
12
+ export declare function migrateV1toV2(poolDir: string): {
13
+ changes: string[];
14
+ };
15
+ /**
16
+ * Check if pool directory uses v1 format (has state.json but no pool.json).
17
+ */
18
+ export declare function needsUpgrade(poolDir: string): boolean;
19
+ /**
20
+ * Check if pool is initialized (either v1 or v2 format).
21
+ */
22
+ export declare function isInitialized(poolDir: string): boolean;
23
+ //# sourceMappingURL=pool-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-manager.d.ts","sourceRoot":"","sources":["../../src/memory-pool/pool-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAgB,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAOvE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAQzD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAE/D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ9E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIvF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,oBAAoB,EAAE,CAQ9E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAkBvD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAqGpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKtD"}
@@ -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":";AAAA,0CAA0C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAY1C,4BAQC;AAED,8BAEC;AAED,0CAQC;AAED,4CAIC;AAED,0DAQC;AAED,4CAkBC;AAMD,sCAqGC;AAKD,oCAIC;AAKD,sCAKC;AAlMD,uCAAyB;AACzB,2CAA6B;AAC7B,sCAA4C;AAE5C,yCAA6C;AAE7C,MAAM,SAAS,GAAG,WAAW,CAAC;AAC9B,MAAM,SAAS,GAAG,OAAO,CAAC;AAC1B,MAAM,cAAc,GAAG,iCAAiC,CAAC;AAEzD,SAAgB,QAAQ,CAAC,OAAe;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,SAAS,CAAC,OAAe,EAAE,IAAc;IACvD,IAAA,wBAAe,EAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAgB,eAAe,CAAC,OAAe,EAAE,MAAc;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAe,EAAE,MAAc,EAAE,OAAe;IAC/E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,IAAA,wBAAe,EAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,SAAgB,uBAAuB,CAAC,IAAc;IACpD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IAClC,OAAO,IAAI,CAAC,KAAK;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACd,GAAG,IAAI;QACP,QAAQ,EAAE,IAAA,0BAAe,EAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;KAC1F,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAc;IAC7C,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE9B,MAAM,KAAK,GAAa,CAAC,8BAA8B,IAAI,CAAC,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC;IACrG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,oBAAoB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAC,OAAe;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,IAAI,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAE1D,sBAAsB;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,+BAA+B,CAAC,EAAE,CAAC;IACrF,IAAI,KAAU,CAAC;IACf,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,sBAAsB;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACnD,IAAI,QAAQ,GAAU,EAAE,CAAC;IACzB,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC5D,QAAQ,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;IACzB,CAAC;IAED,+FAA+F;IAC/F,MAAM,SAAS,GAAmB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;QACxD,+CAA+C;QAC/C,IAAI,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACvD,IAAI,KAAK;gBAAE,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,CAAC;QAED,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,SAAS;YACzB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC;YACb,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;YACrB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC;YACzB,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;YACpB,UAAU;SACX,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,oFAAoF;IACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/C,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;oBAC1D,IAAA,wBAAe,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBACjC,QAAQ,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,6CAA6C,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,6BAA6B,QAAQ,aAAa,CAAC,CAAC;IACrF,CAAC;IAED,kFAAkF;IAClF,MAAM,IAAI,GAAa;QACrB,OAAO,EAAE,CAAC;QACV,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC;QACf,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;QAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG;QACzB,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,EAAE;QAC5C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC;QAC3B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;QAC7B,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAChE,KAAK,EAAE,SAAS;KACjB,CAAC;IACF,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,0BAA0B,SAAS,CAAC,MAAM,QAAQ,CAAC,CAAC;IAEjE,wCAAwC;IACxC,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,OAAe;IAC1C,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IACjE,OAAO,QAAQ,IAAI,CAAC,OAAO,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,OAAe;IAC3C,OAAO,CACL,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC5C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAChD,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/memory-pool/templates.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,IAAI,MAAM,CAyKvC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAqE3C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAmB9C"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/memory-pool/templates.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,IAAI,MAAM,CA6IvC;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
- > 本文档定义了记忆池系统的完整规范。AI 应在执行复杂记忆操作(分化、融合、架构调整)时参考本文档。
10
+ > 本文档定义了记忆池系统��完整规范。AI 应在执行复杂记忆操作时参考本文档。
11
11
  > 日常操作请使用 QUICK-REF.md。
12
12
 
13
13
  ## 一、核心模型:楔形容器与浮球系统
14
14
 
15
- 记忆池是一个**楔形容器**——上窄下深,深度无限。每条记忆是容器中的一个**浮球**,对应 \`.memory-pool/balls/\` 下的一个 \`.md\` 文件。
15
+ 记忆池是一个**楔形容器**——利用物理几何来施加计算层面的容量约束。每条记忆是容器中的一个**浮球**,对应 \`.memory-pool/balls/\` 下的一个 \`.md\` 文件。
16
16
 
17
- - **活跃层**:浮力最高的 Top-N 个球(N = \`state.json\` 中的 \`active_capacity\`),AI 每次对话应优先加载
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₀ | 初始浮力 | 球文件 frontmatter \`B0\` |
30
- | H | 累计命中次数 | 球文件 frontmatter \`H\` |
31
- | α | 查询增益系数 | \`state.json\` → \`alpha\`(默认 1.0) |
32
- | λ | 衰减率 | \`state.json\` → \`lambda\`(默认 0.97) |
33
- | t | 当前全局轮次 | \`state.json\` → \`t\` |
34
- | t_last | 上次访问轮次 | 球文件 frontmatter \`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
- **轮次规则**:每条用户消息算一轮。AI 在对话开始时读取 \`state.json\` 的 \`t\` 值,在对话过程中根据用户消息数量自增并写回。
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[]\` | 与其他球的关联:\`strong\`(分化产生)或 \`weak\`(共现产生) |
46
- | 融合潜力 | \`fusion_potential\` (0-1) | 多次共现检索时累积,超过阈值可触发融合 |
51
+ | 连线 | \`links[]\` | 与其他球的关联(ID 数组) |
52
+ | 永久 | \`permanent\` | true 时不参与衰减 |
47
53
 
48
54
  ## 四、球的四种类型
49
55
 
@@ -54,124 +60,90 @@ 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
- 文件路径:\`.memory-pool/balls/ball_XXXX.md\`
60
-
61
- \`\`\`yaml
62
- ---
63
- id: ball_0042
64
- type: feedback
65
- B0: 8
66
- H: 3
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": "ball_0042",
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
- "links": ["ball_0015", "ball_0038"]
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
- **\`buoyancy\` 字段**:AI 在更新 index 时用公式计算并写入,前端直接读取显示。
104
+ ### 5.2 球文件格式
131
105
 
132
- ## 八、操作流程
106
+ 文件路径:\`.memory-pool/balls/ball_XXXX.md\`
107
+
108
+ 球���件为纯 markdown,不包含 YAML frontmatter。所有元数据存储在 \`pool.json\` 中。
133
109
 
134
- ### 8.1 创建球
110
+ ## 六、操作流程
135
111
 
136
- 1. 读取 \`state.json\`,获取 \`next_id\` 和当前 \`t\`
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
- ### 8.2 查询/使用球(命中更新)
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. 该球 \`H\` += 1
145
- 2. \`t_last\` = 当前 \`t\`
146
- 3. 更新球文件和 \`index.json\`
123
+ 1. \`pool.json\` 中找到该球条目
124
+ 2. \`H\` += 1,\`t_last\` = 当前 \`t\`
125
+ 3. 写回 \`pool.json\`
147
126
 
148
- ### 8.3 维护(衰减、分化、融合)
127
+ ### 6.3 维护
149
128
 
150
- **衰减**:不需要显式操作——浮力公式中的 \`λ^(t - t_last)\` 自动完成衰减。每次更新 index.json 时重新计算即可。
129
+ **衰减**:不需要显式操作——浮力公式中的 \`λ^(t - t_last)\` 自动完成衰减,由后端在读取时动态计算。
151
130
 
152
131
  **分化**(大球拆为多个小球):
153
132
  - 触发条件:活跃层空间不足,且存在体积大的球
154
- - 判据:易裂度 = (z - x) / (y - x),其中 x=原球浮力,y=子球最大浮力,z=子球最小浮力
155
- - 硬度约束:硬度 ≥ 7 的球不拆
156
- - 操作:删除原球文件,创建多个新球文件,新球之间建立 \`strong\` 连线
157
-
158
- **融合**(多个小球合为一个):
159
- - 触发条件:\`fusion_potential\` > 0.7 的多个球
160
- - 操作:合并源球内容为新球,重新评估 B₀ 和硬度,继承外部连线,删除源球文件
133
+ - 硬度约束��硬度 7 的球不拆
134
+ - 操作:删除原球文件和元数据,创建多个新球,新球之间建立连线
161
135
 
162
- ### 8.4 连线召回
136
+ ### 6.4 连线召回
163
137
 
164
- 查询命中活跃层某球时,检查其 \`links\`:
165
- - \`strong\` 连线:直接拉出关联球(H+=1, t_last 重置)
166
- - \`weak\` 连线:仅当该连线已被多次激活时触发
138
+ 查询命中活跃层某球时,检查其 \`links\`,拉出关联球(H+=1, t_last 重置)。
167
139
 
168
- ### 8.5 轮次自增
140
+ ### 6.5 轮次自增
169
141
 
170
- AI 在对话中应跟踪用户消息数量,在对话结束或执行记忆操作时将增量写入 \`state.json\` \`t\`。
142
+ \`t\` 由系统 hook 自动递增(每条用户消息 +1)。AI 无需手动管理轮次。
171
143
 
172
- ## 九、多容器架构(预留)
144
+ ## 七、多容器架构(预留)
173
145
 
174
- 当前为项目级记忆池(\`pool: "project"\`)。未来可扩展全局池(\`~/.ccweb/memory-pool/\`,\`pool: "global"\`,\`lambda: 0.99\`)。球文件格式和操作流程保持一致。
146
+ 当前为项目级记忆池(\`pool: "project"\`)。未来可扩展全局池(\`~/.ccweb/memory-pool/\`,\`pool: "global"\`,\`lambda: 0.99\`)。
175
147
  `;
176
148
  }
177
149
  function generateQuickRefMd() {
@@ -181,31 +153,26 @@ function generateQuickRefMd() {
181
153
 
182
154
  ## 创建球
183
155
 
184
- \`\`\`bash
185
- # 1. 读取 state.json 获取 next_id 和 t
186
- # 2. 创建文件
187
- \`\`\`
156
+ 1. 读取 \`pool.json\`,获取 \`next_id\` 和 \`t\`
157
+ 2. 创建 \`balls/ball_XXXX.md\`(纯 markdown,无 frontmatter)
158
+ 3. 在 \`pool.json\` 的 \`balls\` 数组中添加条目:
188
159
 
189
- \`\`\`yaml
190
- ---
191
- id: ball_{next_id 补零到4位}
192
- type: feedback | user | project | reference
193
- B0: {参考下方}
194
- H: 0
195
- t_last: {当前 t}
196
- hardness: {0-10}
197
- fusion_potential: 0
198
- links: []
199
- created_at: "{ISO时间}"
200
- ---
201
-
202
- {记忆正文}
160
+ \`\`\`json
161
+ {
162
+ "id": "ball_XXXX",
163
+ "type": "feedback",
164
+ "summary": "简短摘要",
165
+ "B0": 8,
166
+ "H": 0,
167
+ "t_last": 当前t,
168
+ "hardness": 7,
169
+ "permanent": false,
170
+ "links": [],
171
+ "created_at": "ISO时间"
172
+ }
203
173
  \`\`\`
204
174
 
205
- \`\`\`
206
- # 3. state.json next_id += 1
207
- # 4. 更新 index.json(重算所有 buoyancy,降序排列)
208
- \`\`\`
175
+ 4. \`next_id\` += 1,写回 \`pool.json\`
209
176
 
210
177
  **B₀ 参考**:feedback=8-10 | user=5-7 | project=4-6 | reference=2-4
211
178
 
@@ -215,51 +182,44 @@ created_at: "{ISO时间}"
215
182
  B(t) = (B0 + alpha * H) * lambda^(t - t_last)
216
183
  \`\`\`
217
184
 
218
- 默认参数在 state.json:lambda=0.97, alpha=1.0
185
+ 默认参数在 pool.json:lambda=0.97, alpha=1.0
186
+ 永久球(permanent=true)不乘衰减项。
187
+ buoyancy 由后端动态计算,不存储在文件中。
219
188
 
220
189
  ## 命中更新
221
190
 
222
- 使用某球信息时:H += 1, t_last = 当前 t,更新球文件 + index.json
191
+ 使用某球信息时:在 pool.json 中找到该球,H += 1, t_last = 当前 t,写回 pool.json
223
192
 
224
193
  ## 维护流程
225
194
 
226
- 1. 读取 state.json 和所有球文件
227
- 2. 对每个球计算当前 buoyancy
228
- 3. buoyancy 降序排列
229
- 4. active_capacity 个为活跃层,其余为深层
230
- 5. 检查是否需要分化(活跃层满 + 大球 + 硬度 < 7)
231
- 6. 检查是否需要融合(fusion_potential > 0.7 的共现球组)
232
- 7. 写回所有修改的球文件 + index.json
195
+ 1. 读取 pool.json
196
+ 2. 浮力由后端动态计算,无需手动重算
197
+ 3. 检查是否需要分化(活跃层满 + 大球 + 硬度 < 7)
198
+ 4. 写回 pool.json
233
199
 
234
200
  ## 轮次管理
235
201
 
236
- 每条用户消息 = 1 轮。对话中跟踪消息数,操作记忆时将增量写入 state.json 的 t。
202
+ \`t\` 由系统 hook 自动递增,AI 无需手动管理。
237
203
 
238
- ## index.json 更新
204
+ ## pool.json 更新
239
205
 
240
- **每次修改球文件后必须更新 index.json**。每个球条目:
241
-
242
- \`\`\`json
243
- { "id", "type", "summary"(正文首行或摘要), "B0", "H", "t_last", "buoyancy"(计算值), "hardness", "links"(ID数组) }
244
- \`\`\`
206
+ 每次修改球信息后写回 pool.json。只需操作这一个文件(+ 球的 markdown 文件)。
245
207
  `;
246
208
  }
247
209
  function generateClaudeMdBlock() {
248
- return `
249
- ## 记忆池(Memory Pool)
210
+ return `## 记忆池(Memory Pool)
250
211
 
251
212
  本项目已启用记忆池系统。
252
213
 
253
214
  **每次对话开始时:**
254
215
  1. 读取 \`.memory-pool/QUICK-REF.md\` 了解操作规范
255
- 2. 读取 \`.memory-pool/state.json\` 获取当前轮次
256
- 3. 读取 \`.memory-pool/index.json\` 加载活跃层记忆
257
- 4. 将活跃层记忆纳入当前对话上下文
216
+ 2. 读取 \`.memory-pool/pool.json\` 加载全局参数和活跃层记忆
217
+ 3. 将活跃层记忆纳入当前对话上下文
258
218
 
259
219
  **对话过程中:**
260
220
  - 遇到重要信息时主动提议存入记忆池
261
221
  - 用户要求记忆操作时参照 QUICK-REF.md 执行
262
- - 每次操作后更新 index.json
222
+ - 每次操作后更新 pool.json
263
223
 
264
224
  **完整规范:** \`.memory-pool/SPEC.md\`
265
225
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/memory-pool/templates.ts"],"names":[],"mappings":";AAAA,uCAAuC;;AAEvC,wCAyKC;AAED,gDAqEC;AAED,sDAmBC;AArQD,SAAgB,cAAc;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuKR,CAAC;AACF,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmER,CAAC;AACF,CAAC;AAED,SAAgB,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;CAiBR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/memory-pool/templates.ts"],"names":[],"mappings":";AAAA,uCAAuC;;AAEvC,wCA6IC;AAED,gDA2DC;AAED,sDAiBC;AA7ND,SAAgB,cAAc;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2IR,CAAC;AACF,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDR,CAAC;AACF,CAAC;AAED,SAAgB,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;CAeR,CAAC;AACF,CAAC"}