front-cpu 0.1.1

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 (136) hide show
  1. package/README.md +475 -0
  2. package/README.zh-CN.md +474 -0
  3. package/dist/Pipeline.d.ts +119 -0
  4. package/dist/Pipeline.d.ts.map +1 -0
  5. package/dist/Pipeline.js +373 -0
  6. package/dist/Pipeline.js.map +1 -0
  7. package/dist/debug.d.ts +3 -0
  8. package/dist/debug.d.ts.map +1 -0
  9. package/dist/debug.js +12 -0
  10. package/dist/debug.js.map +1 -0
  11. package/dist/index.d.ts +20 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +19 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/interfaces.d.ts +49 -0
  16. package/dist/interfaces.d.ts.map +1 -0
  17. package/dist/interfaces.js +8 -0
  18. package/dist/interfaces.js.map +1 -0
  19. package/dist/isa/index.d.ts +20 -0
  20. package/dist/isa/index.d.ts.map +1 -0
  21. package/dist/isa/index.js +26 -0
  22. package/dist/isa/index.js.map +1 -0
  23. package/dist/isa/types.d.ts +144 -0
  24. package/dist/isa/types.d.ts.map +1 -0
  25. package/dist/isa/types.js +10 -0
  26. package/dist/isa/types.js.map +1 -0
  27. package/dist/logging/CPUConsole.d.ts +105 -0
  28. package/dist/logging/CPUConsole.d.ts.map +1 -0
  29. package/dist/logging/CPUConsole.js +471 -0
  30. package/dist/logging/CPUConsole.js.map +1 -0
  31. package/dist/logging/CPUDebugger.d.ts +91 -0
  32. package/dist/logging/CPUDebugger.d.ts.map +1 -0
  33. package/dist/logging/CPUDebugger.js +166 -0
  34. package/dist/logging/CPUDebugger.js.map +1 -0
  35. package/dist/logging/CPUEventCollector.d.ts +90 -0
  36. package/dist/logging/CPUEventCollector.d.ts.map +1 -0
  37. package/dist/logging/CPUEventCollector.js +353 -0
  38. package/dist/logging/CPUEventCollector.js.map +1 -0
  39. package/dist/logging/CPULogger.d.ts +150 -0
  40. package/dist/logging/CPULogger.d.ts.map +1 -0
  41. package/dist/logging/CPULogger.js +336 -0
  42. package/dist/logging/CPULogger.js.map +1 -0
  43. package/dist/logging/index.d.ts +10 -0
  44. package/dist/logging/index.d.ts.map +1 -0
  45. package/dist/logging/index.js +16 -0
  46. package/dist/logging/index.js.map +1 -0
  47. package/dist/logging/runtime.d.ts +37 -0
  48. package/dist/logging/runtime.d.ts.map +1 -0
  49. package/dist/logging/runtime.js +42 -0
  50. package/dist/logging/runtime.js.map +1 -0
  51. package/dist/logging/stack-parser.d.ts +22 -0
  52. package/dist/logging/stack-parser.d.ts.map +1 -0
  53. package/dist/logging/stack-parser.js +144 -0
  54. package/dist/logging/stack-parser.js.map +1 -0
  55. package/dist/logging/types.d.ts +73 -0
  56. package/dist/logging/types.d.ts.map +1 -0
  57. package/dist/logging/types.js +47 -0
  58. package/dist/logging/types.js.map +1 -0
  59. package/dist/scheduling/ResourceStrategyRegistry.d.ts +61 -0
  60. package/dist/scheduling/ResourceStrategyRegistry.d.ts.map +1 -0
  61. package/dist/scheduling/ResourceStrategyRegistry.js +109 -0
  62. package/dist/scheduling/ResourceStrategyRegistry.js.map +1 -0
  63. package/dist/scheduling/index.d.ts +6 -0
  64. package/dist/scheduling/index.d.ts.map +1 -0
  65. package/dist/scheduling/index.js +5 -0
  66. package/dist/scheduling/index.js.map +1 -0
  67. package/dist/scheduling/types.d.ts +44 -0
  68. package/dist/scheduling/types.d.ts.map +1 -0
  69. package/dist/scheduling/types.js +5 -0
  70. package/dist/scheduling/types.js.map +1 -0
  71. package/dist/stages/EX.d.ts +17 -0
  72. package/dist/stages/EX.d.ts.map +1 -0
  73. package/dist/stages/EX.js +95 -0
  74. package/dist/stages/EX.js.map +1 -0
  75. package/dist/stages/IF.d.ts +41 -0
  76. package/dist/stages/IF.d.ts.map +1 -0
  77. package/dist/stages/IF.js +83 -0
  78. package/dist/stages/IF.js.map +1 -0
  79. package/dist/stages/RES.d.ts +17 -0
  80. package/dist/stages/RES.d.ts.map +1 -0
  81. package/dist/stages/RES.js +37 -0
  82. package/dist/stages/RES.js.map +1 -0
  83. package/dist/stages/SCH.d.ts +77 -0
  84. package/dist/stages/SCH.d.ts.map +1 -0
  85. package/dist/stages/SCH.js +270 -0
  86. package/dist/stages/SCH.js.map +1 -0
  87. package/dist/stages/WB.d.ts +19 -0
  88. package/dist/stages/WB.d.ts.map +1 -0
  89. package/dist/stages/WB.js +102 -0
  90. package/dist/stages/WB.js.map +1 -0
  91. package/dist/types.d.ts +111 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +26 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/utils/InstructionCancellation.d.ts +31 -0
  96. package/dist/utils/InstructionCancellation.d.ts.map +1 -0
  97. package/dist/utils/InstructionCancellation.js +53 -0
  98. package/dist/utils/InstructionCancellation.js.map +1 -0
  99. package/dist/utils/abortable.d.ts +30 -0
  100. package/dist/utils/abortable.d.ts.map +1 -0
  101. package/dist/utils/abortable.js +76 -0
  102. package/dist/utils/abortable.js.map +1 -0
  103. package/dist/utils/request.d.ts +27 -0
  104. package/dist/utils/request.d.ts.map +1 -0
  105. package/dist/utils/request.js +96 -0
  106. package/dist/utils/request.js.map +1 -0
  107. package/package.json +74 -0
  108. package/src/Pipeline.ts +475 -0
  109. package/src/debug.ts +15 -0
  110. package/src/index.ts +67 -0
  111. package/src/interfaces.ts +53 -0
  112. package/src/isa/index.ts +34 -0
  113. package/src/isa/types.ts +178 -0
  114. package/src/logging/CPUConsole.md +843 -0
  115. package/src/logging/CPUConsole.ts +631 -0
  116. package/src/logging/CPUDebugger.ts +235 -0
  117. package/src/logging/CPUEventCollector.ts +418 -0
  118. package/src/logging/CPULogger.ts +435 -0
  119. package/src/logging/CPU_LOGGING_DESIGN.md +1319 -0
  120. package/src/logging/USAGE_GUIDE.md +505 -0
  121. package/src/logging/index.ts +21 -0
  122. package/src/logging/runtime.ts +96 -0
  123. package/src/logging/stack-parser.ts +168 -0
  124. package/src/logging/types.ts +101 -0
  125. package/src/scheduling/ResourceStrategyRegistry.ts +124 -0
  126. package/src/scheduling/index.ts +13 -0
  127. package/src/scheduling/types.ts +47 -0
  128. package/src/stages/EX.ts +121 -0
  129. package/src/stages/IF.ts +103 -0
  130. package/src/stages/RES.ts +46 -0
  131. package/src/stages/SCH.ts +331 -0
  132. package/src/stages/WB.ts +127 -0
  133. package/src/types.ts +118 -0
  134. package/src/utils/InstructionCancellation.ts +73 -0
  135. package/src/utils/abortable.ts +89 -0
  136. package/src/utils/request.ts +125 -0
@@ -0,0 +1,505 @@
1
+ # 🚀 CPU 日志系统使用指南
2
+
3
+ ## 📖 快速开始
4
+
5
+ ### 1. 打开控制台,立即看到指令执行
6
+
7
+ CPU 日志系统已经自动集成到流水线中,**无需任何配置**即可使用!
8
+
9
+ ```bash
10
+ # 启动应用后,打开浏览器控制台(F12)
11
+ # 你会看到类似这样的输出:
12
+
13
+ 🎯 [20:30:15.123] task.create 指令创建
14
+ { id: 'instr_xxx', correlationId: 'corr_xxx' }
15
+
16
+ ✅ [20:30:15.248] task.create → 成功 125ms
17
+ 流水线阶段:
18
+ IF ████ 0ms
19
+ SCH ████ 0ms
20
+ EX ████████████████████ 123ms
21
+ WB ████ 2ms
22
+ ✓ 乐观更新
23
+ ```
24
+
25
+ ### 2. 调整控制台输出级别
26
+
27
+ 前往 **CPU 调试器页面**(左侧边栏 → CPU 调试):
28
+
29
+ ![Console Level Selector](控制台级别选择器)
30
+
31
+ 选择你想要的级别:
32
+
33
+ - **关闭 (SILENT)**: 完全静音,适合生产环境
34
+ - **最小 (MINIMAL)**: 只看成功/失败,适合日常使用
35
+ - **正常 (NORMAL)**: 看关键阶段,**推荐用于开发**
36
+ - **详细 (VERBOSE)**: 看所有细节,适合深度调试
37
+ - **调试 (DEBUG)**: 看 payload 和 result,适合排查问题
38
+
39
+ ### 3. 实际使用场景
40
+
41
+ #### 场景 1:验证任务创建是否成功
42
+
43
+ ```typescript
44
+ // 你在看板创建了一个任务
45
+ // 立即在控制台看到:
46
+
47
+ 🎯 [20:30:15.123] task.create 指令创建
48
+ ✅ [20:30:15.248] task.create → 成功 125ms
49
+ 流水线阶段:
50
+ IF ████ 0ms
51
+ EX ████████████████████ 123ms
52
+
53
+ // 如果失败,会自动展开:
54
+ ❌ [20:30:15.456] task.create → 失败 24ms
55
+ 原因: 网络错误
56
+ 💡 建议: 检查后端服务是否运行
57
+ ```
58
+
59
+ #### 场景 2:调试拖放排期为什么闪烁
60
+
61
+ ```typescript
62
+ // 1. 设置控制台级别为 VERBOSE
63
+ cpuConsole.setLevel(ConsoleLevel.VERBOSE)
64
+
65
+ // 2. 拖动任务到新日期
66
+ // 3. 在控制台看到完整流程:
67
+
68
+ 🎯 [20:30:15.123] schedule.update 指令创建
69
+ 🔄 [20:30:15.124] 乐观更新已应用 // ← 这里应该立即更新 UI
70
+ ✅ [20:30:15.248] schedule.update → 成功 125ms
71
+
72
+ // 如果看到回滚:
73
+ ⚠️ [20:30:15.456] schedule.update 乐观更新已回滚
74
+ 原因: HTTP 500: database is locked
75
+
76
+ // 说明:乐观更新失败 → UI 会闪烁 → 需要修复后端
77
+ ```
78
+
79
+ #### 场景 3:分析性能瓶颈
80
+
81
+ 在 CPU 调试器页面:
82
+
83
+ ```typescript
84
+ // 1. 点击"打印统计信息"按钮
85
+ // 控制台输出:
86
+
87
+ 📊 流水线统计
88
+ 总指令数: 150
89
+ 成功: 142 (94.7%)
90
+ 失败: 8 (5.3%)
91
+ 平均延迟: 125ms
92
+
93
+ // 2. 使用 CPUDebugger 查询最慢的指令
94
+ import { cpuDebugger } from '@/cpu/logging'
95
+
96
+ const slowest = cpuDebugger.getSlowestInstructions(10)
97
+ console.table(slowest)
98
+
99
+ // 输出:
100
+ // ┌─────┬────────────────────┬──────────┬──────────┐
101
+ // │ Rank│ Type │ Duration │ ID │
102
+ // ├─────┼────────────────────┼──────────┼──────────┤
103
+ // │ 1 │ schedule.update │ 2345ms │ instr_xx │
104
+ // │ 2 │ task.create │ 1234ms │ instr_yy │
105
+ // └─────┴────────────────────┴──────────┴──────────┘
106
+
107
+ // 3. 诊断为什么慢
108
+ const diagnosis = cpuDebugger.diagnoseSlowInstruction('instr_xx')
109
+ console.log(diagnosis)
110
+
111
+ // 输出:
112
+ // {
113
+ // bottleneck: { stage: 'SCH→EX', duration: 2000ms, percentage: 85% },
114
+ // suggestions: [
115
+ // '调度器等待时间较长,存在资源冲突',
116
+ // 'SCH→EX 占总耗时 85.3%,是主要瓶颈'
117
+ // ]
118
+ // }
119
+ ```
120
+
121
+ #### 场景 4:查询特定类型指令的性能
122
+
123
+ ```typescript
124
+ import { cpuLogger } from '@/cpu/logging'
125
+
126
+ // 分析 schedule.update 的性能
127
+ const perf = cpuLogger.analyzeInstructionPerformance('schedule.update')
128
+
129
+ console.log(`
130
+ 执行次数: ${perf.count}
131
+ 成功率: ${(perf.successRate * 100).toFixed(1)}%
132
+ 平均延迟: ${perf.avgLatency.toFixed(0)}ms
133
+ P50: ${perf.p50.toFixed(0)}ms
134
+ P95: ${perf.p95.toFixed(0)}ms
135
+ P99: ${perf.p99.toFixed(0)}ms
136
+ `)
137
+
138
+ // 输出:
139
+ // 执行次数: 50
140
+ // 成功率: 96.0%
141
+ // 平均延迟: 125ms
142
+ // P50: 120ms
143
+ // P95: 180ms
144
+ // P99: 250ms
145
+ ```
146
+
147
+ #### 场景 5:分析资源冲突
148
+
149
+ ```typescript
150
+ import { cpuLogger } from '@/cpu/logging'
151
+
152
+ // 查看哪些资源冲突最多
153
+ const conflicts = cpuLogger.analyzeResourceConflicts()
154
+
155
+ console.table(conflicts.slice(0, 5)) // 前 5 个热点
156
+
157
+ // 输出:
158
+ // ┌───┬──────────────────────┬──────────────┬─────────────┐
159
+ // │ # │ Resource │ ConflictCount│ AvgWaitTime │
160
+ // ├───┼──────────────────────┼──────────────┼─────────────┤
161
+ // │ 0 │ task:abc123 │ 23 │ 156ms │
162
+ // │ 1 │ schedule:xyz789 │ 15 │ 89ms │
163
+ // └───┴──────────────────────┴──────────────┴─────────────┘
164
+
165
+ // 说明:task:abc123 发生了 23 次冲突,平均等待 156ms
166
+ // 建议:检查是否有多个操作同时修改这个任务
167
+ ```
168
+
169
+ #### 场景 6:分析乐观更新回滚率
170
+
171
+ ```typescript
172
+ import { cpuLogger } from '@/cpu/logging'
173
+
174
+ // 查看乐观更新的回滚情况
175
+ const rollbackStats = cpuLogger.analyzeOptimisticRollbackRate()
176
+
177
+ console.log(`
178
+ 总乐观更新: ${rollbackStats.totalOptimistic}
179
+ 回滚次数: ${rollbackStats.rollbackCount}
180
+ 回滚率: ${(rollbackStats.rollbackRate * 100).toFixed(1)}%
181
+ `)
182
+
183
+ console.table(rollbackStats.byInstructionType)
184
+
185
+ // 输出:
186
+ // ┌────────────────────┬───────┬──────────┬────────┐
187
+ // │ Type │ Total │ Rollbacks│ Rate │
188
+ // ├────────────────────┼───────┼──────────┼────────┤
189
+ // │ schedule.update │ 50 │ 2 │ 4.0% │
190
+ // │ task.update │ 30 │ 0 │ 0.0% │
191
+ // └────────────────────┴───────┴──────────┴────────┘
192
+
193
+ // 说明:schedule.update 有 4% 的回滚率
194
+ // 建议:如果 > 5%,说明乐观更新不够准确
195
+ ```
196
+
197
+ ---
198
+
199
+ ## 🎨 高级用法
200
+
201
+ ### 1. 导出数据进行离线分析
202
+
203
+ ```typescript
204
+ import { cpuLogger } from '@/cpu/logging'
205
+
206
+ // 导出最近 1 小时的所有指令数据
207
+ const data = cpuLogger.exportData({
208
+ timeRange: {
209
+ start: Date.now() - 3600000,
210
+ end: Date.now(),
211
+ },
212
+ })
213
+
214
+ // 保存为 JSON
215
+ const json = JSON.stringify(data, null, 2)
216
+ const blob = new Blob([json], { type: 'application/json' })
217
+ const url = URL.createObjectURL(blob)
218
+ const a = document.createElement('a')
219
+ a.href = url
220
+ a.download = `cpu-logs-${Date.now()}.json`
221
+ a.click()
222
+
223
+ // 可以用 Excel、Python、R 等工具分析
224
+ ```
225
+
226
+ ### 2. 复杂查询
227
+
228
+ ```typescript
229
+ import { cpuLogger, CPUEventType } from '@/cpu/logging'
230
+
231
+ // 查询:所有执行超过 100ms 的 schedule.update 指令
232
+ const slowUpdates = cpuLogger.query({
233
+ instructionType: 'schedule.update',
234
+ minLatency: 100,
235
+ timeRange: {
236
+ start: Date.now() - 3600000, // 最近 1 小时
237
+ end: Date.now(),
238
+ },
239
+ })
240
+
241
+ console.log(`找到 ${slowUpdates.length} 条慢指令`)
242
+
243
+ // 查询:所有触发了回滚的指令
244
+ const rollbacks = cpuLogger.query({
245
+ eventType: CPUEventType.OPTIMISTIC_ROLLED_BACK,
246
+ })
247
+
248
+ console.log(`找到 ${rollbacks.length} 次回滚`)
249
+
250
+ // 查询:所有资源冲突事件
251
+ const conflicts = cpuLogger.query({
252
+ tags: ['conflict'],
253
+ })
254
+
255
+ console.log(`找到 ${conflicts.length} 次资源冲突`)
256
+ ```
257
+
258
+ ### 3. 实时监控
259
+
260
+ ```typescript
261
+ import { cpuDebugger } from '@/cpu/logging'
262
+
263
+ // 每 5 秒打印一次实时统计
264
+ setInterval(() => {
265
+ const stats = cpuDebugger.getRealtimeStats(5) // 最近 5 秒
266
+
267
+ console.log(`
268
+ 📊 实时统计(最近 5 秒)
269
+ 指令吞吐量: ${stats.instructionsPerSecond.toFixed(2)} IPS
270
+ 平均延迟: ${stats.avgLatency.toFixed(0)}ms
271
+ 错误率: ${(stats.errorRate * 100).toFixed(1)}%
272
+ 热门指令: ${stats.topInstructionTypes.map((t) => t.type).join(', ')}
273
+ `)
274
+ }, 5000)
275
+ ```
276
+
277
+ ### 4. 指令重放(时间旅行调试)
278
+
279
+ ```typescript
280
+ import { cpuDebugger } from '@/cpu/logging'
281
+
282
+ // 重放某个指令的完整执行过程
283
+ const replay = cpuDebugger.replayInstruction('instr_abc123')
284
+
285
+ console.log('指令重放:')
286
+ console.table(replay.timeline)
287
+
288
+ // 输出:
289
+ // ┌───┬──────────────┬───────┬──────────────────────┐
290
+ // │ # │ Time │ Stage │ Event │
291
+ // ├───┼──────────────┼───────┼──────────────────────┤
292
+ // │ 0 │ 1634567890123│ IF │ instruction.created │
293
+ // │ 1 │ 1634567890124│ SCH │ instruction.issued │
294
+ // │ 2 │ 1634567890125│ EX │ optimistic.applied │
295
+ // │ 3 │ 1634567890126│ EX │ network.request_sent │
296
+ // │ 4 │ 1634567890250│ EX │ network.response_... │
297
+ // │ 5 │ 1634567890251│ WB │ instruction.committed│
298
+ // └───┴──────────────┴───────┴──────────────────────┘
299
+
300
+ console.log(`执行成功: ${replay.success}`)
301
+ ```
302
+
303
+ ---
304
+
305
+ ## 🎯 最佳实践
306
+
307
+ ### 开发环境配置
308
+
309
+ ```typescript
310
+ // src/main.ts 或其他入口文件
311
+
312
+ import { cpuConsole, ConsoleLevel } from '@/cpu/logging'
313
+
314
+ if (import.meta.env.DEV) {
315
+ // 开发环境:详细模式
316
+ cpuConsole.setLevel(ConsoleLevel.VERBOSE)
317
+ } else {
318
+ // 生产环境:只看失败
319
+ cpuConsole.setLevel(ConsoleLevel.MINIMAL)
320
+ }
321
+ ```
322
+
323
+ ### 调试特定功能时
324
+
325
+ ```typescript
326
+ import { cpuConsole } from '@/cpu/logging'
327
+
328
+ // 只看 schedule 相关指令
329
+ cpuConsole.setFilter(['schedule.update', 'schedule.create', 'schedule.delete'])
330
+
331
+ // 开发完成后,清除过滤器
332
+ cpuConsole.setFilter([])
333
+ ```
334
+
335
+ ### 定期检查性能
336
+
337
+ ```typescript
338
+ // 每天早上查看昨天的性能
339
+ import { cpuLogger } from '@/cpu/logging'
340
+
341
+ const yesterday = Date.now() - 86400000
342
+ const events = cpuLogger.getEventsByTimeRange(yesterday, Date.now())
343
+
344
+ console.log(`昨天执行了 ${events.length} 条指令`)
345
+
346
+ const instructions = new Set(events.map((e) => e.instructionId))
347
+ console.log(`共 ${instructions.size} 个唯一指令`)
348
+
349
+ // 找出最慢的 10 个
350
+ import { cpuDebugger } from '@/cpu/logging'
351
+ const slowest = cpuDebugger.getSlowestInstructions(10)
352
+ console.table(slowest)
353
+ ```
354
+
355
+ ---
356
+
357
+ ## 🔧 故障排查流程
358
+
359
+ ### 问题 1: UI 操作后没有反应
360
+
361
+ ```typescript
362
+ // 1. 检查控制台是否有指令
363
+ // 如果没有 → 指令没有发射
364
+ // 如果有失败 → 看错误信息
365
+
366
+ // 2. 如果指令成功但 UI 没更新
367
+ // 检查是否有 commit 函数
368
+ import { ISA } from '@/cpu/isa'
369
+ console.log(ISA['task.update'].commit) // 应该有函数
370
+
371
+ // 3. 检查是否被中断处理器去重了
372
+ import { interruptHandler } from '@/cpu/interrupt/InterruptHandler'
373
+ console.log(interruptHandler.getStats())
374
+ ```
375
+
376
+ ### 问题 2: UI 闪烁
377
+
378
+ ```typescript
379
+ // 1. 检查是否有乐观更新
380
+ cpuConsole.setLevel(ConsoleLevel.VERBOSE)
381
+
382
+ // 2. 看是否有回滚
383
+ // 如果有 ⚠️ 乐观更新已回滚 → 说明请求失败
384
+
385
+ // 3. 查看回滚率
386
+ import { cpuLogger } from '@/cpu/logging'
387
+ const stats = cpuLogger.analyzeOptimisticRollbackRate()
388
+ console.log(stats)
389
+
390
+ // 如果 > 5% → 乐观更新逻辑有问题或后端经常失败
391
+ ```
392
+
393
+ ### 问题 3: 操作很慢
394
+
395
+ ```typescript
396
+ // 1. 找出最慢的指令
397
+ import { cpuDebugger } from '@/cpu/logging'
398
+ const slowest = cpuDebugger.getSlowestInstructions(10)
399
+ console.table(slowest)
400
+
401
+ // 2. 诊断瓶颈
402
+ const diagnosis = cpuDebugger.diagnoseSlowInstruction(slowest[0].instructionId)
403
+ console.log(diagnosis)
404
+
405
+ // 3. 如果瓶颈在 SCH → 资源冲突
406
+ // 查看冲突详情
407
+ const conflicts = cpuLogger.analyzeResourceConflicts()
408
+ console.table(conflicts)
409
+
410
+ // 4. 如果瓶颈在 EX → 网络慢
411
+ // 检查后端性能
412
+ ```
413
+
414
+ ---
415
+
416
+ ## 📚 API 速查
417
+
418
+ ### CPUConsole(控制台)
419
+
420
+ ```typescript
421
+ import { cpuConsole, ConsoleLevel } from '@/cpu/logging'
422
+
423
+ // 设置级别
424
+ cpuConsole.setLevel(ConsoleLevel.VERBOSE)
425
+
426
+ // 设置过滤器
427
+ cpuConsole.setFilter(['task.create', 'task.update'])
428
+
429
+ // 打印统计
430
+ cpuConsole.printStats({ total: 100, success: 95, failed: 5, avgLatency: 125 })
431
+
432
+ // 打印分隔线
433
+ cpuConsole.printSeparator('我的调试会话')
434
+
435
+ // 启用/禁用
436
+ cpuConsole.enable()
437
+ cpuConsole.disable()
438
+ ```
439
+
440
+ ### CPULogger(日志记录器)
441
+
442
+ ```typescript
443
+ import { cpuLogger, CPUEventType } from '@/cpu/logging'
444
+
445
+ // 查询
446
+ cpuLogger.getInstructionTrace('instr_xxx')
447
+ cpuLogger.getCorrelationTrace('corr_xxx')
448
+ cpuLogger.getEventsByType(CPUEventType.NETWORK_ERROR)
449
+ cpuLogger.getEventsByInstructionType('task.update')
450
+ cpuLogger.getEventsByTimeRange(start, end)
451
+ cpuLogger.query({
452
+ /* 复杂条件 */
453
+ })
454
+
455
+ // 分析
456
+ cpuLogger.analyzeInstructionPerformance('task.update')
457
+ cpuLogger.analyzeResourceConflicts()
458
+ cpuLogger.analyzeOptimisticRollbackRate()
459
+ cpuLogger.analyzeThroughput(60000)
460
+
461
+ // 导出
462
+ cpuLogger.exportData()
463
+ cpuLogger.getStats()
464
+ cpuLogger.clear()
465
+ ```
466
+
467
+ ### CPUDebugger(调试器)
468
+
469
+ ```typescript
470
+ import { cpuDebugger } from '@/cpu/logging'
471
+
472
+ // 查询
473
+ cpuDebugger.getSlowestInstructions(10)
474
+ cpuDebugger.getFailedInstructions()
475
+ cpuDebugger.getRolledBackInstructions()
476
+ cpuDebugger.getResourceConflictChain('instr_xxx')
477
+
478
+ // 诊断
479
+ cpuDebugger.diagnoseSlowInstruction('instr_xxx')
480
+ cpuDebugger.replayInstruction('instr_xxx')
481
+ cpuDebugger.getRealtimeStats(5)
482
+ ```
483
+
484
+ ---
485
+
486
+ ## 💡 小贴士
487
+
488
+ 1. **日常开发用 NORMAL 级别**,够用了
489
+ 2. **调试问题用 VERBOSE 或 DEBUG**,能看到所有细节
490
+ 3. **生产环境用 MINIMAL**,减少噪音
491
+ 4. **定期导出数据**,离线分析性能趋势
492
+ 5. **设置过滤器**,专注于当前开发的功能
493
+ 6. **善用打印统计**,快速了解整体情况
494
+ 7. **遇到慢指令**,用 `diagnoseSlowInstruction` 分析瓶颈
495
+ 8. **看到回滚**,检查乐观更新逻辑或后端问题
496
+
497
+ ---
498
+
499
+ ## 🎉 总结
500
+
501
+ **CPUConsole**: 你的"眼睛",实时看到指令执行
502
+ **CPULogger**: 系统的"黑匣子",记录所有细节用于分析
503
+ **CPUDebugger**: 你的"助手",帮你找问题、分析性能
504
+
505
+ 两者配合使用,覆盖"实时调试"和"事后分析"两个场景,让你的开发效率翻倍!🚀
@@ -0,0 +1,21 @@
1
+ /**
2
+ * CPU 日志和调试系统统一导出
3
+ */
4
+
5
+ // 类型
6
+ export { CPUEventType, ConsoleLevel, type CPUEvent, type CallSource } from './types'
7
+
8
+ // 事件采集器
9
+ export { cpuEventCollector, CPUEventCollector } from './CPUEventCollector'
10
+
11
+ // 日志记录器
12
+ export { cpuLogger, CPULogger } from './CPULogger'
13
+
14
+ // 调试器
15
+ export { cpuDebugger, CPUDebugger } from './CPUDebugger'
16
+
17
+ // 控制台
18
+ export { cpuConsole, CPUConsole } from './CPUConsole'
19
+
20
+ // 调用栈解析工具
21
+ export { captureCallSource, formatCallSource, formatCallSourceShort } from './stack-parser'
@@ -0,0 +1,96 @@
1
+ import type { QueuedInstruction } from '../types'
2
+ import type { CallSource } from './types'
3
+
4
+ export interface CPUEventCollectorLike {
5
+ onInstructionCreated: (instruction: QueuedInstruction) => void
6
+ onInstructionCommitted: (instruction: QueuedInstruction) => void
7
+ onInstructionCancelled: (instruction: QueuedInstruction) => void
8
+ onInstructionFailed: (instruction: QueuedInstruction, error: Error) => void
9
+ onOptimisticApplied: (
10
+ instructionId: string,
11
+ instructionType: string,
12
+ correlationId: string,
13
+ snapshot: any,
14
+ changes: any
15
+ ) => void
16
+ onOptimisticRolledBack: (
17
+ instructionId: string,
18
+ instructionType: string,
19
+ correlationId: string,
20
+ snapshot: any,
21
+ reason: string,
22
+ error?: Error
23
+ ) => void
24
+ }
25
+
26
+ export interface CPUConsoleLike {
27
+ onInstructionCreated: (instruction: QueuedInstruction) => void
28
+ onInstructionSuccess: (instruction: QueuedInstruction, duration: number) => void
29
+ onInstructionCancelled: (instruction: QueuedInstruction, duration: number) => void
30
+ onInstructionFailure: (instruction: QueuedInstruction, error: Error, duration: number) => void
31
+ onOptimisticApplied: (instruction: QueuedInstruction) => void
32
+ onOptimisticRolledBack: (instruction: QueuedInstruction, reason: string) => void
33
+ }
34
+
35
+ export interface CPULoggerLike {
36
+ getQuickStats: () => {
37
+ totalCompleted: number
38
+ totalFailed: number
39
+ totalCancelled: number
40
+ }
41
+ }
42
+
43
+ export interface LoggingProvider {
44
+ cpuEventCollector: CPUEventCollectorLike
45
+ cpuConsole: CPUConsoleLike
46
+ cpuLogger: CPULoggerLike
47
+ captureCallSource: (skipFrames?: number) => CallSource | undefined
48
+ }
49
+
50
+ const noopEventCollector: CPUEventCollectorLike = {
51
+ onInstructionCreated: () => {},
52
+ onInstructionCommitted: () => {},
53
+ onInstructionCancelled: () => {},
54
+ onInstructionFailed: () => {},
55
+ onOptimisticApplied: () => {},
56
+ onOptimisticRolledBack: () => {},
57
+ }
58
+
59
+ const noopConsole: CPUConsoleLike = {
60
+ onInstructionCreated: () => {},
61
+ onInstructionSuccess: () => {},
62
+ onInstructionCancelled: () => {},
63
+ onInstructionFailure: () => {},
64
+ onOptimisticApplied: () => {},
65
+ onOptimisticRolledBack: () => {},
66
+ }
67
+
68
+ const noopLogger: CPULoggerLike = {
69
+ getQuickStats: () => ({
70
+ totalCompleted: 0,
71
+ totalFailed: 0,
72
+ totalCancelled: 0,
73
+ }),
74
+ }
75
+
76
+ export let cpuEventCollector: CPUEventCollectorLike = noopEventCollector
77
+ export let cpuConsole: CPUConsoleLike = noopConsole
78
+ export let cpuLogger: CPULoggerLike = noopLogger
79
+ export let captureCallSource: (skipFrames?: number) => CallSource | undefined = () => undefined
80
+
81
+ export function setLoggingProvider(provider: Partial<LoggingProvider>): void {
82
+ if (provider.cpuEventCollector) {
83
+ cpuEventCollector = provider.cpuEventCollector
84
+ }
85
+ if (provider.cpuConsole) {
86
+ cpuConsole = provider.cpuConsole
87
+ }
88
+ if (provider.cpuLogger) {
89
+ cpuLogger = provider.cpuLogger
90
+ }
91
+ if (provider.captureCallSource) {
92
+ captureCallSource = provider.captureCallSource
93
+ }
94
+ }
95
+
96
+