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,48 @@
1
+ import { BaseStrategy } from '../base-strategy.js';
2
+ import { createUnifiedDiff } from '../../../utils/diff.js';
3
+ /**
4
+ * Prune Noise 策略
5
+ * 删除被忽略的冗余说明
6
+ */
7
+ export class PruneNoiseStrategy extends BaseStrategy {
8
+ constructor() {
9
+ super('prune-noise', 'Remove redundant or ignored instructions', 'prune_noise');
10
+ }
11
+ generate(currentContent, context) {
12
+ try {
13
+ const section = context.section;
14
+ if (!section) {
15
+ return this.createFailureResult('Section not provided');
16
+ }
17
+ // 查找要删除的 section
18
+ const lines = currentContent.split('\n');
19
+ const sectionIndex = lines.findIndex((line) => line.toLowerCase().includes(section.toLowerCase()));
20
+ if (sectionIndex === -1) {
21
+ return this.createFailureResult(`Section "${section}" not found`);
22
+ }
23
+ // 找到 section 的结束位置
24
+ let endIndex = sectionIndex + 1;
25
+ const sectionLevel = lines[sectionIndex]?.match(/^(#{1,6})/)?.[1]?.length ?? 0;
26
+ while (endIndex < lines.length) {
27
+ const line = lines[endIndex];
28
+ const match = line?.match(/^(#{1,6})\s/);
29
+ if (match && match[1].length <= sectionLevel) {
30
+ break;
31
+ }
32
+ endIndex++;
33
+ }
34
+ // 删除 section
35
+ const newLines = [
36
+ ...lines.slice(0, sectionIndex),
37
+ ...lines.slice(endIndex),
38
+ ];
39
+ const newContent = newLines.join('\n');
40
+ const patch = createUnifiedDiff('skill.md', currentContent, newContent);
41
+ return this.createSuccessResult(patch, newContent);
42
+ }
43
+ catch (error) {
44
+ return this.createFailureResult(`Failed to generate patch: ${error}`);
45
+ }
46
+ }
47
+ }
48
+ //# sourceMappingURL=prune-noise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune-noise.js","sourceRoot":"","sources":["../../../../src/core/patch-generator/strategies/prune-noise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAClD;QACE,KAAK,CACH,aAAa,EACb,0CAA0C,EAC1C,aAAa,CACd,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,cAAsB,EAAE,OAAgC;QAC/D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAiB,CAAC;YAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;YAC1D,CAAC;YAED,iBAAiB;YACjB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5C,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CACnD,CAAC;YAEF,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,YAAY,OAAO,aAAa,CAAC,CAAC;YACpE,CAAC;YAED,mBAAmB;YACnB,IAAI,QAAQ,GAAG,YAAY,GAAG,CAAC,CAAC;YAChC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;YAE/E,OAAO,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;gBAEzC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;oBAC7C,MAAM;gBACR,CAAC;gBAED,QAAQ,EAAE,CAAC;YACb,CAAC;YAED,aAAa;YACb,MAAM,QAAQ,GAAG;gBACf,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC;gBAC/B,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;aACzB,CAAC;YAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;YAExE,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,mBAAmB,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,65 @@
1
+ import type { Trace, EvaluationResult } from '../../types/index.js';
2
+ /**
3
+ * Shadow Manager
4
+ * 负责编排整个演化流程
5
+ */
6
+ export declare class ShadowManager {
7
+ private shadowRegistry;
8
+ private journalManager;
9
+ private traceManager;
10
+ private policy;
11
+ private lastPatchTime;
12
+ private patchCountToday;
13
+ constructor(projectRoot: string);
14
+ /**
15
+ * 初始化
16
+ */
17
+ init(): Promise<void>;
18
+ /**
19
+ * 处理 trace
20
+ */
21
+ processTrace(trace: Trace): Promise<void>;
22
+ /**
23
+ * 查找 trace 对应的 shadow
24
+ */
25
+ private findShadowForTrace;
26
+ /**
27
+ * 处理评估结果
28
+ */
29
+ private handleEvaluation;
30
+ /**
31
+ * 执行 patch
32
+ */
33
+ private executePatch;
34
+ /**
35
+ * 检查是否在冷却期
36
+ */
37
+ private isInCooldown;
38
+ /**
39
+ * 检查是否超过每日限制
40
+ */
41
+ private exceedsDailyLimit;
42
+ /**
43
+ * 手动触发优化
44
+ */
45
+ triggerOptimize(shadowId: string): Promise<EvaluationResult | null>;
46
+ /**
47
+ * 获取 shadow 状态
48
+ */
49
+ getShadowState(shadowId: string): Promise<{
50
+ shadow: import("../../types/index.js").ProjectSkillShadow;
51
+ latest_revision: number;
52
+ snapshot_count: number;
53
+ last_patch_time: number | undefined;
54
+ } | null>;
55
+ /**
56
+ * 清理旧 traces
57
+ */
58
+ cleanupOldTraces(retentionDays: number): Promise<number>;
59
+ /**
60
+ * 关闭
61
+ */
62
+ close(): void;
63
+ }
64
+ export declare function createShadowManager(projectRoot: string): ShadowManager;
65
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/shadow-manager/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAsB,MAAM,sBAAsB,CAAC;AAIxF;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,eAAe,CAAkC;gBAE7C,WAAW,EAAE,MAAM;IAgB/B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/C;;OAEG;YACW,kBAAkB;IAMhC;;OAEG;YACW,gBAAgB;IAkC9B;;OAEG;YACW,YAAY;IAuE1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAczE;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM;;;;;;IAmBrC;;OAEG;IACG,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI9D;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd;AAGD,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAEtE"}
@@ -0,0 +1,229 @@
1
+ import { createChildLogger } from '../../utils/logger.js';
2
+ import { configManager } from '../../config/index.js';
3
+ import { createShadowRegistry } from '../shadow-registry/index.js';
4
+ import { createJournalManager } from '../journal/index.js';
5
+ import { createTraceManager } from '../observer/trace-manager.js';
6
+ import { evaluator } from '../evaluator/index.js';
7
+ import { patchGenerator } from '../patch-generator/index.js';
8
+ import { hashString } from '../../utils/hash.js';
9
+ const logger = createChildLogger('shadow-manager');
10
+ /**
11
+ * Shadow Manager
12
+ * 负责编排整个演化流程
13
+ */
14
+ export class ShadowManager {
15
+ shadowRegistry;
16
+ journalManager;
17
+ traceManager;
18
+ policy;
19
+ lastPatchTime = new Map();
20
+ patchCountToday = new Map();
21
+ constructor(projectRoot) {
22
+ this.shadowRegistry = createShadowRegistry(projectRoot);
23
+ this.journalManager = createJournalManager(projectRoot);
24
+ this.traceManager = createTraceManager(projectRoot);
25
+ const patchConfig = configManager.getPatchConfig();
26
+ this.policy = {
27
+ min_signal_count: configManager.getEvaluatorConfig().min_signal_count,
28
+ min_source_sessions: configManager.getEvaluatorConfig().min_source_sessions,
29
+ min_confidence: configManager.getEvaluatorConfig().min_confidence,
30
+ cooldown_hours: patchConfig.cooldown_hours,
31
+ max_patches_per_day: patchConfig.max_patches_per_day,
32
+ pause_after_rollback_hours: 48,
33
+ };
34
+ }
35
+ /**
36
+ * 初始化
37
+ */
38
+ async init() {
39
+ await this.shadowRegistry.init();
40
+ await this.journalManager.init();
41
+ await this.traceManager.init();
42
+ logger.info('Shadow manager initialized');
43
+ }
44
+ /**
45
+ * 处理 trace
46
+ */
47
+ async processTrace(trace) {
48
+ // 记录 trace
49
+ this.traceManager.recordTrace(trace);
50
+ // 检查是否需要触发评估
51
+ const shadowId = await this.findShadowForTrace(trace);
52
+ if (!shadowId) {
53
+ return;
54
+ }
55
+ // 获取最近的 traces
56
+ const recentTraces = await this.traceManager.getSessionTraces(trace.session_id);
57
+ // 评估是否需要优化
58
+ const evaluation = evaluator.evaluate(recentTraces);
59
+ if (evaluation && evaluation.should_patch) {
60
+ await this.handleEvaluation(shadowId, evaluation, recentTraces);
61
+ }
62
+ }
63
+ /**
64
+ * 查找 trace 对应的 shadow
65
+ */
66
+ async findShadowForTrace(_trace) {
67
+ // 这里需要根据 trace 的内容推断对应的 skill
68
+ // 简化实现:返回 null,实际需要更复杂的逻辑
69
+ return null;
70
+ }
71
+ /**
72
+ * 处理评估结果
73
+ */
74
+ async handleEvaluation(shadowId, evaluation, _traces) {
75
+ // 检查是否在冷却期
76
+ if (this.isInCooldown(shadowId)) {
77
+ logger.debug(`Shadow ${shadowId} is in cooldown, skipping patch`);
78
+ return;
79
+ }
80
+ // 检查是否超过每日限制
81
+ if (this.exceedsDailyLimit(shadowId)) {
82
+ logger.debug(`Shadow ${shadowId} exceeds daily patch limit, skipping`);
83
+ return;
84
+ }
85
+ // 检查是否被冻结
86
+ const shadow = await this.shadowRegistry.get(shadowId.split('@')[0]);
87
+ if (shadow?.status === 'frozen') {
88
+ logger.debug(`Shadow ${shadowId} is frozen, skipping patch`);
89
+ return;
90
+ }
91
+ // 检查置信度
92
+ if (evaluation.confidence < this.policy.min_confidence) {
93
+ logger.debug(`Confidence ${evaluation.confidence} below threshold, skipping patch`);
94
+ return;
95
+ }
96
+ // 执行 patch
97
+ await this.executePatch(shadowId, evaluation);
98
+ }
99
+ /**
100
+ * 执行 patch
101
+ */
102
+ async executePatch(shadowId, evaluation) {
103
+ const skillId = shadowId.split('@')[0];
104
+ try {
105
+ // 读取当前内容
106
+ const currentContent = await this.shadowRegistry.readContent(skillId);
107
+ if (!currentContent) {
108
+ logger.warn(`Cannot read shadow content: ${skillId}`);
109
+ return;
110
+ }
111
+ // 生成 patch
112
+ const context = {
113
+ pattern: evaluation.reason,
114
+ reason: evaluation.reason,
115
+ section: evaluation.target_section,
116
+ };
117
+ const patchResult = patchGenerator.generate(evaluation.change_type, currentContent, context);
118
+ if (!patchResult.success) {
119
+ logger.warn(`Patch generation failed: ${patchResult.error}`);
120
+ return;
121
+ }
122
+ // 获取当前 revision
123
+ const currentRevision = await this.journalManager.getLatestRevision(shadowId);
124
+ // 写入新内容
125
+ await this.shadowRegistry.writeContent(skillId, patchResult.newContent);
126
+ // 记录演化
127
+ await this.journalManager.record(shadowId, {
128
+ shadow_id: shadowId,
129
+ timestamp: new Date().toISOString(),
130
+ reason: evaluation.reason ?? 'Auto optimization',
131
+ source_sessions: evaluation.source_sessions,
132
+ change_type: evaluation.change_type,
133
+ patch: patchResult.patch,
134
+ before_hash: hashString(currentContent),
135
+ after_hash: hashString(patchResult.newContent),
136
+ applied_by: 'auto',
137
+ });
138
+ // 更新时间戳
139
+ this.lastPatchTime.set(shadowId, Date.now());
140
+ // 更新计数
141
+ const today = new Date().toDateString();
142
+ const key = `${shadowId}:${today}`;
143
+ this.patchCountToday.set(key, (this.patchCountToday.get(key) ?? 0) + 1);
144
+ // 检查是否需要创建 snapshot
145
+ if (evaluation.change_type === 'rewrite_section' || (currentRevision + 1) % 5 === 0) {
146
+ await this.journalManager.createSnapshot(shadowId, currentRevision + 1);
147
+ }
148
+ logger.info(`Patch executed successfully`, {
149
+ shadow_id: shadowId,
150
+ change_type: evaluation.change_type,
151
+ revision: currentRevision + 1,
152
+ });
153
+ }
154
+ catch (error) {
155
+ logger.error(`Patch execution failed`, { shadow_id: shadowId, error });
156
+ }
157
+ }
158
+ /**
159
+ * 检查是否在冷却期
160
+ */
161
+ isInCooldown(shadowId) {
162
+ const lastTime = this.lastPatchTime.get(shadowId);
163
+ if (!lastTime) {
164
+ return false;
165
+ }
166
+ const cooldownMs = this.policy.cooldown_hours * 60 * 60 * 1000;
167
+ return Date.now() - lastTime < cooldownMs;
168
+ }
169
+ /**
170
+ * 检查是否超过每日限制
171
+ */
172
+ exceedsDailyLimit(shadowId) {
173
+ const today = new Date().toDateString();
174
+ const key = `${shadowId}:${today}`;
175
+ const count = this.patchCountToday.get(key) ?? 0;
176
+ return count >= this.policy.max_patches_per_day;
177
+ }
178
+ /**
179
+ * 手动触发优化
180
+ */
181
+ async triggerOptimize(shadowId) {
182
+ // 获取最近的 traces
183
+ const traces = await this.traceManager.getRecentTraces(100);
184
+ // 评估
185
+ const evaluation = evaluator.evaluate(traces);
186
+ if (evaluation && evaluation.should_patch) {
187
+ await this.executePatch(shadowId, evaluation);
188
+ }
189
+ return evaluation;
190
+ }
191
+ /**
192
+ * 获取 shadow 状态
193
+ */
194
+ async getShadowState(shadowId) {
195
+ const skillId = shadowId.split('@')[0];
196
+ const shadow = await this.shadowRegistry.get(skillId);
197
+ if (!shadow) {
198
+ return null;
199
+ }
200
+ const latestRevision = await this.journalManager.getLatestRevision(shadowId);
201
+ const snapshots = await this.journalManager.getSnapshots(shadowId);
202
+ return {
203
+ shadow,
204
+ latest_revision: latestRevision,
205
+ snapshot_count: snapshots.length,
206
+ last_patch_time: this.lastPatchTime.get(shadowId),
207
+ };
208
+ }
209
+ /**
210
+ * 清理旧 traces
211
+ */
212
+ async cleanupOldTraces(retentionDays) {
213
+ return this.traceManager.cleanupOldTraces(retentionDays);
214
+ }
215
+ /**
216
+ * 关闭
217
+ */
218
+ close() {
219
+ this.shadowRegistry.close();
220
+ this.journalManager.close();
221
+ this.traceManager.close();
222
+ logger.info('Shadow manager closed');
223
+ }
224
+ }
225
+ // 导出工厂函数
226
+ export function createShadowManager(projectRoot) {
227
+ return new ShadowManager(projectRoot);
228
+ }
229
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/shadow-manager/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { ProjectSkillShadow, ShadowStatus, OriginSkill } from '../../types/index.js';
2
+ /**
3
+ * Shadow Skill 注册表
4
+ * 负责管理项目中的 shadow skills
5
+ */
6
+ export declare class ShadowRegistry {
7
+ private db;
8
+ private projectRoot;
9
+ constructor(projectRoot: string);
10
+ /**
11
+ * 初始化数据库
12
+ */
13
+ init(): Promise<void>;
14
+ /**
15
+ * 获取项目的 shadow skill
16
+ */
17
+ get(skillId: string): Promise<ProjectSkillShadow | null>;
18
+ /**
19
+ * 列出项目的所有 shadow skills
20
+ */
21
+ list(): Promise<ProjectSkillShadow[]>;
22
+ /**
23
+ * 从 origin 创建 shadow
24
+ */
25
+ fork(origin: OriginSkill): Promise<ProjectSkillShadow>;
26
+ /**
27
+ * 检查 shadow 是否存在
28
+ */
29
+ exists(skillId: string): Promise<boolean>;
30
+ /**
31
+ * 更新 shadow 状态
32
+ */
33
+ updateStatus(shadowId: string, status: ShadowStatus): Promise<void>;
34
+ /**
35
+ * 更新 shadow revision
36
+ */
37
+ updateRevision(shadowId: string, revision: number): Promise<void>;
38
+ /**
39
+ * 读取 shadow skill 内容
40
+ */
41
+ readContent(skillId: string): Promise<string | null>;
42
+ /**
43
+ * 写入 shadow skill 内容
44
+ */
45
+ writeContent(skillId: string, content: string): Promise<void>;
46
+ /**
47
+ * 获取 shadow 的 journal
48
+ */
49
+ getJournal(skillId: string): import("../../storage/ndjson.js").JournalStore;
50
+ /**
51
+ * 获取 shadow 的 snapshots 目录
52
+ */
53
+ getSnapshotsDir(skillId: string): string;
54
+ /**
55
+ * 获取项目 ID(使用项目根目录的哈希)
56
+ */
57
+ private getProjectId;
58
+ /**
59
+ * 确保项目 .evo 目录结构存在
60
+ */
61
+ ensureProjectStructure(): Promise<void>;
62
+ /**
63
+ * 关闭数据库连接
64
+ */
65
+ close(): void;
66
+ }
67
+ export declare function createShadowRegistry(projectRoot: string): ShadowRegistry;
68
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/shadow-registry/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAI1F;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAC;IACX,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAM/B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;OAEG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAI9D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAI3C;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA+C5D;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/C;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzE;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAe1D;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnE;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM;IAK1B;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIxC;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB7C;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAGD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAExE"}
@@ -0,0 +1,173 @@
1
+ import { mkdirSync, existsSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { createChildLogger } from '../../utils/logger.js';
4
+ import { getShadowSkillPath, getShadowMetaPath, getShadowJournalPath, getSnapshotsDir } from '../../utils/path.js';
5
+ import { createMarkdownSkill } from '../../storage/markdown.js';
6
+ import { createSQLiteStorage } from '../../storage/sqlite.js';
7
+ import { createJournalStore } from '../../storage/ndjson.js';
8
+ const logger = createChildLogger('shadow-registry');
9
+ /**
10
+ * Shadow Skill 注册表
11
+ * 负责管理项目中的 shadow skills
12
+ */
13
+ export class ShadowRegistry {
14
+ db;
15
+ projectRoot;
16
+ constructor(projectRoot) {
17
+ this.projectRoot = projectRoot;
18
+ const dbPath = join(projectRoot, '.evo', 'state', 'sessions.db');
19
+ this.db = createSQLiteStorage(dbPath);
20
+ }
21
+ /**
22
+ * 初始化数据库
23
+ */
24
+ async init() {
25
+ await this.db.init();
26
+ }
27
+ /**
28
+ * 获取项目的 shadow skill
29
+ */
30
+ async get(skillId) {
31
+ return this.db.getShadowSkill(this.projectRoot, skillId);
32
+ }
33
+ /**
34
+ * 列出项目的所有 shadow skills
35
+ */
36
+ async list() {
37
+ return this.db.listShadowSkills(this.projectRoot);
38
+ }
39
+ /**
40
+ * 从 origin 创建 shadow
41
+ */
42
+ async fork(origin) {
43
+ const shadowId = `${origin.skill_id}@${this.getProjectId()}`;
44
+ const now = new Date().toISOString();
45
+ // 创建 shadow 目录结构
46
+ const shadowDir = join(this.projectRoot, '.evo', 'skills', origin.skill_id);
47
+ const snapshotsDir = join(shadowDir, 'snapshots');
48
+ if (!existsSync(shadowDir)) {
49
+ mkdirSync(shadowDir, { recursive: true });
50
+ }
51
+ if (!existsSync(snapshotsDir)) {
52
+ mkdirSync(snapshotsDir, { recursive: true });
53
+ }
54
+ // 复制 origin 内容到 shadow
55
+ const shadowPath = getShadowSkillPath(this.projectRoot, origin.skill_id);
56
+ const shadowSkill = createMarkdownSkill(shadowPath);
57
+ shadowSkill.copyFromOrigin(origin.origin_path);
58
+ // 创建 meta.json
59
+ const metaPath = getShadowMetaPath(this.projectRoot, origin.skill_id);
60
+ const meta = {
61
+ shadow_id: shadowId,
62
+ project_id: this.projectRoot,
63
+ skill_id: origin.skill_id,
64
+ origin_skill_id: origin.skill_id,
65
+ origin_version_at_fork: origin.origin_version,
66
+ shadow_path: shadowPath,
67
+ current_revision: 0,
68
+ status: 'active',
69
+ created_at: now,
70
+ last_optimized_at: '',
71
+ };
72
+ writeFileSync(metaPath, JSON.stringify(meta, null, 2), 'utf-8');
73
+ // 保存到数据库
74
+ this.db.upsertShadowSkill(meta);
75
+ logger.info(`Shadow skill created: ${shadowId}`, {
76
+ origin: origin.skill_id,
77
+ path: shadowPath,
78
+ });
79
+ return meta;
80
+ }
81
+ /**
82
+ * 检查 shadow 是否存在
83
+ */
84
+ async exists(skillId) {
85
+ const shadow = await this.get(skillId);
86
+ return shadow !== null;
87
+ }
88
+ /**
89
+ * 更新 shadow 状态
90
+ */
91
+ async updateStatus(shadowId, status) {
92
+ this.db.updateShadowStatus(shadowId, status);
93
+ }
94
+ /**
95
+ * 更新 shadow revision
96
+ */
97
+ async updateRevision(shadowId, revision) {
98
+ this.db.updateShadowRevision(shadowId, revision);
99
+ }
100
+ /**
101
+ * 读取 shadow skill 内容
102
+ */
103
+ async readContent(skillId) {
104
+ const shadowPath = getShadowSkillPath(this.projectRoot, skillId);
105
+ if (!existsSync(shadowPath)) {
106
+ return null;
107
+ }
108
+ try {
109
+ const shadowSkill = createMarkdownSkill(shadowPath);
110
+ return shadowSkill.read();
111
+ }
112
+ catch (error) {
113
+ logger.warn(`Failed to read shadow content: ${skillId}`, { error });
114
+ return null;
115
+ }
116
+ }
117
+ /**
118
+ * 写入 shadow skill 内容
119
+ */
120
+ async writeContent(skillId, content) {
121
+ const shadowPath = getShadowSkillPath(this.projectRoot, skillId);
122
+ const shadowSkill = createMarkdownSkill(shadowPath);
123
+ shadowSkill.write(content);
124
+ }
125
+ /**
126
+ * 获取 shadow 的 journal
127
+ */
128
+ getJournal(skillId) {
129
+ const journalPath = getShadowJournalPath(this.projectRoot, skillId);
130
+ return createJournalStore(journalPath);
131
+ }
132
+ /**
133
+ * 获取 shadow 的 snapshots 目录
134
+ */
135
+ getSnapshotsDir(skillId) {
136
+ return getSnapshotsDir(this.projectRoot, skillId);
137
+ }
138
+ /**
139
+ * 获取项目 ID(使用项目根目录的哈希)
140
+ */
141
+ getProjectId() {
142
+ const { shortHash } = require('../../utils/hash.js');
143
+ return shortHash(this.projectRoot);
144
+ }
145
+ /**
146
+ * 确保项目 .evo 目录结构存在
147
+ */
148
+ async ensureProjectStructure() {
149
+ const evoDir = join(this.projectRoot, '.evo');
150
+ const dirs = [
151
+ join(evoDir, 'skills'),
152
+ join(evoDir, 'state'),
153
+ join(evoDir, 'config'),
154
+ ];
155
+ for (const dir of dirs) {
156
+ if (!existsSync(dir)) {
157
+ mkdirSync(dir, { recursive: true });
158
+ }
159
+ }
160
+ logger.debug('Project structure ensured', { projectRoot: this.projectRoot });
161
+ }
162
+ /**
163
+ * 关闭数据库连接
164
+ */
165
+ close() {
166
+ this.db.close();
167
+ }
168
+ }
169
+ // 导出工厂函数
170
+ export function createShadowRegistry(projectRoot) {
171
+ return new ShadowRegistry(projectRoot);
172
+ }
173
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/shadow-registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACnH,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,MAAM,MAAM,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;AAEpD;;;GAGG;AACH,MAAM,OAAO,cAAc;IACjB,EAAE,CAAC;IACH,WAAW,CAAS;IAE5B,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QACjE,IAAI,CAAC,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,OAAe;QACvB,OAAO,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,MAAmB;QAC5B,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,iBAAiB;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAElD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,uBAAuB;QACvB,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACpD,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAE/C,eAAe;QACf,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtE,MAAM,IAAI,GAAuB;YAC/B,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,eAAe,EAAE,MAAM,CAAC,QAAQ;YAChC,sBAAsB,EAAE,MAAM,CAAC,cAAc;YAC7C,WAAW,EAAE,UAAU;YACvB,gBAAgB,EAAE,CAAC;YACnB,MAAM,EAAE,QAAwB;YAChC,UAAU,EAAE,GAAG;YACf,iBAAiB,EAAE,EAAE;SACtB,CAAC;QACF,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAEhE,SAAS;QACT,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEhC,MAAM,CAAC,IAAI,CAAC,yBAAyB,QAAQ,EAAE,EAAE;YAC/C,MAAM,EAAE,MAAM,CAAC,QAAQ;YACvB,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,MAAM,KAAK,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,MAAoB;QACvD,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,QAAgB;QACrD,IAAI,CAAC,EAAE,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACpD,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,kCAAkC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,OAAe;QACjD,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACpD,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAe;QACxB,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACpE,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAe;QAC7B,OAAO,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACrD,OAAO,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG;YACX,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;YACtB,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;YACrB,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;SACvB,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AAED,SAAS;AACT,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 后台守护进程
3
+ * 负责监听文件变化和定时任务
4
+ */
5
+ export declare class Daemon {
6
+ private projectRoot;
7
+ private shadowManager;
8
+ private codexObserver;
9
+ private watcher;
10
+ private isRunning;
11
+ private cleanupInterval;
12
+ constructor(projectRoot: string);
13
+ /**
14
+ * 启动守护进程
15
+ */
16
+ start(): Promise<void>;
17
+ /**
18
+ * 启动文件监听器
19
+ */
20
+ private startFileWatcher;
21
+ /**
22
+ * 启动定时清理任务
23
+ */
24
+ private startCleanupTask;
25
+ /**
26
+ * 停止守护进程
27
+ */
28
+ stop(): Promise<void>;
29
+ /**
30
+ * 检查是否正在运行
31
+ */
32
+ isActive(): boolean;
33
+ /**
34
+ * 获取 shadow manager
35
+ */
36
+ getShadowManager(): import("../core/shadow-manager/index.js").ShadowManager;
37
+ /**
38
+ * 获取 codex observer
39
+ */
40
+ getCodexObserver(): import("../core/observer/codex-observer.js").CodexObserver;
41
+ }
42
+ export declare function createDaemon(projectRoot: string): Daemon;
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,eAAe,CAA+B;gBAE1C,WAAW,EAAE,MAAM;IAM/B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,gBAAgB;IAIhB;;OAEG;IACH,gBAAgB;CAGjB;AAGD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD"}