sema-core 2.0.2 → 2.0.3

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 (56) hide show
  1. package/dist/conf/config.d.ts +1 -0
  2. package/dist/conf/config.d.ts.map +1 -1
  3. package/dist/conf/config.js +3 -1
  4. package/dist/conf/config.js.map +1 -1
  5. package/dist/core/SemaEngine.d.ts +6 -0
  6. package/dist/core/SemaEngine.d.ts.map +1 -1
  7. package/dist/core/SemaEngine.js +79 -11
  8. package/dist/core/SemaEngine.js.map +1 -1
  9. package/dist/core/SemaSession.d.ts +8 -0
  10. package/dist/core/SemaSession.d.ts.map +1 -1
  11. package/dist/core/SemaSession.js +10 -0
  12. package/dist/core/SemaSession.js.map +1 -1
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/manager/CheckpointManager.d.ts +52 -0
  16. package/dist/manager/CheckpointManager.d.ts.map +1 -0
  17. package/dist/manager/CheckpointManager.js +206 -0
  18. package/dist/manager/CheckpointManager.js.map +1 -0
  19. package/dist/manager/PermissionManager.d.ts.map +1 -1
  20. package/dist/manager/PermissionManager.js +59 -30
  21. package/dist/manager/PermissionManager.js.map +1 -1
  22. package/dist/tools/EditNotebook.d.ts.map +1 -1
  23. package/dist/tools/EditNotebook.js +3 -0
  24. package/dist/tools/EditNotebook.js.map +1 -1
  25. package/dist/tools/PatchFile.d.ts.map +1 -1
  26. package/dist/tools/PatchFile.js +3 -0
  27. package/dist/tools/PatchFile.js.map +1 -1
  28. package/dist/tools/WriteFile.d.ts.map +1 -1
  29. package/dist/tools/WriteFile.js +3 -0
  30. package/dist/tools/WriteFile.js.map +1 -1
  31. package/dist/types/fork.d.ts +46 -0
  32. package/dist/types/fork.d.ts.map +1 -0
  33. package/dist/types/fork.js +3 -0
  34. package/dist/types/fork.js.map +1 -0
  35. package/dist/types/message.d.ts +1 -0
  36. package/dist/types/message.d.ts.map +1 -1
  37. package/dist/util/commands.d.ts +2 -7
  38. package/dist/util/commands.d.ts.map +1 -1
  39. package/dist/util/commands.js +8 -39
  40. package/dist/util/commands.js.map +1 -1
  41. package/dist/util/diff.d.ts +13 -0
  42. package/dist/util/diff.d.ts.map +1 -1
  43. package/dist/util/diff.js +18 -0
  44. package/dist/util/diff.js.map +1 -1
  45. package/dist/util/history.d.ts.map +1 -1
  46. package/dist/util/history.js +15 -0
  47. package/dist/util/history.js.map +1 -1
  48. package/dist/util/savePath.d.ts +13 -1
  49. package/dist/util/savePath.d.ts.map +1 -1
  50. package/dist/util/savePath.js +24 -3
  51. package/dist/util/savePath.js.map +1 -1
  52. package/dist/util/snapshotStore.d.ts +29 -0
  53. package/dist/util/snapshotStore.d.ts.map +1 -0
  54. package/dist/util/snapshotStore.js +134 -0
  55. package/dist/util/snapshotStore.js.map +1 -0
  56. package/package.json +1 -1
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * Fork 快照存储层(纯文件 IO,不依赖任何 manager,避免循环依赖)
4
+ *
5
+ * 目录布局:
6
+ * ~/.sema/snapshots/<project>/
7
+ * ├── blobs/<sha256> # 文件改动前的原始字节(内容寻址,跨会话去重)
8
+ * └── <sessionId>.editlog.json # 每会话的 EditLog
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.writeBlob = writeBlob;
12
+ exports.readBlob = readBlob;
13
+ exports.loadEditLog = loadEditLog;
14
+ exports.saveEditLog = saveEditLog;
15
+ exports.cleanupProjectSnapshots = cleanupProjectSnapshots;
16
+ const crypto_1 = require("crypto");
17
+ const fs_1 = require("fs");
18
+ const path_1 = require("path");
19
+ const savePath_1 = require("./savePath");
20
+ const log_1 = require("./log");
21
+ const EDITLOG_SUFFIX = '.editlog.json';
22
+ const BLOBS_SUBDIR = 'blobs';
23
+ function snapshotsDirOf(projectPath) {
24
+ return projectPath ? (0, savePath_1.getProjectSnapshotsDir)(projectPath) : (0, savePath_1.getSnapshotsDir)();
25
+ }
26
+ function blobsDirOf(projectPath) {
27
+ return (0, path_1.join)(snapshotsDirOf(projectPath), BLOBS_SUBDIR);
28
+ }
29
+ function editLogPathOf(sessionId, projectPath) {
30
+ return (0, path_1.join)(snapshotsDirOf(projectPath), `${sessionId}${EDITLOG_SUFFIX}`);
31
+ }
32
+ // ==================== blob 仓库(内容寻址) ====================
33
+ function writeBlob(buf, projectPath) {
34
+ const hash = (0, crypto_1.createHash)('sha256').update(buf).digest('hex');
35
+ const dir = blobsDirOf(projectPath);
36
+ const path = (0, path_1.join)(dir, hash);
37
+ if (!(0, fs_1.existsSync)(path)) {
38
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
39
+ (0, fs_1.writeFileSync)(path, buf);
40
+ }
41
+ return hash;
42
+ }
43
+ function readBlob(hash, projectPath) {
44
+ return (0, fs_1.readFileSync)((0, path_1.join)(blobsDirOf(projectPath), hash));
45
+ }
46
+ // ==================== EditLog 持久化 ====================
47
+ function loadEditLog(sessionId, projectPath) {
48
+ try {
49
+ const path = editLogPathOf(sessionId, projectPath);
50
+ if ((0, fs_1.existsSync)(path)) {
51
+ const data = JSON.parse((0, fs_1.readFileSync)(path, 'utf8'));
52
+ return Array.isArray(data?.records) ? data.records : [];
53
+ }
54
+ }
55
+ catch (error) {
56
+ (0, log_1.logWarn)(`加载 editlog 失败 (${sessionId}): ${error instanceof Error ? error.message : String(error)}`);
57
+ }
58
+ return [];
59
+ }
60
+ function saveEditLog(sessionId, records, projectPath) {
61
+ const dir = snapshotsDirOf(projectPath);
62
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
63
+ (0, fs_1.writeFileSync)(editLogPathOf(sessionId, projectPath), JSON.stringify({ records }, null, 2));
64
+ }
65
+ // ==================== 退场:跟随历史清理 + blob 标记清除 ====================
66
+ /**
67
+ * 回收某项目的快照:
68
+ * 1) 删除历史文件已不存在(被淘汰)的会话对应的 editlog
69
+ * 2) 扫描剩余 editlog 收集仍被引用的 blob,删除无引用的 blob
70
+ * 由 history.cleanupOldHistoryFiles 在历史清理之后调用。
71
+ */
72
+ function cleanupProjectSnapshots(projectPath) {
73
+ try {
74
+ const snapDir = (0, savePath_1.getProjectSnapshotsDir)(projectPath);
75
+ if (!(0, fs_1.existsSync)(snapDir))
76
+ return;
77
+ // 1) 从剩余历史文件中收集仍存活的 sessionId(文件名形如 YYYY-MM-DD_<sessionId>.json)
78
+ const liveSessions = new Set();
79
+ const histDir = (0, savePath_1.getProjectHistoryDir)(projectPath);
80
+ if ((0, fs_1.existsSync)(histDir)) {
81
+ for (const file of (0, fs_1.readdirSync)(histDir)) {
82
+ const m = /^\d{4}-\d{2}-\d{2}_(.+)\.json$/.exec(file);
83
+ if (m)
84
+ liveSessions.add(m[1]);
85
+ }
86
+ }
87
+ // 2) 删除非存活会话的 editlog
88
+ for (const file of (0, fs_1.readdirSync)(snapDir)) {
89
+ if (!file.endsWith(EDITLOG_SUFFIX))
90
+ continue;
91
+ const sessionId = file.slice(0, -EDITLOG_SUFFIX.length);
92
+ if (!liveSessions.has(sessionId)) {
93
+ try {
94
+ (0, fs_1.unlinkSync)((0, path_1.join)(snapDir, file));
95
+ (0, log_1.logDebug)(`删除无主 editlog: ${file}`);
96
+ }
97
+ catch { /* 忽略 */ }
98
+ }
99
+ }
100
+ // 3) blob 标记清除:收集剩余 editlog 引用的 hash,删除无引用 blob
101
+ const referenced = new Set();
102
+ for (const file of (0, fs_1.readdirSync)(snapDir)) {
103
+ if (!file.endsWith(EDITLOG_SUFFIX))
104
+ continue;
105
+ try {
106
+ const data = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(snapDir, file), 'utf8'));
107
+ for (const r of (data?.records ?? [])) {
108
+ if (r?.blobHash)
109
+ referenced.add(r.blobHash);
110
+ }
111
+ }
112
+ catch { /* 跳过损坏的 editlog */ }
113
+ }
114
+ const blobsDir = (0, path_1.join)(snapDir, BLOBS_SUBDIR);
115
+ if ((0, fs_1.existsSync)(blobsDir)) {
116
+ let removed = 0;
117
+ for (const hash of (0, fs_1.readdirSync)(blobsDir)) {
118
+ if (!referenced.has(hash)) {
119
+ try {
120
+ (0, fs_1.unlinkSync)((0, path_1.join)(blobsDir, hash));
121
+ removed++;
122
+ }
123
+ catch { /* 忽略 */ }
124
+ }
125
+ }
126
+ if (removed > 0)
127
+ (0, log_1.logDebug)(`回收无引用 blob ${removed} 个`);
128
+ }
129
+ }
130
+ catch (error) {
131
+ (0, log_1.logWarn)(`清理项目快照失败: ${error instanceof Error ? error.message : String(error)}`);
132
+ }
133
+ }
134
+ //# sourceMappingURL=snapshotStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotStore.js","sourceRoot":"","sources":["../../src/util/snapshotStore.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sema-core",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "Event-driven core library for Sema AI assistant",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",