@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,243 @@
1
+ /**
2
+ * Public API of `ai-agent-context`.
3
+ *
4
+ * ```ts
5
+ * import { AgentContext } from 'ai-agent-context';
6
+ *
7
+ * const context = await AgentContext.load({ root: process.cwd() });
8
+ * const payments = await context.explain('src/payments');
9
+ * ```
10
+ *
11
+ * Design notes:
12
+ * - the facade is the only entry point to the pipeline and it is what the CLI and
13
+ * the MCP adapter call, so neither contains business logic;
14
+ * - read-only queries use a *dry run* of the pipeline: the local cache makes it
15
+ * cheap and `.agent/` on disk is never modified by a query;
16
+ * - `scan()` is the only method that persists the context.
17
+ */
18
+ import path from 'node:path';
19
+ import { existsSync } from 'node:fs';
20
+ import { mkdir, writeFile } from 'node:fs/promises';
21
+ import { Logger } from "./logging/diagnostics.js";
22
+ import { AGENT_DIR, AGENT_GITIGNORE, CONFIG_FILE } from "./model/schema.js";
23
+ import { compareStrings } from "./model/canonical.js";
24
+ import { loadConfig, writeConfigFile } from "./config/load.js";
25
+ import { runPipeline } from "./pipeline/scan-pipeline.js";
26
+ import { readPersistedContext } from "./core/serialization/reader.js";
27
+ import { LocalStateStore } from "./core/scanner/cache.js";
28
+ import { explainModule } from "./core/context/explain.js";
29
+ import { buildRepositoryContext } from "./core/context/repository-context.js";
30
+ import { SearchService } from "./core/search/service.js";
31
+ import { ContextStateError } from "./errors.js";
32
+ export class AgentContext {
33
+ root;
34
+ options;
35
+ resolvedConfig;
36
+ configSource = null;
37
+ pipeline = null;
38
+ persisted = null;
39
+ constructor(root, options, config) {
40
+ this.root = root;
41
+ this.options = options;
42
+ this.resolvedConfig = config;
43
+ }
44
+ /**
45
+ * Loads the context for a repository.
46
+ *
47
+ * Nothing is scanned yet: the first query (or `scan()`) runs the pipeline. This
48
+ * keeps `AgentContext.load()` cheap for callers that only need configuration.
49
+ */
50
+ static async load(options = {}) {
51
+ const root = path.resolve(options.root ?? process.cwd());
52
+ const loaded = await loadConfig({
53
+ root,
54
+ ...(options.config === undefined ? {} : { overrides: options.config }),
55
+ ...(options.configPath === undefined ? {} : { configPath: options.configPath }),
56
+ });
57
+ const context = new AgentContext(root, options, loaded.config);
58
+ context.configSource = loaded.source;
59
+ context.persisted = await readPersistedContext(root);
60
+ return context;
61
+ }
62
+ /** Resolved configuration (defaults + config file + overrides). */
63
+ get config() {
64
+ return this.resolvedConfig;
65
+ }
66
+ /** Path of the configuration file in use, relative to the root, when it exists. */
67
+ get configFile() {
68
+ return this.configSource;
69
+ }
70
+ pipelineOptions(scanOptions = {}) {
71
+ return {
72
+ root: this.root,
73
+ ...(this.options.config === undefined ? {} : { overrides: this.options.config }),
74
+ ...(this.options.configPath === undefined ? {} : { configPath: this.options.configPath }),
75
+ logger: this.options.logger ?? new Logger({ level: 'silent' }),
76
+ ...(this.options.registry === undefined ? {} : { registry: this.options.registry }),
77
+ ...(this.options.progress === undefined ? {} : { progress: this.options.progress }),
78
+ ...(this.options.now === undefined ? {} : { now: this.options.now }),
79
+ ...(this.options.gitAdapter === undefined ? {} : { gitAdapter: this.options.gitAdapter }),
80
+ dryRun: scanOptions.dryRun === true,
81
+ force: scanOptions.force === true,
82
+ };
83
+ }
84
+ /** Runs the pipeline; read-only queries use `dryRun` so nothing is written. */
85
+ async ensurePipeline(scanOptions = {}) {
86
+ const dryRun = scanOptions.dryRun === true;
87
+ if (this.pipeline !== null && (dryRun || !scanOptions.force))
88
+ return this.pipeline;
89
+ const result = await runPipeline(this.pipelineOptions(scanOptions));
90
+ this.pipeline = result;
91
+ return result;
92
+ }
93
+ /** Scans the repository and persists the context into `.agent/`. */
94
+ async scan(options = {}) {
95
+ const result = await this.ensurePipeline({ ...options, dryRun: options.dryRun === true, force: true });
96
+ this.pipeline = result;
97
+ this.persisted = await readPersistedContext(this.root);
98
+ return result.report;
99
+ }
100
+ /** Complete repository model, in memory. */
101
+ async getRepository() {
102
+ return (await this.ensurePipeline()).graph.repository;
103
+ }
104
+ /** Architecture projection. */
105
+ async getArchitecture() {
106
+ return (await this.ensurePipeline()).documents.architecture;
107
+ }
108
+ async getDependencies() {
109
+ return (await this.ensurePipeline()).documents.dependencies;
110
+ }
111
+ async getConventions() {
112
+ return (await this.ensurePipeline()).documents.conventions.conventions;
113
+ }
114
+ async getDecisions() {
115
+ return (await this.ensurePipeline()).documents.decisions.decisions;
116
+ }
117
+ async getIndex() {
118
+ return (await this.ensurePipeline()).documents.index;
119
+ }
120
+ async getFiles() {
121
+ return (await this.ensurePipeline()).graph.repository.files;
122
+ }
123
+ /** Modules of the repository, each with heuristic roles and evidence. */
124
+ async getModules() {
125
+ return (await this.ensurePipeline()).graph.repository.modules;
126
+ }
127
+ /** Module ids that depend on the given module (direct dependents). */
128
+ async getDependents(moduleId) {
129
+ const repository = await this.getRepository();
130
+ return (repository.modules.find((module) => module.id === moduleId)?.usedBy ?? []).sort(compareStrings);
131
+ }
132
+ /** Module ids the given module depends on. */
133
+ async getDependenciesOf(moduleId) {
134
+ const repository = await this.getRepository();
135
+ return (repository.modules.find((module) => module.id === moduleId)?.dependsOn ?? []).sort(compareStrings);
136
+ }
137
+ /** Compact, agent oriented repository context. */
138
+ async getRepositoryContext() {
139
+ const result = await this.ensurePipeline();
140
+ return buildRepositoryContext(result.graph, result.parsed);
141
+ }
142
+ /** Structured explanation of a module (or of the module owning a file). */
143
+ async explain(target) {
144
+ const result = await this.ensurePipeline();
145
+ return explainModule({ graph: result.graph, parsed: result.parsed, target });
146
+ }
147
+ /** Context changes relative to the persisted context. */
148
+ async diff() {
149
+ return (await this.ensurePipeline()).diff;
150
+ }
151
+ /** Deterministic lexical search over files, modules, symbols, conventions, decisions. */
152
+ async search(query, options = {}) {
153
+ const result = await this.ensurePipeline();
154
+ return SearchService.fromGraph({ graph: result.graph, parsed: result.parsed }).search(query, options);
155
+ }
156
+ /** Search with an explicitly provided backend (embeddings, vector database, ...). */
157
+ async searchWith(service, query, options = {}) {
158
+ await this.ensurePipeline();
159
+ return service.search(query, options);
160
+ }
161
+ /** Compares the working tree with the persisted context. */
162
+ async status() {
163
+ const result = await this.ensurePipeline();
164
+ const persisted = this.persisted ?? (await readPersistedContext(this.root));
165
+ const state = await new LocalStateStore(this.root).read();
166
+ const configHashMatches = state !== null && state.configHash === result.configHash;
167
+ const changes = result.report.changes;
168
+ const pending = changes.added.length > 0 || changes.modified.length > 0 || changes.deleted.length > 0;
169
+ const present = [];
170
+ if (persisted.index !== null)
171
+ present.push('index.json');
172
+ if (persisted.architecture !== null)
173
+ present.push('architecture.json');
174
+ if (persisted.dependencies !== null)
175
+ present.push('dependencies.json');
176
+ if (persisted.conventions !== null)
177
+ present.push('conventions.json');
178
+ if (persisted.decisions !== null)
179
+ present.push('decisions.json');
180
+ const status = persisted.index === null ? 'missing' : pending || !configHashMatches ? 'stale' : 'up-to-date';
181
+ return {
182
+ status,
183
+ lastScanAt: state?.lastScanAt ?? null,
184
+ configPath: this.configSource,
185
+ configHashMatches,
186
+ contextFiles: { present, missing: [...persisted.missing], invalid: [...persisted.invalid] },
187
+ changes,
188
+ counts: state?.counts ?? {
189
+ files: 0,
190
+ modules: 0,
191
+ dependencies: 0,
192
+ entryPoints: 0,
193
+ conventions: 0,
194
+ decisions: 0,
195
+ },
196
+ git: {
197
+ available: result.git.availability.available,
198
+ ...(result.git.availability.reason === undefined ? {} : { reason: result.git.availability.reason }),
199
+ commitsAnalyzed: result.git.commitsAnalyzed,
200
+ },
201
+ };
202
+ }
203
+ /**
204
+ * Creates `.agent/` and `.agent/config.json`.
205
+ *
206
+ * Idempotent: an existing configuration is left untouched unless `force` is set.
207
+ */
208
+ async init(options = {}) {
209
+ const configPath = path.join(this.root, CONFIG_FILE);
210
+ const existed = existsSync(configPath);
211
+ const created = [];
212
+ if (!existsSync(path.join(this.root, AGENT_DIR))) {
213
+ await mkdir(path.join(this.root, AGENT_DIR), { recursive: true });
214
+ created.push(`${AGENT_DIR}/`);
215
+ }
216
+ const gitignorePath = path.join(this.root, AGENT_DIR, '.gitignore');
217
+ if (!existsSync(gitignorePath)) {
218
+ await writeFile(gitignorePath, AGENT_GITIGNORE, 'utf8');
219
+ created.push(`${AGENT_DIR}/.gitignore`);
220
+ }
221
+ let overwritten = false;
222
+ if (!existed || options.force === true) {
223
+ const loaded = await loadConfig({ root: this.root, ignoreFile: true });
224
+ await writeConfigFile(this.root, loaded.config, true);
225
+ if (existed)
226
+ overwritten = true;
227
+ else
228
+ created.push(CONFIG_FILE);
229
+ }
230
+ return { configPath, created: created.sort(compareStrings), alreadyExisted: existed, overwritten };
231
+ }
232
+ /** Returns the persisted context or throws a helpful error when it is missing. */
233
+ async requirePersistedContext() {
234
+ const persisted = this.persisted ?? (await readPersistedContext(this.root));
235
+ if (persisted.index === null) {
236
+ throw new ContextStateError('No usable .agent/ context found in this repository.', [
237
+ 'Run: agent-context init && agent-context scan',
238
+ ]);
239
+ }
240
+ return persisted;
241
+ }
242
+ }
243
+ //# sourceMappingURL=agent-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-context.js","sourceRoot":"","sources":["../src/agent-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** Default configuration, aligned with the documented `.agent/config.json` example. */
2
+ import type { AgentContextConfig } from './types.ts';
3
+ /** Directory patterns that are never analyzed. */
4
+ export declare const DEFAULT_EXCLUDE: string[];
5
+ export declare const DEFAULT_INCLUDE: string[];
6
+ /** Files that are never read, even when they match the include patterns. */
7
+ export declare const DEFAULT_SENSITIVE_PATTERNS: string[];
8
+ export declare const DEFAULT_CONFIG: AgentContextConfig;
9
+ /** Directories searched for architecture decision records and documentation. */
10
+ export declare const DECISION_SOURCES: string[];
11
+ /** Documented package.json fields that represent entry points. */
12
+ export declare const PACKAGE_ENTRY_FIELDS: readonly ["main", "module", "types", "browser", "exports", "bin"];
13
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,kDAAkD;AAClD,eAAO,MAAM,eAAe,EAAE,MAAM,EAenC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAM,EAA+F,CAAC;AAEpI,4EAA4E;AAC5E,eAAO,MAAM,0BAA0B,EAAE,MAAM,EAwB9C,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,kBAsC5B,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,EAAE,MAAM,EAUpC,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,mEAAoE,CAAC"}
@@ -0,0 +1,98 @@
1
+ /** Directory patterns that are never analyzed. */
2
+ export const DEFAULT_EXCLUDE = [
3
+ 'node_modules/**',
4
+ 'dist/**',
5
+ 'build/**',
6
+ 'out/**',
7
+ 'coverage/**',
8
+ 'vendor/**',
9
+ 'target/**',
10
+ '.git/**',
11
+ '.agent/**',
12
+ '.cache/**',
13
+ '.next/**',
14
+ '.turbo/**',
15
+ '.venv/**',
16
+ '__pycache__/**',
17
+ ];
18
+ export const DEFAULT_INCLUDE = ['src/**', 'packages/**', 'apps/**', 'lib/**', 'test/**', 'tests/**', '**/*.md', '*.json'];
19
+ /** Files that are never read, even when they match the include patterns. */
20
+ export const DEFAULT_SENSITIVE_PATTERNS = [
21
+ '**/.env',
22
+ '**/.env.*',
23
+ '**/*.env',
24
+ '**/.npmrc',
25
+ '**/.pypirc',
26
+ '**/.netrc',
27
+ '**/.htpasswd',
28
+ '**/.git-credentials',
29
+ '**/credentials',
30
+ '**/credentials.*',
31
+ '**/secrets',
32
+ '**/secrets.*',
33
+ '**/*.pem',
34
+ '**/*.key',
35
+ '**/*.p12',
36
+ '**/*.pfx',
37
+ '**/*.jks',
38
+ '**/*.keystore',
39
+ '**/*.crt',
40
+ '**/id_rsa*',
41
+ '**/id_ed25519*',
42
+ '**/.ssh/**',
43
+ '**/service-account*.json',
44
+ ];
45
+ export const DEFAULT_CONFIG = {
46
+ version: 1,
47
+ root: '.',
48
+ include: [...DEFAULT_INCLUDE],
49
+ exclude: [...DEFAULT_EXCLUDE],
50
+ ignore: [],
51
+ languages: ['typescript', 'javascript'],
52
+ features: {
53
+ architecture: true,
54
+ dependencies: true,
55
+ conventions: true,
56
+ decisions: true,
57
+ git: true,
58
+ search: true,
59
+ },
60
+ analysis: {
61
+ moduleDepth: 2,
62
+ concurrency: 0, // 0 => derive from the machine (see util/concurrency)
63
+ maxFileSizeBytes: 1_048_576,
64
+ followSymlinks: false,
65
+ sourceRoots: ['src', 'lib', 'app', 'apps', 'packages', 'services'],
66
+ git: {
67
+ windowDays: 180,
68
+ maxCommits: 5000,
69
+ recentDays: 30,
70
+ architectureSignalPatterns: ['refactor', 'architecture', 'adr', 'breaking', 'migrat', 'restructure', 'rewrite'],
71
+ },
72
+ },
73
+ output: {
74
+ includeTimestamp: false,
75
+ prettyJson: true,
76
+ conventionsMarkdown: true,
77
+ },
78
+ security: {
79
+ allowSensitiveFiles: false,
80
+ redactSecrets: true,
81
+ extraSensitivePatterns: [],
82
+ },
83
+ };
84
+ /** Directories searched for architecture decision records and documentation. */
85
+ export const DECISION_SOURCES = [
86
+ 'docs',
87
+ 'docs/adr',
88
+ 'adr',
89
+ 'adrs',
90
+ 'architecture',
91
+ 'docs/architecture',
92
+ 'doc',
93
+ 'spec',
94
+ 'specs',
95
+ ];
96
+ /** Documented package.json fields that represent entry points. */
97
+ export const PACKAGE_ENTRY_FIELDS = ['main', 'module', 'types', 'browser', 'exports', 'bin'];
98
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAGA,kDAAkD;AAClD,MAAM,CAAC,MAAM,eAAe,GAAa;IACvC,iBAAiB;IACjB,SAAS;IACT,UAAU;IACV,QAAQ;IACR,aAAa;IACb,WAAW;IACX,WAAW;IACX,SAAS;IACT,WAAW;IACX,WAAW;IACX,UAAU;IACV,WAAW;IACX,UAAU;IACV,gBAAgB;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEpI,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GAAa;IAClD,SAAS;IACT,WAAW;IACX,UAAU;IACV,WAAW;IACX,YAAY;IACZ,WAAW;IACX,cAAc;IACd,qBAAqB;IACrB,gBAAgB;IAChB,kBAAkB;IAClB,YAAY;IACZ,cAAc;IACd,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,eAAe;IACf,UAAU;IACV,YAAY;IACZ,gBAAgB;IAChB,YAAY;IACZ,0BAA0B;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAuB;IAChD,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,GAAG;IACT,OAAO,EAAE,CAAC,GAAG,eAAe,CAAC;IAC7B,OAAO,EAAE,CAAC,GAAG,eAAe,CAAC;IAC7B,MAAM,EAAE,EAAE;IACV,SAAS,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;IACvC,QAAQ,EAAE;QACR,YAAY,EAAE,IAAI;QAClB,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI;QACf,GAAG,EAAE,IAAI;QACT,MAAM,EAAE,IAAI;KACb;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,CAAC,EAAE,sDAAsD;QACtE,gBAAgB,EAAE,SAAS;QAC3B,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC;QAClE,GAAG,EAAE;YACH,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,EAAE;YACd,0BAA0B,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC;SAChH;KACF;IACD,MAAM,EAAE;QACN,gBAAgB,EAAE,KAAK;QACvB,UAAU,EAAE,IAAI;QAChB,mBAAmB,EAAE,IAAI;KAC1B;IACD,QAAQ,EAAE;QACR,mBAAmB,EAAE,KAAK;QAC1B,aAAa,EAAE,IAAI;QACnB,sBAAsB,EAAE,EAAE;KAC3B;CACF,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,MAAM,gBAAgB,GAAa;IACxC,MAAM;IACN,UAAU;IACV,KAAK;IACL,MAAM;IACN,cAAc;IACd,mBAAmB;IACnB,KAAK;IACL,MAAM;IACN,OAAO;CACR,CAAC;AAEF,kEAAkE;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAU,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { AgentContextConfig, ConfigOverrides, LoadedConfig } from './types.ts';
2
+ /** Deep merge of CLI overrides on top of a resolved configuration. */
3
+ export declare function applyOverrides(config: AgentContextConfig, overrides: ConfigOverrides | undefined): AgentContextConfig;
4
+ /** Validation of the merged result (guards against contradictory overrides). */
5
+ export declare function validateMerged(config: AgentContextConfig): string[];
6
+ export interface LoadConfigOptions {
7
+ /** Repository root (absolute or relative to `process.cwd()`). */
8
+ root: string;
9
+ /** CLI overrides; take precedence over the config file. */
10
+ overrides?: ConfigOverrides;
11
+ /** Explicit config file path. Defaults to `<root>/.agent/config.json`. */
12
+ configPath?: string;
13
+ /** Skip reading the config file entirely (used by `init`). */
14
+ ignoreFile?: boolean;
15
+ }
16
+ export declare function loadConfig(options: LoadConfigOptions): Promise<LoadedConfig>;
17
+ /** Synchronous config resolution for CLI startup paths that must not await. */
18
+ export declare function resolveConfigSync(root: string, overrides?: ConfigOverrides, configText?: string): LoadedConfig;
19
+ /** Validates an already parsed configuration object (used by tests and adapters). */
20
+ export declare function normalizeConfig(raw: unknown): AgentContextConfig;
21
+ /** Writes `.agent/config.json`, creating `.agent/` when necessary. */
22
+ export declare function writeConfigFile(root: string, config: AgentContextConfig, pretty?: boolean): Promise<string>;
23
+ /** Configuration template written by `agent-context init` (documented in the README). */
24
+ export declare function initConfigTemplate(): AgentContextConfig;
25
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpF,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,eAAe,GAAG,SAAS,GAAG,kBAAkB,CAmBrH;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAYnE;AAED,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAqBlF;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAc9G;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAEhE;AAED,sEAAsE;AACtE,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAM9G;AAED,yFAAyF;AACzF,wBAAgB,kBAAkB,IAAI,kBAAkB,CAEvD"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Configuration loading and merging.
3
+ *
4
+ * Precedence (highest first):
5
+ * 1. CLI flags (`ConfigOverrides`)
6
+ * 2. `.agent/config.json`
7
+ * 3. built-in defaults
8
+ */
9
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
10
+ import { existsSync } from 'node:fs';
11
+ import path from 'node:path';
12
+ import { ConfigError } from "../errors.js";
13
+ import { hashValue, stringifyCanonical } from "../model/canonical.js";
14
+ import { AGENT_DIR, CONFIG_FILE } from "../model/schema.js";
15
+ import { DEFAULT_CONFIG } from "./defaults.js";
16
+ import { parseConfigText, validateConfig } from "./validate.js";
17
+ /** Deep merge of CLI overrides on top of a resolved configuration. */
18
+ export function applyOverrides(config, overrides) {
19
+ if (!overrides)
20
+ return config;
21
+ const merged = {
22
+ ...config,
23
+ include: overrides.include ?? config.include,
24
+ exclude: overrides.exclude ?? config.exclude,
25
+ ignore: overrides.ignore ?? config.ignore,
26
+ languages: overrides.languages ?? config.languages,
27
+ features: { ...config.features, ...(overrides.features ?? {}) },
28
+ analysis: {
29
+ ...config.analysis,
30
+ ...(overrides.analysis ?? {}),
31
+ git: { ...config.analysis.git, ...(overrides.analysis?.git ?? {}) },
32
+ },
33
+ output: { ...config.output, ...(overrides.output ?? {}) },
34
+ security: { ...config.security, ...(overrides.security ?? {}) },
35
+ };
36
+ if (overrides.root !== undefined)
37
+ merged.root = overrides.root;
38
+ return merged;
39
+ }
40
+ /** Validation of the merged result (guards against contradictory overrides). */
41
+ export function validateMerged(config) {
42
+ const warnings = [];
43
+ if (config.include.length === 0) {
44
+ warnings.push('include patterns are empty: no files will be analyzed');
45
+ }
46
+ if (config.languages.length === 0) {
47
+ warnings.push('no languages configured: no source files will be parsed');
48
+ }
49
+ if (config.analysis.moduleDepth < 1) {
50
+ throw new ConfigError('analysis.moduleDepth must be >= 1', ['Set moduleDepth to at least 1 in .agent/config.json.']);
51
+ }
52
+ return warnings;
53
+ }
54
+ export async function loadConfig(options) {
55
+ const root = path.resolve(options.root);
56
+ const configPath = options.configPath ? path.resolve(options.configPath) : path.join(root, CONFIG_FILE);
57
+ const warnings = [];
58
+ let fileConfig = structuredClone(DEFAULT_CONFIG);
59
+ let source = null;
60
+ if (!options.ignoreFile && existsSync(configPath)) {
61
+ source = path.relative(root, configPath).split(path.sep).join('/');
62
+ const text = await readFile(configPath, 'utf8');
63
+ const validated = parseConfigText(text, source);
64
+ fileConfig = validated.config;
65
+ warnings.push(...validated.warnings);
66
+ }
67
+ const config = applyOverrides(fileConfig, options.overrides);
68
+ warnings.push(...validateMerged(config));
69
+ // Note: `root` is intentionally excluded from the hash — moving a repository
70
+ // must not invalidate the local cache.
71
+ const hash = hashValue({ ...config, root: '.' });
72
+ return { config, source, hash, warnings };
73
+ }
74
+ /** Synchronous config resolution for CLI startup paths that must not await. */
75
+ export function resolveConfigSync(root, overrides, configText) {
76
+ const configPath = path.join(path.resolve(root), CONFIG_FILE);
77
+ const warnings = [];
78
+ let fileConfig = structuredClone(DEFAULT_CONFIG);
79
+ let source = null;
80
+ if (configText !== undefined) {
81
+ source = path.relative(root, configPath).split(path.sep).join('/');
82
+ const validated = parseConfigText(configText, source);
83
+ fileConfig = validated.config;
84
+ warnings.push(...validated.warnings);
85
+ }
86
+ const config = applyOverrides(fileConfig, overrides);
87
+ warnings.push(...validateMerged(config));
88
+ return { config, source, hash: hashValue({ ...config, root: '.' }), warnings };
89
+ }
90
+ /** Validates an already parsed configuration object (used by tests and adapters). */
91
+ export function normalizeConfig(raw) {
92
+ return validateConfig(raw).config;
93
+ }
94
+ /** Writes `.agent/config.json`, creating `.agent/` when necessary. */
95
+ export async function writeConfigFile(root, config, pretty = true) {
96
+ const agentDir = path.join(root, AGENT_DIR);
97
+ await mkdir(agentDir, { recursive: true });
98
+ const target = path.join(root, CONFIG_FILE);
99
+ await writeFile(target, stringifyCanonical(config, pretty), 'utf8');
100
+ return target;
101
+ }
102
+ /** Configuration template written by `agent-context init` (documented in the README). */
103
+ export function initConfigTemplate() {
104
+ return structuredClone(DEFAULT_CONFIG);
105
+ }
106
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Configuration model of `ai-agent-context`.
3
+ *
4
+ * Configuration lives in `.agent/config.json` and can be overridden by CLI
5
+ * flags, which always take precedence over the file.
6
+ */
7
+ export interface FeaturesConfig {
8
+ architecture: boolean;
9
+ dependencies: boolean;
10
+ conventions: boolean;
11
+ decisions: boolean;
12
+ /** Git metadata analysis (recently changed files, activity, ownership). */
13
+ git: boolean;
14
+ /** Local search index / query support. */
15
+ search: boolean;
16
+ }
17
+ export interface GitAnalysisConfig {
18
+ /** How far back `git log` looks, in days. */
19
+ windowDays: number;
20
+ /** Hard cap on parsed commits, to keep large repositories fast. */
21
+ maxCommits: number;
22
+ /** Window (days) used for the `recentChanges` / `recentActivity` signal. */
23
+ recentDays: number;
24
+ /** Patterns that mark a commit message as an architectural change signal. */
25
+ architectureSignalPatterns: string[];
26
+ }
27
+ export interface AnalysisConfig {
28
+ /**
29
+ * Maximum directory depth below a workspace package root at which
30
+ * automatically detected modules are created.
31
+ */
32
+ moduleDepth: number;
33
+ /** Bounded concurrency for file system and parsing work. */
34
+ concurrency: number;
35
+ /** Files larger than this are recorded but not parsed. */
36
+ maxFileSizeBytes: number;
37
+ /** Never followed by default: symlink loops are a real risk in monorepos. */
38
+ followSymlinks: boolean;
39
+ /** Directories treated as source roots when deriving module ids. */
40
+ sourceRoots: string[];
41
+ git: GitAnalysisConfig;
42
+ }
43
+ export interface OutputConfig {
44
+ /**
45
+ * When `true`, `generatedAt` is written into `.agent/index.json`. Disabled by
46
+ * default so that an unchanged repository produces an unchanged context.
47
+ */
48
+ includeTimestamp: boolean;
49
+ prettyJson: boolean;
50
+ /** Generate the human readable `.agent/conventions.md` projection. */
51
+ conventionsMarkdown: boolean;
52
+ }
53
+ export interface SecurityConfig {
54
+ /** Opt-in escape hatch for reading `.env`-like files. Off by default. */
55
+ allowSensitiveFiles: boolean;
56
+ /** Redact secret-looking values from excerpts copied into the context. */
57
+ redactSecrets: boolean;
58
+ /** Additional glob patterns treated as sensitive. */
59
+ extraSensitivePatterns: string[];
60
+ }
61
+ export interface AgentContextConfig {
62
+ version: number;
63
+ root: string;
64
+ include: string[];
65
+ exclude: string[];
66
+ ignore: string[];
67
+ languages: string[];
68
+ features: FeaturesConfig;
69
+ analysis: AnalysisConfig;
70
+ output: OutputConfig;
71
+ security: SecurityConfig;
72
+ }
73
+ /** Deep partial used for CLI overrides and `init --force` templates. */
74
+ export interface ConfigOverrides {
75
+ root?: string;
76
+ include?: string[];
77
+ exclude?: string[];
78
+ ignore?: string[];
79
+ languages?: string[];
80
+ features?: Partial<FeaturesConfig>;
81
+ analysis?: Partial<Omit<AnalysisConfig, 'git'>> & {
82
+ git?: Partial<GitAnalysisConfig>;
83
+ };
84
+ output?: Partial<OutputConfig>;
85
+ security?: Partial<SecurityConfig>;
86
+ }
87
+ export interface LoadedConfig {
88
+ config: AgentContextConfig;
89
+ /** Path of the config file that was read, or `null` for pure defaults. */
90
+ source: string | null;
91
+ /** Stable hash of the resolved configuration (used for cache invalidation). */
92
+ hash: string;
93
+ warnings: string[];
94
+ }
95
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,GAAG,EAAE,OAAO,CAAC;IACb,0CAA0C;IAC1C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,0BAA0B,EAAE,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,gBAAgB,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,cAAc,EAAE,OAAO,CAAC;IACxB,oEAAoE;IACpE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,EAAE,iBAAiB,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,mBAAmB,EAAE,OAAO,CAAC;IAC7B,0EAA0E;IAC1E,aAAa,EAAE,OAAO,CAAC;IACvB,qDAAqD;IACrD,sBAAsB,EAAE,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,wEAAwE;AACxE,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,GAAG;QAAE,GAAG,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;KAAE,CAAC;IACvF,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,0EAA0E;IAC1E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Configuration model of `ai-agent-context`.
3
+ *
4
+ * Configuration lives in `.agent/config.json` and can be overridden by CLI
5
+ * flags, which always take precedence over the file.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}