@gaunt-sloth/core 2.0.0-alpha.2 → 2.0.0-alpha.21

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 (158) hide show
  1. package/.gsloth.code.md +10 -0
  2. package/README.md +6 -6
  3. package/dist/config/defaults.d.ts +85 -0
  4. package/dist/config/defaults.js +103 -0
  5. package/dist/config/defaults.js.map +1 -0
  6. package/dist/config/jsonc.d.ts +12 -0
  7. package/dist/config/jsonc.js +41 -0
  8. package/dist/config/jsonc.js.map +1 -0
  9. package/dist/config/loader.d.ts +169 -0
  10. package/dist/config/loader.js +872 -0
  11. package/dist/config/loader.js.map +1 -0
  12. package/dist/config/schema.d.ts +673 -0
  13. package/dist/config/schema.js +524 -0
  14. package/dist/config/schema.js.map +1 -0
  15. package/dist/config/shell-policy.d.ts +331 -0
  16. package/dist/config/shell-policy.js +238 -0
  17. package/dist/config/shell-policy.js.map +1 -0
  18. package/dist/config/types.d.ts +596 -0
  19. package/dist/config/types.js +13 -0
  20. package/dist/config/types.js.map +1 -0
  21. package/dist/config.d.ts +18 -647
  22. package/dist/config.js +15 -516
  23. package/dist/config.js.map +1 -1
  24. package/dist/constants.d.ts +42 -0
  25. package/dist/constants.js +42 -0
  26. package/dist/constants.js.map +1 -1
  27. package/dist/core/GthAbstractAgent.d.ts +85 -2
  28. package/dist/core/GthAbstractAgent.js +398 -28
  29. package/dist/core/GthAbstractAgent.js.map +1 -1
  30. package/dist/core/GthAgentRunner.d.ts +158 -1
  31. package/dist/core/GthAgentRunner.js +367 -4
  32. package/dist/core/GthAgentRunner.js.map +1 -1
  33. package/dist/core/GthLangChainAgent.js +193 -16
  34. package/dist/core/GthLangChainAgent.js.map +1 -1
  35. package/dist/core/debugCapture.d.ts +59 -0
  36. package/dist/core/debugCapture.js +101 -0
  37. package/dist/core/debugCapture.js.map +1 -0
  38. package/dist/core/gthLeanAgentFactory.d.ts +9 -0
  39. package/dist/core/gthLeanAgentFactory.js +10 -0
  40. package/dist/core/gthLeanAgentFactory.js.map +1 -0
  41. package/dist/core/plainToolIndication.d.ts +15 -0
  42. package/dist/core/plainToolIndication.js +148 -0
  43. package/dist/core/plainToolIndication.js.map +1 -0
  44. package/dist/core/runStats.d.ts +41 -0
  45. package/dist/core/runStats.js +73 -0
  46. package/dist/core/runStats.js.map +1 -0
  47. package/dist/core/shell/ShellCommandFailedError.d.ts +54 -0
  48. package/dist/core/shell/ShellCommandFailedError.js +68 -0
  49. package/dist/core/shell/ShellCommandFailedError.js.map +1 -0
  50. package/dist/core/shell/allowlist.d.ts +75 -0
  51. package/dist/core/shell/allowlist.js +187 -0
  52. package/dist/core/shell/allowlist.js.map +1 -0
  53. package/dist/core/shell/arity.d.ts +75 -0
  54. package/dist/core/shell/arity.js +313 -0
  55. package/dist/core/shell/arity.js.map +1 -0
  56. package/dist/core/shell/judge.d.ts +161 -0
  57. package/dist/core/shell/judge.js +261 -0
  58. package/dist/core/shell/judge.js.map +1 -0
  59. package/dist/core/shell/normalize.d.ts +27 -0
  60. package/dist/core/shell/normalize.js +53 -0
  61. package/dist/core/shell/normalize.js.map +1 -0
  62. package/dist/core/toolDisplay.d.ts +101 -0
  63. package/dist/core/toolDisplay.js +374 -0
  64. package/dist/core/toolDisplay.js.map +1 -0
  65. package/dist/core/toolOutputChannel.d.ts +68 -0
  66. package/dist/core/toolOutputChannel.js +112 -0
  67. package/dist/core/toolOutputChannel.js.map +1 -0
  68. package/dist/core/types.d.ts +173 -0
  69. package/dist/core/types.js.map +1 -1
  70. package/dist/history/historyFormat.d.ts +28 -0
  71. package/dist/history/historyFormat.js +127 -0
  72. package/dist/history/historyFormat.js.map +1 -0
  73. package/dist/history/historyStore.d.ts +198 -0
  74. package/dist/history/historyStore.js +482 -0
  75. package/dist/history/historyStore.js.map +1 -0
  76. package/dist/history/recordSession.d.ts +37 -0
  77. package/dist/history/recordSession.js +56 -0
  78. package/dist/history/recordSession.js.map +1 -0
  79. package/dist/index.d.ts +4 -0
  80. package/dist/index.js +4 -0
  81. package/dist/index.js.map +1 -1
  82. package/dist/providers/anthropic.d.ts +1 -1
  83. package/dist/providers/anthropic.js +5 -10
  84. package/dist/providers/anthropic.js.map +1 -1
  85. package/dist/providers/deepseek.d.ts +1 -1
  86. package/dist/providers/deepseek.js +5 -10
  87. package/dist/providers/deepseek.js.map +1 -1
  88. package/dist/providers/geminiSchemaSanitizer.d.ts +52 -0
  89. package/dist/providers/geminiSchemaSanitizer.js +201 -0
  90. package/dist/providers/geminiSchemaSanitizer.js.map +1 -0
  91. package/dist/providers/google-genai.d.ts +1 -1
  92. package/dist/providers/google-genai.js +9 -11
  93. package/dist/providers/google-genai.js.map +1 -1
  94. package/dist/providers/groq.d.ts +1 -1
  95. package/dist/providers/groq.js +5 -10
  96. package/dist/providers/groq.js.map +1 -1
  97. package/dist/providers/huggingface.d.ts +25 -0
  98. package/dist/providers/huggingface.js +69 -0
  99. package/dist/providers/huggingface.js.map +1 -0
  100. package/dist/providers/modelCatalog.d.ts +109 -0
  101. package/dist/providers/modelCatalog.js +245 -0
  102. package/dist/providers/modelCatalog.js.map +1 -0
  103. package/dist/providers/modelDiscovery.d.ts +111 -3
  104. package/dist/providers/modelDiscovery.js +183 -27
  105. package/dist/providers/modelDiscovery.js.map +1 -1
  106. package/dist/providers/ollama.d.ts +19 -5
  107. package/dist/providers/ollama.js +60 -52
  108. package/dist/providers/ollama.js.map +1 -1
  109. package/dist/providers/openai.d.ts +1 -1
  110. package/dist/providers/openai.js +5 -10
  111. package/dist/providers/openai.js.map +1 -1
  112. package/dist/providers/openrouter.d.ts +1 -1
  113. package/dist/providers/openrouter.js +12 -12
  114. package/dist/providers/openrouter.js.map +1 -1
  115. package/dist/providers/vertexai.d.ts +1 -1
  116. package/dist/providers/vertexai.js +9 -11
  117. package/dist/providers/vertexai.js.map +1 -1
  118. package/dist/providers/xai.d.ts +1 -1
  119. package/dist/providers/xai.js +5 -10
  120. package/dist/providers/xai.js.map +1 -1
  121. package/dist/runtime/askStructured.d.ts +62 -0
  122. package/dist/runtime/askStructured.js +76 -0
  123. package/dist/runtime/askStructured.js.map +1 -0
  124. package/dist/runtime/conversation.d.ts +59 -0
  125. package/dist/runtime/conversation.js +137 -0
  126. package/dist/runtime/conversation.js.map +1 -0
  127. package/dist/runtime/singleShot.d.ts +24 -5
  128. package/dist/runtime/singleShot.js +56 -9
  129. package/dist/runtime/singleShot.js.map +1 -1
  130. package/dist/utils/aiignoreUtils.js.map +1 -1
  131. package/dist/utils/binaryOutputUtils.js.map +1 -1
  132. package/dist/utils/consoleUtils.d.ts +22 -0
  133. package/dist/utils/consoleUtils.js +45 -0
  134. package/dist/utils/consoleUtils.js.map +1 -1
  135. package/dist/utils/debugDump.d.ts +57 -0
  136. package/dist/utils/debugDump.js +236 -0
  137. package/dist/utils/debugDump.js.map +1 -0
  138. package/dist/utils/debugUtils.d.ts +13 -4
  139. package/dist/utils/debugUtils.js +36 -13
  140. package/dist/utils/debugUtils.js.map +1 -1
  141. package/dist/utils/fileUtils.d.ts +24 -2
  142. package/dist/utils/fileUtils.js +54 -12
  143. package/dist/utils/fileUtils.js.map +1 -1
  144. package/dist/utils/llmUtils.js.map +1 -1
  145. package/dist/utils/redactSecrets.d.ts +63 -0
  146. package/dist/utils/redactSecrets.js +238 -0
  147. package/dist/utils/redactSecrets.js.map +1 -0
  148. package/dist/utils/systemPromptNotes.d.ts +181 -0
  149. package/dist/utils/systemPromptNotes.js +298 -0
  150. package/dist/utils/systemPromptNotes.js.map +1 -0
  151. package/dist/utils/systemUtils.d.ts +32 -1
  152. package/dist/utils/systemUtils.js +50 -3
  153. package/dist/utils/systemUtils.js.map +1 -1
  154. package/dist/utils/toolMatching.d.ts +30 -0
  155. package/dist/utils/toolMatching.js +44 -0
  156. package/dist/utils/toolMatching.js.map +1 -0
  157. package/package.json +17 -8
  158. package/schema/gsloth-config.schema.json +2111 -0
package/dist/config.js CHANGED
@@ -7,521 +7,20 @@
7
7
  * Refer to {@link DEFAULT_CONFIG} for default configuration.
8
8
  *
9
9
  * Some config params can be overriden from command line, see {@link CommandLineConfigOverrides}
10
- */
11
- import { PROJECT_GUIDELINES, PROJECT_REVIEW_INSTRUCTIONS, USER_PROJECT_CONFIG_JS, USER_PROJECT_CONFIG_JSON, USER_PROJECT_CONFIG_MJS, } from '#src/constants.js';
12
- import { StatusLevel } from '#src/core/types.js';
13
- import { displayDebug, displayError, displayInfo, displayWarning, setConsoleLevel, } from '#src/utils/consoleUtils.js';
14
- import { getGslothConfigReadPath, importExternalFile } from '#src/utils/fileUtils.js';
15
- import { getGlobalGslothConfigReadPath } from '#src/utils/globalConfigUtils.js';
16
- import { error, exit, isTTY, setUseColour } from '#src/utils/systemUtils.js';
17
- import { existsSync, readFileSync } from 'node:fs';
18
- export const availableDefaultConfigs = [
19
- 'vertexai',
20
- 'anthropic',
21
- 'groq',
22
- 'deepseek',
23
- 'openai',
24
- 'google-genai',
25
- 'xai',
26
- 'openrouter',
27
- 'ollama',
28
- ];
29
- /**
30
- * Default config
31
- */
32
- export const DEFAULT_CONFIG = {
33
- contentSource: 'file',
34
- requirementSource: 'file',
35
- contentProvider: 'file',
36
- requirementsProvider: 'file',
37
- /**
38
- * Path to project-specific guidelines.
39
- * The default is `.gsloth.guidelines.md`; this config may be used to point Gaunt Sloth to a different file,
40
- * for example, to AGENTS.md
41
- */
42
- projectGuidelines: PROJECT_GUIDELINES,
43
- /**
44
- * Whether to include the current date in the project review instructions or not.
45
- */
46
- includeCurrentDateAfterGuidelines: false,
47
- projectReviewInstructions: PROJECT_REVIEW_INSTRUCTIONS,
48
- filesystem: 'none',
49
- debugLog: false,
50
- consoleLevel: StatusLevel.INFO, // Default to INFO level, not debug
51
- /**
52
- * Default provider for both requirements and content is GitHub.
53
- * It needs GitHub CLI (gh).
54
- *
55
- * `github` content provider uses `gh pr diff NN` internally. {@link src/providers/ghPrDiffProvider.ts!}
56
- *
57
- *
58
- * `github` requirements provider `gh issue view NN` internally
59
- */
60
- commands: {
61
- pr: {
62
- contentSource: 'github',
63
- requirementSource: 'github',
64
- contentProvider: 'github',
65
- requirementsProvider: 'github',
66
- rating: {
67
- enabled: true,
68
- passThreshold: 6,
69
- minRating: 0,
70
- maxRating: 10,
71
- errorOnReviewFail: true,
72
- },
73
- },
74
- review: {
75
- rating: {
76
- enabled: true,
77
- passThreshold: 6,
78
- minRating: 0,
79
- maxRating: 10,
80
- errorOnReviewFail: true,
81
- },
82
- },
83
- ask: {
84
- filesystem: 'read',
85
- },
86
- chat: {
87
- filesystem: 'read',
88
- },
89
- code: {
90
- filesystem: 'all',
91
- },
92
- exec: {
93
- filesystem: 'all',
94
- },
95
- api: {
96
- filesystem: 'read',
97
- port: 3000,
98
- cors: {
99
- allowOrigin: 'http://localhost:3000',
100
- allowMethods: 'POST, GET, OPTIONS',
101
- allowHeaders: 'Content-Type, Accept',
102
- },
103
- },
104
- },
105
- streamOutput: true,
106
- writeOutputToFile: true,
107
- writeBinaryOutputsToFile: true,
108
- useColour: true,
109
- streamSessionInferenceLog: true,
110
- canInterruptInferenceWithEsc: true,
111
- aiignore: {
112
- enabled: true,
113
- patterns: undefined,
114
- },
115
- };
116
- /**
117
- * Needed DEFAULT_CONFIG to be plain const to be picked up by typedoc,
118
- * this cast here is just for typecheck.
119
- */
120
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
121
- DEFAULT_CONFIG;
122
- /**
123
- * Loads the global gsloth config (if present) from the global `~/.gsloth` folder.
124
- *
125
- * Precedence support: the returned raw config is intended to act as the BASE that the
126
- * project config (and CLI overrides) merge on top of, so any value here is the lowest
127
- * user-controlled layer (still above {@link DEFAULT_CONFIG}).
128
- *
129
- * Lookup order within the global folder, first match wins:
130
- * `.gsloth.config.json` -> `.gsloth.config.js` -> `.gsloth.config.mjs`
131
- *
132
- * Absence of every variant is a no-op: returns `undefined` so behaviour is unchanged.
133
- *
134
- * NOTE: secrets (API keys) may live in this file; this function must never log its
135
- * contents. Only non-sensitive diagnostics (the resolved path / parse failure) are emitted.
136
- *
137
- * @returns The raw global config object, or `undefined` when no global config exists.
138
- */
139
- export async function loadGlobalRawConfig() {
140
- // JSON first (the must-have format).
141
- const jsonPath = getGlobalGslothConfigReadPath(USER_PROJECT_CONFIG_JSON);
142
- if (existsSync(jsonPath)) {
143
- try {
144
- return JSON.parse(readFileSync(jsonPath, 'utf8'));
145
- }
146
- catch (e) {
147
- displayDebug(e instanceof Error ? e : String(e));
148
- displayWarning(`Failed to read global config from ${jsonPath}, ignoring it.`);
149
- return undefined;
150
- }
151
- }
152
- // Then JS / MJS variants (dynamic import of a `configure()` module).
153
- for (const filename of [USER_PROJECT_CONFIG_JS, USER_PROJECT_CONFIG_MJS]) {
154
- const modulePath = getGlobalGslothConfigReadPath(filename);
155
- if (existsSync(modulePath)) {
156
- try {
157
- const imported = await importExternalFile(modulePath);
158
- const configured = await imported.configure();
159
- return configured;
160
- }
161
- catch (e) {
162
- displayDebug(e instanceof Error ? e : String(e));
163
- displayWarning(`Failed to read global config from ${modulePath}, ignoring it.`);
164
- return undefined;
165
- }
166
- }
167
- }
168
- return undefined;
169
- }
170
- /**
171
- * Deep-merges a loaded global raw config UNDER the given project raw config, so the
172
- * project config wins on conflicting keys. When no global config exists this is a no-op
173
- * and the original project config is returned unchanged.
174
- */
175
- async function applyGlobalConfigBase(projectRawConfig) {
176
- const globalRawConfig = await loadGlobalRawConfig();
177
- if (!globalRawConfig) {
178
- return projectRawConfig;
179
- }
180
- return deepMerge(globalRawConfig, projectRawConfig);
181
- }
182
- /**
183
- * Returns true when a project-level config file (json/js/mjs) exists for the given
184
- * overrides. Honours `customConfigPath` and the active identity profile so the check
185
- * matches exactly what {@link initConfig} would attempt to load.
186
10
  *
187
- * This is the project half of CFG-10's "is any config present?" detection; the global
188
- * half is {@link loadGlobalRawConfig} (used by {@link hasAnyConfig}).
189
- */
190
- export function hasProjectConfig(commandLineConfigOverrides) {
191
- if (commandLineConfigOverrides.customConfigPath) {
192
- return existsSync(commandLineConfigOverrides.customConfigPath);
193
- }
194
- return [USER_PROJECT_CONFIG_JSON, USER_PROJECT_CONFIG_JS, USER_PROJECT_CONFIG_MJS].some((filename) => existsSync(getGslothConfigReadPath(filename, commandLineConfigOverrides.identityProfile)));
195
- }
196
- /**
197
- * CFG-10 — true when ANY usable configuration is present, either a project config file
198
- * (json/js/mjs) or a standalone global config (`~/.gsloth/.gsloth.config.*`). When this
199
- * returns false the caller should run the first-run dialog instead of erroring.
200
- *
201
- * Reuses CFG-8's project + global detection so the two paths can never disagree.
202
- */
203
- export async function hasAnyConfig(commandLineConfigOverrides) {
204
- if (hasProjectConfig(commandLineConfigOverrides)) {
205
- return true;
206
- }
207
- return (await loadGlobalRawConfig()) !== undefined;
208
- }
209
- /**
210
- * Initialize configuration by loading from available config files
211
- * @returns The loaded GthConfig
212
- */
213
- export async function initConfig(commandLineConfigOverrides) {
214
- if (commandLineConfigOverrides.customConfigPath &&
215
- !existsSync(commandLineConfigOverrides.customConfigPath)) {
216
- throw new Error(`Provided manual config "${commandLineConfigOverrides.customConfigPath}" does not exist`);
217
- }
218
- const jsonConfigPath = commandLineConfigOverrides.customConfigPath ??
219
- getGslothConfigReadPath(USER_PROJECT_CONFIG_JSON, commandLineConfigOverrides.identityProfile);
220
- // CFG-8 — when no project config file of any format exists, fall back to a standalone
221
- // global config (loaded alone) before erroring. Project config still takes precedence:
222
- // this branch only runs when there is no project file to apply the global config under.
223
- if (!hasProjectConfig(commandLineConfigOverrides)) {
224
- const globalRawConfig = await loadGlobalRawConfig();
225
- if (globalRawConfig) {
226
- if (globalRawConfig.llm &&
227
- typeof globalRawConfig.llm === 'object' &&
228
- 'type' in globalRawConfig.llm) {
229
- // Route the global config through the same path the project JSON uses.
230
- return await tryJsonConfig(globalRawConfig, commandLineConfigOverrides);
231
- }
232
- displayError('Global configuration found but it is not in valid format. Should at least define llm.type');
233
- exit(1);
234
- // Unreachable past exit(1) in production; keeps TS happy and prevents test exit.
235
- throw new Error('Unexpected error occurred.');
236
- }
237
- }
238
- // Try loading the JSON config file first
239
- if (jsonConfigPath.endsWith('.json') && existsSync(jsonConfigPath)) {
240
- try {
241
- // TODO makes sense to employ ZOD to validate config
242
- const projectJsonConfig = JSON.parse(readFileSync(jsonConfigPath, 'utf8'));
243
- // Apply global config as the base layer (project config wins on conflicts).
244
- const jsonConfig = (await applyGlobalConfigBase(projectJsonConfig));
245
- // If the config has an LLM with a type, create the appropriate LLM instance
246
- if (jsonConfig.llm && typeof jsonConfig.llm === 'object' && 'type' in jsonConfig.llm) {
247
- return await tryJsonConfig(jsonConfig, commandLineConfigOverrides);
248
- }
249
- else {
250
- error(`${jsonConfigPath} is not in valid format. Should at least define llm.type`);
251
- exit(1);
252
- // noinspection ExceptionCaughtLocallyJS
253
- // This throw is unreachable due to exit(1) above, but satisfies TS type analysis and prevents tests from exiting
254
- // noinspection ExceptionCaughtLocallyJS
255
- throw new Error('Unexpected error occurred.');
256
- }
257
- }
258
- catch (e) {
259
- displayDebug(e instanceof Error ? e : String(e));
260
- displayError(`Failed to read config from ${USER_PROJECT_CONFIG_JSON}, will try other formats.`);
261
- // Continue to try other formats
262
- return await tryJsConfig(commandLineConfigOverrides);
263
- }
264
- }
265
- else {
266
- // JSON config not found, try JS
267
- return tryJsConfig(commandLineConfigOverrides);
268
- }
269
- }
270
- // Helper function to try loading JS config
271
- async function tryJsConfig(commandLineConfigOverrides) {
272
- const jsConfigPath = commandLineConfigOverrides.customConfigPath ??
273
- getGslothConfigReadPath(USER_PROJECT_CONFIG_JS, commandLineConfigOverrides.identityProfile);
274
- if (jsConfigPath.endsWith('.js') && existsSync(jsConfigPath)) {
275
- try {
276
- const i = await importExternalFile(jsConfigPath);
277
- const customConfig = await i.configure();
278
- const mergedWithGlobal = await applyGlobalConfigBase(customConfig);
279
- return await mergeConfig(mergedWithGlobal, commandLineConfigOverrides);
280
- }
281
- catch (e) {
282
- displayDebug(e instanceof Error ? e : String(e));
283
- displayError(`Failed to read config from ${USER_PROJECT_CONFIG_JS}, will try other formats.`);
284
- // Continue to try other formats
285
- return await tryMjsConfig(commandLineConfigOverrides);
286
- }
287
- }
288
- else {
289
- // JS config not found, try MJS
290
- return await tryMjsConfig(commandLineConfigOverrides);
291
- }
292
- }
293
- // Helper function to try loading MJS config
294
- async function tryMjsConfig(commandLineConfigOverrides) {
295
- const mjsConfigPath = commandLineConfigOverrides.customConfigPath ??
296
- getGslothConfigReadPath(USER_PROJECT_CONFIG_MJS, commandLineConfigOverrides.identityProfile);
297
- if (mjsConfigPath.endsWith('.mjs') && existsSync(mjsConfigPath)) {
298
- try {
299
- const i = await importExternalFile(mjsConfigPath);
300
- const customConfig = await i.configure();
301
- const mergedWithGlobal = await applyGlobalConfigBase(customConfig);
302
- return await mergeConfig(mergedWithGlobal, commandLineConfigOverrides);
303
- }
304
- catch (e) {
305
- displayDebug(e instanceof Error ? e : String(e));
306
- displayError(`Failed to read config from ${USER_PROJECT_CONFIG_MJS}.`);
307
- displayError(`No valid configuration found. Please create a valid configuration file.`);
308
- exit(1);
309
- }
310
- }
311
- else {
312
- // No config files found
313
- displayError('No configuration file found. Please create one of: ' +
314
- `${USER_PROJECT_CONFIG_JSON}, ${USER_PROJECT_CONFIG_JS}, or ${USER_PROJECT_CONFIG_MJS} ` +
315
- 'in your project directory.');
316
- exit(1);
317
- }
318
- // This throw is unreachable due to exit(1) above, but satisfies TS type analysis and prevents tests from exiting
319
- throw new Error('Unexpected error occurred.');
320
- }
321
- /**
322
- * Process JSON LLM config by creating the appropriate LLM instance
323
- * @param jsonConfig - The parsed JSON config
324
- * @param commandLineConfigOverrides - command line config overrides
325
- * @returns Promise<GthConfig>
326
- */
327
- export async function tryJsonConfig(jsonConfig, commandLineConfigOverrides) {
328
- try {
329
- if (jsonConfig.llm && typeof jsonConfig.llm === 'object') {
330
- // Get the type of LLM (e.g. 'vertexai', 'anthropic') - this should exist
331
- const llmType = jsonConfig.llm.type;
332
- if (!llmType) {
333
- displayError('LLM type not specified in config.');
334
- exit(1);
335
- }
336
- // Get the configuration for the specific LLM type
337
- const llmConfig = jsonConfig.llm;
338
- if (commandLineConfigOverrides.verbose) {
339
- // Necessary to avoid https://github.com/langchain-ai/langchainjs/issues/8705
340
- llmConfig.verbose = commandLineConfigOverrides.verbose;
341
- }
342
- // Import the appropriate config module
343
- const configModule = await import(`#src/providers/${llmType}.js`);
344
- if (configModule.processJsonConfig) {
345
- const llm = (await configModule.processJsonConfig(llmConfig));
346
- const mergedConfig = mergeRawConfig(jsonConfig, llm, commandLineConfigOverrides);
347
- if (configModule.postProcessJsonConfig) {
348
- return await configModule.postProcessJsonConfig(mergedConfig);
349
- }
350
- else {
351
- return await mergedConfig;
352
- }
353
- }
354
- else {
355
- displayWarning(`Config module for ${llmType} does not have processJsonConfig function.`);
356
- exit(1);
357
- }
358
- }
359
- else {
360
- displayError('No LLM configuration found in config.');
361
- exit(1);
362
- }
363
- }
364
- catch (e) {
365
- if (e instanceof Error && e.message.includes('Cannot find module')) {
366
- displayError(`LLM type '${jsonConfig.llm.type}' not supported.`);
367
- }
368
- else {
369
- displayError(`Error processing LLM config: ${e instanceof Error ? e.message : String(e)}`);
370
- }
371
- exit(1);
372
- }
373
- // This throw is unreachable due to exit(1) above, but satisfies TS type analysis and prevents tests from exiting
374
- throw new Error('Unexpected error occurred.');
375
- }
376
- /**
377
- * Deep merge two objects, with source overriding target properties
378
- * @param target - The target object with default values
379
- * @param source - The source object with user overrides
380
- * @param maxDepth - Maximum recursion depth to prevent stack overflow (default: 4)
381
- */
382
- function deepMerge(target, source, maxDepth = 4) {
383
- if (!source)
384
- return target;
385
- if (!target)
386
- return source;
387
- const result = { ...target };
388
- // Return result without merging if depth is exceeded
389
- if (maxDepth === 0)
390
- return result;
391
- for (const key in source) {
392
- const sourceValue = source[key];
393
- const targetValue = target[key];
394
- if (sourceValue &&
395
- typeof sourceValue === 'object' &&
396
- !Array.isArray(sourceValue) &&
397
- targetValue &&
398
- typeof targetValue === 'object' &&
399
- !Array.isArray(targetValue)) {
400
- // Recursively merge nested objects
401
- result[key] = deepMerge(targetValue, sourceValue, maxDepth - 1);
402
- }
403
- else if (sourceValue !== undefined) {
404
- // Override with source value if it exists
405
- result[key] = sourceValue;
406
- }
407
- }
408
- return result;
409
- }
410
- /**
411
- * Merge config with default config
412
- */
413
- async function mergeConfig(partialConfig, commandLineConfigOverrides) {
414
- const config = partialConfig;
415
- // Migrate deprecated property names
416
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
417
- const raw = config;
418
- if (raw.contentProvider && !raw.contentSource) {
419
- displayWarning('Config property "contentProvider" is deprecated. Use "contentSource" instead.');
420
- config.contentSource = raw.contentProvider;
421
- }
422
- if (raw.requirementsProvider && !raw.requirementSource) {
423
- displayWarning('Config property "requirementsProvider" is deprecated. Use "requirementSource" instead.');
424
- config.requirementSource = raw.requirementsProvider;
425
- }
426
- // Keep both old and new in sync
427
- if (config.contentSource)
428
- config.contentProvider = config.contentSource;
429
- if (config.requirementSource)
430
- config.requirementsProvider = config.requirementSource;
431
- // Migrate command-level deprecated properties
432
- if (config.commands) {
433
- for (const cmdName of ['pr', 'review']) {
434
- const cmd = config.commands[cmdName];
435
- if (cmd) {
436
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
437
- const cmdRaw = cmd;
438
- if (cmdRaw.contentProvider && !cmdRaw.contentSource) {
439
- cmd.contentSource = cmdRaw.contentProvider;
440
- }
441
- if (cmdRaw.requirementsProvider && !cmdRaw.requirementSource) {
442
- cmd.requirementSource = cmdRaw.requirementsProvider;
443
- }
444
- if (cmd.contentSource)
445
- cmd.contentProvider = cmd.contentSource;
446
- if (cmd.requirementSource)
447
- cmd.requirementsProvider = cmd.requirementSource;
448
- }
449
- }
450
- }
451
- // Deep merge command configs while preserving defaults
452
- // Type complexity from DEFAULT_CONFIG.commands 'as const' requires any cast for deep merge result
453
- const mergedCommands = {
454
- pr: deepMerge(DEFAULT_CONFIG.commands.pr, config?.commands?.pr), // eslint-disable-line @typescript-eslint/no-explicit-any
455
- review: deepMerge(DEFAULT_CONFIG.commands.review, config?.commands?.review), // eslint-disable-line @typescript-eslint/no-explicit-any
456
- code: deepMerge(DEFAULT_CONFIG.commands.code, config?.commands?.code), // eslint-disable-line @typescript-eslint/no-explicit-any
457
- exec: deepMerge(DEFAULT_CONFIG.commands.exec, config?.commands?.exec), // eslint-disable-line @typescript-eslint/no-explicit-any
458
- ask: deepMerge(DEFAULT_CONFIG.commands.ask, config?.commands?.ask), // eslint-disable-line @typescript-eslint/no-explicit-any
459
- chat: deepMerge(DEFAULT_CONFIG.commands.chat, config?.commands?.chat), // eslint-disable-line @typescript-eslint/no-explicit-any
460
- api: deepMerge(DEFAULT_CONFIG.commands.api, config?.commands?.api), // eslint-disable-line @typescript-eslint/no-explicit-any
461
- };
462
- const mergedConfig = {
463
- ...DEFAULT_CONFIG,
464
- ...config,
465
- commands: mergedCommands,
466
- };
467
- if (commandLineConfigOverrides.identityProfile !== undefined) {
468
- displayInfo(`Activating profile: ${commandLineConfigOverrides.identityProfile}`);
469
- mergedConfig.identityProfile = commandLineConfigOverrides.identityProfile.trim();
470
- }
471
- if (commandLineConfigOverrides.verbose !== undefined) {
472
- mergedConfig.llm.verbose = commandLineConfigOverrides.verbose;
473
- }
474
- if (commandLineConfigOverrides.writeOutputToFile !== undefined) {
475
- mergedConfig.writeOutputToFile = commandLineConfigOverrides.writeOutputToFile;
476
- }
477
- // Set the useColour value in systemUtils
478
- setUseColour(mergedConfig.useColour);
479
- // Set console logging level
480
- if (mergedConfig.consoleLevel !== undefined) {
481
- const resolvedConsoleLevel = resolveConsoleLevel(mergedConfig.consoleLevel);
482
- if (resolvedConsoleLevel !== undefined) {
483
- mergedConfig.consoleLevel = resolvedConsoleLevel;
484
- setConsoleLevel(resolvedConsoleLevel);
485
- }
486
- else {
487
- displayWarning(`Invalid consoleLevel "${String(mergedConfig.consoleLevel)}", using default ${StatusLevel.INFO}.`);
488
- mergedConfig.consoleLevel = StatusLevel.INFO;
489
- setConsoleLevel(StatusLevel.INFO);
490
- }
491
- }
492
- mergedConfig.canInterruptInferenceWithEsc = mergedConfig.canInterruptInferenceWithEsc && isTTY();
493
- return mergedConfig;
494
- }
495
- const CONSOLE_LEVELS_BY_NAME = {
496
- debug: StatusLevel.DEBUG,
497
- info: StatusLevel.INFO,
498
- display: StatusLevel.DISPLAY,
499
- success: StatusLevel.SUCCESS,
500
- warning: StatusLevel.WARNING,
501
- error: StatusLevel.ERROR,
502
- stream: StatusLevel.STREAM,
503
- };
504
- function resolveConsoleLevel(level) {
505
- if (typeof level === 'number') {
506
- return StatusLevel[level] !== undefined ? level : undefined;
507
- }
508
- if (typeof level === 'string') {
509
- const normalized = level.trim().toLowerCase();
510
- if (normalized in CONSOLE_LEVELS_BY_NAME) {
511
- return CONSOLE_LEVELS_BY_NAME[normalized];
512
- }
513
- const enumValue = StatusLevel[level];
514
- if (typeof enumValue === 'number') {
515
- return enumValue;
516
- }
517
- }
518
- return undefined;
519
- }
520
- /**
521
- * Merge raw with default config
522
- */
523
- async function mergeRawConfig(config, llm, commandLineConfigOverrides) {
524
- const modelDisplayName = config.llm?.model;
525
- return await mergeConfig({ ...config, llm, modelDisplayName }, commandLineConfigOverrides);
526
- }
11
+ * This module is the **public barrel** for the configuration system. The implementation
12
+ * is split into focused modules under `config/`:
13
+ * - `config/types.ts` — the configuration type surface.
14
+ * - `config/shell-policy.ts` — {@link GthDevToolsConfig} + the shell/dev-tools resolvers.
15
+ * - `config/defaults.ts` {@link DEFAULT_CONFIG}.
16
+ * - `config/loader.ts` — discovery + the layered load/merge pipeline.
17
+ * - `config/schema.ts` — the Zod schema (single source of truth) + JSON-Schema generator.
18
+ *
19
+ * Every name that was previously exported from `config.ts` is re-exported here, so the
20
+ * public import path `@gaunt-sloth/core/config.js` (and `#src/config.js`) is unchanged.
21
+ */
22
+ export * from '#src/config/types.js';
23
+ export * from '#src/config/shell-policy.js';
24
+ export * from '#src/config/defaults.js';
25
+ export * from '#src/config/loader.js';
527
26
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC"}
@@ -4,6 +4,7 @@ export declare const GSLOTH_AUTH = ".gsloth-auth";
4
4
  export declare const USER_PROJECT_CONFIG_JS = ".gsloth.config.js";
5
5
  export declare const USER_PROJECT_CONFIG_JSON = ".gsloth.config.json";
6
6
  export declare const USER_PROJECT_CONFIG_MJS = ".gsloth.config.mjs";
7
+ export declare const USER_PROJECT_CONFIG_TS = ".gsloth.config.ts";
7
8
  export declare const GSLOTH_BACKSTORY = ".gsloth.backstory.md";
8
9
  export declare const PROJECT_GUIDELINES = ".gsloth.guidelines.md";
9
10
  export declare const PROJECT_REVIEW_INSTRUCTIONS = ".gsloth.review.md";
@@ -12,3 +13,44 @@ export declare const GSLOTH_CHAT_PROMPT = ".gsloth.chat.md";
12
13
  export declare const GSLOTH_CODE_PROMPT = ".gsloth.code.md";
13
14
  export declare const GSLOTH_EXEC_PROMPT = ".gsloth.exec.md";
14
15
  export declare const AIIGNORE_FILE = ".aiignore";
16
+ /**
17
+ * `$schema` pointer written into a generated `.gsloth.config.json` (GS2-1) so editors offer
18
+ * autocomplete + validation. The **hosted, major-pinned** URL is used rather than a relative
19
+ * `node_modules` path because the relative path only resolves when `@gaunt-sloth/core` sits in a
20
+ * `node_modules` beside the config, which is NOT the case for a globally-installed CLI
21
+ * (`npm i -g`): the schema lands in the global prefix, not next to the user's project config, so
22
+ * a relative pointer would silently fail to resolve. A hosted URL resolves for every install mode
23
+ * (global, npx, local, or a hand-written config with nothing installed) and is the standard
24
+ * convention editors fetch + cache.
25
+ *
26
+ * The channel is **major-pinned** (`/schema/v2/…`, not `latest` or `alpha`) so a config never
27
+ * revalidates against a future major it was not written for. The hosted copy is kept in sync with
28
+ * this package's generated schema by the deploy runbook in
29
+ * `websites/gauntsloth-site/schema/README.md` (interim, hand-run) and, in time, PLAT-9's automated
30
+ * release step. The schema still ships inside the package (`files: ["./schema/*"]`) as an offline
31
+ * artifact and golden-snapshot source of truth; it is just no longer what the pointer references.
32
+ */
33
+ export declare const CONFIG_SCHEMA_POINTER = "https://gauntsloth.app/schema/v2/gsloth-config.schema.json";
34
+ /**
35
+ * EXT-9 Tier-2: project-scoped persisted shell allow-list (`always` approvals).
36
+ * Lives under `.gsloth/.gsloth-settings/` like other project settings.
37
+ */
38
+ export declare const SHELL_ALLOWLIST_FILE = "shell-allowlist.json";
39
+ /**
40
+ * The `additionalToolNamePrefix` handed to `MultiServerMCPClient` so every MCP tool name is
41
+ * namespaced. Combined with `prefixToolNameWithServerName`, the adapter emits tool names shaped
42
+ * `${MCP_TOOL_NAME_PREFIX}__<serverName>__<toolName>` (the `__` separator is the mcp-adapters
43
+ * convention). Single-sourced here so the resolver that sets the prefix (EXT-32) and any consumer
44
+ * that groups tools back by server (the [[TUI-C20]] MCP debug tab) can never silently drift apart.
45
+ */
46
+ export declare const MCP_TOOL_NAME_PREFIX = "mcp";
47
+ /**
48
+ * GS2-35 — the canonical Git co-author identity for agent-authored commits. When Gaunt Sloth writes
49
+ * a commit (via `run_shell_command` `git commit`) the co-author is *Gaunt Sloth itself*, NOT the
50
+ * underlying model — attributing the commit to the model name (e.g. `Claude`, `GPT`) is factually
51
+ * wrong. Config (`commit.coAuthor`) overrides this; single-sourced so the config default and the
52
+ * prompt-guidance fallback ({@link import('#src/utils/systemPromptNotes.js').appendCommitCoAuthorNote})
53
+ * can never drift.
54
+ */
55
+ export declare const DEFAULT_COMMIT_CO_AUTHOR_NAME = "Gaunt Sloth";
56
+ export declare const DEFAULT_COMMIT_CO_AUTHOR_EMAIL = "code@gauntsloth.app";