@dommaker/harness 1.5.0 → 1.6.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 (208) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +0 -2
  3. package/dist/cli/commands/definitions.d.ts.map +1 -1
  4. package/dist/cli/commands/definitions.js +1 -32
  5. package/dist/cli/commands/definitions.js.map +1 -1
  6. package/dist/cli/commands/passes-gate.d.ts +0 -2
  7. package/dist/cli/commands/passes-gate.d.ts.map +1 -1
  8. package/dist/cli/commands/passes-gate.js +0 -1
  9. package/dist/cli/commands/passes-gate.js.map +1 -1
  10. package/dist/cli/commands/performance.d.ts +0 -4
  11. package/dist/cli/commands/performance.d.ts.map +1 -1
  12. package/dist/cli/commands/performance.js +10 -20
  13. package/dist/cli/commands/performance.js.map +1 -1
  14. package/dist/cli/commands/report.d.ts +1 -1
  15. package/dist/cli/commands/report.d.ts.map +1 -1
  16. package/dist/cli/commands/report.js +2 -55
  17. package/dist/cli/commands/report.js.map +1 -1
  18. package/dist/cli/commands/status.d.ts.map +1 -1
  19. package/dist/cli/commands/status.js +4 -8
  20. package/dist/cli/commands/status.js.map +1 -1
  21. package/dist/context/index.d.ts +2 -5
  22. package/dist/context/index.d.ts.map +1 -1
  23. package/dist/context/index.js +2 -8
  24. package/dist/context/index.js.map +1 -1
  25. package/dist/context/token-budget.d.ts +0 -29
  26. package/dist/context/token-budget.d.ts.map +1 -1
  27. package/dist/context/token-budget.js +1 -65
  28. package/dist/context/token-budget.js.map +1 -1
  29. package/dist/context/types.d.ts +0 -1
  30. package/dist/context/types.d.ts.map +1 -1
  31. package/dist/context/types.js +0 -9
  32. package/dist/context/types.js.map +1 -1
  33. package/dist/core/constraints/checker.d.ts +14 -0
  34. package/dist/core/constraints/checker.d.ts.map +1 -1
  35. package/dist/core/constraints/checker.js +22 -2
  36. package/dist/core/constraints/checker.js.map +1 -1
  37. package/dist/core/constraints/git-evidence.d.ts +6 -3
  38. package/dist/core/constraints/git-evidence.d.ts.map +1 -1
  39. package/dist/core/constraints/git-evidence.js +6 -3
  40. package/dist/core/constraints/git-evidence.js.map +1 -1
  41. package/dist/core/index.d.ts +1 -2
  42. package/dist/core/index.d.ts.map +1 -1
  43. package/dist/core/index.js +1 -9
  44. package/dist/core/index.js.map +1 -1
  45. package/dist/core/spec/validator.d.ts +2 -0
  46. package/dist/core/spec/validator.d.ts.map +1 -1
  47. package/dist/core/spec/validator.js +9 -11
  48. package/dist/core/spec/validator.js.map +1 -1
  49. package/dist/core/validators/index.d.ts +1 -1
  50. package/dist/core/validators/index.d.ts.map +1 -1
  51. package/dist/core/validators/passes-gate.d.ts +1 -15
  52. package/dist/core/validators/passes-gate.d.ts.map +1 -1
  53. package/dist/core/validators/passes-gate.js +0 -125
  54. package/dist/core/validators/passes-gate.js.map +1 -1
  55. package/dist/failure/index.d.ts +0 -1
  56. package/dist/failure/index.d.ts.map +1 -1
  57. package/dist/failure/index.js +1 -7
  58. package/dist/failure/index.js.map +1 -1
  59. package/dist/gates/definitions.d.ts.map +1 -1
  60. package/dist/gates/definitions.js +0 -4
  61. package/dist/gates/definitions.js.map +1 -1
  62. package/dist/gates/performance.d.ts +7 -22
  63. package/dist/gates/performance.d.ts.map +1 -1
  64. package/dist/gates/performance.js +7 -89
  65. package/dist/gates/performance.js.map +1 -1
  66. package/dist/gates/types.d.ts +2 -8
  67. package/dist/gates/types.d.ts.map +1 -1
  68. package/dist/index.d.ts +6 -8
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +4 -22
  71. package/dist/index.js.map +1 -1
  72. package/dist/knowledge/index.d.ts +0 -1
  73. package/dist/knowledge/index.d.ts.map +1 -1
  74. package/dist/knowledge/index.js +1 -3
  75. package/dist/knowledge/index.js.map +1 -1
  76. package/dist/monitoring/trace-analyzer.d.ts +25 -10
  77. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  78. package/dist/monitoring/trace-analyzer.js +147 -116
  79. package/dist/monitoring/trace-analyzer.js.map +1 -1
  80. package/dist/types/passes-gate.d.ts +0 -19
  81. package/dist/types/passes-gate.d.ts.map +1 -1
  82. package/package.json +1 -1
  83. package/src/__tests__/passes-gate-check.test.ts +20 -4
  84. package/src/__tests__/passes-gate.test.ts +5 -99
  85. package/src/__tests__/performance-gate.test.ts +3 -11
  86. package/src/__tests__/public-exports.test.ts +46 -16
  87. package/src/__tests__/trace-analyzer.test.ts +52 -2
  88. package/src/cli/commands/CONTEXT.md +3 -2
  89. package/src/cli/commands/__tests__/passes-gate-dead-options.test.ts +70 -0
  90. package/src/cli/commands/__tests__/passes-gate.test.ts +7 -3
  91. package/src/cli/commands/__tests__/performance.test.ts +5 -16
  92. package/src/cli/commands/__tests__/registry.test.ts +46 -3
  93. package/src/cli/commands/__tests__/report-extra.test.ts +0 -19
  94. package/src/cli/commands/__tests__/report-false-green.test.ts +46 -0
  95. package/src/cli/commands/__tests__/report.test.ts +0 -20
  96. package/src/cli/commands/__tests__/status-analysis-wiring.test.ts +68 -0
  97. package/src/cli/commands/__tests__/status-extra.test.ts +63 -116
  98. package/src/cli/commands/__tests__/status.test.ts +66 -148
  99. package/src/cli/commands/definitions.ts +1 -32
  100. package/src/cli/commands/passes-gate.ts +0 -3
  101. package/src/cli/commands/performance.ts +13 -27
  102. package/src/cli/commands/report.ts +3 -61
  103. package/src/cli/commands/status.ts +5 -10
  104. package/src/context/CONTEXT.md +2 -3
  105. package/src/context/__tests__/token-budget.test.ts +1 -81
  106. package/src/context/index.ts +2 -7
  107. package/src/context/token-budget.ts +0 -73
  108. package/src/context/types.ts +0 -9
  109. package/src/core/CONTEXT.md +5 -6
  110. package/src/core/constraints/__tests__/collect-constraints.test.ts +66 -0
  111. package/src/core/constraints/checker.ts +33 -2
  112. package/src/core/constraints/git-evidence.ts +6 -3
  113. package/src/core/index.ts +0 -11
  114. package/src/core/spec/__tests__/validator.test.ts +24 -0
  115. package/src/core/spec/validator.ts +9 -10
  116. package/src/core/validators/__tests__/passes-gate.test.ts +2 -9
  117. package/src/core/validators/index.ts +0 -1
  118. package/src/core/validators/passes-gate.ts +1 -149
  119. package/src/failure/CONTEXT.md +8 -6
  120. package/src/failure/index.ts +0 -10
  121. package/src/gates/CONTEXT.md +3 -2
  122. package/src/gates/__tests__/performance.test.ts +6 -74
  123. package/src/gates/definitions.ts +0 -4
  124. package/src/gates/performance.ts +9 -111
  125. package/src/gates/types.ts +2 -8
  126. package/src/index.ts +1 -36
  127. package/src/knowledge/CONTEXT.md +1 -2
  128. package/src/knowledge/index.ts +0 -1
  129. package/src/monitoring/CONTEXT.md +2 -2
  130. package/src/monitoring/trace-analyzer.ts +160 -126
  131. package/src/types/passes-gate.ts +0 -26
  132. package/src/utils/__tests__/jsonl-skip-disposition.test.ts +0 -1
  133. package/dist/cli/commands/analyze-sessions.d.ts +0 -20
  134. package/dist/cli/commands/analyze-sessions.d.ts.map +0 -1
  135. package/dist/cli/commands/analyze-sessions.js +0 -290
  136. package/dist/cli/commands/analyze-sessions.js.map +0 -1
  137. package/dist/cli/commands/update-user-model.d.ts +0 -30
  138. package/dist/cli/commands/update-user-model.d.ts.map +0 -1
  139. package/dist/cli/commands/update-user-model.js +0 -406
  140. package/dist/cli/commands/update-user-model.js.map +0 -1
  141. package/dist/cli/session-mining/corrections.d.ts +0 -17
  142. package/dist/cli/session-mining/corrections.d.ts.map +0 -1
  143. package/dist/cli/session-mining/corrections.js +0 -58
  144. package/dist/cli/session-mining/corrections.js.map +0 -1
  145. package/dist/cli/session-mining/index.d.ts +0 -13
  146. package/dist/cli/session-mining/index.d.ts.map +0 -1
  147. package/dist/cli/session-mining/index.js +0 -29
  148. package/dist/cli/session-mining/index.js.map +0 -1
  149. package/dist/cli/session-mining/text.d.ts +0 -31
  150. package/dist/cli/session-mining/text.d.ts.map +0 -1
  151. package/dist/cli/session-mining/text.js +0 -126
  152. package/dist/cli/session-mining/text.js.map +0 -1
  153. package/dist/cli/session-mining/transcript.d.ts +0 -34
  154. package/dist/cli/session-mining/transcript.d.ts.map +0 -1
  155. package/dist/cli/session-mining/transcript.js +0 -130
  156. package/dist/cli/session-mining/transcript.js.map +0 -1
  157. package/dist/context/compaction.d.ts +0 -57
  158. package/dist/context/compaction.d.ts.map +0 -1
  159. package/dist/context/compaction.js +0 -165
  160. package/dist/context/compaction.js.map +0 -1
  161. package/dist/core/session/clean-state.d.ts +0 -17
  162. package/dist/core/session/clean-state.d.ts.map +0 -1
  163. package/dist/core/session/clean-state.js +0 -192
  164. package/dist/core/session/clean-state.js.map +0 -1
  165. package/dist/core/session/index.d.ts +0 -6
  166. package/dist/core/session/index.d.ts.map +0 -1
  167. package/dist/core/session/index.js +0 -15
  168. package/dist/core/session/index.js.map +0 -1
  169. package/dist/core/session/startup.d.ts +0 -47
  170. package/dist/core/session/startup.d.ts.map +0 -1
  171. package/dist/core/session/startup.js +0 -263
  172. package/dist/core/session/startup.js.map +0 -1
  173. package/dist/failure/constraint-handler.d.ts +0 -83
  174. package/dist/failure/constraint-handler.d.ts.map +0 -1
  175. package/dist/failure/constraint-handler.js +0 -138
  176. package/dist/failure/constraint-handler.js.map +0 -1
  177. package/dist/knowledge/lifecycle-hooks.d.ts +0 -62
  178. package/dist/knowledge/lifecycle-hooks.d.ts.map +0 -1
  179. package/dist/knowledge/lifecycle-hooks.js +0 -143
  180. package/dist/knowledge/lifecycle-hooks.js.map +0 -1
  181. package/dist/types/session.d.ts +0 -113
  182. package/dist/types/session.d.ts.map +0 -1
  183. package/dist/types/session.js +0 -6
  184. package/dist/types/session.js.map +0 -1
  185. package/src/__tests__/clean-state-extra.test.ts +0 -301
  186. package/src/__tests__/clean-state.test.ts +0 -169
  187. package/src/__tests__/constraint-handler.test.ts +0 -132
  188. package/src/__tests__/passes-gate-extra.test.ts +0 -93
  189. package/src/__tests__/session-startup.test.ts +0 -334
  190. package/src/cli/commands/__tests__/analyze-sessions.test.ts +0 -184
  191. package/src/cli/commands/__tests__/update-user-model.test.ts +0 -268
  192. package/src/cli/commands/analyze-sessions.ts +0 -335
  193. package/src/cli/commands/update-user-model.ts +0 -476
  194. package/src/cli/session-mining/__tests__/transcript.test.ts +0 -118
  195. package/src/cli/session-mining/corrections.ts +0 -56
  196. package/src/cli/session-mining/index.ts +0 -13
  197. package/src/cli/session-mining/text.ts +0 -117
  198. package/src/cli/session-mining/transcript.ts +0 -125
  199. package/src/context/__tests__/compaction.test.ts +0 -169
  200. package/src/context/compaction.ts +0 -201
  201. package/src/core/session/__tests__/startup.test.ts +0 -281
  202. package/src/core/session/clean-state.ts +0 -178
  203. package/src/core/session/index.ts +0 -15
  204. package/src/core/session/startup.ts +0 -253
  205. package/src/failure/constraint-handler.ts +0 -171
  206. package/src/knowledge/__tests__/lifecycle-hooks.test.ts +0 -140
  207. package/src/knowledge/lifecycle-hooks.ts +0 -202
  208. package/src/types/session.ts +0 -132
@@ -1,126 +0,0 @@
1
- "use strict";
2
- /**
3
- * 分词 / 停用词 / 相似度 / 文本清洗(工单 19-C)
4
- *
5
- * 合并 analyze-sessions 与 update-user-model 的重复实现。
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.STOP_WORDS = void 0;
9
- exports.tokenize = tokenize;
10
- exports.jaccardSimilarity = jaccardSimilarity;
11
- exports.jaccardChinese = jaccardChinese;
12
- exports.stripCodeBlocks = stripCodeBlocks;
13
- exports.isPunctuation = isPunctuation;
14
- exports.hasSemanticContent = hasSemanticContent;
15
- exports.isCodeNoise = isCodeNoise;
16
- /** N-gram 停用词表(中英) */
17
- exports.STOP_WORDS = new Set([
18
- '的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一',
19
- '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会', '着',
20
- '没有', '看', '好', '自己', '这', '他', '她', '它', '们', '那',
21
- 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
22
- 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
23
- 'should', 'may', 'might', 'can', 'shall', 'to', 'of', 'in', 'for',
24
- 'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through', 'during',
25
- 'before', 'after', 'above', 'below', 'between', 'under', 'again',
26
- 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why',
27
- 'how', 'all', 'both', 'each', 'few', 'more', 'most', 'other', 'some',
28
- 'such', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 'just',
29
- '因为', '所以', '但是', '而且', '如果', '虽然', '可以', '这个', '那个',
30
- '什么', '怎么', '哪', '吗', '吧', '呢', '啊', '嗯', '哦',
31
- ]);
32
- const CN_CHAR = /[\u4e00-\u9fff\u3400-\u4dbf]/;
33
- /**
34
- * 中英文混合分词:中文产出 bigram/trigram(短序列保留整体),
35
- * 连续的拉丁/数字/路径字符作为整体 token。
36
- */
37
- function tokenize(text) {
38
- const tokens = [];
39
- let current = '';
40
- for (const char of text) {
41
- if (CN_CHAR.test(char)) {
42
- current += char;
43
- }
44
- else if (/[a-zA-Z0-9_\-/.]/.test(char)) {
45
- current += char;
46
- }
47
- else {
48
- pushToken(current, tokens);
49
- current = '';
50
- }
51
- }
52
- pushToken(current, tokens);
53
- return tokens;
54
- }
55
- function pushToken(current, tokens) {
56
- if (current.length < 2)
57
- return;
58
- if (CN_CHAR.test(current)) {
59
- for (let i = 0; i <= current.length - 2; i++) {
60
- tokens.push(current.slice(i, i + 2));
61
- }
62
- for (let i = 0; i <= current.length - 3; i++) {
63
- tokens.push(current.slice(i, i + 3));
64
- }
65
- if (current.length <= 6)
66
- tokens.push(current);
67
- }
68
- else {
69
- tokens.push(current);
70
- }
71
- }
72
- /**
73
- * 基于 tokenize 的 Jaccard 相似度
74
- */
75
- function jaccardSimilarity(a, b) {
76
- const setA = new Set(tokenize(a));
77
- const setB = new Set(tokenize(b));
78
- const intersection = new Set([...setA].filter(x => setB.has(x)));
79
- const union = new Set([...setA, ...setB]);
80
- return union.size === 0 ? 0 : intersection.size / union.size;
81
- }
82
- /**
83
- * 仅取汉字字符集的 Jaccard 相似度(概念聚类用)
84
- */
85
- function jaccardChinese(a, b) {
86
- const charsA = new Set(a.split('').filter(c => /[\u4e00-\u9fff]/.test(c)));
87
- const charsB = new Set(b.split('').filter(c => /[\u4e00-\u9fff]/.test(c)));
88
- if (charsA.size === 0 || charsB.size === 0)
89
- return 0;
90
- const intersection = new Set([...charsA].filter(x => charsB.has(x)));
91
- const union = new Set([...charsA, ...charsB]);
92
- return intersection.size / union.size;
93
- }
94
- /**
95
- * 剥离代码块 / 行内代码 / JSON 片段,保留自然语言
96
- */
97
- function stripCodeBlocks(text) {
98
- return text
99
- .replace(/```[\s\S]*?```/g, '')
100
- .replace(/`[^`]+`/g, '')
101
- .replace(/\{[^{}]*"[^"]+"\s*:\s*"[^"]*"[^}]*\}/g, '')
102
- .replace(/\[[\s\S]*?\]/g, '')
103
- .replace(/\\n/g, ' ')
104
- .replace(/[{}[\]"':,\\]+/g, ' ');
105
- }
106
- /** 是否纯标点/空白 */
107
- function isPunctuation(str) {
108
- return /^[,。!?、;:""''()[\]【】「」『』《》〈〉\s]+$/.test(str);
109
- }
110
- /** 是否含语义内容(汉字,或 ≥7 字符的合法英文标识词) */
111
- function hasSemanticContent(phrase) {
112
- if (/[\u4e00-\u9fff]/.test(phrase))
113
- return true;
114
- if (phrase.length >= 7 && /^[a-zA-Z][a-zA-Z0-9_]*[a-zA-Z]$/.test(phrase))
115
- return true;
116
- return false;
117
- }
118
- /** 是否代码噪声(短拉丁片段 / 常见 JSON 字段名碎片) */
119
- function isCodeNoise(phrase) {
120
- if (!/[\u4e00-\u9fff]/.test(phrase) && phrase.length <= 6)
121
- return true;
122
- if (/^(?:clla|cood|odde|oppe|laaw|peen|enne|ennc|ddec|deco|ecod|code|type|role|name|text|file|path|tool|user|session)$/i.test(phrase))
123
- return true;
124
- return false;
125
- }
126
- //# sourceMappingURL=text.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/cli/session-mining/text.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- /**
2
- * Claude Code transcript(.jsonl)读取(工单 19-C)
3
- *
4
- * 原 analyze-sessions.findSessions 与 update-user-model.findNewSessions
5
- * 各持一份解析逻辑,收敛于此。
6
- */
7
- export interface MinedTurn {
8
- role: string;
9
- content: string;
10
- }
11
- export interface MinedSession {
12
- /** 会话 ID(文件名去掉 .jsonl,截断至 40 字符) */
13
- id: string;
14
- /** 文件修改日期(YYYY-MM-DD) */
15
- date: string;
16
- /** 修改时间戳(毫秒) */
17
- mtimeMs: number;
18
- turns: MinedTurn[];
19
- /** 出现过的工具调用名(去重,保持出现顺序) */
20
- toolCalls: string[];
21
- }
22
- /**
23
- * 扫描目录下的 .jsonl transcript 文件
24
- *
25
- * 不可读/损坏的行静默跳过(与原实现一致)。
26
- */
27
- export interface TranscriptFilter {
28
- /** 只读 mtimeMs >= since 的文件(stat 级过滤,命中即不 parse);缺省不过滤 */
29
- since?: number;
30
- /** 按会话 ID(文件名去 .jsonl、截断 40 字符)排除(文件名级过滤,不 stat 不 parse);缺省不排除 */
31
- excludeIds?: string[];
32
- }
33
- export declare function readTranscriptSessions(dir: string, filter?: TranscriptFilter): MinedSession[];
34
- //# sourceMappingURL=transcript.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../src/cli/session-mining/transcript.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAaD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,gBAAqB,GAAG,YAAY,EAAE,CAyEjG"}
@@ -1,130 +0,0 @@
1
- "use strict";
2
- /**
3
- * Claude Code transcript(.jsonl)读取(工单 19-C)
4
- *
5
- * 原 analyze-sessions.findSessions 与 update-user-model.findNewSessions
6
- * 各持一份解析逻辑,收敛于此。
7
- */
8
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
- if (k2 === undefined) k2 = k;
10
- var desc = Object.getOwnPropertyDescriptor(m, k);
11
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
- desc = { enumerable: true, get: function() { return m[k]; } };
13
- }
14
- Object.defineProperty(o, k2, desc);
15
- }) : (function(o, m, k, k2) {
16
- if (k2 === undefined) k2 = k;
17
- o[k2] = m[k];
18
- }));
19
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
- Object.defineProperty(o, "default", { enumerable: true, value: v });
21
- }) : function(o, v) {
22
- o["default"] = v;
23
- });
24
- var __importStar = (this && this.__importStar) || (function () {
25
- var ownKeys = function(o) {
26
- ownKeys = Object.getOwnPropertyNames || function (o) {
27
- var ar = [];
28
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
- return ar;
30
- };
31
- return ownKeys(o);
32
- };
33
- return function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
- })();
41
- Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.readTranscriptSessions = readTranscriptSessions;
43
- const fs = __importStar(require("fs"));
44
- const path = __importStar(require("path"));
45
- const jsonl_1 = require("../../utils/jsonl");
46
- function extractText(content) {
47
- if (typeof content === 'string')
48
- return content;
49
- if (Array.isArray(content)) {
50
- return content
51
- .filter((b) => b.type === 'text')
52
- .map((b) => b.text)
53
- .join(' ');
54
- }
55
- return '';
56
- }
57
- function readTranscriptSessions(dir, filter = {}) {
58
- const sessions = [];
59
- const exclude = filter.excludeIds && filter.excludeIds.length > 0
60
- ? new Set(filter.excludeIds)
61
- : undefined;
62
- let files;
63
- try {
64
- files = fs.readdirSync(dir);
65
- }
66
- catch {
67
- return sessions;
68
- }
69
- for (const file of files) {
70
- if (!file.endsWith('.jsonl'))
71
- continue;
72
- const id = file.replace('.jsonl', '').slice(0, 40);
73
- if (exclude?.has(id))
74
- continue;
75
- const filePath = path.join(dir, file);
76
- let stat;
77
- try {
78
- stat = fs.statSync(filePath);
79
- }
80
- catch {
81
- continue;
82
- }
83
- if (filter.since !== undefined && stat.mtimeMs < filter.since)
84
- continue;
85
- const turns = [];
86
- const toolCalls = [];
87
- let records;
88
- try {
89
- // 损坏行静默跳过(坏行策略 skip,与原实现一致,harness#82 走 jsonl 正本);
90
- // 外层 catch 兜文件不可读,沿用原「跳过该文件」语义
91
- // 计数去向:豁免(harness#100)——读的是外部 Claude Code transcript(非 harness 写入面)。
92
- // 影响方向如实:坏行使该会话少几条 turn,而 analyze-sessions 的候选按次数阈值筛
93
- // (frequency>=4 / 跨会话>=2 / confidence=len/10)→ 只会少出候选,不会造出候选,且候选须人审;
94
- // 告知需改 MinedSession 形状并波及 analyze-sessions/update-user-model 两个调用方,另票收口
95
- records = (0, jsonl_1.readJsonl)(filePath, 'skip').records;
96
- }
97
- catch {
98
- continue;
99
- }
100
- for (const entry of records) {
101
- try {
102
- const msg = entry.message;
103
- if (msg?.role && (msg.content || entry.type === 'user')) {
104
- turns.push({ role: msg.role, content: extractText(msg.content) });
105
- }
106
- if (msg?.role === 'assistant' && Array.isArray(msg.content)) {
107
- for (const block of msg.content) {
108
- if (block.type === 'tool_use' && block.name) {
109
- toolCalls.push(block.name);
110
- }
111
- }
112
- }
113
- }
114
- catch {
115
- // 单条记录提取异常跳过(原逐行 catch 语义:parse 已由 module skip,此处兜提取)
116
- }
117
- }
118
- if (turns.length > 0) {
119
- sessions.push({
120
- id,
121
- date: stat.mtime.toISOString().slice(0, 10),
122
- mtimeMs: stat.mtimeMs,
123
- turns,
124
- toolCalls: [...new Set(toolCalls)],
125
- });
126
- }
127
- }
128
- return sessions;
129
- }
130
- //# sourceMappingURL=transcript.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../src/cli/session-mining/transcript.ts"],"names":[],"mappings":"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"}
@@ -1,57 +0,0 @@
1
- /**
2
- * 会话压缩
3
- *
4
- * 三档策略:eviction / summary / checkpoint
5
- * 不调用 LLM,零 token 成本
6
- */
7
- import type { CompactionConfig, CompactionLevel, SessionMessage } from './types';
8
- export interface CompactionResult {
9
- compacted: SessionMessage[];
10
- summary?: string;
11
- level: CompactionLevel;
12
- originalTokens: number;
13
- compactedTokens: number;
14
- }
15
- export declare class SessionCompaction {
16
- private config;
17
- constructor(config?: Partial<CompactionConfig>);
18
- /**
19
- * 检查是否需要压缩
20
- */
21
- shouldCompact(messages: SessionMessage[], budget: number): boolean;
22
- /**
23
- * 执行压缩
24
- */
25
- compact(messages: SessionMessage[], budget: number): CompactionResult;
26
- /**
27
- * 轻量压缩:按比例丢最早消息,保留 tool-call 边界对
28
- */
29
- private evictionCompact;
30
- /**
31
- * 中等压缩:结构化总结 + 保留最近 N 轮
32
- */
33
- private summaryCompact;
34
- /**
35
- * 重型压缩:checkpoint + 清空历史
36
- */
37
- private checkpointCompact;
38
- /**
39
- * 生成结构化摘要(零 LLM 成本)
40
- */
41
- generateStructuredSummary(messages: SessionMessage[]): string;
42
- /**
43
- * 保留 tool-call 边界对
44
- *
45
- * 如果 tool 结果被保留,对应的 tool 调用也要保留
46
- */
47
- private preserveToolCallPairs;
48
- /**
49
- * 估算消息的 token 数
50
- */
51
- private estimateMessages;
52
- /**
53
- * 获取配置
54
- */
55
- getConfig(): CompactionConfig;
56
- }
57
- //# sourceMappingURL=compaction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/context/compaction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGjF,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,eAAe,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAI9C;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAKlE;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAerE;;OAEG;IACH,OAAO,CAAC,eAAe;IAyBvB;;OAEG;IACH,OAAO,CAAC,cAAc;IA2BtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,yBAAyB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM;IA4B7D;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,SAAS,IAAI,gBAAgB;CAG9B"}
@@ -1,165 +0,0 @@
1
- "use strict";
2
- /**
3
- * 会话压缩
4
- *
5
- * 三档策略:eviction / summary / checkpoint
6
- * 不调用 LLM,零 token 成本
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.SessionCompaction = void 0;
10
- const token_budget_1 = require("./token-budget");
11
- const types_1 = require("./types");
12
- class SessionCompaction {
13
- config;
14
- constructor(config) {
15
- this.config = { ...types_1.DEFAULT_COMPACTION_CONFIG, ...config };
16
- }
17
- /**
18
- * 检查是否需要压缩
19
- */
20
- shouldCompact(messages, budget) {
21
- const totalTokens = this.estimateMessages(messages);
22
- return totalTokens / budget > this.config.triggerRatio;
23
- }
24
- /**
25
- * 执行压缩
26
- */
27
- compact(messages, budget) {
28
- const originalTokens = this.estimateMessages(messages);
29
- switch (this.config.level) {
30
- case 'eviction':
31
- return this.evictionCompact(messages, budget, originalTokens);
32
- case 'summary':
33
- return this.summaryCompact(messages, budget, originalTokens);
34
- case 'checkpoint':
35
- return this.checkpointCompact(messages, budget, originalTokens);
36
- default:
37
- return this.evictionCompact(messages, budget, originalTokens);
38
- }
39
- }
40
- /**
41
- * 轻量压缩:按比例丢最早消息,保留 tool-call 边界对
42
- */
43
- evictionCompact(messages, budget, originalTokens) {
44
- const targetTokens = Math.floor(budget * 0.6); // 目标压缩到 60%
45
- const keepRatio = targetTokens / originalTokens;
46
- // 至少保留最近 2 条
47
- const minKeep = Math.min(2, messages.length);
48
- const keepCount = Math.max(minKeep, Math.floor(messages.length * keepRatio));
49
- let compacted = messages.slice(-keepCount);
50
- // 保留 tool-call 边界对
51
- if (this.config.preserveToolCallPairs) {
52
- compacted = this.preserveToolCallPairs(messages, compacted);
53
- }
54
- const compactedTokens = this.estimateMessages(compacted);
55
- return {
56
- compacted,
57
- level: 'eviction',
58
- originalTokens,
59
- compactedTokens,
60
- };
61
- }
62
- /**
63
- * 中等压缩:结构化总结 + 保留最近 N 轮
64
- */
65
- summaryCompact(messages, _budget, originalTokens) {
66
- const recentCount = Math.min(6, messages.length); // 保留最近 6 条
67
- const recent = messages.slice(-recentCount);
68
- const older = messages.slice(0, -recentCount);
69
- // 生成结构化摘要
70
- const summary = this.generateStructuredSummary(older);
71
- // 摘要作为系统消息插入
72
- const summarySessionMessage = {
73
- role: 'assistant',
74
- content: `[会话摘要]\n${summary}`,
75
- timestamp: new Date().toISOString(),
76
- };
77
- const compacted = [summarySessionMessage, ...recent];
78
- const compactedTokens = this.estimateMessages(compacted);
79
- return {
80
- compacted,
81
- summary,
82
- level: 'summary',
83
- originalTokens,
84
- compactedTokens,
85
- };
86
- }
87
- /**
88
- * 重型压缩:checkpoint + 清空历史
89
- */
90
- checkpointCompact(messages, _budget, originalTokens) {
91
- const summary = this.generateStructuredSummary(messages);
92
- const checkpointSessionMessage = {
93
- role: 'assistant',
94
- content: `[Checkpoint]\n${summary}\n\n[历史已压缩,共 ${messages.length} 条消息]`,
95
- timestamp: new Date().toISOString(),
96
- };
97
- const compacted = [checkpointSessionMessage];
98
- const compactedTokens = this.estimateMessages(compacted);
99
- return {
100
- compacted,
101
- summary,
102
- level: 'checkpoint',
103
- originalTokens,
104
- compactedTokens,
105
- };
106
- }
107
- /**
108
- * 生成结构化摘要(零 LLM 成本)
109
- */
110
- generateStructuredSummary(messages) {
111
- const sections = [];
112
- // 提取用户目标
113
- const userSessionMessages = messages.filter(m => m.role === 'user');
114
- if (userSessionMessages.length > 0) {
115
- sections.push(`用户目标: ${userSessionMessages[0].content.slice(0, 200)}`);
116
- }
117
- // 提取工具调用
118
- const toolCalls = messages.filter(m => m.role === 'tool');
119
- if (toolCalls.length > 0) {
120
- sections.push(`工具调用: ${toolCalls.length} 次`);
121
- }
122
- // 提取关键信息
123
- const assistantSessionMessages = messages.filter(m => m.role === 'assistant');
124
- if (assistantSessionMessages.length > 0) {
125
- const lastAssistant = assistantSessionMessages[assistantSessionMessages.length - 1];
126
- sections.push(`最近响应: ${lastAssistant.content.slice(0, 200)}`);
127
- }
128
- sections.push(`消息总数: ${messages.length}`);
129
- sections.push(`时间范围: ${messages[0]?.timestamp || 'N/A'} → ${messages[messages.length - 1]?.timestamp || 'N/A'}`);
130
- return sections.join('\n');
131
- }
132
- /**
133
- * 保留 tool-call 边界对
134
- *
135
- * 如果 tool 结果被保留,对应的 tool 调用也要保留
136
- */
137
- preserveToolCallPairs(all, compacted) {
138
- const result = [];
139
- for (const msg of compacted) {
140
- // 如果是 tool 结果,确保对应的 tool 调用也在
141
- if (msg.role === 'tool' && msg.toolCallId) {
142
- const paired = all.find(m => m.toolCallId === msg.toolCallId && m.role === 'assistant');
143
- if (paired && !compacted.some(m => m === paired)) {
144
- result.push(paired);
145
- }
146
- }
147
- result.push(msg);
148
- }
149
- return result;
150
- }
151
- /**
152
- * 估算消息的 token 数
153
- */
154
- estimateMessages(messages) {
155
- return messages.reduce((sum, m) => sum + token_budget_1.TokenEstimator.estimateText(m.content), 0);
156
- }
157
- /**
158
- * 获取配置
159
- */
160
- getConfig() {
161
- return { ...this.config };
162
- }
163
- }
164
- exports.SessionCompaction = SessionCompaction;
165
- //# sourceMappingURL=compaction.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/context/compaction.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * CleanStateManager - Session 结束状态管理
3
- *
4
- * 确保 Agent 结束时必须"打扫干净",不留烂代码。
5
- */
6
- import type { CleanStateConfig, CleanStateResult, SessionInfo } from '../../types/session';
7
- export declare class CleanStateManager {
8
- private config;
9
- constructor(config?: Partial<CleanStateConfig>);
10
- onSessionEnd(workDir: string, sessionInfo: SessionInfo): Promise<CleanStateResult>;
11
- private hasUncommittedChanges;
12
- private autoCommit;
13
- private detectBugs;
14
- private updateProgress;
15
- }
16
- export declare const createCleanStateManager: (config?: Partial<CleanStateConfig>) => CleanStateManager;
17
- //# sourceMappingURL=clean-state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clean-state.d.ts","sourceRoot":"","sources":["../../../src/core/session/clean-state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEhB,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAkB7B,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAA6B;gBAE/B,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAI5C,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAqC1E,qBAAqB;YASrB,UAAU;YAsBV,UAAU;YAmCV,cAAc;CA8B7B;AAED,eAAO,MAAM,uBAAuB,GAAI,SAAS,OAAO,CAAC,gBAAgB,CAAC,sBAC3C,CAAC"}