@gaunt-sloth/core 2.0.0-alpha.11 → 2.0.0-alpha.12

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.
@@ -6,15 +6,22 @@
6
6
  * JSON Schema (`packages/core/schema/gsloth-config.schema.json`). It models the
7
7
  * canonical config shape only — the deprecated aliases (`contentProvider`,
8
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.
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.
12
17
  *
13
18
  * Design notes:
14
19
  * - The top-level object is a {@link z.looseObject} so unknown keys PASS THROUGH
15
20
  * (they are neither stripped nor a hard failure). The loader separately diffs
16
21
  * present-vs-known top-level keys ({@link findUnknownTopLevelKeys}) to warn about
17
- * likely typos without failing.
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.
18
25
  * - Every field is optional. The schema validates the *shape/type of what is
19
26
  * present*, not requiredness. In particular `llm` is optional so the loader's
20
27
  * existing "must at least define llm.type" checks remain the authority on llm
@@ -84,7 +91,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
84
91
  read: "read";
85
92
  none: "none";
86
93
  }>]>>;
87
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
94
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
95
+ enabled: z.ZodOptional<z.ZodBoolean>;
96
+ command: z.ZodOptional<z.ZodString>;
97
+ timeout: z.ZodOptional<z.ZodNumber>;
98
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
99
+ allowlist: z.ZodOptional<z.ZodBoolean>;
100
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
101
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
102
+ enabled: z.ZodOptional<z.ZodBoolean>;
103
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
104
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
105
+ model: z.ZodOptional<z.ZodObject<{
106
+ type: z.ZodOptional<z.ZodString>;
107
+ model: z.ZodOptional<z.ZodString>;
108
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
109
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
110
+ }, z.core.$loose>>;
111
+ }, z.core.$strip>]>>;
112
+ yolo: z.ZodOptional<z.ZodBoolean>;
113
+ }, z.core.$strip>]>>]>>;
88
114
  tools: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
89
115
  allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
90
116
  middleware: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
@@ -127,7 +153,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
127
153
  read: "read";
128
154
  none: "none";
129
155
  }>]>>;
130
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
156
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
157
+ enabled: z.ZodOptional<z.ZodBoolean>;
158
+ command: z.ZodOptional<z.ZodString>;
159
+ timeout: z.ZodOptional<z.ZodNumber>;
160
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
161
+ allowlist: z.ZodOptional<z.ZodBoolean>;
162
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
163
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
164
+ enabled: z.ZodOptional<z.ZodBoolean>;
165
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
166
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
167
+ model: z.ZodOptional<z.ZodObject<{
168
+ type: z.ZodOptional<z.ZodString>;
169
+ model: z.ZodOptional<z.ZodString>;
170
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
171
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
172
+ }, z.core.$loose>>;
173
+ }, z.core.$strip>]>>;
174
+ yolo: z.ZodOptional<z.ZodBoolean>;
175
+ }, z.core.$strip>]>>]>>;
131
176
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
132
177
  command: z.ZodString;
133
178
  description: z.ZodString;
@@ -172,7 +217,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
172
217
  read: "read";
173
218
  none: "none";
174
219
  }>]>>;
175
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
220
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
221
+ enabled: z.ZodOptional<z.ZodBoolean>;
222
+ command: z.ZodOptional<z.ZodString>;
223
+ timeout: z.ZodOptional<z.ZodNumber>;
224
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
225
+ allowlist: z.ZodOptional<z.ZodBoolean>;
226
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
227
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
228
+ enabled: z.ZodOptional<z.ZodBoolean>;
229
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
230
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
231
+ model: z.ZodOptional<z.ZodObject<{
232
+ type: z.ZodOptional<z.ZodString>;
233
+ model: z.ZodOptional<z.ZodString>;
234
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
235
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
236
+ }, z.core.$loose>>;
237
+ }, z.core.$strip>]>>;
238
+ yolo: z.ZodOptional<z.ZodBoolean>;
239
+ }, z.core.$strip>]>>]>>;
176
240
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
177
241
  command: z.ZodString;
178
242
  description: z.ZodString;
@@ -214,7 +278,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
214
278
  read: "read";
215
279
  none: "none";
216
280
  }>]>>;
217
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
281
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
282
+ enabled: z.ZodOptional<z.ZodBoolean>;
283
+ command: z.ZodOptional<z.ZodString>;
284
+ timeout: z.ZodOptional<z.ZodNumber>;
285
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
286
+ allowlist: z.ZodOptional<z.ZodBoolean>;
287
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
288
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
289
+ enabled: z.ZodOptional<z.ZodBoolean>;
290
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
291
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
292
+ model: z.ZodOptional<z.ZodObject<{
293
+ type: z.ZodOptional<z.ZodString>;
294
+ model: z.ZodOptional<z.ZodString>;
295
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
296
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
297
+ }, z.core.$loose>>;
298
+ }, z.core.$strip>]>>;
299
+ yolo: z.ZodOptional<z.ZodBoolean>;
300
+ }, z.core.$strip>]>>]>>;
218
301
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
219
302
  command: z.ZodString;
220
303
  description: z.ZodString;
@@ -230,31 +313,6 @@ export declare const rawGthConfigSchema: z.ZodObject<{
230
313
  timeout: z.ZodOptional<z.ZodNumber>;
231
314
  }, z.core.$strip>>]>>;
232
315
  allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
233
- devTools: z.ZodOptional<z.ZodObject<{
234
- run_tests: z.ZodOptional<z.ZodString>;
235
- run_lint: z.ZodOptional<z.ZodString>;
236
- run_build: z.ZodOptional<z.ZodString>;
237
- run_single_test: z.ZodOptional<z.ZodString>;
238
- shell: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
239
- enabled: z.ZodOptional<z.ZodBoolean>;
240
- timeout: z.ZodOptional<z.ZodNumber>;
241
- maxOutputBytes: z.ZodOptional<z.ZodNumber>;
242
- allowlist: z.ZodOptional<z.ZodBoolean>;
243
- persistAllowlist: z.ZodOptional<z.ZodBoolean>;
244
- judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
245
- enabled: z.ZodOptional<z.ZodBoolean>;
246
- autoApproveLow: z.ZodOptional<z.ZodBoolean>;
247
- blockHigh: z.ZodOptional<z.ZodBoolean>;
248
- model: z.ZodOptional<z.ZodObject<{
249
- type: z.ZodOptional<z.ZodString>;
250
- model: z.ZodOptional<z.ZodString>;
251
- configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
252
- apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
253
- }, z.core.$loose>>;
254
- }, z.core.$strip>]>>;
255
- }, z.core.$strip>]>>;
256
- shellYolo: z.ZodOptional<z.ZodBoolean>;
257
- }, z.core.$strip>>;
258
316
  binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
259
317
  type: z.ZodEnum<{
260
318
  binary: "binary";
@@ -274,7 +332,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
274
332
  read: "read";
275
333
  none: "none";
276
334
  }>]>>;
277
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
335
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
336
+ enabled: z.ZodOptional<z.ZodBoolean>;
337
+ command: z.ZodOptional<z.ZodString>;
338
+ timeout: z.ZodOptional<z.ZodNumber>;
339
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
340
+ allowlist: z.ZodOptional<z.ZodBoolean>;
341
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
342
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
343
+ enabled: z.ZodOptional<z.ZodBoolean>;
344
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
345
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
346
+ model: z.ZodOptional<z.ZodObject<{
347
+ type: z.ZodOptional<z.ZodString>;
348
+ model: z.ZodOptional<z.ZodString>;
349
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
350
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
351
+ }, z.core.$loose>>;
352
+ }, z.core.$strip>]>>;
353
+ yolo: z.ZodOptional<z.ZodBoolean>;
354
+ }, z.core.$strip>]>>]>>;
278
355
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
279
356
  command: z.ZodString;
280
357
  description: z.ZodString;
@@ -309,7 +386,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
309
386
  read: "read";
310
387
  none: "none";
311
388
  }>]>>;
312
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
389
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
390
+ enabled: z.ZodOptional<z.ZodBoolean>;
391
+ command: z.ZodOptional<z.ZodString>;
392
+ timeout: z.ZodOptional<z.ZodNumber>;
393
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
394
+ allowlist: z.ZodOptional<z.ZodBoolean>;
395
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
396
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
397
+ enabled: z.ZodOptional<z.ZodBoolean>;
398
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
399
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
400
+ model: z.ZodOptional<z.ZodObject<{
401
+ type: z.ZodOptional<z.ZodString>;
402
+ model: z.ZodOptional<z.ZodString>;
403
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
404
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
405
+ }, z.core.$loose>>;
406
+ }, z.core.$strip>]>>;
407
+ yolo: z.ZodOptional<z.ZodBoolean>;
408
+ }, z.core.$strip>]>>]>>;
313
409
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
314
410
  command: z.ZodString;
315
411
  description: z.ZodString;
@@ -325,31 +421,6 @@ export declare const rawGthConfigSchema: z.ZodObject<{
325
421
  timeout: z.ZodOptional<z.ZodNumber>;
326
422
  }, z.core.$strip>>]>>;
327
423
  allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
328
- devTools: z.ZodOptional<z.ZodObject<{
329
- run_tests: z.ZodOptional<z.ZodString>;
330
- run_lint: z.ZodOptional<z.ZodString>;
331
- run_build: z.ZodOptional<z.ZodString>;
332
- run_single_test: z.ZodOptional<z.ZodString>;
333
- shell: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
334
- enabled: z.ZodOptional<z.ZodBoolean>;
335
- timeout: z.ZodOptional<z.ZodNumber>;
336
- maxOutputBytes: z.ZodOptional<z.ZodNumber>;
337
- allowlist: z.ZodOptional<z.ZodBoolean>;
338
- persistAllowlist: z.ZodOptional<z.ZodBoolean>;
339
- judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
340
- enabled: z.ZodOptional<z.ZodBoolean>;
341
- autoApproveLow: z.ZodOptional<z.ZodBoolean>;
342
- blockHigh: z.ZodOptional<z.ZodBoolean>;
343
- model: z.ZodOptional<z.ZodObject<{
344
- type: z.ZodOptional<z.ZodString>;
345
- model: z.ZodOptional<z.ZodString>;
346
- configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
347
- apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
348
- }, z.core.$loose>>;
349
- }, z.core.$strip>]>>;
350
- }, z.core.$strip>]>>;
351
- shellYolo: z.ZodOptional<z.ZodBoolean>;
352
- }, z.core.$strip>>;
353
424
  binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
354
425
  type: z.ZodEnum<{
355
426
  binary: "binary";
@@ -369,7 +440,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
369
440
  read: "read";
370
441
  none: "none";
371
442
  }>]>>;
372
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
443
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
444
+ enabled: z.ZodOptional<z.ZodBoolean>;
445
+ command: z.ZodOptional<z.ZodString>;
446
+ timeout: z.ZodOptional<z.ZodNumber>;
447
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
448
+ allowlist: z.ZodOptional<z.ZodBoolean>;
449
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
450
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
451
+ enabled: z.ZodOptional<z.ZodBoolean>;
452
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
453
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
454
+ model: z.ZodOptional<z.ZodObject<{
455
+ type: z.ZodOptional<z.ZodString>;
456
+ model: z.ZodOptional<z.ZodString>;
457
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
458
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
459
+ }, z.core.$loose>>;
460
+ }, z.core.$strip>]>>;
461
+ yolo: z.ZodOptional<z.ZodBoolean>;
462
+ }, z.core.$strip>]>>]>>;
373
463
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
374
464
  command: z.ZodString;
375
465
  description: z.ZodString;
@@ -385,31 +475,6 @@ export declare const rawGthConfigSchema: z.ZodObject<{
385
475
  timeout: z.ZodOptional<z.ZodNumber>;
386
476
  }, z.core.$strip>>]>>;
387
477
  allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
388
- devTools: z.ZodOptional<z.ZodObject<{
389
- run_tests: z.ZodOptional<z.ZodString>;
390
- run_lint: z.ZodOptional<z.ZodString>;
391
- run_build: z.ZodOptional<z.ZodString>;
392
- run_single_test: z.ZodOptional<z.ZodString>;
393
- shell: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
394
- enabled: z.ZodOptional<z.ZodBoolean>;
395
- timeout: z.ZodOptional<z.ZodNumber>;
396
- maxOutputBytes: z.ZodOptional<z.ZodNumber>;
397
- allowlist: z.ZodOptional<z.ZodBoolean>;
398
- persistAllowlist: z.ZodOptional<z.ZodBoolean>;
399
- judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
400
- enabled: z.ZodOptional<z.ZodBoolean>;
401
- autoApproveLow: z.ZodOptional<z.ZodBoolean>;
402
- blockHigh: z.ZodOptional<z.ZodBoolean>;
403
- model: z.ZodOptional<z.ZodObject<{
404
- type: z.ZodOptional<z.ZodString>;
405
- model: z.ZodOptional<z.ZodString>;
406
- configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
407
- apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
408
- }, z.core.$loose>>;
409
- }, z.core.$strip>]>>;
410
- }, z.core.$strip>]>>;
411
- shellYolo: z.ZodOptional<z.ZodBoolean>;
412
- }, z.core.$strip>>;
413
478
  binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
414
479
  type: z.ZodEnum<{
415
480
  binary: "binary";
@@ -429,7 +494,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
429
494
  read: "read";
430
495
  none: "none";
431
496
  }>]>>;
432
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
497
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
498
+ enabled: z.ZodOptional<z.ZodBoolean>;
499
+ command: z.ZodOptional<z.ZodString>;
500
+ timeout: z.ZodOptional<z.ZodNumber>;
501
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
502
+ allowlist: z.ZodOptional<z.ZodBoolean>;
503
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
504
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
505
+ enabled: z.ZodOptional<z.ZodBoolean>;
506
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
507
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
508
+ model: z.ZodOptional<z.ZodObject<{
509
+ type: z.ZodOptional<z.ZodString>;
510
+ model: z.ZodOptional<z.ZodString>;
511
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
512
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
513
+ }, z.core.$loose>>;
514
+ }, z.core.$strip>]>>;
515
+ yolo: z.ZodOptional<z.ZodBoolean>;
516
+ }, z.core.$strip>]>>]>>;
433
517
  port: z.ZodOptional<z.ZodNumber>;
434
518
  cors: z.ZodOptional<z.ZodObject<{
435
519
  allowOrigin: z.ZodOptional<z.ZodString>;
@@ -453,10 +537,20 @@ export type RawGthConfigInput = z.infer<typeof rawGthConfigSchema>;
453
537
  * never drift from {@link rawGthConfigSchema}. Includes `$schema`.
454
538
  */
455
539
  export declare const KNOWN_TOP_LEVEL_KEYS: ReadonlySet<string>;
540
+ /**
541
+ * True when a raw config value is a plain (non-null, non-array) object, so the key scans
542
+ * ({@link findDeprecatedConfigIssues}, {@link findUnknownTopLevelKeys}) are safe to run. A
543
+ * `null`/array/primitive config (e.g. a JSON file that is just `null`, or a module
544
+ * `configure()` returning null) must NOT reach those scans — they'd throw on
545
+ * `hasOwnProperty`/`Object.keys`; the entry points instead hand it straight to
546
+ * `rawGthConfigSchema.safeParse`, which reports a clean "expected object" error.
547
+ */
548
+ export declare function isRecordConfig(value: unknown): value is Record<string, unknown>;
456
549
  /**
457
550
  * Return the top-level keys present in `raw` that are not part of the known config
458
- * surface. Deprecated aliases should be pre-mapped away first (see
459
- * {@link preMapDeprecatedConfigNames}) so they do not show up here.
551
+ * surface. KNOWN deprecated names are rejected earlier by {@link findDeprecatedConfigIssues}
552
+ * (the entry points short-circuit on those), so a key that reaches here is a genuinely
553
+ * unknown key (a likely typo) that only warrants a warning.
460
554
  */
461
555
  export declare function findUnknownTopLevelKeys(raw: Record<string, unknown>): string[];
462
556
  /**
@@ -464,18 +558,38 @@ export declare function findUnknownTopLevelKeys(raw: Record<string, unknown>): s
464
558
  * becomes a line ` - <path>: <message>`, with `(root)` for top-level issues.
465
559
  */
466
560
  export declare function formatConfigValidationError(error: z.ZodError): string;
561
+ /** A single deprecated-config-shape rejection: the offending `path` and the migration message. */
562
+ export interface DeprecatedConfigIssue {
563
+ /** Dotted path of the offending key (e.g. `pr`, `commands.pr.contentProvider`). */
564
+ path: string;
565
+ /** Human message naming the canonical replacement + migration path. */
566
+ message: string;
567
+ }
467
568
  /**
468
- * B3one-way pre-map of deprecated config key names to their canonical names, at
469
- * the config root AND per-command. Mutates `raw` in place (it is always a freshly
470
- * loaded config layer) and returns it alongside a list of deprecation warnings the
471
- * caller should emit via `displayWarning`. Canonical names win when both are
472
- * present; the deprecated key is always removed so it does not later surface as an
473
- * "unknown top-level key".
569
+ * GS2-28detect the removed pre-2.0 config shapes on the RAW input (read-only; no
570
+ * mutation), returning one {@link DeprecatedConfigIssue} per occurrence. A non-empty
571
+ * result is a HARD validation failure: 2.0 dropped back-compat coercion, so an old shape
572
+ * must error and point at the fix rather than be silently remapped or ignored.
573
+ *
574
+ * Detects:
575
+ * - (A) a COMMAND name ({@link COMMAND_KEYS}) at the config ROOT — must move under `commands.<cmd>`;
576
+ * - (C) a deprecated `*Provider*` name ({@link DEPRECATED_ROOT_PAIRS} at root,
577
+ * {@link DEPRECATED_COMMAND_PAIRS} per command) — must use its `*Source*` replacement;
578
+ * - (D, CFG-18) a removed per-command key folded into another ({@link REMOVED_COMMAND_KEYS}, e.g.
579
+ * `commands.<cmd>.devTools` → configure under `builtInTools`).
580
+ *
581
+ * Runs on the raw input specifically so nested `commands.*.contentProvider` is still visible
582
+ * (zod's per-command `z.object` would strip it before any schema-embedded check could fire).
583
+ * A genuinely-unknown key is NOT flagged here (it stays a warn-only unknown key), preserving
584
+ * the deliberate typo-tolerance.
474
585
  */
475
- export declare function preMapDeprecatedConfigNames<T extends Record<string, unknown>>(raw: T): {
476
- config: T;
477
- warnings: string[];
478
- };
586
+ export declare function findDeprecatedConfigIssues(raw: Record<string, unknown>): DeprecatedConfigIssue[];
587
+ /**
588
+ * Render {@link DeprecatedConfigIssue}s as the same ` - <path>: <message>` block used for
589
+ * Zod validation errors, so a deprecated-shape rejection reads identically to a type-mismatch
590
+ * rejection (loader wraps it with `Invalid configuration in <source>:`).
591
+ */
592
+ export declare function formatDeprecatedConfigIssues(issues: ReadonlyArray<DeprecatedConfigIssue>): string;
479
593
  /**
480
594
  * Generate the JSON Schema for the raw config from {@link rawGthConfigSchema} using
481
595
  * zod 4's native `z.toJSONSchema`. The output is committed to
@@ -491,7 +605,7 @@ export declare function generateConfigJsonSchema(): Record<string, unknown>;
491
605
  export interface RawConfigValidationResult {
492
606
  /** True when the config parses against the schema (unknown keys do NOT make it false). */
493
607
  ok: boolean;
494
- /** Non-fatal advisories: deprecated-name remaps (B3) and unknown top-level keys. */
608
+ /** Non-fatal advisories: unknown top-level keys (likely typos). Deprecated shapes are hard errors, not warnings. */
495
609
  warnings: string[];
496
610
  /** Present only when `ok` is false: the path-scoped, multi-line validation message. */
497
611
  errorMessage?: string;
@@ -499,11 +613,11 @@ export interface RawConfigValidationResult {
499
613
  /**
500
614
  * Validate a freshly-loaded raw config object against {@link rawGthConfigSchema} and
501
615
  * report the outcome as data (a pure function — no `displayWarning`/`exit`). Mirrors the
502
- * loader's policy: deprecated key names are pre-mapped (each yielding a warning), unknown
503
- * top-level keys warn but do not fail, and a genuine type mismatch on a known field fails
504
- * with a path-scoped message.
616
+ * loader's policy: a removed pre-2.0 shape (a top-level command key or a deprecated
617
+ * `*Provider*` name) is a HARD failure that names the fix, unknown top-level keys warn but
618
+ * do not fail, and a genuine type mismatch on a known field fails with a path-scoped message.
505
619
  *
506
- * A shallow copy is taken before the (mutating) deprecated-name pre-map so the caller's
507
- * top-level object is not modified.
620
+ * Read-only: `findDeprecatedConfigIssues`, `findUnknownTopLevelKeys` and `safeParse` never
621
+ * mutate `raw`, so no defensive copy is needed.
508
622
  */
509
623
  export declare function validateRawGthConfig(raw: Record<string, unknown>): RawConfigValidationResult;