autosnippet 3.3.5 → 3.3.6

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 (203) hide show
  1. package/dashboard/dist/assets/icons-D1aVZYFW.js +1 -0
  2. package/dashboard/dist/assets/index-CxHOu8Hd.css +1 -0
  3. package/dashboard/dist/assets/index-DDdAOpYT.js +128 -0
  4. package/dashboard/dist/index.html +3 -3
  5. package/dist/bin/api-server.js +1 -0
  6. package/dist/bin/cli.d.ts +1 -0
  7. package/dist/bin/cli.js +136 -9
  8. package/dist/lib/agent/AgentFactory.d.ts +0 -17
  9. package/dist/lib/agent/AgentFactory.js +1 -25
  10. package/dist/lib/agent/capabilities.d.ts +11 -0
  11. package/dist/lib/agent/capabilities.js +29 -5
  12. package/dist/lib/agent/context/ExplorationTracker.js +10 -1
  13. package/dist/lib/agent/context/exploration/ExplorationStrategies.d.ts +2 -0
  14. package/dist/lib/agent/context/exploration/ExplorationStrategies.js +2 -2
  15. package/dist/lib/agent/domain/insight-analyst.d.ts +47 -3
  16. package/dist/lib/agent/domain/insight-analyst.js +111 -11
  17. package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
  18. package/dist/lib/agent/domain/insight-evolver.js +230 -0
  19. package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
  20. package/dist/lib/agent/domain/insight-gate.js +41 -0
  21. package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
  22. package/dist/lib/agent/domain/insight-producer.js +60 -5
  23. package/dist/lib/agent/domain/scan-prompts.js +10 -7
  24. package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
  25. package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
  26. package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
  27. package/dist/lib/agent/memory/SessionStore.js +9 -15
  28. package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
  29. package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
  30. package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
  31. package/dist/lib/agent/memory/session-store-schema.js +41 -0
  32. package/dist/lib/agent/presets.d.ts +89 -1
  33. package/dist/lib/agent/presets.js +53 -5
  34. package/dist/lib/agent/tools/_shared.d.ts +7 -15
  35. package/dist/lib/agent/tools/_shared.js +20 -21
  36. package/dist/lib/agent/tools/composite.d.ts +25 -22
  37. package/dist/lib/agent/tools/composite.js +108 -109
  38. package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
  39. package/dist/lib/agent/tools/evolution-tools.js +161 -0
  40. package/dist/lib/agent/tools/index.d.ts +163 -92
  41. package/dist/lib/agent/tools/index.js +9 -1
  42. package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
  43. package/dist/lib/agent/tools/lifecycle.js +59 -75
  44. package/dist/lib/cli/AiScanService.js +1 -1
  45. package/dist/lib/cli/KnowledgeSyncService.js +1 -1
  46. package/dist/lib/core/AstAnalyzer.d.ts +1 -0
  47. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
  48. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
  49. package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
  50. package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
  51. package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
  52. package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
  53. package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
  54. package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
  55. package/dist/lib/domain/dimension/index.d.ts +10 -0
  56. package/dist/lib/domain/dimension/index.js +9 -0
  57. package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
  58. package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
  59. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +33 -111
  60. package/dist/lib/domain/knowledge/KnowledgeEntry.js +27 -6
  61. package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
  62. package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
  63. package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
  64. package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
  65. package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
  66. package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
  67. package/dist/lib/external/mcp/McpServer.js +4 -0
  68. package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
  69. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
  70. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
  71. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
  72. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
  73. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
  74. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
  75. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
  76. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
  77. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
  78. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
  79. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
  80. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
  81. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +172 -161
  82. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
  83. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
  84. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
  85. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
  86. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
  87. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
  88. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
  89. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
  90. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
  91. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
  92. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
  93. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
  94. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
  95. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
  96. package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
  97. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
  98. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
  99. package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +14 -10
  100. package/dist/lib/external/mcp/handlers/bootstrap-external.js +39 -51
  101. package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
  102. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +115 -82
  103. package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
  104. package/dist/lib/external/mcp/handlers/consolidated.js +107 -332
  105. package/dist/lib/external/mcp/handlers/dimension-complete-external.js +69 -1
  106. package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
  107. package/dist/lib/external/mcp/handlers/evolve-external.js +226 -0
  108. package/dist/lib/external/mcp/handlers/knowledge.js +26 -2
  109. package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
  110. package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
  111. package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
  112. package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
  113. package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
  114. package/dist/lib/external/mcp/handlers/search.js +6 -5
  115. package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
  116. package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
  117. package/dist/lib/external/mcp/tools.d.ts +8 -18
  118. package/dist/lib/external/mcp/tools.js +58 -2
  119. package/dist/lib/http/routes/knowledge.js +122 -1
  120. package/dist/lib/http/routes/modules.js +25 -3
  121. package/dist/lib/http/routes/panorama.js +16 -4
  122. package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
  123. package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
  124. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
  125. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
  126. package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
  127. package/dist/lib/injection/ServiceContainer.js +55 -0
  128. package/dist/lib/injection/ServiceMap.d.ts +8 -1
  129. package/dist/lib/injection/modules/KnowledgeModule.js +15 -1
  130. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
  131. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
  132. package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
  133. package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
  134. package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
  135. package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
  136. package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +5 -0
  137. package/dist/lib/service/bootstrap/UiStartupTasks.js +20 -0
  138. package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
  139. package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
  140. package/dist/lib/service/cleanup/CleanupService.d.ts +85 -0
  141. package/dist/lib/service/cleanup/CleanupService.js +324 -0
  142. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
  143. package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
  144. package/dist/lib/service/delivery/FileProtection.js +54 -0
  145. package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
  146. package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
  147. package/dist/lib/service/evolution/ContentPatcher.js +310 -0
  148. package/dist/lib/service/evolution/ProposalExecutor.d.ts +4 -0
  149. package/dist/lib/service/evolution/ProposalExecutor.js +77 -13
  150. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
  151. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
  152. package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
  153. package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
  154. package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
  155. package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
  156. package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
  157. package/dist/lib/service/guard/ComplianceReporter.js +51 -0
  158. package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
  159. package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
  160. package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
  161. package/dist/lib/service/knowledge/KnowledgeService.js +44 -4
  162. package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
  163. package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
  164. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +3 -2
  165. package/dist/lib/service/panorama/DimensionAnalyzer.js +15 -140
  166. package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
  167. package/dist/lib/service/search/SearchEngine.d.ts +11 -10
  168. package/dist/lib/service/search/SearchEngine.js +38 -36
  169. package/dist/lib/service/search/SearchTypes.d.ts +14 -8
  170. package/dist/lib/service/search/SearchTypes.js +1 -1
  171. package/dist/lib/service/search/tokenizer.d.ts +1 -1
  172. package/dist/lib/service/search/tokenizer.js +2 -2
  173. package/dist/lib/shared/schemas/common.d.ts +4 -4
  174. package/dist/lib/shared/schemas/http-requests.d.ts +12 -1
  175. package/dist/lib/shared/schemas/http-requests.js +8 -0
  176. package/dist/lib/shared/schemas/mcp-tools.d.ts +32 -2
  177. package/dist/lib/shared/schemas/mcp-tools.js +38 -0
  178. package/dist/lib/types/evolution.d.ts +135 -0
  179. package/dist/lib/types/evolution.js +6 -0
  180. package/dist/lib/types/graph-shared.d.ts +25 -0
  181. package/dist/lib/types/graph-shared.js +7 -0
  182. package/dist/lib/types/knowledge-wire.d.ts +131 -0
  183. package/dist/lib/types/knowledge-wire.js +7 -0
  184. package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
  185. package/dist/lib/types/project-snapshot-builder.js +189 -0
  186. package/dist/lib/types/project-snapshot.d.ts +399 -0
  187. package/dist/lib/types/project-snapshot.js +17 -0
  188. package/dist/lib/types/search-wire.d.ts +46 -0
  189. package/dist/lib/types/search-wire.js +7 -0
  190. package/dist/lib/types/snapshot-views.d.ts +58 -0
  191. package/dist/lib/types/snapshot-views.js +103 -0
  192. package/package.json +1 -1
  193. package/skills/autosnippet-recipes/SKILL.md +1 -1
  194. package/templates/instructions/agent-static.md +2 -0
  195. package/templates/instructions/conventions.md +3 -1
  196. package/templates/recipes-setup/README.md +2 -2
  197. package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
  198. package/dashboard/dist/assets/index-B659K9t5.js +0 -128
  199. package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
  200. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
  201. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
  202. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
  203. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +0 -821
@@ -0,0 +1,131 @@
1
+ /**
2
+ * §10.1 KnowledgeEntryWire — 统一的知识条目传输合约
3
+ *
4
+ * 这是后端 KnowledgeEntry.toJSON() 和前端 Dashboard 共享的唯一类型定义。
5
+ * 所有 API 层传输都使用此形状,消除后端 class 与前端 interface 的字段漂移。
6
+ */
7
+ export type KnowledgeLifecycle = 'pending' | 'staging' | 'active' | 'evolving' | 'decaying' | 'deprecated';
8
+ export type KnowledgeKind = 'rule' | 'pattern' | 'fact';
9
+ export interface KnowledgeContentWire {
10
+ pattern: string;
11
+ markdown: string;
12
+ rationale: string;
13
+ steps: Array<{
14
+ title?: string;
15
+ description?: string;
16
+ code?: string;
17
+ }>;
18
+ codeChanges: Array<{
19
+ file: string;
20
+ before: string;
21
+ after: string;
22
+ explanation: string;
23
+ }>;
24
+ verification: {
25
+ method?: string;
26
+ expectedResult?: string;
27
+ testCode?: string;
28
+ } | null;
29
+ }
30
+ export interface KnowledgeReasoningWire {
31
+ whyStandard: string;
32
+ sources: string[];
33
+ confidence: number;
34
+ qualitySignals: Record<string, unknown>;
35
+ alternatives: string[];
36
+ }
37
+ export interface KnowledgeQualityWire {
38
+ completeness: number;
39
+ adaptation: number;
40
+ documentation: number;
41
+ overall: number;
42
+ grade: string;
43
+ }
44
+ export interface KnowledgeStatsWire {
45
+ views: number;
46
+ adoptions: number;
47
+ applications: number;
48
+ guardHits: number;
49
+ searchHits: number;
50
+ authority: number;
51
+ lastHitAt: number | null;
52
+ lastSearchedAt: number | null;
53
+ lastGuardHitAt: number | null;
54
+ hitsLast30d: number;
55
+ hitsLast90d: number;
56
+ searchHitsLast30d: number;
57
+ version: number;
58
+ ruleFalsePositiveRate: number | null;
59
+ }
60
+ export interface KnowledgeConstraintsWire {
61
+ guards: Array<{
62
+ id?: string | null;
63
+ type?: string;
64
+ pattern: string | null;
65
+ severity: string;
66
+ message?: string;
67
+ fixSuggestion?: string;
68
+ }>;
69
+ boundaries: string[];
70
+ preconditions: string[];
71
+ sideEffects: string[];
72
+ }
73
+ export interface KnowledgeRelationEntry {
74
+ target: string;
75
+ description?: string;
76
+ }
77
+ export interface KnowledgeRelationsWire {
78
+ [bucket: string]: KnowledgeRelationEntry[];
79
+ }
80
+ /** 后端 → 前端 / API 传输的唯一合约 */
81
+ export interface KnowledgeEntryWire {
82
+ id: string;
83
+ title: string;
84
+ description: string;
85
+ lifecycle: string;
86
+ lifecycleHistory: Array<{
87
+ from: string;
88
+ to: string;
89
+ at: number;
90
+ }>;
91
+ autoApprovable: boolean;
92
+ language: string;
93
+ category: string;
94
+ kind: string;
95
+ knowledgeType: string;
96
+ complexity: string;
97
+ scope: string;
98
+ difficulty: string | null;
99
+ tags: string[];
100
+ trigger: string;
101
+ topicHint: string;
102
+ whenClause: string;
103
+ doClause: string;
104
+ dontClause: string;
105
+ coreCode: string;
106
+ usageGuide: string;
107
+ content: KnowledgeContentWire;
108
+ relations: KnowledgeRelationsWire;
109
+ constraints: KnowledgeConstraintsWire;
110
+ reasoning: KnowledgeReasoningWire;
111
+ quality: KnowledgeQualityWire;
112
+ stats: KnowledgeStatsWire;
113
+ headers: string[];
114
+ headerPaths: string[];
115
+ moduleName: string;
116
+ includeHeaders: boolean;
117
+ agentNotes: string | null;
118
+ aiInsight: string | null;
119
+ reviewedBy: string | null;
120
+ reviewedAt: number | null;
121
+ rejectionReason: string | null;
122
+ source: string;
123
+ sourceFile: string | null;
124
+ sourceCandidateId: string | null;
125
+ createdBy: string;
126
+ createdAt: number;
127
+ updatedAt: number;
128
+ publishedAt: number | null;
129
+ publishedBy: string | null;
130
+ [key: string]: unknown;
131
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * §10.1 KnowledgeEntryWire — 统一的知识条目传输合约
3
+ *
4
+ * 这是后端 KnowledgeEntry.toJSON() 和前端 Dashboard 共享的唯一类型定义。
5
+ * 所有 API 层传输都使用此形状,消除后端 class 与前端 interface 的字段漂移。
6
+ */
7
+ export {};
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ProjectSnapshot Builder — 从 runAllPhases() 的松散返回值构建类型化快照
3
+ *
4
+ * 职责:
5
+ * 1. 类型归一化(unknown → typed interfaces)
6
+ * 2. 默认值填充
7
+ * 3. 不可变冻结(Object.freeze)
8
+ *
9
+ * @module types/project-snapshot-builder
10
+ * @see docs/copilot/unified-project-snapshot-design.md
11
+ */
12
+ import type { ProjectSnapshot, ProjectSnapshotInput } from './project-snapshot.js';
13
+ /**
14
+ * 从 runAllPhases() 的松散返回值构建类型化的 ProjectSnapshot。
15
+ *
16
+ * @param input runAllPhases() 返回值 + 额外的上下文信息
17
+ * @returns 不可变的 ProjectSnapshot 对象
18
+ */
19
+ export declare function buildProjectSnapshot(input: ProjectSnapshotInput): ProjectSnapshot;
@@ -0,0 +1,189 @@
1
+ /**
2
+ * ProjectSnapshot Builder — 从 runAllPhases() 的松散返回值构建类型化快照
3
+ *
4
+ * 职责:
5
+ * 1. 类型归一化(unknown → typed interfaces)
6
+ * 2. 默认值填充
7
+ * 3. 不可变冻结(Object.freeze)
8
+ *
9
+ * @module types/project-snapshot-builder
10
+ * @see docs/copilot/unified-project-snapshot-design.md
11
+ */
12
+ const SNAPSHOT_VERSION = '1.0.0';
13
+ /**
14
+ * 从 runAllPhases() 的松散返回值构建类型化的 ProjectSnapshot。
15
+ *
16
+ * @param input runAllPhases() 返回值 + 额外的上下文信息
17
+ * @returns 不可变的 ProjectSnapshot 对象
18
+ */
19
+ export function buildProjectSnapshot(input) {
20
+ const primaryLang = typeof input.primaryLang === 'string' ? input.primaryLang : 'unknown';
21
+ const langStats = input.langStats && typeof input.langStats === 'object' ? input.langStats : {};
22
+ const language = {
23
+ primaryLang,
24
+ stats: langStats,
25
+ secondary: input.langProfile?.secondary,
26
+ isMultiLang: input.langProfile?.isMultiLang,
27
+ };
28
+ const snapshot = {
29
+ version: SNAPSHOT_VERSION,
30
+ timestamp: Date.now(),
31
+ projectRoot: input.projectRoot,
32
+ sourceTag: input.sourceTag,
33
+ // Phase 1
34
+ allFiles: normalizeFiles(input.allFiles),
35
+ allTargets: normalizeTargets(input.allTargets),
36
+ discoverer: normalizeDiscoverer(input.discoverer),
37
+ truncated: input.truncated ?? false,
38
+ // Phase 1.5
39
+ language,
40
+ ast: normalizeAst(input.astProjectSummary),
41
+ astContext: typeof input.astContext === 'string' ? input.astContext : null,
42
+ // Phase 1.6-1.7
43
+ codeEntityGraph: normalizeCodeEntity(input.codeEntityResult),
44
+ callGraph: normalizeCallGraph(input.callGraphResult),
45
+ // Phase 1.8
46
+ panorama: normalizePanorama(input.panoramaResult),
47
+ // Phase 2
48
+ dependencyGraph: normalizeDepGraph(input.depGraphData),
49
+ depEdgesWritten: typeof input.depEdgesWritten === 'number' ? input.depEdgesWritten : 0,
50
+ // Phase 3
51
+ guardAudit: normalizeGuardAudit(input.guardAudit),
52
+ // Phase 4
53
+ activeDimensions: normalizeDimensions(input.activeDimensions),
54
+ enhancementPackInfo: normalizeEnhancementPackInfo(input.enhancementPackInfo),
55
+ enhancementPatterns: Array.isArray(input.enhancementPatterns)
56
+ ? input.enhancementPatterns
57
+ : [],
58
+ enhancementGuardRules: Array.isArray(input.enhancementGuardRules)
59
+ ? input.enhancementGuardRules
60
+ : [],
61
+ detectedFrameworks: Array.isArray(input.detectedFrameworks) ? input.detectedFrameworks : [],
62
+ // Language profile & Targets summary
63
+ langProfile: language,
64
+ targetsSummary: normalizeTargets(input.targetsSummary || input.allTargets),
65
+ localPackageModules: normalizeLocalPackageModules(input.localPackageModules),
66
+ // Report
67
+ phaseReport: normalizePhaseReport(input.report),
68
+ warnings: Array.isArray(input.warnings) ? input.warnings : [],
69
+ // Incremental
70
+ incrementalPlan: normalizeIncrementalPlan(input.incrementalPlan),
71
+ // Empty
72
+ isEmpty: input.isEmpty ?? false,
73
+ };
74
+ return Object.freeze(snapshot);
75
+ }
76
+ // ── Normalize 函数 ──────────────────────────────────────────
77
+ function normalizeFiles(raw) {
78
+ if (!Array.isArray(raw)) {
79
+ return [];
80
+ }
81
+ return raw.map((f) => ({
82
+ name: String(f.name || ''),
83
+ path: String(f.path || ''),
84
+ relativePath: String(f.relativePath || ''),
85
+ content: String(f.content || ''),
86
+ targetName: String(f.targetName || ''),
87
+ language: f.language != null ? String(f.language) : undefined,
88
+ totalLines: typeof f.totalLines === 'number' ? f.totalLines : undefined,
89
+ priority: f.priority != null ? String(f.priority) : undefined,
90
+ truncated: typeof f.truncated === 'boolean' ? f.truncated : undefined,
91
+ }));
92
+ }
93
+ function normalizeTargets(raw) {
94
+ if (!Array.isArray(raw)) {
95
+ return [];
96
+ }
97
+ return raw.map((t) => {
98
+ if (typeof t === 'string') {
99
+ return { name: t };
100
+ }
101
+ const obj = t;
102
+ return {
103
+ name: String(obj.name || ''),
104
+ type: obj.type != null ? String(obj.type) : undefined,
105
+ framework: obj.framework != null ? String(obj.framework) : undefined,
106
+ packageName: obj.packageName != null ? String(obj.packageName) : undefined,
107
+ inferredRole: obj.inferredRole != null ? String(obj.inferredRole) : undefined,
108
+ fileCount: typeof obj.fileCount === 'number' ? obj.fileCount : undefined,
109
+ isLocalPackage: typeof obj.isLocalPackage === 'boolean' ? obj.isLocalPackage : undefined,
110
+ };
111
+ });
112
+ }
113
+ function normalizeDiscoverer(raw) {
114
+ if (raw && typeof raw === 'object') {
115
+ const obj = raw;
116
+ return {
117
+ id: String(obj.id || 'unknown'),
118
+ displayName: String(obj.displayName || 'Unknown'),
119
+ };
120
+ }
121
+ return { id: 'unknown', displayName: 'Unknown' };
122
+ }
123
+ function normalizeAst(raw) {
124
+ if (!raw || typeof raw !== 'object') {
125
+ return null;
126
+ }
127
+ // Pass through — the shapes from analyzeProject() already match AstSummary
128
+ return raw;
129
+ }
130
+ function normalizeCodeEntity(raw) {
131
+ if (!raw || typeof raw !== 'object') {
132
+ return null;
133
+ }
134
+ return raw;
135
+ }
136
+ function normalizeCallGraph(raw) {
137
+ if (!raw || typeof raw !== 'object') {
138
+ return null;
139
+ }
140
+ return raw;
141
+ }
142
+ function normalizePanorama(raw) {
143
+ if (!raw || typeof raw !== 'object') {
144
+ return null;
145
+ }
146
+ return raw;
147
+ }
148
+ function normalizeDepGraph(raw) {
149
+ if (!raw || typeof raw !== 'object') {
150
+ return null;
151
+ }
152
+ return raw;
153
+ }
154
+ function normalizeGuardAudit(raw) {
155
+ if (!raw || typeof raw !== 'object') {
156
+ return null;
157
+ }
158
+ return raw;
159
+ }
160
+ function normalizeDimensions(raw) {
161
+ if (!Array.isArray(raw)) {
162
+ return [];
163
+ }
164
+ return raw;
165
+ }
166
+ function normalizeEnhancementPackInfo(raw) {
167
+ if (!Array.isArray(raw)) {
168
+ return [];
169
+ }
170
+ return raw;
171
+ }
172
+ function normalizePhaseReport(raw) {
173
+ if (!raw || typeof raw !== 'object') {
174
+ return null;
175
+ }
176
+ return raw;
177
+ }
178
+ function normalizeIncrementalPlan(raw) {
179
+ if (!raw || typeof raw !== 'object') {
180
+ return null;
181
+ }
182
+ return raw;
183
+ }
184
+ function normalizeLocalPackageModules(raw) {
185
+ if (!Array.isArray(raw)) {
186
+ return [];
187
+ }
188
+ return raw;
189
+ }