evo-skills 0.1.0

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 (188) hide show
  1. package/.eslintrc.json +36 -0
  2. package/.prettierrc +11 -0
  3. package/README.md +227 -0
  4. package/USER-GUIDE.md +382 -0
  5. package/dist/cli/commands/diff.d.ts +7 -0
  6. package/dist/cli/commands/diff.d.ts.map +1 -0
  7. package/dist/cli/commands/diff.js +126 -0
  8. package/dist/cli/commands/diff.js.map +1 -0
  9. package/dist/cli/commands/freeze.d.ts +12 -0
  10. package/dist/cli/commands/freeze.d.ts.map +1 -0
  11. package/dist/cli/commands/freeze.js +93 -0
  12. package/dist/cli/commands/freeze.js.map +1 -0
  13. package/dist/cli/commands/log.d.ts +7 -0
  14. package/dist/cli/commands/log.d.ts.map +1 -0
  15. package/dist/cli/commands/log.js +76 -0
  16. package/dist/cli/commands/log.js.map +1 -0
  17. package/dist/cli/commands/rollback.d.ts +7 -0
  18. package/dist/cli/commands/rollback.d.ts.map +1 -0
  19. package/dist/cli/commands/rollback.js +92 -0
  20. package/dist/cli/commands/rollback.js.map +1 -0
  21. package/dist/cli/commands/status.d.ts +7 -0
  22. package/dist/cli/commands/status.d.ts.map +1 -0
  23. package/dist/cli/commands/status.js +88 -0
  24. package/dist/cli/commands/status.js.map +1 -0
  25. package/dist/cli/index.d.ts +3 -0
  26. package/dist/cli/index.d.ts.map +1 -0
  27. package/dist/cli/index.js +25 -0
  28. package/dist/cli/index.js.map +1 -0
  29. package/dist/config/defaults.d.ts +6 -0
  30. package/dist/config/defaults.d.ts.map +1 -0
  31. package/dist/config/defaults.js +31 -0
  32. package/dist/config/defaults.js.map +1 -0
  33. package/dist/config/index.d.ts +68 -0
  34. package/dist/config/index.d.ts.map +1 -0
  35. package/dist/config/index.js +195 -0
  36. package/dist/config/index.js.map +1 -0
  37. package/dist/core/evaluator/base-rule.d.ts +50 -0
  38. package/dist/core/evaluator/base-rule.d.ts.map +1 -0
  39. package/dist/core/evaluator/base-rule.js +69 -0
  40. package/dist/core/evaluator/base-rule.js.map +1 -0
  41. package/dist/core/evaluator/index.d.ts +33 -0
  42. package/dist/core/evaluator/index.d.ts.map +1 -0
  43. package/dist/core/evaluator/index.js +74 -0
  44. package/dist/core/evaluator/index.js.map +1 -0
  45. package/dist/core/evaluator/rules/repeated-drift.d.ts +19 -0
  46. package/dist/core/evaluator/rules/repeated-drift.d.ts.map +1 -0
  47. package/dist/core/evaluator/rules/repeated-drift.js +82 -0
  48. package/dist/core/evaluator/rules/repeated-drift.js.map +1 -0
  49. package/dist/core/evaluator/rules/repeated-manual-fix.d.ts +23 -0
  50. package/dist/core/evaluator/rules/repeated-manual-fix.d.ts.map +1 -0
  51. package/dist/core/evaluator/rules/repeated-manual-fix.js +97 -0
  52. package/dist/core/evaluator/rules/repeated-manual-fix.js.map +1 -0
  53. package/dist/core/journal/index.d.ts +76 -0
  54. package/dist/core/journal/index.d.ts.map +1 -0
  55. package/dist/core/journal/index.js +207 -0
  56. package/dist/core/journal/index.js.map +1 -0
  57. package/dist/core/observer/base-observer.d.ts +64 -0
  58. package/dist/core/observer/base-observer.d.ts.map +1 -0
  59. package/dist/core/observer/base-observer.js +142 -0
  60. package/dist/core/observer/base-observer.js.map +1 -0
  61. package/dist/core/observer/codex-observer.d.ts +71 -0
  62. package/dist/core/observer/codex-observer.d.ts.map +1 -0
  63. package/dist/core/observer/codex-observer.js +248 -0
  64. package/dist/core/observer/codex-observer.js.map +1 -0
  65. package/dist/core/observer/index.d.ts +7 -0
  66. package/dist/core/observer/index.d.ts.map +1 -0
  67. package/dist/core/observer/index.js +7 -0
  68. package/dist/core/observer/index.js.map +1 -0
  69. package/dist/core/observer/trace-manager.d.ts +82 -0
  70. package/dist/core/observer/trace-manager.d.ts.map +1 -0
  71. package/dist/core/observer/trace-manager.js +196 -0
  72. package/dist/core/observer/trace-manager.js.map +1 -0
  73. package/dist/core/origin-registry/index.d.ts +59 -0
  74. package/dist/core/origin-registry/index.d.ts.map +1 -0
  75. package/dist/core/origin-registry/index.js +235 -0
  76. package/dist/core/origin-registry/index.js.map +1 -0
  77. package/dist/core/patch-generator/base-strategy.d.ts +35 -0
  78. package/dist/core/patch-generator/base-strategy.d.ts.map +1 -0
  79. package/dist/core/patch-generator/base-strategy.js +55 -0
  80. package/dist/core/patch-generator/base-strategy.js.map +1 -0
  81. package/dist/core/patch-generator/index.d.ts +32 -0
  82. package/dist/core/patch-generator/index.d.ts.map +1 -0
  83. package/dist/core/patch-generator/index.js +101 -0
  84. package/dist/core/patch-generator/index.js.map +1 -0
  85. package/dist/core/patch-generator/strategies/add-fallback.d.ts +11 -0
  86. package/dist/core/patch-generator/strategies/add-fallback.d.ts.map +1 -0
  87. package/dist/core/patch-generator/strategies/add-fallback.js +57 -0
  88. package/dist/core/patch-generator/strategies/add-fallback.js.map +1 -0
  89. package/dist/core/patch-generator/strategies/prune-noise.d.ts +11 -0
  90. package/dist/core/patch-generator/strategies/prune-noise.d.ts.map +1 -0
  91. package/dist/core/patch-generator/strategies/prune-noise.js +48 -0
  92. package/dist/core/patch-generator/strategies/prune-noise.js.map +1 -0
  93. package/dist/core/shadow-manager/index.d.ts +65 -0
  94. package/dist/core/shadow-manager/index.d.ts.map +1 -0
  95. package/dist/core/shadow-manager/index.js +229 -0
  96. package/dist/core/shadow-manager/index.js.map +1 -0
  97. package/dist/core/shadow-registry/index.d.ts +68 -0
  98. package/dist/core/shadow-registry/index.d.ts.map +1 -0
  99. package/dist/core/shadow-registry/index.js +173 -0
  100. package/dist/core/shadow-registry/index.js.map +1 -0
  101. package/dist/daemon/index.d.ts +43 -0
  102. package/dist/daemon/index.d.ts.map +1 -0
  103. package/dist/daemon/index.js +144 -0
  104. package/dist/daemon/index.js.map +1 -0
  105. package/dist/storage/index.d.ts +7 -0
  106. package/dist/storage/index.d.ts.map +1 -0
  107. package/dist/storage/index.js +7 -0
  108. package/dist/storage/index.js.map +1 -0
  109. package/dist/storage/markdown.d.ts +66 -0
  110. package/dist/storage/markdown.d.ts.map +1 -0
  111. package/dist/storage/markdown.js +227 -0
  112. package/dist/storage/markdown.js.map +1 -0
  113. package/dist/storage/ndjson.d.ts +118 -0
  114. package/dist/storage/ndjson.d.ts.map +1 -0
  115. package/dist/storage/ndjson.js +238 -0
  116. package/dist/storage/ndjson.js.map +1 -0
  117. package/dist/storage/sqlite.d.ts +131 -0
  118. package/dist/storage/sqlite.d.ts.map +1 -0
  119. package/dist/storage/sqlite.js +415 -0
  120. package/dist/storage/sqlite.js.map +1 -0
  121. package/dist/types/index.d.ts +158 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/types/index.js +5 -0
  124. package/dist/types/index.js.map +1 -0
  125. package/dist/utils/diff.d.ts +20 -0
  126. package/dist/utils/diff.d.ts.map +1 -0
  127. package/dist/utils/diff.js +47 -0
  128. package/dist/utils/diff.js.map +1 -0
  129. package/dist/utils/hash.d.ts +17 -0
  130. package/dist/utils/hash.d.ts.map +1 -0
  131. package/dist/utils/hash.js +28 -0
  132. package/dist/utils/hash.js.map +1 -0
  133. package/dist/utils/index.d.ts +8 -0
  134. package/dist/utils/index.d.ts.map +1 -0
  135. package/dist/utils/index.js +8 -0
  136. package/dist/utils/index.js.map +1 -0
  137. package/dist/utils/logger.d.ts +11 -0
  138. package/dist/utils/logger.d.ts.map +1 -0
  139. package/dist/utils/logger.js +64 -0
  140. package/dist/utils/logger.js.map +1 -0
  141. package/dist/utils/path.d.ts +67 -0
  142. package/dist/utils/path.d.ts.map +1 -0
  143. package/dist/utils/path.js +115 -0
  144. package/dist/utils/path.js.map +1 -0
  145. package/docs/ENGINEERING_PLAN.md +1065 -0
  146. package/docs/PRD.md +1004 -0
  147. package/docs/PROGRESS.md +523 -0
  148. package/package.json +60 -0
  149. package/src/cli/commands/diff.ts +158 -0
  150. package/src/cli/commands/freeze.ts +108 -0
  151. package/src/cli/commands/log.ts +87 -0
  152. package/src/cli/commands/rollback.ts +99 -0
  153. package/src/cli/commands/status.ts +101 -0
  154. package/src/cli/index.ts +31 -0
  155. package/src/config/defaults.ts +32 -0
  156. package/src/config/index.ts +220 -0
  157. package/src/core/evaluator/base-rule.ts +90 -0
  158. package/src/core/evaluator/index.ts +86 -0
  159. package/src/core/evaluator/rules/repeated-drift.ts +109 -0
  160. package/src/core/evaluator/rules/repeated-manual-fix.ts +129 -0
  161. package/src/core/journal/index.ts +286 -0
  162. package/src/core/observer/base-observer.ts +200 -0
  163. package/src/core/observer/codex-observer.ts +309 -0
  164. package/src/core/observer/index.ts +7 -0
  165. package/src/core/observer/trace-manager.ts +250 -0
  166. package/src/core/origin-registry/index.ts +264 -0
  167. package/src/core/patch-generator/base-strategy.ts +67 -0
  168. package/src/core/patch-generator/index.ts +118 -0
  169. package/src/core/patch-generator/strategies/add-fallback.ts +69 -0
  170. package/src/core/patch-generator/strategies/prune-noise.ts +65 -0
  171. package/src/core/shadow-manager/index.ts +278 -0
  172. package/src/core/shadow-registry/index.ts +200 -0
  173. package/src/daemon/index.ts +174 -0
  174. package/src/storage/index.ts +7 -0
  175. package/src/storage/markdown.ts +267 -0
  176. package/src/storage/ndjson.ts +273 -0
  177. package/src/storage/sqlite.ts +555 -0
  178. package/src/types/index.ts +212 -0
  179. package/src/utils/diff.ts +60 -0
  180. package/src/utils/hash.ts +31 -0
  181. package/src/utils/index.ts +8 -0
  182. package/src/utils/logger.ts +78 -0
  183. package/src/utils/path.ts +129 -0
  184. package/tests/unit/config.test.ts +65 -0
  185. package/tests/unit/path.test.ts +89 -0
  186. package/tests/unit/utils.test.ts +45 -0
  187. package/tsconfig.json +31 -0
  188. package/vitest.config.ts +19 -0
@@ -0,0 +1,71 @@
1
+ import { BaseObserver } from './base-observer.js';
2
+ /**
3
+ * Codex Observer
4
+ * 监听 Codex 的 JSONL 事件流和 session 日志
5
+ */
6
+ export declare class CodexObserver extends BaseObserver {
7
+ private watcher;
8
+ private sessionDir;
9
+ private currentSessionId;
10
+ private turnCounter;
11
+ private lastFileSize;
12
+ constructor(sessionDir?: string);
13
+ /**
14
+ * 获取默认 session 目录
15
+ */
16
+ private getDefaultSessionDir;
17
+ /**
18
+ * 启动 observer
19
+ */
20
+ start(): Promise<void>;
21
+ /**
22
+ * 停止 observer
23
+ */
24
+ stop(): Promise<void>;
25
+ /**
26
+ * 处理新文件
27
+ */
28
+ private handleFileAdd;
29
+ /**
30
+ * 处理文件变化
31
+ */
32
+ private handleFileChange;
33
+ /**
34
+ * 处理 JSONL 文件(全量)
35
+ */
36
+ private processJsonlFile;
37
+ /**
38
+ * 处理 JSONL 文件(增量)
39
+ */
40
+ private processJsonlFileIncremental;
41
+ /**
42
+ * 处理单个事件
43
+ */
44
+ private processEvent;
45
+ /**
46
+ * 从文件路径提取 session ID
47
+ */
48
+ private extractSessionId;
49
+ /**
50
+ * 获取文件大小
51
+ */
52
+ private getFileSize;
53
+ /**
54
+ * 手动处理一个 session 文件
55
+ */
56
+ processSessionFile(filePath: string): Promise<void>;
57
+ /**
58
+ * 获取当前 session ID
59
+ */
60
+ getCurrentSessionId(): string | null;
61
+ /**
62
+ * 设置 session 目录
63
+ */
64
+ setSessionDir(dir: string): void;
65
+ /**
66
+ * 获取 session 目录
67
+ */
68
+ getSessionDir(): string;
69
+ }
70
+ export declare function createCodexObserver(sessionDir?: string): CodexObserver;
71
+ //# sourceMappingURL=codex-observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-observer.d.ts","sourceRoot":"","sources":["../../../src/core/observer/codex-observer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD;;;GAGG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAkC;gBAE1C,UAAU,CAAC,EAAE,MAAM;IAK/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAK5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA6BnC;;OAEG;IACH,OAAO,CAAC,YAAY;IA0EpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASzD;;OAEG;IACH,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,aAAa,IAAI,MAAM;CAGxB;AAGD,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAEtE"}
@@ -0,0 +1,248 @@
1
+ import { watch } from 'chokidar';
2
+ import { createReadStream, existsSync, readFileSync, statSync } from 'node:fs';
3
+ import { join, basename } from 'node:path';
4
+ import { createInterface } from 'node:readline';
5
+ import { BaseObserver } from './base-observer.js';
6
+ import { createChildLogger } from '../../utils/logger.js';
7
+ const logger = createChildLogger('codex-observer');
8
+ /**
9
+ * Codex Observer
10
+ * 监听 Codex 的 JSONL 事件流和 session 日志
11
+ */
12
+ export class CodexObserver extends BaseObserver {
13
+ watcher = null;
14
+ sessionDir;
15
+ currentSessionId = null;
16
+ turnCounter = 0;
17
+ lastFileSize = new Map();
18
+ constructor(sessionDir) {
19
+ super('codex');
20
+ this.sessionDir = sessionDir ?? this.getDefaultSessionDir();
21
+ }
22
+ /**
23
+ * 获取默认 session 目录
24
+ */
25
+ getDefaultSessionDir() {
26
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? '';
27
+ return join(home, '.codex', 'sessions');
28
+ }
29
+ /**
30
+ * 启动 observer
31
+ */
32
+ async start() {
33
+ if (this.isRunning) {
34
+ logger.warn('Observer already running');
35
+ return;
36
+ }
37
+ if (!existsSync(this.sessionDir)) {
38
+ logger.warn(`Session directory not found: ${this.sessionDir}`);
39
+ return;
40
+ }
41
+ this.isRunning = true;
42
+ logger.info('Starting Codex observer', { sessionDir: this.sessionDir });
43
+ // 监听 session 目录的变化
44
+ this.watcher = watch(this.sessionDir, {
45
+ persistent: true,
46
+ ignoreInitial: false,
47
+ awaitWriteFinish: {
48
+ stabilityThreshold: 100,
49
+ pollInterval: 50,
50
+ },
51
+ });
52
+ this.watcher.on('add', (path) => this.handleFileAdd(path));
53
+ this.watcher.on('change', (path) => this.handleFileChange(path));
54
+ logger.info('Codex observer started');
55
+ }
56
+ /**
57
+ * 停止 observer
58
+ */
59
+ async stop() {
60
+ if (!this.isRunning) {
61
+ return;
62
+ }
63
+ this.isRunning = false;
64
+ if (this.watcher) {
65
+ await this.watcher.close();
66
+ this.watcher = null;
67
+ }
68
+ logger.info('Codex observer stopped');
69
+ }
70
+ /**
71
+ * 处理新文件
72
+ */
73
+ handleFileAdd(path) {
74
+ if (!path.endsWith('.jsonl')) {
75
+ return;
76
+ }
77
+ const sessionId = this.extractSessionId(path);
78
+ this.currentSessionId = sessionId;
79
+ this.lastFileSize.set(path, 0);
80
+ logger.info(`New session detected: ${sessionId}`, { path });
81
+ // 读取整个文件
82
+ this.processJsonlFile(path);
83
+ }
84
+ /**
85
+ * 处理文件变化
86
+ */
87
+ handleFileChange(path) {
88
+ if (!path.endsWith('.jsonl')) {
89
+ return;
90
+ }
91
+ const lastSize = this.lastFileSize.get(path) ?? 0;
92
+ const currentSize = this.getFileSize(path);
93
+ if (currentSize > lastSize) {
94
+ // 只读取新增的部分
95
+ this.processJsonlFileIncremental(path, lastSize);
96
+ this.lastFileSize.set(path, currentSize);
97
+ }
98
+ }
99
+ /**
100
+ * 处理 JSONL 文件(全量)
101
+ */
102
+ processJsonlFile(path) {
103
+ const sessionId = this.extractSessionId(path);
104
+ try {
105
+ const content = readFileSync(path, 'utf-8');
106
+ const lines = content.split('\n').filter((line) => line.trim());
107
+ for (const line of lines) {
108
+ try {
109
+ const event = JSON.parse(line);
110
+ this.processEvent(sessionId, event);
111
+ }
112
+ catch {
113
+ // 忽略解析错误
114
+ }
115
+ }
116
+ }
117
+ catch (error) {
118
+ logger.warn(`Failed to read JSONL file: ${path}`, { error });
119
+ }
120
+ }
121
+ /**
122
+ * 处理 JSONL 文件(增量)
123
+ */
124
+ processJsonlFileIncremental(path, startOffset) {
125
+ const sessionId = this.extractSessionId(path);
126
+ try {
127
+ const stream = createReadStream(path, {
128
+ start: startOffset,
129
+ encoding: 'utf-8',
130
+ });
131
+ const rl = createInterface({
132
+ input: stream,
133
+ crlfDelay: Infinity,
134
+ });
135
+ rl.on('line', (line) => {
136
+ if (line.trim()) {
137
+ try {
138
+ const event = JSON.parse(line);
139
+ this.processEvent(sessionId, event);
140
+ }
141
+ catch {
142
+ // 忽略解析错误
143
+ }
144
+ }
145
+ });
146
+ }
147
+ catch (error) {
148
+ logger.warn(`Failed to read JSONL file incrementally: ${path}`, { error });
149
+ }
150
+ }
151
+ /**
152
+ * 处理单个事件
153
+ */
154
+ processEvent(sessionId, event) {
155
+ const turnId = `turn_${++this.turnCounter}`;
156
+ // 根据事件类型创建相应的 trace
157
+ switch (event.type) {
158
+ case 'user_input':
159
+ this.emitTrace(this.createUserInputTrace(sessionId, turnId, event.content));
160
+ break;
161
+ case 'assistant_output':
162
+ case 'assistant_message':
163
+ this.emitTrace(this.createAssistantOutputTrace(sessionId, turnId, event.content));
164
+ break;
165
+ case 'tool_call':
166
+ this.emitTrace(this.createToolCallTrace(sessionId, turnId, event.tool, event.args ?? {}));
167
+ break;
168
+ case 'tool_result':
169
+ this.emitTrace(this.createToolResultTrace(sessionId, turnId, event.tool, event.result ?? {}, event.status === 'error' ? 'failure' : 'success'));
170
+ break;
171
+ case 'file_change':
172
+ case 'file_write':
173
+ case 'file_edit':
174
+ if (event.files) {
175
+ this.emitTrace(this.createFileChangeTrace(sessionId, turnId, event.files));
176
+ }
177
+ break;
178
+ case 'retry':
179
+ this.emitTrace(this.createRetryTrace(sessionId, turnId, event.reason));
180
+ break;
181
+ case 'error':
182
+ this.emitTrace(this.createStatusTrace(sessionId, turnId, 'failure', {
183
+ error: event.error,
184
+ }));
185
+ break;
186
+ case 'session_start':
187
+ logger.info(`Session started: ${sessionId}`);
188
+ break;
189
+ case 'session_end':
190
+ logger.info(`Session ended: ${sessionId}`);
191
+ break;
192
+ default:
193
+ // 忽略未知事件类型
194
+ break;
195
+ }
196
+ }
197
+ /**
198
+ * 从文件路径提取 session ID
199
+ */
200
+ extractSessionId(path) {
201
+ const filename = basename(path, '.jsonl');
202
+ return filename;
203
+ }
204
+ /**
205
+ * 获取文件大小
206
+ */
207
+ getFileSize(path) {
208
+ try {
209
+ return statSync(path).size;
210
+ }
211
+ catch {
212
+ return 0;
213
+ }
214
+ }
215
+ /**
216
+ * 手动处理一个 session 文件
217
+ */
218
+ async processSessionFile(filePath) {
219
+ if (!existsSync(filePath)) {
220
+ throw new Error(`Session file not found: ${filePath}`);
221
+ }
222
+ logger.info(`Processing session file: ${filePath}`);
223
+ this.processJsonlFile(filePath);
224
+ }
225
+ /**
226
+ * 获取当前 session ID
227
+ */
228
+ getCurrentSessionId() {
229
+ return this.currentSessionId;
230
+ }
231
+ /**
232
+ * 设置 session 目录
233
+ */
234
+ setSessionDir(dir) {
235
+ this.sessionDir = dir;
236
+ }
237
+ /**
238
+ * 获取 session 目录
239
+ */
240
+ getSessionDir() {
241
+ return this.sessionDir;
242
+ }
243
+ }
244
+ // 导出工厂函数
245
+ export function createCodexObserver(sessionDir) {
246
+ return new CodexObserver(sessionDir);
247
+ }
248
+ //# sourceMappingURL=codex-observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-observer.js","sourceRoot":"","sources":["../../../src/core/observer/codex-observer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Observer 模块入口
3
+ */
4
+ export { BaseObserver } from './base-observer.js';
5
+ export { CodexObserver, createCodexObserver } from './codex-observer.js';
6
+ export { TraceManager, createTraceManager } from './trace-manager.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/observer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Observer 模块入口
3
+ */
4
+ export { BaseObserver } from './base-observer.js';
5
+ export { CodexObserver, createCodexObserver } from './codex-observer.js';
6
+ export { TraceManager, createTraceManager } from './trace-manager.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/observer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,82 @@
1
+ import type { Trace, RuntimeType } from '../../types/index.js';
2
+ /**
3
+ * Trace 存储管理器
4
+ * 负责存储和查询 trace 数据
5
+ */
6
+ export declare class TraceManager {
7
+ private projectRoot;
8
+ private db;
9
+ private traceStore;
10
+ private currentSessionId;
11
+ constructor(projectRoot: string);
12
+ /**
13
+ * 初始化
14
+ */
15
+ init(): Promise<void>;
16
+ /**
17
+ * 设置当前 session
18
+ */
19
+ setSession(sessionId: string, runtime: RuntimeType, projectId?: string): void;
20
+ /**
21
+ * 记录 trace
22
+ */
23
+ recordTrace(trace: Trace): void;
24
+ /**
25
+ * 批量记录 traces
26
+ */
27
+ recordTraces(traces: Trace[]): void;
28
+ /**
29
+ * 获取 session 的 traces
30
+ */
31
+ getSessionTraces(sessionId: string, limit?: number): Promise<Trace[]>;
32
+ /**
33
+ * 获取最近的 traces
34
+ */
35
+ getRecentTraces(count: number): Promise<Trace[]>;
36
+ /**
37
+ * 按事件类型查询 traces
38
+ */
39
+ getTracesByEventType(sessionId: string, eventType: string): Promise<Trace[]>;
40
+ /**
41
+ * 按时间范围查询 traces
42
+ */
43
+ getTracesByTimeRange(sessionId: string, startTime: string, endTime: string): Promise<Trace[]>;
44
+ /**
45
+ * 获取失败的 traces
46
+ */
47
+ getFailedTraces(sessionId: string): Promise<Trace[]>;
48
+ /**
49
+ * 获取重试的 traces
50
+ */
51
+ getRetryTraces(sessionId: string): Promise<Trace[]>;
52
+ /**
53
+ * 获取文件变化的 traces
54
+ */
55
+ getFileChangeTraces(sessionId: string): Promise<Trace[]>;
56
+ /**
57
+ * 获取 trace 统计信息
58
+ */
59
+ getTraceStats(sessionId: string): Promise<{
60
+ total: number;
61
+ byEventType: Record<string, number>;
62
+ byStatus: Record<string, number>;
63
+ }>;
64
+ /**
65
+ * 清理旧的 traces
66
+ */
67
+ cleanupOldTraces(retentionDays: number): Promise<number>;
68
+ /**
69
+ * 获取当前 session ID
70
+ */
71
+ getCurrentSessionId(): string | null;
72
+ /**
73
+ * 结束当前 session
74
+ */
75
+ endSession(): void;
76
+ /**
77
+ * 关闭
78
+ */
79
+ close(): void;
80
+ }
81
+ export declare function createTraceManager(projectRoot: string): TraceManager;
82
+ //# sourceMappingURL=trace-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-manager.d.ts","sourceRoot":"","sources":["../../../src/core/observer/trace-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAI/D;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,EAAE,CAAC;IACX,OAAO,CAAC,UAAU,CAAC;IACnB,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,WAAW,EAAE,MAAM;IAY/B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAoB7E;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAuB/B;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAMnC;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAe3E;;OAEG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAItD;;OAEG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,EAAE,CAAC;IAOnB;;OAEG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,EAAE,CAAC;IAYnB;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAO1D;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAOzD;;OAEG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAO9D;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAC9C,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;IAmBF;;OAEG;IACG,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO9D;;OAEG;IACH,mBAAmB,IAAI,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACH,KAAK,IAAI,IAAI;CAKd;AAGD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAEpE"}
@@ -0,0 +1,196 @@
1
+ import { join } from 'node:path';
2
+ import { createChildLogger } from '../../utils/logger.js';
3
+ import { createTraceStore } from '../../storage/ndjson.js';
4
+ import { createSQLiteStorage } from '../../storage/sqlite.js';
5
+ const logger = createChildLogger('trace-manager');
6
+ /**
7
+ * Trace 存储管理器
8
+ * 负责存储和查询 trace 数据
9
+ */
10
+ export class TraceManager {
11
+ projectRoot;
12
+ db;
13
+ traceStore;
14
+ currentSessionId = null;
15
+ constructor(projectRoot) {
16
+ this.projectRoot = projectRoot;
17
+ // 初始化数据库
18
+ const dbPath = join(projectRoot, '.evo', 'state', 'sessions.db');
19
+ this.db = createSQLiteStorage(dbPath);
20
+ // 初始化 NDJSON trace store
21
+ const tracesDir = join(projectRoot, '.evo', 'state');
22
+ this.traceStore = createTraceStore(tracesDir, 'default');
23
+ }
24
+ /**
25
+ * 初始化
26
+ */
27
+ async init() {
28
+ await this.db.init();
29
+ logger.info('Trace manager initialized');
30
+ }
31
+ /**
32
+ * 设置当前 session
33
+ */
34
+ setSession(sessionId, runtime, projectId) {
35
+ this.currentSessionId = sessionId;
36
+ // 创建 session 记录
37
+ this.db.createSession({
38
+ session_id: sessionId,
39
+ runtime,
40
+ project_id: projectId ?? null,
41
+ started_at: new Date().toISOString(),
42
+ ended_at: null,
43
+ trace_count: 0,
44
+ });
45
+ // 更新 trace store 的 session ID
46
+ const tracesDir = join(this.projectRoot, '.evo', 'state');
47
+ this.traceStore = createTraceStore(tracesDir, sessionId);
48
+ logger.info(`Session set: ${sessionId}`, { runtime, projectId });
49
+ }
50
+ /**
51
+ * 记录 trace
52
+ */
53
+ recordTrace(trace) {
54
+ // 保存到 NDJSON
55
+ this.traceStore.append(trace);
56
+ // 添加索引到数据库
57
+ this.db.addTraceIndex({
58
+ trace_id: trace.trace_id,
59
+ session_id: trace.session_id,
60
+ runtime: trace.runtime,
61
+ event_type: trace.event_type,
62
+ timestamp: trace.timestamp,
63
+ status: trace.status,
64
+ });
65
+ // 更新 session trace 计数
66
+ this.db.incrementSessionTraceCount(trace.session_id);
67
+ logger.debug('Trace recorded', {
68
+ trace_id: trace.trace_id,
69
+ event_type: trace.event_type,
70
+ });
71
+ }
72
+ /**
73
+ * 批量记录 traces
74
+ */
75
+ recordTraces(traces) {
76
+ for (const trace of traces) {
77
+ this.recordTrace(trace);
78
+ }
79
+ }
80
+ /**
81
+ * 获取 session 的 traces
82
+ */
83
+ async getSessionTraces(sessionId, limit) {
84
+ const allTraces = await this.traceStore.readAll();
85
+ let filtered = allTraces.filter((t) => t.session_id === sessionId);
86
+ // 按时间戳排序
87
+ filtered.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
88
+ if (limit) {
89
+ filtered = filtered.slice(0, limit);
90
+ }
91
+ return filtered;
92
+ }
93
+ /**
94
+ * 获取最近的 traces
95
+ */
96
+ async getRecentTraces(count) {
97
+ return this.traceStore.readRecent(count);
98
+ }
99
+ /**
100
+ * 按事件类型查询 traces
101
+ */
102
+ async getTracesByEventType(sessionId, eventType) {
103
+ const allTraces = await this.traceStore.readAll();
104
+ return allTraces.filter((t) => t.session_id === sessionId && t.event_type === eventType);
105
+ }
106
+ /**
107
+ * 按时间范围查询 traces
108
+ */
109
+ async getTracesByTimeRange(sessionId, startTime, endTime) {
110
+ const allTraces = await this.traceStore.readAll();
111
+ const start = new Date(startTime).getTime();
112
+ const end = new Date(endTime).getTime();
113
+ return allTraces.filter((t) => {
114
+ if (t.session_id !== sessionId)
115
+ return false;
116
+ const time = new Date(t.timestamp).getTime();
117
+ return time >= start && time <= end;
118
+ });
119
+ }
120
+ /**
121
+ * 获取失败的 traces
122
+ */
123
+ async getFailedTraces(sessionId) {
124
+ const allTraces = await this.traceStore.readAll();
125
+ return allTraces.filter((t) => t.session_id === sessionId && t.status === 'failure');
126
+ }
127
+ /**
128
+ * 获取重试的 traces
129
+ */
130
+ async getRetryTraces(sessionId) {
131
+ const allTraces = await this.traceStore.readAll();
132
+ return allTraces.filter((t) => t.session_id === sessionId && t.event_type === 'retry');
133
+ }
134
+ /**
135
+ * 获取文件变化的 traces
136
+ */
137
+ async getFileChangeTraces(sessionId) {
138
+ const allTraces = await this.traceStore.readAll();
139
+ return allTraces.filter((t) => t.session_id === sessionId && t.event_type === 'file_change');
140
+ }
141
+ /**
142
+ * 获取 trace 统计信息
143
+ */
144
+ async getTraceStats(sessionId) {
145
+ const allTraces = await this.traceStore.readAll();
146
+ const sessionTraces = allTraces.filter((t) => t.session_id === sessionId);
147
+ const byEventType = {};
148
+ const byStatus = {};
149
+ for (const trace of sessionTraces) {
150
+ byEventType[trace.event_type] = (byEventType[trace.event_type] ?? 0) + 1;
151
+ byStatus[trace.status] = (byStatus[trace.status] ?? 0) + 1;
152
+ }
153
+ return {
154
+ total: sessionTraces.length,
155
+ byEventType,
156
+ byStatus,
157
+ };
158
+ }
159
+ /**
160
+ * 清理旧的 traces
161
+ */
162
+ async cleanupOldTraces(retentionDays) {
163
+ // 这里可以实现清理逻辑
164
+ // 暂时返回 0
165
+ logger.info(`Cleanup old traces older than ${retentionDays} days`);
166
+ return 0;
167
+ }
168
+ /**
169
+ * 获取当前 session ID
170
+ */
171
+ getCurrentSessionId() {
172
+ return this.currentSessionId;
173
+ }
174
+ /**
175
+ * 结束当前 session
176
+ */
177
+ endSession() {
178
+ if (this.currentSessionId) {
179
+ logger.info(`Session ended: ${this.currentSessionId}`);
180
+ this.currentSessionId = null;
181
+ }
182
+ }
183
+ /**
184
+ * 关闭
185
+ */
186
+ close() {
187
+ this.endSession();
188
+ this.db.close();
189
+ logger.info('Trace manager closed');
190
+ }
191
+ }
192
+ // 导出工厂函数
193
+ export function createTraceManager(projectRoot) {
194
+ return new TraceManager(projectRoot);
195
+ }
196
+ //# sourceMappingURL=trace-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-manager.js","sourceRoot":"","sources":["../../../src/core/observer/trace-manager.ts"],"names":[],"mappings":"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"}