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

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 (53) hide show
  1. package/.gsloth.code.md +10 -0
  2. package/README.md +3 -4
  3. package/dist/config/defaults.d.ts +84 -0
  4. package/dist/config/defaults.js +97 -0
  5. package/dist/config/defaults.js.map +1 -0
  6. package/dist/config/loader.d.ts +88 -0
  7. package/dist/config/loader.js +604 -0
  8. package/dist/config/loader.js.map +1 -0
  9. package/dist/config/schema.d.ts +471 -0
  10. package/dist/config/schema.js +301 -0
  11. package/dist/config/schema.js.map +1 -0
  12. package/dist/config/shell-policy.d.ts +212 -0
  13. package/dist/config/shell-policy.js +142 -0
  14. package/dist/config/shell-policy.js.map +1 -0
  15. package/dist/config/types.d.ts +453 -0
  16. package/dist/config/types.js +12 -0
  17. package/dist/config/types.js.map +1 -0
  18. package/dist/config.d.ts +18 -647
  19. package/dist/config.js +15 -516
  20. package/dist/config.js.map +1 -1
  21. package/dist/constants.d.ts +6 -0
  22. package/dist/constants.js +6 -0
  23. package/dist/constants.js.map +1 -1
  24. package/dist/core/GthAbstractAgent.d.ts +24 -1
  25. package/dist/core/GthAbstractAgent.js +86 -4
  26. package/dist/core/GthAbstractAgent.js.map +1 -1
  27. package/dist/core/GthAgentRunner.d.ts +127 -1
  28. package/dist/core/GthAgentRunner.js +298 -4
  29. package/dist/core/GthAgentRunner.js.map +1 -1
  30. package/dist/core/shell/allowlist.d.ts +75 -0
  31. package/dist/core/shell/allowlist.js +187 -0
  32. package/dist/core/shell/allowlist.js.map +1 -0
  33. package/dist/core/shell/arity.d.ts +75 -0
  34. package/dist/core/shell/arity.js +313 -0
  35. package/dist/core/shell/arity.js.map +1 -0
  36. package/dist/core/shell/judge.d.ts +161 -0
  37. package/dist/core/shell/judge.js +261 -0
  38. package/dist/core/shell/judge.js.map +1 -0
  39. package/dist/core/shell/normalize.d.ts +27 -0
  40. package/dist/core/shell/normalize.js +53 -0
  41. package/dist/core/shell/normalize.js.map +1 -0
  42. package/dist/core/types.d.ts +75 -0
  43. package/dist/core/types.js.map +1 -1
  44. package/dist/providers/openrouter.js +2 -2
  45. package/dist/providers/openrouter.js.map +1 -1
  46. package/dist/utils/fileUtils.d.ts +4 -1
  47. package/dist/utils/fileUtils.js +19 -10
  48. package/dist/utils/fileUtils.js.map +1 -1
  49. package/dist/utils/systemUtils.d.ts +31 -0
  50. package/dist/utils/systemUtils.js +38 -0
  51. package/dist/utils/systemUtils.js.map +1 -1
  52. package/package.json +12 -8
  53. package/schema/gsloth-config.schema.json +1548 -0
@@ -0,0 +1,471 @@
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. The loader maps those one-way to the
10
+ * canonical names ({@link preMapDeprecatedConfigNames}) BEFORE validating, so by
11
+ * the time a config reaches the schema it only uses canonical names.
12
+ *
13
+ * Design notes:
14
+ * - The top-level object is a {@link z.looseObject} so unknown keys PASS THROUGH
15
+ * (they are neither stripped nor a hard failure). The loader separately diffs
16
+ * present-vs-known top-level keys ({@link findUnknownTopLevelKeys}) to warn about
17
+ * likely typos without failing.
18
+ * - Every field is optional. The schema validates the *shape/type of what is
19
+ * present*, not requiredness. In particular `llm` is optional so the loader's
20
+ * existing "must at least define llm.type" checks remain the authority on llm
21
+ * validity (and keep emitting their established messages).
22
+ * - Runtime-object-bearing fields (`tools`, `middleware`, `mcpServers`,
23
+ * `a2aAgents`, `builtInToolsConfig`) are modelled permissively because JS/MJS
24
+ * `configure()` returns live instances/objects there.
25
+ *
26
+ * The exported {@link RawGthConfig}/{@link GthConfig} interfaces in `config.ts`
27
+ * remain the public type surface; the `z.infer` here ({@link RawGthConfigInput})
28
+ * is additive and legitimately differs (no deprecated fields).
29
+ */
30
+ import { z } from 'zod';
31
+ /**
32
+ * Zod schema for the raw, on-disk Gaunt Sloth config. Loose at the top level so
33
+ * unknown keys are preserved (warn-only via {@link findUnknownTopLevelKeys}).
34
+ */
35
+ export declare const rawGthConfigSchema: z.ZodObject<{
36
+ $schema: z.ZodOptional<z.ZodString>;
37
+ llm: z.ZodOptional<z.ZodObject<{
38
+ type: z.ZodOptional<z.ZodString>;
39
+ model: z.ZodOptional<z.ZodString>;
40
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
41
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
42
+ }, z.core.$loose>>;
43
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
44
+ type: z.ZodEnum<{
45
+ binary: "binary";
46
+ image: "image";
47
+ audio: "audio";
48
+ video: "video";
49
+ file: "file";
50
+ }>;
51
+ extensions: z.ZodArray<z.ZodString>;
52
+ maxSize: z.ZodOptional<z.ZodNumber>;
53
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
54
+ }, z.core.$strip>>]>>;
55
+ contentSource: z.ZodOptional<z.ZodString>;
56
+ requirementSource: z.ZodOptional<z.ZodString>;
57
+ contentSourceConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
58
+ requirementSourceConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
59
+ projectGuidelines: z.ZodOptional<z.ZodString>;
60
+ identityProfile: z.ZodOptional<z.ZodString>;
61
+ includeCurrentDateAfterGuidelines: z.ZodOptional<z.ZodBoolean>;
62
+ organization: z.ZodOptional<z.ZodObject<{
63
+ name: z.ZodOptional<z.ZodString>;
64
+ locale: z.ZodOptional<z.ZodString>;
65
+ timezone: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$strip>>;
67
+ projectReviewInstructions: z.ZodOptional<z.ZodString>;
68
+ noDefaultPrompts: z.ZodOptional<z.ZodBoolean>;
69
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
70
+ all: "all";
71
+ read: "read";
72
+ none: "none";
73
+ }>]>>;
74
+ builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
75
+ tools: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
76
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
77
+ middleware: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
78
+ streamOutput: z.ZodOptional<z.ZodBoolean>;
79
+ writeOutputToFile: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
80
+ writeBinaryOutputsToFile: z.ZodOptional<z.ZodBoolean>;
81
+ useColour: z.ZodOptional<z.ZodBoolean>;
82
+ streamSessionInferenceLog: z.ZodOptional<z.ZodBoolean>;
83
+ canInterruptInferenceWithEsc: z.ZodOptional<z.ZodBoolean>;
84
+ debugLog: z.ZodOptional<z.ZodBoolean>;
85
+ recursionLimit: z.ZodOptional<z.ZodNumber>;
86
+ consoleLevel: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
87
+ customTools: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
88
+ command: z.ZodString;
89
+ description: z.ZodString;
90
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
91
+ description: z.ZodString;
92
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
93
+ "absolute-paths": "absolute-paths";
94
+ "directory-traversal": "directory-traversal";
95
+ "shell-injection": "shell-injection";
96
+ "null-bytes": "null-bytes";
97
+ }>>>;
98
+ }, z.core.$strip>>>;
99
+ timeout: z.ZodOptional<z.ZodNumber>;
100
+ }, z.core.$strip>>>;
101
+ mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
102
+ a2aAgents: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
103
+ builtInToolsConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
104
+ aiignore: z.ZodOptional<z.ZodObject<{
105
+ enabled: z.ZodOptional<z.ZodBoolean>;
106
+ patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
107
+ }, z.core.$strip>>;
108
+ commands: z.ZodOptional<z.ZodObject<{
109
+ pr: z.ZodOptional<z.ZodObject<{
110
+ contentSource: z.ZodOptional<z.ZodString>;
111
+ requirementSource: z.ZodOptional<z.ZodString>;
112
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
113
+ all: "all";
114
+ read: "read";
115
+ none: "none";
116
+ }>]>>;
117
+ builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
118
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
119
+ command: z.ZodString;
120
+ description: z.ZodString;
121
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
122
+ description: z.ZodString;
123
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
124
+ "absolute-paths": "absolute-paths";
125
+ "directory-traversal": "directory-traversal";
126
+ "shell-injection": "shell-injection";
127
+ "null-bytes": "null-bytes";
128
+ }>>>;
129
+ }, z.core.$strip>>>;
130
+ timeout: z.ZodOptional<z.ZodNumber>;
131
+ }, z.core.$strip>>]>>;
132
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
133
+ logWorkForReviewInSeconds: z.ZodOptional<z.ZodNumber>;
134
+ rating: z.ZodOptional<z.ZodObject<{
135
+ enabled: z.ZodOptional<z.ZodBoolean>;
136
+ passThreshold: z.ZodOptional<z.ZodNumber>;
137
+ maxRating: z.ZodOptional<z.ZodNumber>;
138
+ minRating: z.ZodOptional<z.ZodNumber>;
139
+ errorOnReviewFail: z.ZodOptional<z.ZodBoolean>;
140
+ }, z.core.$strip>>;
141
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
142
+ type: z.ZodEnum<{
143
+ binary: "binary";
144
+ image: "image";
145
+ audio: "audio";
146
+ video: "video";
147
+ file: "file";
148
+ }>;
149
+ extensions: z.ZodArray<z.ZodString>;
150
+ maxSize: z.ZodOptional<z.ZodNumber>;
151
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
152
+ }, z.core.$strip>>]>>;
153
+ }, z.core.$strip>>;
154
+ review: z.ZodOptional<z.ZodObject<{
155
+ contentSource: z.ZodOptional<z.ZodString>;
156
+ requirementSource: z.ZodOptional<z.ZodString>;
157
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
158
+ all: "all";
159
+ read: "read";
160
+ none: "none";
161
+ }>]>>;
162
+ builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
163
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
164
+ command: z.ZodString;
165
+ description: z.ZodString;
166
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
167
+ description: z.ZodString;
168
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
169
+ "absolute-paths": "absolute-paths";
170
+ "directory-traversal": "directory-traversal";
171
+ "shell-injection": "shell-injection";
172
+ "null-bytes": "null-bytes";
173
+ }>>>;
174
+ }, z.core.$strip>>>;
175
+ timeout: z.ZodOptional<z.ZodNumber>;
176
+ }, z.core.$strip>>]>>;
177
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
178
+ rating: z.ZodOptional<z.ZodObject<{
179
+ enabled: z.ZodOptional<z.ZodBoolean>;
180
+ passThreshold: z.ZodOptional<z.ZodNumber>;
181
+ maxRating: z.ZodOptional<z.ZodNumber>;
182
+ minRating: z.ZodOptional<z.ZodNumber>;
183
+ errorOnReviewFail: z.ZodOptional<z.ZodBoolean>;
184
+ }, z.core.$strip>>;
185
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
186
+ type: z.ZodEnum<{
187
+ binary: "binary";
188
+ image: "image";
189
+ audio: "audio";
190
+ video: "video";
191
+ file: "file";
192
+ }>;
193
+ extensions: z.ZodArray<z.ZodString>;
194
+ maxSize: z.ZodOptional<z.ZodNumber>;
195
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
196
+ }, z.core.$strip>>]>>;
197
+ }, z.core.$strip>>;
198
+ ask: z.ZodOptional<z.ZodObject<{
199
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
200
+ all: "all";
201
+ read: "read";
202
+ none: "none";
203
+ }>]>>;
204
+ builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
205
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
206
+ command: z.ZodString;
207
+ description: z.ZodString;
208
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
209
+ description: z.ZodString;
210
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
211
+ "absolute-paths": "absolute-paths";
212
+ "directory-traversal": "directory-traversal";
213
+ "shell-injection": "shell-injection";
214
+ "null-bytes": "null-bytes";
215
+ }>>>;
216
+ }, z.core.$strip>>>;
217
+ timeout: z.ZodOptional<z.ZodNumber>;
218
+ }, z.core.$strip>>]>>;
219
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
220
+ devTools: z.ZodOptional<z.ZodObject<{
221
+ run_tests: z.ZodOptional<z.ZodString>;
222
+ run_lint: z.ZodOptional<z.ZodString>;
223
+ run_build: z.ZodOptional<z.ZodString>;
224
+ run_single_test: z.ZodOptional<z.ZodString>;
225
+ shell: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
226
+ enabled: z.ZodOptional<z.ZodBoolean>;
227
+ timeout: z.ZodOptional<z.ZodNumber>;
228
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
229
+ allowlist: z.ZodOptional<z.ZodBoolean>;
230
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
231
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
232
+ enabled: z.ZodOptional<z.ZodBoolean>;
233
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
234
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
235
+ model: z.ZodOptional<z.ZodObject<{
236
+ type: z.ZodOptional<z.ZodString>;
237
+ model: z.ZodOptional<z.ZodString>;
238
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
239
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
240
+ }, z.core.$loose>>;
241
+ }, z.core.$strip>]>>;
242
+ }, z.core.$strip>]>>;
243
+ shellYolo: z.ZodOptional<z.ZodBoolean>;
244
+ }, z.core.$strip>>;
245
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
246
+ type: z.ZodEnum<{
247
+ binary: "binary";
248
+ image: "image";
249
+ audio: "audio";
250
+ video: "video";
251
+ file: "file";
252
+ }>;
253
+ extensions: z.ZodArray<z.ZodString>;
254
+ maxSize: z.ZodOptional<z.ZodNumber>;
255
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
256
+ }, z.core.$strip>>]>>;
257
+ }, z.core.$strip>>;
258
+ chat: z.ZodOptional<z.ZodObject<{
259
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
260
+ all: "all";
261
+ read: "read";
262
+ none: "none";
263
+ }>]>>;
264
+ builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
265
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
266
+ command: z.ZodString;
267
+ description: z.ZodString;
268
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
269
+ description: z.ZodString;
270
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
271
+ "absolute-paths": "absolute-paths";
272
+ "directory-traversal": "directory-traversal";
273
+ "shell-injection": "shell-injection";
274
+ "null-bytes": "null-bytes";
275
+ }>>>;
276
+ }, z.core.$strip>>>;
277
+ timeout: z.ZodOptional<z.ZodNumber>;
278
+ }, z.core.$strip>>]>>;
279
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
280
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
281
+ type: z.ZodEnum<{
282
+ binary: "binary";
283
+ image: "image";
284
+ audio: "audio";
285
+ video: "video";
286
+ file: "file";
287
+ }>;
288
+ extensions: z.ZodArray<z.ZodString>;
289
+ maxSize: z.ZodOptional<z.ZodNumber>;
290
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
291
+ }, z.core.$strip>>]>>;
292
+ }, z.core.$strip>>;
293
+ code: z.ZodOptional<z.ZodObject<{
294
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
295
+ all: "all";
296
+ read: "read";
297
+ none: "none";
298
+ }>]>>;
299
+ builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
300
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
301
+ command: z.ZodString;
302
+ description: z.ZodString;
303
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
304
+ description: z.ZodString;
305
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
306
+ "absolute-paths": "absolute-paths";
307
+ "directory-traversal": "directory-traversal";
308
+ "shell-injection": "shell-injection";
309
+ "null-bytes": "null-bytes";
310
+ }>>>;
311
+ }, z.core.$strip>>>;
312
+ timeout: z.ZodOptional<z.ZodNumber>;
313
+ }, z.core.$strip>>]>>;
314
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
315
+ devTools: z.ZodOptional<z.ZodObject<{
316
+ run_tests: z.ZodOptional<z.ZodString>;
317
+ run_lint: z.ZodOptional<z.ZodString>;
318
+ run_build: z.ZodOptional<z.ZodString>;
319
+ run_single_test: z.ZodOptional<z.ZodString>;
320
+ shell: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
321
+ enabled: z.ZodOptional<z.ZodBoolean>;
322
+ timeout: z.ZodOptional<z.ZodNumber>;
323
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
324
+ allowlist: z.ZodOptional<z.ZodBoolean>;
325
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
326
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
327
+ enabled: z.ZodOptional<z.ZodBoolean>;
328
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
329
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
330
+ model: z.ZodOptional<z.ZodObject<{
331
+ type: z.ZodOptional<z.ZodString>;
332
+ model: z.ZodOptional<z.ZodString>;
333
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
334
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
335
+ }, z.core.$loose>>;
336
+ }, z.core.$strip>]>>;
337
+ }, z.core.$strip>]>>;
338
+ shellYolo: z.ZodOptional<z.ZodBoolean>;
339
+ }, z.core.$strip>>;
340
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
341
+ type: z.ZodEnum<{
342
+ binary: "binary";
343
+ image: "image";
344
+ audio: "audio";
345
+ video: "video";
346
+ file: "file";
347
+ }>;
348
+ extensions: z.ZodArray<z.ZodString>;
349
+ maxSize: z.ZodOptional<z.ZodNumber>;
350
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
351
+ }, z.core.$strip>>]>>;
352
+ }, z.core.$strip>>;
353
+ exec: z.ZodOptional<z.ZodObject<{
354
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
355
+ all: "all";
356
+ read: "read";
357
+ none: "none";
358
+ }>]>>;
359
+ builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
360
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
361
+ command: z.ZodString;
362
+ description: z.ZodString;
363
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
364
+ description: z.ZodString;
365
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
366
+ "absolute-paths": "absolute-paths";
367
+ "directory-traversal": "directory-traversal";
368
+ "shell-injection": "shell-injection";
369
+ "null-bytes": "null-bytes";
370
+ }>>>;
371
+ }, z.core.$strip>>>;
372
+ timeout: z.ZodOptional<z.ZodNumber>;
373
+ }, z.core.$strip>>]>>;
374
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
375
+ devTools: z.ZodOptional<z.ZodObject<{
376
+ run_tests: z.ZodOptional<z.ZodString>;
377
+ run_lint: z.ZodOptional<z.ZodString>;
378
+ run_build: z.ZodOptional<z.ZodString>;
379
+ run_single_test: z.ZodOptional<z.ZodString>;
380
+ shell: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
381
+ enabled: z.ZodOptional<z.ZodBoolean>;
382
+ timeout: z.ZodOptional<z.ZodNumber>;
383
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
384
+ allowlist: z.ZodOptional<z.ZodBoolean>;
385
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
386
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
387
+ enabled: z.ZodOptional<z.ZodBoolean>;
388
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
389
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
390
+ model: z.ZodOptional<z.ZodObject<{
391
+ type: z.ZodOptional<z.ZodString>;
392
+ model: z.ZodOptional<z.ZodString>;
393
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
394
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
395
+ }, z.core.$loose>>;
396
+ }, z.core.$strip>]>>;
397
+ }, z.core.$strip>]>>;
398
+ shellYolo: z.ZodOptional<z.ZodBoolean>;
399
+ }, z.core.$strip>>;
400
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
401
+ type: z.ZodEnum<{
402
+ binary: "binary";
403
+ image: "image";
404
+ audio: "audio";
405
+ video: "video";
406
+ file: "file";
407
+ }>;
408
+ extensions: z.ZodArray<z.ZodString>;
409
+ maxSize: z.ZodOptional<z.ZodNumber>;
410
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
411
+ }, z.core.$strip>>]>>;
412
+ }, z.core.$strip>>;
413
+ api: z.ZodOptional<z.ZodObject<{
414
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
415
+ all: "all";
416
+ read: "read";
417
+ none: "none";
418
+ }>]>>;
419
+ builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
420
+ port: z.ZodOptional<z.ZodNumber>;
421
+ cors: z.ZodOptional<z.ZodObject<{
422
+ allowOrigin: z.ZodOptional<z.ZodString>;
423
+ allowMethods: z.ZodOptional<z.ZodString>;
424
+ allowHeaders: z.ZodOptional<z.ZodString>;
425
+ }, z.core.$strip>>;
426
+ }, z.core.$strip>>;
427
+ }, z.core.$strip>>;
428
+ modelDisplayName: z.ZodOptional<z.ZodString>;
429
+ allowDirs: z.ZodOptional<z.ZodArray<z.ZodString>>;
430
+ askWriteMode: z.ZodOptional<z.ZodBoolean>;
431
+ }, z.core.$loose>;
432
+ /**
433
+ * Type inferred from {@link rawGthConfigSchema}. This is additive and intentionally
434
+ * separate from the hand-written `RawGthConfig` interface in `config.ts` (it omits
435
+ * the deprecated aliases). Prefer `RawGthConfig` for the public surface.
436
+ */
437
+ export type RawGthConfigInput = z.infer<typeof rawGthConfigSchema>;
438
+ /**
439
+ * The set of known top-level config keys, derived from the schema shape so it can
440
+ * never drift from {@link rawGthConfigSchema}. Includes `$schema`.
441
+ */
442
+ export declare const KNOWN_TOP_LEVEL_KEYS: ReadonlySet<string>;
443
+ /**
444
+ * Return the top-level keys present in `raw` that are not part of the known config
445
+ * surface. Deprecated aliases should be pre-mapped away first (see
446
+ * {@link preMapDeprecatedConfigNames}) so they do not show up here.
447
+ */
448
+ export declare function findUnknownTopLevelKeys(raw: Record<string, unknown>): string[];
449
+ /**
450
+ * Render a friendly, path-scoped validation message from a Zod error. Each issue
451
+ * becomes a line ` - <path>: <message>`, with `(root)` for top-level issues.
452
+ */
453
+ export declare function formatConfigValidationError(error: z.ZodError): string;
454
+ /**
455
+ * B3 — one-way pre-map of deprecated config key names to their canonical names, at
456
+ * the config root AND per-command. Mutates `raw` in place (it is always a freshly
457
+ * loaded config layer) and returns it alongside a list of deprecation warnings the
458
+ * caller should emit via `displayWarning`. Canonical names win when both are
459
+ * present; the deprecated key is always removed so it does not later surface as an
460
+ * "unknown top-level key".
461
+ */
462
+ export declare function preMapDeprecatedConfigNames<T extends Record<string, unknown>>(raw: T): {
463
+ config: T;
464
+ warnings: string[];
465
+ };
466
+ /**
467
+ * Generate the JSON Schema for the raw config from {@link rawGthConfigSchema} using
468
+ * zod 4's native `z.toJSONSchema`. The output is committed to
469
+ * `packages/core/schema/gsloth-config.schema.json` and asserted by a golden test.
470
+ */
471
+ export declare function generateConfigJsonSchema(): Record<string, unknown>;