@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.
- 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/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 +94 -134
- package/backend/dist/memory-pool/templates.js.map +1 -1
- package/backend/dist/memory-pool/types.d.ts +27 -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 +124 -16
- package/backend/dist/routes/memory-pool.js.map +1 -1
- package/frontend/dist/assets/{GraphPreview-5Ad7E5P5.js → GraphPreview-QiSxy4LP.js} +1 -1
- package/frontend/dist/assets/{OfficePreview-BtdfzoUf.js → OfficePreview-DlUCjmFD.js} +2 -2
- package/frontend/dist/assets/{PlanPanel-BzxuZna7.js → PlanPanel-Dn5PCqCc.js} +1 -1
- package/frontend/dist/assets/{ProjectPage-DJSpIIb2.js → ProjectPage-XG9MZm7t.js} +5 -5
- package/frontend/dist/assets/{SettingsPage-CufDI4cE.js → SettingsPage-ofs1M1K_.js} +1 -1
- package/frontend/dist/assets/{ShareViewPage-CLuAfYtv.js → ShareViewPage-u8FXEdhC.js} +1 -1
- package/frontend/dist/assets/{SkillHubPage-DOXGJ-X_.js → SkillHubPage-DYQ3--oW.js} +2 -2
- package/frontend/dist/assets/{bot-CMOVWzMR.js → bot-63iGenXw.js} +1 -1
- package/frontend/dist/assets/{chevron-down-pBWSO11H.js → chevron-down-CzkwkeMW.js} +1 -1
- package/frontend/dist/assets/{download-A2dvNFij.js → download-DhFx0Fu-.js} +1 -1
- package/frontend/dist/assets/{index-DduZUNeK.js → index-C8aR4tRp.js} +4 -4
- package/frontend/dist/assets/{index-DLG7lJu-.js → index-DKsG2yPY.js} +1 -1
- package/frontend/dist/assets/index-DVUjdhq8.css +1 -0
- package/frontend/dist/assets/{jszip.min-DAk2qj6r.js → jszip.min-B9vwwWDL.js} +1 -1
- package/frontend/dist/assets/{matter-Egqv9e3Y.js → matter-CCkX66fz.js} +1 -1
- package/frontend/dist/assets/{maximize-2-Dw4chVid.js → maximize-2-B3mAuuFs.js} +1 -1
- package/frontend/dist/assets/{save-Dbdk54Dm.js → save-CxQAMJ-_.js} +1 -1
- package/frontend/dist/assets/{user-CT9EiLL3.js → user-DxwkzcYb.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 @@
|
|
|
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":"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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,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
|
-
>
|
|
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,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
|
-
|
|
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
|
-
- 操作:删除原球文件,创建多个新球文件,新球之间建立 \`strong\` 连线
|
|
157
|
-
|
|
158
|
-
**融合**(多个小球合为一个):
|
|
159
|
-
- 触发条件:\`fusion_potential\` > 0.7 的多个球
|
|
160
|
-
- 操作:合并源球内容为新球,重新评估 B₀ 和硬度,继承外部连线,删除源球文件
|
|
133
|
+
- 硬度约束��硬度 ≥ 7 的球不拆
|
|
134
|
+
- 操作:删除原球文件和元数据,创建多个新球,新球之间建立连线
|
|
161
135
|
|
|
162
|
-
###
|
|
136
|
+
### 6.4 连线召回
|
|
163
137
|
|
|
164
|
-
查询命中活跃层某球时,检查其 \`links
|
|
165
|
-
- \`strong\` 连线:直接拉出关联球(H+=1, t_last 重置)
|
|
166
|
-
- \`weak\` 连线:仅当该连线已被多次激活时触发
|
|
138
|
+
查询命中活跃层某球时,检查其 \`links\`,拉出关联球(H+=1, t_last 重置)。
|
|
167
139
|
|
|
168
|
-
###
|
|
140
|
+
### 6.5 轮次自增
|
|
169
141
|
|
|
170
|
-
|
|
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
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
\`\`\`
|
|
156
|
+
1. 读取 \`pool.json\`,获取 \`next_id\` 和 \`t\`
|
|
157
|
+
2. 创建 \`balls/ball_XXXX.md\`(纯 markdown,无 frontmatter)
|
|
158
|
+
3. 在 \`pool.json\` 的 \`balls\` 数组中添加条目:
|
|
188
159
|
|
|
189
|
-
\`\`\`
|
|
190
|
-
|
|
191
|
-
id:
|
|
192
|
-
type: feedback
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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
|
-
默认参数在
|
|
185
|
+
默认参数在 pool.json:lambda=0.97, alpha=1.0
|
|
186
|
+
永久球(permanent=true)不乘衰减项。
|
|
187
|
+
buoyancy 由后端动态计算,不存储在文件中。
|
|
219
188
|
|
|
220
189
|
## 命中更新
|
|
221
190
|
|
|
222
|
-
|
|
191
|
+
使用某球信息时:在 pool.json 中找到该球,H += 1, t_last = 当前 t,写回 pool.json
|
|
223
192
|
|
|
224
193
|
## 维护流程
|
|
225
194
|
|
|
226
|
-
1. 读取
|
|
227
|
-
2.
|
|
228
|
-
3.
|
|
229
|
-
4.
|
|
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
|
-
|
|
202
|
+
\`t\` 由系统 hook 自动递增,AI 无需手动管理。
|
|
237
203
|
|
|
238
|
-
##
|
|
204
|
+
## pool.json 更新
|
|
239
205
|
|
|
240
|
-
|
|
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/
|
|
256
|
-
3.
|
|
257
|
-
4. 将活跃层记忆纳入当前对话上下文
|
|
216
|
+
2. 读取 \`.memory-pool/pool.json\` 加载全局参数和活跃层记忆
|
|
217
|
+
3. 将活跃层记忆纳入当前对话上下文
|
|
258
218
|
|
|
259
219
|
**对话过程中:**
|
|
260
220
|
- 遇到重要信息时主动提议存入记忆池
|
|
261
221
|
- 用户要求记忆操作时参照 QUICK-REF.md 执行
|
|
262
|
-
- 每次操作后更新
|
|
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,
|
|
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"}
|