@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
@@ -0,0 +1,524 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * Zod schema for the on-disk raw Gaunt Sloth config (`RawGthConfig`).
4
+ *
5
+ * This is the single source of truth for config validation and for the generated
6
+ * JSON Schema (`packages/core/schema/gsloth-config.schema.json`). It models the
7
+ * canonical config shape only — the deprecated aliases (`contentProvider`,
8
+ * `requirementsProvider`, `contentProviderConfig`, `requirementsProviderConfig`)
9
+ * are intentionally NOT part of the schema. GS2-28 (a 2.0 breaking release with NO
10
+ * back-compat coercion) turns those deprecated shapes into HARD validation errors:
11
+ * {@link findDeprecatedConfigIssues} detects them on the raw input BEFORE the schema
12
+ * parse and each entry point (loader `validateRawConfigLayer`, read-side
13
+ * {@link validateRawGthConfig}) rejects the config with a message naming the canonical
14
+ * replacement + migration path. Detection runs on the RAW input on purpose: zod's
15
+ * per-command `z.object` strips unknown keys, so a nested `commands.*.contentProvider`
16
+ * would vanish before any schema-embedded check could see it.
17
+ *
18
+ * Design notes:
19
+ * - The top-level object is a {@link z.looseObject} so unknown keys PASS THROUGH
20
+ * (they are neither stripped nor a hard failure). The loader separately diffs
21
+ * present-vs-known top-level keys ({@link findUnknownTopLevelKeys}) to warn about
22
+ * likely typos without failing. That typo-tolerance is deliberate: only the KNOWN
23
+ * deprecated names ({@link findDeprecatedConfigIssues}) hard-fail; a genuine typo
24
+ * (e.g. `pulrequest`) still only warns.
25
+ * - Every field is optional. The schema validates the *shape/type of what is
26
+ * present*, not requiredness. In particular `llm` is optional so the loader's
27
+ * existing "must at least define llm.type" checks remain the authority on llm
28
+ * validity (and keep emitting their established messages).
29
+ * - Runtime-object-bearing fields (`tools`, `middleware`, `mcpServers`,
30
+ * `a2aAgents`, `builtInToolsConfig`) are modelled permissively because JS/MJS
31
+ * `configure()` returns live instances/objects there.
32
+ *
33
+ * The exported {@link RawGthConfig}/{@link GthConfig} interfaces in `config.ts`
34
+ * remain the public type surface; the `z.infer` here ({@link RawGthConfigInput})
35
+ * is additive and legitimately differs (no deprecated fields).
36
+ */
37
+ import { z } from 'zod';
38
+ const filesystemSchema = z.union([z.array(z.string()), z.enum(['all', 'read', 'none'])]);
39
+ /**
40
+ * TLS trust for outbound HTTPS (MCP servers over `http` transport, and — because the mechanism is
41
+ * a process-global undici dispatcher — every other `fetch`, including LLM provider calls). Lets a
42
+ * config point Node's `fetch` at a private/corporate CA without prepending `NODE_EXTRA_CA_CERTS`
43
+ * on every invocation (that env var is read once at Node startup and can't be set from config).
44
+ */
45
+ const tlsSchema = z.object({
46
+ // Extra CA cert file(s) to TRUST in ADDITION to Node's built-in roots. Paths resolve
47
+ // relative-to-project (or `~`/absolute). Additive — this never removes a default root.
48
+ extraCaCerts: z.array(z.string()).optional(),
49
+ // DANGER: `false` disables TLS certificate verification for ALL outbound HTTPS this process makes
50
+ // (not just MCP — LLM calls too). Escape hatch only; emits a loud security warning every session.
51
+ rejectUnauthorized: z.boolean().optional(),
52
+ });
53
+ const llmConfigSchema = z.looseObject({
54
+ type: z.string().optional(),
55
+ model: z.string().optional(),
56
+ configuration: z.record(z.string(), z.unknown()).optional(),
57
+ apiKeyEnvironmentVariable: z.string().optional(),
58
+ });
59
+ const ratingConfigSchema = z.object({
60
+ enabled: z.boolean().optional(),
61
+ passThreshold: z.number().optional(),
62
+ maxRating: z.number().optional(),
63
+ minRating: z.number().optional(),
64
+ errorOnReviewFail: z.boolean().optional(),
65
+ });
66
+ const customCommandParameterSchema = z.object({
67
+ description: z.string(),
68
+ allow: z
69
+ .array(z.enum(['absolute-paths', 'directory-traversal', 'shell-injection', 'null-bytes']))
70
+ .optional(),
71
+ });
72
+ const customCommandConfigSchema = z.object({
73
+ command: z.string(),
74
+ description: z.string(),
75
+ parameters: z.record(z.string(), customCommandParameterSchema).optional(),
76
+ timeout: z.number().optional(),
77
+ });
78
+ const customToolsConfigSchema = z.record(z.string(), customCommandConfigSchema);
79
+ const customToolsOrFalseSchema = z.union([z.literal(false), customToolsConfigSchema]);
80
+ const binaryFormatConfigSchema = z.object({
81
+ type: z.enum(['image', 'file', 'audio', 'video', 'binary']),
82
+ extensions: z.array(z.string()),
83
+ maxSize: z.number().optional(),
84
+ mimeTypes: z.record(z.string(), z.string()).optional(),
85
+ });
86
+ const binaryFormatsSchema = z.union([z.literal(false), z.array(binaryFormatConfigSchema)]);
87
+ const shellJudgeSchema = z.union([
88
+ z.boolean(),
89
+ z.object({
90
+ enabled: z.boolean().optional(),
91
+ autoApproveLow: z.boolean().optional(),
92
+ blockHigh: z.boolean().optional(),
93
+ model: llmConfigSchema.optional(),
94
+ }),
95
+ ]);
96
+ /**
97
+ * CFG-18 — the per-tool config object carried as a value in the widened `builtInTools` registry.
98
+ * One permissive shape covering every tool: `command` for the fixed dev-command tools
99
+ * (run_tests/run_lint/run_build/run_single_test), the EXT-9/10/12 knobs for `run_shell_command`
100
+ * (`yolo` is the folded former `shellYolo`), `fileSet` for `gth_grep` (GS2-51), and `enabled` for a
101
+ * plain built-in tool.
102
+ */
103
+ const builtInToolConfigSchema = z.object({
104
+ enabled: z.boolean().optional(),
105
+ command: z.string().optional(),
106
+ timeout: z.number().optional(),
107
+ maxOutputBytes: z.number().optional(),
108
+ allowlist: z.boolean().optional(),
109
+ persistAllowlist: z.boolean().optional(),
110
+ judge: shellJudgeSchema.optional(),
111
+ yolo: z.boolean().optional(),
112
+ // GS2-51 — `gth_grep`: which corpus to search. `gitignore` (default) respects .gitignore/.ignore
113
+ // and skips hidden dot-files; `all` scans everything but the noise dirs. See BuiltInToolConfig.
114
+ fileSet: z.enum(['gitignore', 'all']).optional(),
115
+ });
116
+ /**
117
+ * CFG-18 — the widened `builtInTools` setting: either the legacy `string[]` (each name enabled) or
118
+ * a registry keyed by tool name whose values enable (`true`), force-disable (`false`), or configure
119
+ * ({@link builtInToolConfigSchema}) each tool. Replaces `builtInTools: string[]` + per-command
120
+ * `devTools`.
121
+ */
122
+ const builtInToolsSchema = z.union([
123
+ z.array(z.string()),
124
+ z.record(z.string(), z.union([z.boolean(), builtInToolConfigSchema])),
125
+ ]);
126
+ const prCommandSchema = z.object({
127
+ contentSource: z.string().optional(),
128
+ requirementSource: z.string().optional(),
129
+ filesystem: filesystemSchema.optional(),
130
+ builtInTools: builtInToolsSchema.optional(),
131
+ customTools: customToolsOrFalseSchema.optional(),
132
+ allowedTools: z.array(z.string()).optional(),
133
+ logWorkForReviewInSeconds: z.number().optional(),
134
+ rating: ratingConfigSchema.optional(),
135
+ binaryFormats: binaryFormatsSchema.optional(),
136
+ });
137
+ const reviewCommandSchema = z.object({
138
+ contentSource: z.string().optional(),
139
+ requirementSource: z.string().optional(),
140
+ filesystem: filesystemSchema.optional(),
141
+ builtInTools: builtInToolsSchema.optional(),
142
+ customTools: customToolsOrFalseSchema.optional(),
143
+ allowedTools: z.array(z.string()).optional(),
144
+ rating: ratingConfigSchema.optional(),
145
+ binaryFormats: binaryFormatsSchema.optional(),
146
+ });
147
+ const askCommandSchema = z.object({
148
+ filesystem: filesystemSchema.optional(),
149
+ builtInTools: builtInToolsSchema.optional(),
150
+ customTools: customToolsOrFalseSchema.optional(),
151
+ allowedTools: z.array(z.string()).optional(),
152
+ binaryFormats: binaryFormatsSchema.optional(),
153
+ });
154
+ const chatCommandSchema = z.object({
155
+ filesystem: filesystemSchema.optional(),
156
+ builtInTools: builtInToolsSchema.optional(),
157
+ customTools: customToolsOrFalseSchema.optional(),
158
+ allowedTools: z.array(z.string()).optional(),
159
+ binaryFormats: binaryFormatsSchema.optional(),
160
+ });
161
+ const codeCommandSchema = z.object({
162
+ filesystem: filesystemSchema.optional(),
163
+ builtInTools: builtInToolsSchema.optional(),
164
+ customTools: customToolsOrFalseSchema.optional(),
165
+ allowedTools: z.array(z.string()).optional(),
166
+ binaryFormats: binaryFormatsSchema.optional(),
167
+ });
168
+ const execCommandSchema = z.object({
169
+ filesystem: filesystemSchema.optional(),
170
+ builtInTools: builtInToolsSchema.optional(),
171
+ customTools: customToolsOrFalseSchema.optional(),
172
+ allowedTools: z.array(z.string()).optional(),
173
+ binaryFormats: binaryFormatsSchema.optional(),
174
+ });
175
+ const apiCommandSchema = z.object({
176
+ filesystem: filesystemSchema.optional(),
177
+ builtInTools: builtInToolsSchema.optional(),
178
+ port: z.number().optional(),
179
+ cors: z
180
+ .object({
181
+ allowOrigin: z.string().optional(),
182
+ allowMethods: z.string().optional(),
183
+ allowHeaders: z.string().optional(),
184
+ })
185
+ .optional(),
186
+ });
187
+ const commandsSchema = z.object({
188
+ pr: prCommandSchema.optional(),
189
+ review: reviewCommandSchema.optional(),
190
+ ask: askCommandSchema.optional(),
191
+ chat: chatCommandSchema.optional(),
192
+ code: codeCommandSchema.optional(),
193
+ exec: execCommandSchema.optional(),
194
+ api: apiCommandSchema.optional(),
195
+ });
196
+ /**
197
+ * The command names, derived from {@link commandsSchema}'s own shape so it can never drift
198
+ * from the schema. A command config must live under `commands.<cmd>`; the SAME name appearing
199
+ * at the config ROOT is the removed pre-2.0 top-level shape and is hard-rejected by
200
+ * {@link findDeprecatedConfigIssues}. (None of these are valid top-level keys, so there is no
201
+ * collision with {@link KNOWN_TOP_LEVEL_KEYS}.)
202
+ */
203
+ const COMMAND_KEYS = Object.keys(commandsSchema.shape);
204
+ /**
205
+ * Zod schema for the raw, on-disk Gaunt Sloth config. Loose at the top level so
206
+ * unknown keys are preserved (warn-only via {@link findUnknownTopLevelKeys}).
207
+ */
208
+ export const rawGthConfigSchema = z.looseObject({
209
+ // Allow a JSON Schema reference for editor support; never read at runtime.
210
+ $schema: z.string().optional(),
211
+ llm: llmConfigSchema.optional(),
212
+ // Selects the agent backend. `lean` (the default when omitted) uses the plain LangChain agent
213
+ // with gsloth's full toolset (no `/large_tool_results` offload). `deep` is the EXPERIMENTAL,
214
+ // opt-in deepagents runtime and emits a warning when selected. The ACP server is deep-only.
215
+ agent: z
216
+ .object({
217
+ backend: z.enum(['deep', 'lean']).optional(),
218
+ })
219
+ .optional(),
220
+ // GS2-7 (B20) — local, opt-in session history. DEFAULT OFF: absent or `enabled: false` means
221
+ // nothing is persisted and runs behave exactly as before (stateless identity preserved).
222
+ history: z
223
+ .object({
224
+ enabled: z.boolean().optional(),
225
+ dbPath: z.string().optional(),
226
+ })
227
+ .optional(),
228
+ // GS2-7 (B21) — opt-in file-backed memory (MEMORY.md / USER.md). DEFAULT OFF. The toggle exists
229
+ // for forward-compat; the feature itself is a deferred follow-up.
230
+ memory: z
231
+ .object({
232
+ enabled: z.boolean().optional(),
233
+ })
234
+ .optional(),
235
+ binaryFormats: binaryFormatsSchema.optional(),
236
+ contentSource: z.string().optional(),
237
+ requirementSource: z.string().optional(),
238
+ contentSourceConfig: z.record(z.string(), z.unknown()).optional(),
239
+ requirementSourceConfig: z.record(z.string(), z.unknown()).optional(),
240
+ projectGuidelines: z.string().optional(),
241
+ identityProfile: z.string().optional(),
242
+ includeCurrentDateAfterGuidelines: z.boolean().optional(),
243
+ organization: z
244
+ .object({
245
+ name: z.string().optional(),
246
+ locale: z.string().optional(),
247
+ timezone: z.string().optional(),
248
+ })
249
+ .optional(),
250
+ projectReviewInstructions: z.string().optional(),
251
+ noDefaultPrompts: z.boolean().optional(),
252
+ filesystem: filesystemSchema.optional(),
253
+ builtInTools: builtInToolsSchema.optional(),
254
+ // Live tool instances / toolkits in JS configs — kept permissive.
255
+ tools: z.array(z.unknown()).optional(),
256
+ allowedTools: z.array(z.string()).optional(),
257
+ // Predefined (string/object) or custom (object) middleware — permissive.
258
+ middleware: z.array(z.unknown()).optional(),
259
+ streamOutput: z.boolean().optional(),
260
+ writeOutputToFile: z.union([z.boolean(), z.string()]).optional(),
261
+ writeBinaryOutputsToFile: z.boolean().optional(),
262
+ useColour: z.boolean().optional(),
263
+ streamSessionInferenceLog: z.boolean().optional(),
264
+ canInterruptInferenceWithEsc: z.boolean().optional(),
265
+ debugLog: z.boolean().optional(),
266
+ recursionLimit: z.number().optional(),
267
+ consoleLevel: z.union([z.string(), z.number()]).optional(),
268
+ customTools: customToolsConfigSchema.optional(),
269
+ mcpServers: z.record(z.string(), z.unknown()).optional(),
270
+ tls: tlsSchema.optional(),
271
+ a2aAgents: z.record(z.string(), z.unknown()).optional(),
272
+ builtInToolsConfig: z.record(z.string(), z.unknown()).optional(),
273
+ aiignore: z
274
+ .object({
275
+ enabled: z.boolean().optional(),
276
+ patterns: z.array(z.string()).optional(),
277
+ })
278
+ .optional(),
279
+ commands: commandsSchema.optional(),
280
+ // GS2-35 — identity used in the `Co-Authored-By` trailer of agent-authored git commits. Optional;
281
+ // when omitted the agent is instructed to co-author as the Gaunt Sloth account
282
+ // (`Gaunt Sloth <code@gauntsloth.app>`), NEVER the underlying model. Either field may be set
283
+ // alone; the other falls back to its default (see `appendCommitCoAuthorNote`).
284
+ commit: z
285
+ .object({
286
+ coAuthor: z
287
+ .object({
288
+ name: z.string().optional(),
289
+ email: z.string().optional(),
290
+ })
291
+ .optional(),
292
+ })
293
+ .optional(),
294
+ modelDisplayName: z.string().optional(),
295
+ // GS2-34 — inject the resolved active `provider:model` identity into the system prompt (default ON;
296
+ // set `false` to opt out for reproducible / model-agnostic runs). Defaulted at the read site, so it
297
+ // is intentionally absent from DEFAULT_CONFIG (no effective-config snapshot churn).
298
+ injectModelContext: z.boolean().optional(),
299
+ // GS2-47 — secret-redaction for `/debug-dump` artifacts. `redact` DEFAULTS ON (omitted = redact);
300
+ // set `false` to write a raw, unredacted archive (the command then shows a loud secrets warning).
301
+ // Defaulted at the read site (`!== false`), not in DEFAULT_CONFIG, to avoid churning the
302
+ // effective-config snapshot (à la GS2-34 injectModelContext).
303
+ debugDump: z
304
+ .object({
305
+ redact: z.boolean().optional(),
306
+ })
307
+ .optional(),
308
+ allowDirs: z.array(z.string()).optional(),
309
+ askWriteMode: z.boolean().optional(),
310
+ // GS2-63 — output surface controls. `header` DEFAULTS ON (omitted = show); set `false` to
311
+ // suppress the technical run-header preamble (the Workdir/Model/Tools/Middleware block, the
312
+ // `Press Escape or Q to interrupt` hint, and their surrounding blank lines) in NON-TUI text
313
+ // modes (`--no-tui`, `ask`, `exec`, `eval`, `pr`, `review`, piped/CI), keeping captured stdout /
314
+ // log diffs clean. The interactive TUI ignores it and always shows the header. Suppresses ONLY
315
+ // that preamble — never model/tool output, errors, or config-validation warnings. Defaulted at
316
+ // the read site (`!== false`), not in DEFAULT_CONFIG, to avoid churning the effective-config
317
+ // snapshot (à la GS2-34 injectModelContext).
318
+ output: z
319
+ .object({
320
+ header: z.boolean().optional(),
321
+ })
322
+ .optional(),
323
+ // BATCH-19 — custom `gth eval` reporters. Maps a reporter NAME (as selected with
324
+ // `--reporter <name>`) to a MODULE PATH (relative to the project dir) whose default export is an
325
+ // `EvalReporterFactory` (`() => EvalReporter`). Registered through the same seam the bundled
326
+ // reporters use; a name here overrides a built-in of the same name.
327
+ reporters: z.record(z.string(), z.string()).optional(),
328
+ });
329
+ /**
330
+ * The set of known top-level config keys, derived from the schema shape so it can
331
+ * never drift from {@link rawGthConfigSchema}. Includes `$schema`.
332
+ */
333
+ export const KNOWN_TOP_LEVEL_KEYS = new Set(Object.keys(rawGthConfigSchema.shape));
334
+ /**
335
+ * True when a raw config value is a plain (non-null, non-array) object, so the key scans
336
+ * ({@link findDeprecatedConfigIssues}, {@link findUnknownTopLevelKeys}) are safe to run. A
337
+ * `null`/array/primitive config (e.g. a JSON file that is just `null`, or a module
338
+ * `configure()` returning null) must NOT reach those scans — they'd throw on
339
+ * `hasOwnProperty`/`Object.keys`; the entry points instead hand it straight to
340
+ * `rawGthConfigSchema.safeParse`, which reports a clean "expected object" error.
341
+ */
342
+ export function isRecordConfig(value) {
343
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
344
+ }
345
+ /**
346
+ * Return the top-level keys present in `raw` that are not part of the known config
347
+ * surface. KNOWN deprecated names are rejected earlier by {@link findDeprecatedConfigIssues}
348
+ * (the entry points short-circuit on those), so a key that reaches here is a genuinely
349
+ * unknown key (a likely typo) that only warrants a warning.
350
+ */
351
+ export function findUnknownTopLevelKeys(raw) {
352
+ return Object.keys(raw).filter((key) => !KNOWN_TOP_LEVEL_KEYS.has(key));
353
+ }
354
+ /**
355
+ * Render ` - <path>: <message>` lines (one per issue), with `(root)` for an empty
356
+ * path. Shared by {@link formatConfigValidationError} (Zod issues) and
357
+ * {@link formatDeprecatedConfigIssues} (deprecated-shape issues) so both surfaces read
358
+ * identically.
359
+ */
360
+ function formatIssueLines(issues) {
361
+ return issues.map((issue) => ` - ${issue.path || '(root)'}: ${issue.message}`).join('\n');
362
+ }
363
+ /**
364
+ * Render a friendly, path-scoped validation message from a Zod error. Each issue
365
+ * becomes a line ` - <path>: <message>`, with `(root)` for top-level issues.
366
+ */
367
+ export function formatConfigValidationError(error) {
368
+ return formatIssueLines(error.issues.map((issue) => ({
369
+ path: issue.path.length > 0 ? issue.path.join('.') : '',
370
+ message: issue.message,
371
+ })));
372
+ }
373
+ /** Deprecated → canonical key pairs at the config root (SSOT for the rejecter). */
374
+ const DEPRECATED_ROOT_PAIRS = [
375
+ ['contentProvider', 'contentSource'],
376
+ ['requirementsProvider', 'requirementSource'],
377
+ ['contentProviderConfig', 'contentSourceConfig'],
378
+ ['requirementsProviderConfig', 'requirementSourceConfig'],
379
+ ];
380
+ /** Deprecated → canonical key pairs inside a `commands.<name>` block (SSOT for the rejecter). */
381
+ const DEPRECATED_COMMAND_PAIRS = [
382
+ ['contentProvider', 'contentSource'],
383
+ ['requirementsProvider', 'requirementSource'],
384
+ ];
385
+ /**
386
+ * CFG-18 — removed per-command keys with no 1:1 rename: the config they carried was FOLDED into
387
+ * another key. `[removed, replacement]`. `devTools` (the split dev/shell config) is now configured
388
+ * under the unified `builtInTools` registry. Rejected here specifically because `devTools` lived
389
+ * under a per-command `z.object`, which SILENTLY STRIPS unknown keys — so without this pre-parse
390
+ * reject an old `commands.<cmd>.devTools` block would vanish with no error (worse than today).
391
+ */
392
+ const REMOVED_COMMAND_KEYS = [
393
+ ['devTools', 'builtInTools'],
394
+ ];
395
+ /**
396
+ * Pointer to the migration path, appended to every deprecated-shape error so the user
397
+ * always learns HOW to fix it, not just that it broke. Matches the guidance the 2.0
398
+ * migration notes carry.
399
+ */
400
+ const MIGRATION_HINT = 'See the 2.0 migration notes (or run `gth config migrate` / `gth doctor --fix`).';
401
+ /**
402
+ * GS2-28 — detect the removed pre-2.0 config shapes on the RAW input (read-only; no
403
+ * mutation), returning one {@link DeprecatedConfigIssue} per occurrence. A non-empty
404
+ * result is a HARD validation failure: 2.0 dropped back-compat coercion, so an old shape
405
+ * must error and point at the fix rather than be silently remapped or ignored.
406
+ *
407
+ * Detects:
408
+ * - (A) a COMMAND name ({@link COMMAND_KEYS}) at the config ROOT — must move under `commands.<cmd>`;
409
+ * - (C) a deprecated `*Provider*` name ({@link DEPRECATED_ROOT_PAIRS} at root,
410
+ * {@link DEPRECATED_COMMAND_PAIRS} per command) — must use its `*Source*` replacement;
411
+ * - (D, CFG-18) a removed per-command key folded into another ({@link REMOVED_COMMAND_KEYS}, e.g.
412
+ * `commands.<cmd>.devTools` → configure under `builtInTools`).
413
+ *
414
+ * Runs on the raw input specifically so nested `commands.*.contentProvider` is still visible
415
+ * (zod's per-command `z.object` would strip it before any schema-embedded check could fire).
416
+ * A genuinely-unknown key is NOT flagged here (it stays a warn-only unknown key), preserving
417
+ * the deliberate typo-tolerance.
418
+ */
419
+ export function findDeprecatedConfigIssues(raw) {
420
+ const issues = [];
421
+ // (A) Command name used as a top-level key — command configs must live under commands.<cmd>.
422
+ for (const command of COMMAND_KEYS) {
423
+ if (Object.prototype.hasOwnProperty.call(raw, command)) {
424
+ issues.push({
425
+ path: command,
426
+ message: `Top-level command config "${command}" is no longer supported in 2.0. ` +
427
+ `Move it under "commands.${command}". ${MIGRATION_HINT}`,
428
+ });
429
+ }
430
+ }
431
+ // (C) Deprecated *Provider* names at the config root.
432
+ for (const [deprecated, canonical] of DEPRECATED_ROOT_PAIRS) {
433
+ if (Object.prototype.hasOwnProperty.call(raw, deprecated)) {
434
+ issues.push({
435
+ path: deprecated,
436
+ message: `Config property "${deprecated}" was renamed in 2.0. Use "${canonical}" instead. ` +
437
+ MIGRATION_HINT,
438
+ });
439
+ }
440
+ }
441
+ // (C) Deprecated *Provider* names + (CFG-18) removed keys inside each commands.<name> block.
442
+ const commands = raw.commands;
443
+ if (commands && typeof commands === 'object' && !Array.isArray(commands)) {
444
+ for (const [name, cmd] of Object.entries(commands)) {
445
+ if (cmd && typeof cmd === 'object' && !Array.isArray(cmd)) {
446
+ for (const [deprecated, canonical] of DEPRECATED_COMMAND_PAIRS) {
447
+ if (Object.prototype.hasOwnProperty.call(cmd, deprecated)) {
448
+ issues.push({
449
+ path: `commands.${name}.${deprecated}`,
450
+ message: `Config property "${deprecated}" in commands.${name} was renamed in 2.0. ` +
451
+ `Use "${canonical}" instead. ${MIGRATION_HINT}`,
452
+ });
453
+ }
454
+ }
455
+ // (CFG-18) removed per-command keys folded into another key (e.g. devTools → builtInTools).
456
+ for (const [removed, replacement] of REMOVED_COMMAND_KEYS) {
457
+ if (Object.prototype.hasOwnProperty.call(cmd, removed)) {
458
+ issues.push({
459
+ path: `commands.${name}.${removed}`,
460
+ message: `Config property "${removed}" in commands.${name} is no longer supported in 2.0. ` +
461
+ `Configure tools under "${replacement}" instead. ${MIGRATION_HINT}`,
462
+ });
463
+ }
464
+ }
465
+ }
466
+ }
467
+ }
468
+ return issues;
469
+ }
470
+ /**
471
+ * Render {@link DeprecatedConfigIssue}s as the same ` - <path>: <message>` block used for
472
+ * Zod validation errors, so a deprecated-shape rejection reads identically to a type-mismatch
473
+ * rejection (loader wraps it with `Invalid configuration in <source>:`).
474
+ */
475
+ export function formatDeprecatedConfigIssues(issues) {
476
+ return formatIssueLines(issues);
477
+ }
478
+ /**
479
+ * Generate the JSON Schema for the raw config from {@link rawGthConfigSchema} using
480
+ * zod 4's native `z.toJSONSchema`. The output is committed to
481
+ * `packages/core/schema/gsloth-config.schema.json` and asserted by a golden test.
482
+ */
483
+ export function generateConfigJsonSchema() {
484
+ return z.toJSONSchema(rawGthConfigSchema, { io: 'input' });
485
+ }
486
+ /**
487
+ * Validate a freshly-loaded raw config object against {@link rawGthConfigSchema} and
488
+ * report the outcome as data (a pure function — no `displayWarning`/`exit`). Mirrors the
489
+ * loader's policy: a removed pre-2.0 shape (a top-level command key or a deprecated
490
+ * `*Provider*` name) is a HARD failure that names the fix, unknown top-level keys warn but
491
+ * do not fail, and a genuine type mismatch on a known field fails with a path-scoped message.
492
+ *
493
+ * Read-only: `findDeprecatedConfigIssues`, `findUnknownTopLevelKeys` and `safeParse` never
494
+ * mutate `raw`, so no defensive copy is needed.
495
+ */
496
+ export function validateRawGthConfig(raw) {
497
+ const warnings = [];
498
+ // Only an object config can carry deprecated/unknown keys. A null/array/primitive config is
499
+ // handed straight to safeParse (below), which returns a clean "expected object" failure — the
500
+ // scans would otherwise throw a raw TypeError, and coercing to {} would wrongly report ok:true.
501
+ if (isRecordConfig(raw)) {
502
+ // Removed pre-2.0 shapes short-circuit before the unknown-key warning: any deprecated name
503
+ // present is hard-rejected here (and so never doubles as an unknown-key warning).
504
+ const deprecatedIssues = findDeprecatedConfigIssues(raw);
505
+ if (deprecatedIssues.length > 0) {
506
+ return {
507
+ ok: false,
508
+ warnings: [],
509
+ errorMessage: formatDeprecatedConfigIssues(deprecatedIssues),
510
+ };
511
+ }
512
+ const unknownKeys = findUnknownTopLevelKeys(raw);
513
+ if (unknownKeys.length > 0) {
514
+ warnings.push(`Unknown top-level config ${unknownKeys.length === 1 ? 'key' : 'keys'}: ` +
515
+ `${unknownKeys.join(', ')} (kept as-is but ignored by Gaunt Sloth; check for typos).`);
516
+ }
517
+ }
518
+ const result = rawGthConfigSchema.safeParse(raw);
519
+ if (!result.success) {
520
+ return { ok: false, warnings, errorMessage: formatConfigValidationError(result.error) };
521
+ }
522
+ return { ok: true, warnings };
523
+ }
524
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}