@ai-agent-context/core 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 (236) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +285 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/adapters/filesystem/fs-adapter.d.ts +50 -0
  5. package/dist/adapters/filesystem/fs-adapter.d.ts.map +1 -0
  6. package/dist/adapters/filesystem/fs-adapter.js +168 -0
  7. package/dist/adapters/filesystem/fs-adapter.js.map +1 -0
  8. package/dist/adapters/filesystem/sensitive.d.ts +26 -0
  9. package/dist/adapters/filesystem/sensitive.d.ts.map +1 -0
  10. package/dist/adapters/filesystem/sensitive.js +67 -0
  11. package/dist/adapters/filesystem/sensitive.js.map +1 -0
  12. package/dist/adapters/git/git-adapter.d.ts +47 -0
  13. package/dist/adapters/git/git-adapter.d.ts.map +1 -0
  14. package/dist/adapters/git/git-adapter.js +109 -0
  15. package/dist/adapters/git/git-adapter.js.map +1 -0
  16. package/dist/adapters/language/json/adapter.d.ts +24 -0
  17. package/dist/adapters/language/json/adapter.d.ts.map +1 -0
  18. package/dist/adapters/language/json/adapter.js +54 -0
  19. package/dist/adapters/language/json/adapter.js.map +1 -0
  20. package/dist/adapters/language/markdown/adapter.d.ts +41 -0
  21. package/dist/adapters/language/markdown/adapter.d.ts.map +1 -0
  22. package/dist/adapters/language/markdown/adapter.js +124 -0
  23. package/dist/adapters/language/markdown/adapter.js.map +1 -0
  24. package/dist/adapters/language/package-json/adapter.d.ts +47 -0
  25. package/dist/adapters/language/package-json/adapter.d.ts.map +1 -0
  26. package/dist/adapters/language/package-json/adapter.js +153 -0
  27. package/dist/adapters/language/package-json/adapter.js.map +1 -0
  28. package/dist/adapters/language/registry.d.ts +35 -0
  29. package/dist/adapters/language/registry.d.ts.map +1 -0
  30. package/dist/adapters/language/registry.js +79 -0
  31. package/dist/adapters/language/registry.js.map +1 -0
  32. package/dist/adapters/language/ts-js/adapter.d.ts +14 -0
  33. package/dist/adapters/language/ts-js/adapter.d.ts.map +1 -0
  34. package/dist/adapters/language/ts-js/adapter.js +59 -0
  35. package/dist/adapters/language/ts-js/adapter.js.map +1 -0
  36. package/dist/adapters/language/ts-js/extractor.d.ts +21 -0
  37. package/dist/adapters/language/ts-js/extractor.d.ts.map +1 -0
  38. package/dist/adapters/language/ts-js/extractor.js +779 -0
  39. package/dist/adapters/language/ts-js/extractor.js.map +1 -0
  40. package/dist/adapters/language/ts-js/lexer.d.ts +30 -0
  41. package/dist/adapters/language/ts-js/lexer.d.ts.map +1 -0
  42. package/dist/adapters/language/ts-js/lexer.js +446 -0
  43. package/dist/adapters/language/ts-js/lexer.js.map +1 -0
  44. package/dist/adapters/language/ts-js/package-signals.d.ts +5 -0
  45. package/dist/adapters/language/ts-js/package-signals.d.ts.map +1 -0
  46. package/dist/adapters/language/ts-js/package-signals.js +113 -0
  47. package/dist/adapters/language/ts-js/package-signals.js.map +1 -0
  48. package/dist/adapters/language/tsconfig/adapter.d.ts +38 -0
  49. package/dist/adapters/language/tsconfig/adapter.d.ts.map +1 -0
  50. package/dist/adapters/language/tsconfig/adapter.js +130 -0
  51. package/dist/adapters/language/tsconfig/adapter.js.map +1 -0
  52. package/dist/adapters/language/types.d.ts +152 -0
  53. package/dist/adapters/language/types.d.ts.map +1 -0
  54. package/dist/adapters/language/types.js +51 -0
  55. package/dist/adapters/language/types.js.map +1 -0
  56. package/dist/agent-context.d.ts +122 -0
  57. package/dist/agent-context.d.ts.map +1 -0
  58. package/dist/agent-context.js +243 -0
  59. package/dist/agent-context.js.map +1 -0
  60. package/dist/config/defaults.d.ts +13 -0
  61. package/dist/config/defaults.d.ts.map +1 -0
  62. package/dist/config/defaults.js +98 -0
  63. package/dist/config/defaults.js.map +1 -0
  64. package/dist/config/load.d.ts +25 -0
  65. package/dist/config/load.d.ts.map +1 -0
  66. package/dist/config/load.js +106 -0
  67. package/dist/config/load.js.map +1 -0
  68. package/dist/config/types.d.ts +95 -0
  69. package/dist/config/types.d.ts.map +1 -0
  70. package/dist/config/types.js +8 -0
  71. package/dist/config/types.js.map +1 -0
  72. package/dist/config/validate.d.ts +15 -0
  73. package/dist/config/validate.d.ts.map +1 -0
  74. package/dist/config/validate.js +202 -0
  75. package/dist/config/validate.js.map +1 -0
  76. package/dist/core/architecture/detector.d.ts +10 -0
  77. package/dist/core/architecture/detector.d.ts.map +1 -0
  78. package/dist/core/architecture/detector.js +37 -0
  79. package/dist/core/architecture/detector.js.map +1 -0
  80. package/dist/core/architecture/entry-points.d.ts +20 -0
  81. package/dist/core/architecture/entry-points.d.ts.map +1 -0
  82. package/dist/core/architecture/entry-points.js +190 -0
  83. package/dist/core/architecture/entry-points.js.map +1 -0
  84. package/dist/core/architecture/role-detector.d.ts +32 -0
  85. package/dist/core/architecture/role-detector.d.ts.map +1 -0
  86. package/dist/core/architecture/role-detector.js +240 -0
  87. package/dist/core/architecture/role-detector.js.map +1 -0
  88. package/dist/core/context/explain.d.ts +36 -0
  89. package/dist/core/context/explain.d.ts.map +1 -0
  90. package/dist/core/context/explain.js +199 -0
  91. package/dist/core/context/explain.js.map +1 -0
  92. package/dist/core/context/repository-context.d.ts +16 -0
  93. package/dist/core/context/repository-context.d.ts.map +1 -0
  94. package/dist/core/context/repository-context.js +134 -0
  95. package/dist/core/context/repository-context.js.map +1 -0
  96. package/dist/core/context/types.d.ts +94 -0
  97. package/dist/core/context/types.d.ts.map +1 -0
  98. package/dist/core/context/types.js +2 -0
  99. package/dist/core/context/types.js.map +1 -0
  100. package/dist/core/conventions/detector.d.ts +55 -0
  101. package/dist/core/conventions/detector.d.ts.map +1 -0
  102. package/dist/core/conventions/detector.js +438 -0
  103. package/dist/core/conventions/detector.js.map +1 -0
  104. package/dist/core/conventions/renderer.d.ts +16 -0
  105. package/dist/core/conventions/renderer.d.ts.map +1 -0
  106. package/dist/core/conventions/renderer.js +42 -0
  107. package/dist/core/conventions/renderer.js.map +1 -0
  108. package/dist/core/decisions/detector.d.ts +45 -0
  109. package/dist/core/decisions/detector.d.ts.map +1 -0
  110. package/dist/core/decisions/detector.js +256 -0
  111. package/dist/core/decisions/detector.js.map +1 -0
  112. package/dist/core/diff/differ.d.ts +26 -0
  113. package/dist/core/diff/differ.d.ts.map +1 -0
  114. package/dist/core/diff/differ.js +159 -0
  115. package/dist/core/diff/differ.js.map +1 -0
  116. package/dist/core/git-analysis/activity.d.ts +35 -0
  117. package/dist/core/git-analysis/activity.d.ts.map +1 -0
  118. package/dist/core/git-analysis/activity.js +123 -0
  119. package/dist/core/git-analysis/activity.js.map +1 -0
  120. package/dist/core/graph/aliases.d.ts +20 -0
  121. package/dist/core/graph/aliases.d.ts.map +1 -0
  122. package/dist/core/graph/aliases.js +99 -0
  123. package/dist/core/graph/aliases.js.map +1 -0
  124. package/dist/core/graph/knowledge-graph.d.ts +91 -0
  125. package/dist/core/graph/knowledge-graph.d.ts.map +1 -0
  126. package/dist/core/graph/knowledge-graph.js +572 -0
  127. package/dist/core/graph/knowledge-graph.js.map +1 -0
  128. package/dist/core/graph/modules.d.ts +28 -0
  129. package/dist/core/graph/modules.d.ts.map +1 -0
  130. package/dist/core/graph/modules.js +139 -0
  131. package/dist/core/graph/modules.js.map +1 -0
  132. package/dist/core/graph/resolver.d.ts +50 -0
  133. package/dist/core/graph/resolver.d.ts.map +1 -0
  134. package/dist/core/graph/resolver.js +180 -0
  135. package/dist/core/graph/resolver.js.map +1 -0
  136. package/dist/core/scanner/cache.d.ts +49 -0
  137. package/dist/core/scanner/cache.d.ts.map +1 -0
  138. package/dist/core/scanner/cache.js +101 -0
  139. package/dist/core/scanner/cache.js.map +1 -0
  140. package/dist/core/scanner/scanner.d.ts +60 -0
  141. package/dist/core/scanner/scanner.d.ts.map +1 -0
  142. package/dist/core/scanner/scanner.js +304 -0
  143. package/dist/core/scanner/scanner.js.map +1 -0
  144. package/dist/core/scanner/types.d.ts +47 -0
  145. package/dist/core/scanner/types.d.ts.map +1 -0
  146. package/dist/core/scanner/types.js +18 -0
  147. package/dist/core/scanner/types.js.map +1 -0
  148. package/dist/core/search/analyzer.d.ts +16 -0
  149. package/dist/core/search/analyzer.d.ts.map +1 -0
  150. package/dist/core/search/analyzer.js +165 -0
  151. package/dist/core/search/analyzer.js.map +1 -0
  152. package/dist/core/search/bm25.d.ts +21 -0
  153. package/dist/core/search/bm25.d.ts.map +1 -0
  154. package/dist/core/search/bm25.js +108 -0
  155. package/dist/core/search/bm25.js.map +1 -0
  156. package/dist/core/search/documents.d.ts +20 -0
  157. package/dist/core/search/documents.d.ts.map +1 -0
  158. package/dist/core/search/documents.js +106 -0
  159. package/dist/core/search/documents.js.map +1 -0
  160. package/dist/core/search/service.d.ts +30 -0
  161. package/dist/core/search/service.d.ts.map +1 -0
  162. package/dist/core/search/service.js +54 -0
  163. package/dist/core/search/service.js.map +1 -0
  164. package/dist/core/search/types.d.ts +44 -0
  165. package/dist/core/search/types.d.ts.map +1 -0
  166. package/dist/core/search/types.js +2 -0
  167. package/dist/core/search/types.js.map +1 -0
  168. package/dist/core/serialization/documents.d.ts +26 -0
  169. package/dist/core/serialization/documents.d.ts.map +1 -0
  170. package/dist/core/serialization/documents.js +224 -0
  171. package/dist/core/serialization/documents.js.map +1 -0
  172. package/dist/core/serialization/reader.d.ts +22 -0
  173. package/dist/core/serialization/reader.d.ts.map +1 -0
  174. package/dist/core/serialization/reader.js +65 -0
  175. package/dist/core/serialization/reader.js.map +1 -0
  176. package/dist/core/serialization/types.d.ts +184 -0
  177. package/dist/core/serialization/types.d.ts.map +1 -0
  178. package/dist/core/serialization/types.js +2 -0
  179. package/dist/core/serialization/types.js.map +1 -0
  180. package/dist/core/serialization/writer.d.ts +17 -0
  181. package/dist/core/serialization/writer.d.ts.map +1 -0
  182. package/dist/core/serialization/writer.js +64 -0
  183. package/dist/core/serialization/writer.js.map +1 -0
  184. package/dist/core/workspace/package-facts.d.ts +12 -0
  185. package/dist/core/workspace/package-facts.d.ts.map +1 -0
  186. package/dist/core/workspace/package-facts.js +50 -0
  187. package/dist/core/workspace/package-facts.js.map +1 -0
  188. package/dist/core/workspace/workspace.d.ts +32 -0
  189. package/dist/core/workspace/workspace.d.ts.map +1 -0
  190. package/dist/core/workspace/workspace.js +167 -0
  191. package/dist/core/workspace/workspace.js.map +1 -0
  192. package/dist/errors.d.ts +50 -0
  193. package/dist/errors.d.ts.map +1 -0
  194. package/dist/errors.js +64 -0
  195. package/dist/errors.js.map +1 -0
  196. package/dist/index.d.ts +80 -0
  197. package/dist/index.d.ts.map +1 -0
  198. package/dist/index.js +66 -0
  199. package/dist/index.js.map +1 -0
  200. package/dist/logging/diagnostics.d.ts +64 -0
  201. package/dist/logging/diagnostics.d.ts.map +1 -0
  202. package/dist/logging/diagnostics.js +92 -0
  203. package/dist/logging/diagnostics.js.map +1 -0
  204. package/dist/model/canonical.d.ts +24 -0
  205. package/dist/model/canonical.d.ts.map +1 -0
  206. package/dist/model/canonical.js +69 -0
  207. package/dist/model/canonical.js.map +1 -0
  208. package/dist/model/schema.d.ts +37 -0
  209. package/dist/model/schema.d.ts.map +1 -0
  210. package/dist/model/schema.js +42 -0
  211. package/dist/model/schema.js.map +1 -0
  212. package/dist/model/types.d.ts +402 -0
  213. package/dist/model/types.d.ts.map +1 -0
  214. package/dist/model/types.js +10 -0
  215. package/dist/model/types.js.map +1 -0
  216. package/dist/pipeline/scan-pipeline.d.ts +69 -0
  217. package/dist/pipeline/scan-pipeline.d.ts.map +1 -0
  218. package/dist/pipeline/scan-pipeline.js +270 -0
  219. package/dist/pipeline/scan-pipeline.js.map +1 -0
  220. package/dist/util/concurrency.d.ts +17 -0
  221. package/dist/util/concurrency.d.ts.map +1 -0
  222. package/dist/util/concurrency.js +46 -0
  223. package/dist/util/concurrency.js.map +1 -0
  224. package/dist/util/glob.d.ts +26 -0
  225. package/dist/util/glob.d.ts.map +1 -0
  226. package/dist/util/glob.js +198 -0
  227. package/dist/util/glob.js.map +1 -0
  228. package/dist/util/paths.d.ts +23 -0
  229. package/dist/util/paths.d.ts.map +1 -0
  230. package/dist/util/paths.js +115 -0
  231. package/dist/util/paths.js.map +1 -0
  232. package/dist/util/text.d.ts +22 -0
  233. package/dist/util/text.d.ts.map +1 -0
  234. package/dist/util/text.js +66 -0
  235. package/dist/util/text.js.map +1 -0
  236. package/package.json +52 -0
@@ -0,0 +1,270 @@
1
+ import { loadConfig } from "../config/load.js";
2
+ import { DiagnosticsCollector, Logger } from "../logging/diagnostics.js";
3
+ import { SCHEMA_VERSION } from "../model/schema.js";
4
+ import { compareStrings } from "../model/canonical.js";
5
+ import { FileSystemAdapter } from "../adapters/filesystem/fs-adapter.js";
6
+ import { GitAdapter } from "../adapters/git/git-adapter.js";
7
+ import { scanRepository } from "../core/scanner/scanner.js";
8
+ import { LocalStateStore, ParseCache } from "../core/scanner/cache.js";
9
+ import { detectWorkspace } from "../core/workspace/workspace.js";
10
+ import { packageFactsFromParsed } from "../core/workspace/package-facts.js";
11
+ import { buildKnowledgeGraph } from "../core/graph/knowledge-graph.js";
12
+ import { applyArchitectureDetection } from "../core/architecture/detector.js";
13
+ import { computeGitActivity, applyGitSignals } from "../core/git-analysis/activity.js";
14
+ import { detectConventions } from "../core/conventions/detector.js";
15
+ import { detectDecisions } from "../core/decisions/detector.js";
16
+ import { buildContextDocuments } from "../core/serialization/documents.js";
17
+ import { readPersistedContext } from "../core/serialization/reader.js";
18
+ import { writeContext } from "../core/serialization/writer.js";
19
+ import { diffContext, hashDocuments } from "../core/diff/differ.js";
20
+ import { transitiveDependents } from "../core/context/explain.js";
21
+ /** Rebuilds the workspace model from the parsed `package.json` files. */
22
+ export function detectWorkspaceFromScan(scan) {
23
+ const packageJsonFiles = [];
24
+ for (const [filePath, parsed] of scan.parsed) {
25
+ const facts = packageFactsFromParsed(parsed);
26
+ if (facts === null)
27
+ continue;
28
+ const isEmpty = facts.name === null &&
29
+ facts.entries.length === 0 &&
30
+ facts.dependencies.length === 0 &&
31
+ Object.keys(facts.scripts).length === 0;
32
+ if (isEmpty)
33
+ continue;
34
+ packageJsonFiles.push({ path: filePath, facts });
35
+ }
36
+ packageJsonFiles.sort((a, b) => compareStrings(a.path, b.path));
37
+ return detectWorkspace({
38
+ packageJsonFiles,
39
+ presentFiles: scan.presentFiles,
40
+ pnpmWorkspaceYaml: scan.pnpmWorkspaceYaml,
41
+ });
42
+ }
43
+ function buildReport(options) {
44
+ const { scan, graph, diagnostics } = options;
45
+ const moduleByFile = new Map(scan.files.map((file) => [file.path, file.moduleId]));
46
+ const changedFiles = [...scan.changes.added, ...scan.changes.modified].sort(compareStrings);
47
+ const affectedModules = new Set();
48
+ const dependents = new Set();
49
+ for (const file of changedFiles) {
50
+ const moduleId = moduleByFile.get(file) ?? null;
51
+ if (moduleId === null)
52
+ continue;
53
+ affectedModules.add(moduleId);
54
+ for (const dependent of transitiveDependents(graph, moduleId, 1))
55
+ dependents.add(dependent);
56
+ }
57
+ const files = scan.files;
58
+ return {
59
+ changes: scan.changes,
60
+ files: {
61
+ total: files.length,
62
+ source: files.filter((file) => file.kind === 'source').length,
63
+ tests: files.filter((file) => file.kind === 'test').length,
64
+ skipped: files.filter((file) => file.parseStatus === 'skipped').length,
65
+ failed: files.filter((file) => file.parseStatus === 'failed').length,
66
+ },
67
+ modules: graph.repository.modules.length,
68
+ dependencies: graph.repository.dependencies.length,
69
+ externalDependencies: graph.repository.externalDependencies.length,
70
+ entryPoints: graph.repository.entryPoints.length,
71
+ conventions: graph.repository.conventions.length,
72
+ decisions: graph.repository.decisions.length,
73
+ parsed: options.parsedNow,
74
+ reused: options.reused,
75
+ affected: {
76
+ files: changedFiles,
77
+ modules: [...affectedModules].sort(compareStrings),
78
+ dependents: [...dependents].sort(compareStrings),
79
+ },
80
+ durationMs: options.durationMs,
81
+ warnings: diagnostics.list(),
82
+ };
83
+ }
84
+ function emptyState(configHash, counts) {
85
+ return {
86
+ schemaVersion: SCHEMA_VERSION,
87
+ generatedBy: 'ai-agent-context',
88
+ toolVersion: '0.0.0',
89
+ lastScanAt: null,
90
+ configHash,
91
+ counts,
92
+ files: {},
93
+ canonical: {},
94
+ };
95
+ }
96
+ /** Runs the whole pipeline. */
97
+ export async function runPipeline(options) {
98
+ const startedAt = options.now?.() ?? Date.now();
99
+ const logger = options.logger ?? new Logger({ level: 'warn' });
100
+ const diagnostics = new DiagnosticsCollector({ logger });
101
+ const now = options.now ?? (() => Date.now());
102
+ const loaded = await loadConfig({
103
+ root: options.root,
104
+ ...(options.overrides === undefined ? {} : { overrides: options.overrides }),
105
+ ...(options.configPath === undefined ? {} : { configPath: options.configPath }),
106
+ });
107
+ for (const warning of loaded.warnings)
108
+ diagnostics.warn('WARN_CONFIG', warning);
109
+ const root = options.root;
110
+ const stateStore = new LocalStateStore(root);
111
+ const cache = new ParseCache(root);
112
+ const previousState = options.force === true ? null : await stateStore.read();
113
+ const persisted = await readPersistedContext(root);
114
+ for (const invalid of persisted.invalid) {
115
+ diagnostics.warn('WARN_CONTEXT_FILE', `${invalid.file}: ${invalid.reason}`, {
116
+ hint: 'Run: agent-context scan to regenerate the context.',
117
+ });
118
+ }
119
+ const fsAdapter = new FileSystemAdapter(root);
120
+ options.progress?.({ phase: 'start', message: 'Scanning repository...' });
121
+ const scan = await scanRepository({
122
+ root,
123
+ config: loaded.config,
124
+ configHash: loaded.hash,
125
+ ...(options.registry === undefined ? {} : { registry: options.registry }),
126
+ fsAdapter,
127
+ state: previousState,
128
+ cache,
129
+ diagnostics,
130
+ logger,
131
+ ...(options.progress === undefined ? {} : { progress: options.progress }),
132
+ });
133
+ const workspace = detectWorkspaceFromScan(scan);
134
+ const graph = buildKnowledgeGraph({
135
+ root,
136
+ repositoryName: fsAdapter.basename,
137
+ scan,
138
+ workspace,
139
+ moduleDepth: loaded.config.analysis.moduleDepth,
140
+ schemaVersion: SCHEMA_VERSION,
141
+ languages: loaded.config.languages,
142
+ });
143
+ options.progress?.({ phase: 'architecture', message: 'Detecting modules, entry points and roles...' });
144
+ applyArchitectureDetection(graph, scan.parsed);
145
+ const gitResult = await analyzeGit({
146
+ graph,
147
+ config: loaded.config,
148
+ root,
149
+ now,
150
+ logger,
151
+ diagnostics,
152
+ ...(options.gitAdapter === undefined ? {} : { gitAdapter: options.gitAdapter }),
153
+ });
154
+ if (loaded.config.features.conventions) {
155
+ graph.repository.conventions = detectConventions({
156
+ repository: graph.repository,
157
+ parsed: scan.parsed,
158
+ aliases: graph.aliases,
159
+ });
160
+ }
161
+ if (loaded.config.features.decisions) {
162
+ graph.repository.decisions = detectDecisions({
163
+ repository: graph.repository,
164
+ parsed: scan.parsed,
165
+ gitCommits: gitResult.commits,
166
+ architectureSignalPatterns: loaded.config.features.git
167
+ ? loaded.config.analysis.git.architectureSignalPatterns
168
+ : [],
169
+ });
170
+ }
171
+ const generatedAt = loaded.config.output.includeTimestamp ? new Date(now()).toISOString() : undefined;
172
+ const documents = buildContextDocuments(graph, scan.parsed, loaded.config, {
173
+ ...(generatedAt === undefined ? {} : { generatedAt }),
174
+ diagnostics: diagnostics.list(),
175
+ commitsAnalyzed: gitResult.commits.length,
176
+ });
177
+ const diff = diffContext({
178
+ previous: persisted,
179
+ current: documents,
180
+ baselineHash: previousState?.canonical['index.json'] ?? null,
181
+ });
182
+ let written = null;
183
+ if (options.dryRun !== true)
184
+ written = await writeContext(root, documents, loaded.config);
185
+ const report = buildReport({
186
+ scan,
187
+ graph,
188
+ parsedNow: scan.parsedNow,
189
+ reused: scan.reused,
190
+ diagnostics,
191
+ durationMs: Math.max(0, (options.now?.() ?? Date.now()) - startedAt),
192
+ });
193
+ const counts = {
194
+ files: report.files.total,
195
+ modules: report.modules,
196
+ dependencies: report.dependencies,
197
+ entryPoints: report.entryPoints,
198
+ conventions: report.conventions,
199
+ decisions: report.decisions,
200
+ };
201
+ const state = previousState === null ? emptyState(loaded.hash, counts) : { ...previousState };
202
+ state.schemaVersion = SCHEMA_VERSION;
203
+ state.configHash = loaded.hash;
204
+ state.counts = counts;
205
+ state.lastScanAt = new Date(now()).toISOString();
206
+ state.files = {};
207
+ for (const file of graph.repository.files) {
208
+ if (file.sensitive)
209
+ continue;
210
+ state.files[file.path] = {
211
+ hash: file.hash,
212
+ size: file.size,
213
+ mtimeMs: file.mtimeMs,
214
+ language: file.language,
215
+ kind: file.kind,
216
+ };
217
+ }
218
+ if (options.dryRun !== true) {
219
+ state.canonical = written === null ? state.canonical : { ...state.canonical, ...written.hashes };
220
+ await stateStore.write(state);
221
+ }
222
+ options.progress?.({ phase: 'done', message: 'Context updated.' });
223
+ return {
224
+ config: loaded.config,
225
+ configHash: loaded.hash,
226
+ graph,
227
+ parsed: scan.parsed,
228
+ documents,
229
+ report,
230
+ diff,
231
+ persisted,
232
+ written,
233
+ state,
234
+ workspace,
235
+ git: { availability: gitResult.availability, commitsAnalyzed: gitResult.commits.length },
236
+ diagnostics,
237
+ };
238
+ }
239
+ /** Optional git enrichment; never fails the scan. */
240
+ async function analyzeGit(options) {
241
+ if (!options.config.features.git) {
242
+ return { availability: { available: false, reason: 'feature disabled in .agent/config.json' }, commits: [] };
243
+ }
244
+ const adapter = options.gitAdapter ?? new GitAdapter(options.root);
245
+ const availability = await adapter.probe();
246
+ if (availability.available !== true) {
247
+ options.diagnostics.info('INFO_GIT_UNAVAILABLE', `git signals unavailable: ${availability.reason ?? 'not a git repository'}`, { hint: 'Analysis continues without git activity data.' });
248
+ return { availability, commits: [] };
249
+ }
250
+ const commits = await adapter.log({
251
+ windowDays: options.config.analysis.git.windowDays,
252
+ maxCommits: options.config.analysis.git.maxCommits,
253
+ });
254
+ const activity = computeGitActivity({
255
+ commits,
256
+ files: options.graph.repository.files,
257
+ modules: options.graph.repository.modules,
258
+ recentDays: options.config.analysis.git.recentDays,
259
+ architectureSignalPatterns: options.config.analysis.git.architectureSignalPatterns,
260
+ now: options.now(),
261
+ });
262
+ applyGitSignals(options.graph.repository.modules, activity);
263
+ options.logger.verbose(`git: analyzed ${activity.commitCount} commit(s) from the last ${options.config.analysis.git.windowDays} days`);
264
+ return { availability, commits };
265
+ }
266
+ /** Stable hash of the canonical documents; used by `status`. */
267
+ export function documentHash(documents) {
268
+ return hashDocuments(documents);
269
+ }
270
+ //# sourceMappingURL=scan-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-pipeline.js","sourceRoot":"","sources":["../../src/pipeline/scan-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare function defaultConcurrency(): number;
2
+ export interface ConcurrencyResult<T> {
3
+ items: T[];
4
+ errors: Array<{
5
+ index: number;
6
+ error: unknown;
7
+ }>;
8
+ }
9
+ /**
10
+ * Maps items with a bounded number of in-flight tasks, preserving input order in
11
+ * the result. Failures are collected instead of aborting the run: one unreadable
12
+ * file must never break a repository scan.
13
+ */
14
+ export declare function mapWithConcurrency<TInput, TOutput>(items: readonly TInput[], limit: number, mapper: (item: TInput, index: number) => Promise<TOutput>): Promise<ConcurrencyResult<TOutput>>;
15
+ /** Runs tasks with bounded concurrency, ignoring the results. */
16
+ export declare function runWithConcurrency(limit: number, tasks: Array<() => Promise<void>>): Promise<void>;
17
+ //# sourceMappingURL=concurrency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/util/concurrency.ts"],"names":[],"mappings":"AASA,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAClD;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,OAAO,EACtD,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GACxD,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAqBrC;AAED,iEAAiE;AACjE,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxG"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Bounded concurrency helpers.
3
+ *
4
+ * The scanner must handle repositories with 100k+ files without opening all of
5
+ * them at once, so every I/O fan-out goes through {@link mapWithConcurrency}
6
+ * with a configurable limit (default: min(cpus, 8)).
7
+ */
8
+ import { availableParallelism } from 'node:os';
9
+ export function defaultConcurrency() {
10
+ return Math.max(1, Math.min(availableParallelism() - 1, 8));
11
+ }
12
+ /**
13
+ * Maps items with a bounded number of in-flight tasks, preserving input order in
14
+ * the result. Failures are collected instead of aborting the run: one unreadable
15
+ * file must never break a repository scan.
16
+ */
17
+ export async function mapWithConcurrency(items, limit, mapper) {
18
+ const effectiveLimit = Math.max(1, Math.min(limit, items.length || 1));
19
+ const results = new Array(items.length);
20
+ const errors = [];
21
+ let cursor = 0;
22
+ async function worker() {
23
+ for (;;) {
24
+ const index = cursor;
25
+ cursor += 1;
26
+ if (index >= items.length)
27
+ return;
28
+ try {
29
+ results[index] = await mapper(items[index], index);
30
+ }
31
+ catch (error) {
32
+ errors.push({ index, error });
33
+ }
34
+ }
35
+ }
36
+ await Promise.all(Array.from({ length: effectiveLimit }, () => worker()));
37
+ return { items: results.filter((item) => item !== undefined), errors };
38
+ }
39
+ /** Runs tasks with bounded concurrency, ignoring the results. */
40
+ export async function runWithConcurrency(limit, tasks) {
41
+ await mapWithConcurrency(tasks, limit, async (task) => {
42
+ await task();
43
+ return undefined;
44
+ });
45
+ }
46
+ //# sourceMappingURL=concurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/util/concurrency.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAOD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAwB,EACxB,KAAa,EACb,MAAyD;IAEzD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,KAAK,CAAU,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAA6C,EAAE,CAAC;IAC5D,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,UAAU,MAAM;QACnB,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,MAAM,CAAC;YACrB,MAAM,IAAI,CAAC,CAAC;YACZ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YAClC,IAAI,CAAC;gBACH,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAE,EAAE,KAAK,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1E,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;AACzE,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAa,EAAE,KAAiC;IACvF,MAAM,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACpD,MAAM,IAAI,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface CompiledRule {
2
+ raw: string;
3
+ negated: boolean;
4
+ /** `true` when the rule also matches paths below a matched directory. */
5
+ directoryScoped: boolean;
6
+ regex: RegExp;
7
+ }
8
+ export declare function compileRule(rawPattern: string): CompiledRule;
9
+ /** Ordered set of include/exclude glob rules with `.gitignore`-like semantics. */
10
+ export declare class PatternSet {
11
+ readonly rules: CompiledRule[];
12
+ constructor(patterns?: readonly string[]);
13
+ get isEmpty(): boolean;
14
+ /**
15
+ * Evaluates rules in declaration order; the last matching rule wins (as in
16
+ * `.gitignore`). Directory-scoped rules also match descendants.
17
+ */
18
+ test(path: string, isDirectory?: boolean): boolean;
19
+ /** `true` when at least one positive pattern matches the path. */
20
+ matchesAny(path: string): boolean;
21
+ /** Sorted, deduplicated list of the configured patterns. */
22
+ toArray(): string[];
23
+ }
24
+ /** Convenience wrapper returning a single-pattern predicate. */
25
+ export declare function compileGlob(pattern: string): (path: string) => boolean;
26
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/util/glob.ts"],"names":[],"mappings":"AAkHA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CA0B5D;AAWD,kFAAkF;AAClF,qBAAa,UAAU;IACrB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;gBAEnB,QAAQ,GAAE,SAAS,MAAM,EAAO;IAI5C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,UAAQ,GAAG,OAAO;IAgBhD,kEAAkE;IAClE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKjC,4DAA4D;IAC5D,OAAO,IAAI,MAAM,EAAE;CAGpB;AAED,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAGtE"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Minimal, dependency-free glob engine.
3
+ *
4
+ * Supported syntax (a documented subset of gitignore/minimatch semantics):
5
+ *
6
+ * | Pattern | Meaning |
7
+ * | --------------- | ------------------------------------------------------------- |
8
+ * | `*` | any characters inside a single path segment |
9
+ * | `**` | any number of path segments |
10
+ * | `?` | a single character inside a segment |
11
+ * | `[abc]`/`[!ab]` | character class / negated character class |
12
+ * | `{a,b}` | alternation |
13
+ * | `prefix/**` | everything below `prefix`, including the directory itself |
14
+ * | `name/` | the directory `name` and everything below it |
15
+ * | `!pattern` | negation; the last matching rule wins (see {@link PatternSet}) |
16
+ *
17
+ * Patterns without a `/` match by basename at any depth.
18
+ */
19
+ import { compareStrings } from "../model/canonical.js";
20
+ const REGEXP_SPECIALS = new Set(['.', '+', '(', ')', '|', '^', '$', '\\', '/']);
21
+ function escapeLiteral(character) {
22
+ return REGEXP_SPECIALS.has(character) ? `\\${character}` : character;
23
+ }
24
+ function findMatchingBrace(pattern, openIndex) {
25
+ let depth = 0;
26
+ for (let index = openIndex; index < pattern.length; index += 1) {
27
+ const character = pattern[index];
28
+ if (character === '{')
29
+ depth += 1;
30
+ else if (character === '}') {
31
+ depth -= 1;
32
+ if (depth === 0)
33
+ return index;
34
+ }
35
+ }
36
+ return -1;
37
+ }
38
+ function splitAlternatives(body) {
39
+ const parts = [];
40
+ let depth = 0;
41
+ let current = '';
42
+ for (const character of body) {
43
+ if (character === '{')
44
+ depth += 1;
45
+ if (character === '}')
46
+ depth -= 1;
47
+ if (character === ',' && depth === 0) {
48
+ parts.push(current);
49
+ current = '';
50
+ continue;
51
+ }
52
+ current += character;
53
+ }
54
+ parts.push(current);
55
+ return parts;
56
+ }
57
+ function translatePattern(pattern) {
58
+ let output = '';
59
+ let index = 0;
60
+ while (index < pattern.length) {
61
+ const character = pattern[index];
62
+ if (character === '*') {
63
+ if (pattern[index + 1] === '*') {
64
+ index += 2;
65
+ // `**/` and `a/**/b` mean "zero or more segments"
66
+ if (pattern[index] === '/') {
67
+ output += '(?:[^/]*/)*';
68
+ index += 1;
69
+ }
70
+ else {
71
+ output += '.*';
72
+ }
73
+ continue;
74
+ }
75
+ output += '[^/]*';
76
+ index += 1;
77
+ continue;
78
+ }
79
+ if (character === '?') {
80
+ output += '[^/]';
81
+ index += 1;
82
+ continue;
83
+ }
84
+ if (character === '[') {
85
+ const closing = pattern.indexOf(']', index + 1);
86
+ if (closing === -1) {
87
+ output += '\\[';
88
+ index += 1;
89
+ continue;
90
+ }
91
+ let body = pattern.slice(index + 1, closing);
92
+ if (body.startsWith('!'))
93
+ body = `^${body.slice(1)}`;
94
+ output += `[${body.replace(/\\/g, '\\\\')}]`;
95
+ index = closing + 1;
96
+ continue;
97
+ }
98
+ if (character === '{') {
99
+ const closing = findMatchingBrace(pattern, index);
100
+ if (closing !== -1) {
101
+ const alternatives = splitAlternatives(pattern.slice(index + 1, closing));
102
+ output += `(?:${alternatives.map((alternative) => translatePattern(alternative)).join('|')})`;
103
+ index = closing + 1;
104
+ continue;
105
+ }
106
+ output += '\\{';
107
+ index += 1;
108
+ continue;
109
+ }
110
+ output += escapeLiteral(character);
111
+ index += 1;
112
+ }
113
+ return output;
114
+ }
115
+ function normalizePatternPath(path) {
116
+ return path.replace(/\\/g, '/').replace(/^\.\//, '').replace(/^\/+/, '').replace(/\/+$/, '');
117
+ }
118
+ export function compileRule(rawPattern) {
119
+ let pattern = rawPattern.trim();
120
+ let negated = false;
121
+ if (pattern.startsWith('!')) {
122
+ negated = true;
123
+ pattern = pattern.slice(1);
124
+ }
125
+ let directoryScoped = false;
126
+ if (pattern.endsWith('/')) {
127
+ pattern = pattern.slice(0, -1);
128
+ directoryScoped = true;
129
+ }
130
+ if (pattern.endsWith('/**')) {
131
+ pattern = pattern.slice(0, -3);
132
+ directoryScoped = true;
133
+ }
134
+ const hasSlash = pattern.includes('/');
135
+ const body = translatePattern(pattern);
136
+ const prefix = hasSlash ? '^' : '^(?:.*/)?';
137
+ const suffix = directoryScoped ? '(?:/.*)?$' : '$';
138
+ return {
139
+ raw: rawPattern,
140
+ negated,
141
+ directoryScoped,
142
+ regex: new RegExp(`${prefix}${body}${suffix}`),
143
+ };
144
+ }
145
+ function ancestorPaths(path) {
146
+ const parts = path.split('/').filter((segment) => segment.length > 0);
147
+ const result = [];
148
+ for (let index = 1; index < parts.length; index += 1) {
149
+ result.push(parts.slice(0, index).join('/'));
150
+ }
151
+ return result;
152
+ }
153
+ /** Ordered set of include/exclude glob rules with `.gitignore`-like semantics. */
154
+ export class PatternSet {
155
+ rules;
156
+ constructor(patterns = []) {
157
+ this.rules = patterns.filter((pattern) => pattern.trim().length > 0).map(compileRule);
158
+ }
159
+ get isEmpty() {
160
+ return this.rules.length === 0;
161
+ }
162
+ /**
163
+ * Evaluates rules in declaration order; the last matching rule wins (as in
164
+ * `.gitignore`). Directory-scoped rules also match descendants.
165
+ */
166
+ test(path, isDirectory = false) {
167
+ const normalized = normalizePatternPath(path);
168
+ if (normalized.length === 0)
169
+ return false;
170
+ const parents = ancestorPaths(normalized);
171
+ let ignored = false;
172
+ for (const rule of this.rules) {
173
+ let matched = rule.regex.test(normalized);
174
+ if (!matched && rule.directoryScoped) {
175
+ matched = parents.some((ancestor) => rule.regex.test(ancestor));
176
+ }
177
+ if (matched)
178
+ ignored = !rule.negated;
179
+ }
180
+ void isDirectory;
181
+ return ignored;
182
+ }
183
+ /** `true` when at least one positive pattern matches the path. */
184
+ matchesAny(path) {
185
+ const normalized = normalizePatternPath(path);
186
+ return this.rules.some((rule) => !rule.negated && rule.regex.test(normalized));
187
+ }
188
+ /** Sorted, deduplicated list of the configured patterns. */
189
+ toArray() {
190
+ return [...new Set(this.rules.map((rule) => rule.raw))].sort(compareStrings);
191
+ }
192
+ }
193
+ /** Convenience wrapper returning a single-pattern predicate. */
194
+ export function compileGlob(pattern) {
195
+ const rule = compileRule(pattern);
196
+ return (path) => rule.regex.test(normalizePatternPath(path));
197
+ }
198
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/util/glob.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export declare function toPosix(path: string): string;
2
+ export declare function normalizeRelative(path: string): string;
3
+ export declare function dirname(path: string): string;
4
+ export declare function basename(path: string): string;
5
+ export declare function extname(path: string): string;
6
+ export declare function stem(path: string): string;
7
+ export declare function join(...parts: string[]): string;
8
+ export declare function segments(path: string): string[];
9
+ /** `true` when `child` is `parent` itself or lives below it. */
10
+ export declare function isInside(parent: string, child: string): boolean;
11
+ export declare function depth(path: string): number;
12
+ /** Path relative to `parent`, or `null` when `child` is outside of `parent`. */
13
+ export declare function relativeTo(parent: string, child: string): string | null;
14
+ /** All ancestor directories of a path, from the shallowest to the deepest. */
15
+ export declare function ancestors(path: string): string[];
16
+ /** Longest shared directory prefix of two paths. */
17
+ export declare function commonPrefix(paths: readonly string[]): string;
18
+ /**
19
+ * Derives a stable, human readable module id from a directory path, for example
20
+ * `src/payments` -> `payments`.
21
+ */
22
+ export declare function moduleIdFromPath(path: string, sourceRoots?: readonly string[]): string;
23
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AASA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI5C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI7C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIzC;AAED,wBAAgB,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAG/C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAG/C;AAED,gEAAgE;AAChE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAM/D;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOvE;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOhD;AAED,oDAAoD;AACpD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAW7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,CAU1F"}