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

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>>;
@@ -112,6 +138,10 @@ export declare const rawGthConfigSchema: z.ZodObject<{
112
138
  timeout: z.ZodOptional<z.ZodNumber>;
113
139
  }, z.core.$strip>>>;
114
140
  mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
141
+ tls: z.ZodOptional<z.ZodObject<{
142
+ extraCaCerts: z.ZodOptional<z.ZodArray<z.ZodString>>;
143
+ rejectUnauthorized: z.ZodOptional<z.ZodBoolean>;
144
+ }, z.core.$strip>>;
115
145
  a2aAgents: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
116
146
  builtInToolsConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
117
147
  aiignore: z.ZodOptional<z.ZodObject<{
@@ -127,7 +157,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
127
157
  read: "read";
128
158
  none: "none";
129
159
  }>]>>;
130
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
160
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
161
+ enabled: z.ZodOptional<z.ZodBoolean>;
162
+ command: z.ZodOptional<z.ZodString>;
163
+ timeout: z.ZodOptional<z.ZodNumber>;
164
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
165
+ allowlist: z.ZodOptional<z.ZodBoolean>;
166
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
167
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
168
+ enabled: z.ZodOptional<z.ZodBoolean>;
169
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
170
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
171
+ model: z.ZodOptional<z.ZodObject<{
172
+ type: z.ZodOptional<z.ZodString>;
173
+ model: z.ZodOptional<z.ZodString>;
174
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
175
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
176
+ }, z.core.$loose>>;
177
+ }, z.core.$strip>]>>;
178
+ yolo: z.ZodOptional<z.ZodBoolean>;
179
+ }, z.core.$strip>]>>]>>;
131
180
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
132
181
  command: z.ZodString;
133
182
  description: z.ZodString;
@@ -172,7 +221,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
172
221
  read: "read";
173
222
  none: "none";
174
223
  }>]>>;
175
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
224
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
225
+ enabled: z.ZodOptional<z.ZodBoolean>;
226
+ command: z.ZodOptional<z.ZodString>;
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
+ yolo: z.ZodOptional<z.ZodBoolean>;
243
+ }, z.core.$strip>]>>]>>;
176
244
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
177
245
  command: z.ZodString;
178
246
  description: z.ZodString;
@@ -214,7 +282,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
214
282
  read: "read";
215
283
  none: "none";
216
284
  }>]>>;
217
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
285
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
286
+ enabled: z.ZodOptional<z.ZodBoolean>;
287
+ command: z.ZodOptional<z.ZodString>;
288
+ timeout: z.ZodOptional<z.ZodNumber>;
289
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
290
+ allowlist: z.ZodOptional<z.ZodBoolean>;
291
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
292
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
293
+ enabled: z.ZodOptional<z.ZodBoolean>;
294
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
295
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
296
+ model: z.ZodOptional<z.ZodObject<{
297
+ type: z.ZodOptional<z.ZodString>;
298
+ model: z.ZodOptional<z.ZodString>;
299
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
300
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
301
+ }, z.core.$loose>>;
302
+ }, z.core.$strip>]>>;
303
+ yolo: z.ZodOptional<z.ZodBoolean>;
304
+ }, z.core.$strip>]>>]>>;
218
305
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
219
306
  command: z.ZodString;
220
307
  description: z.ZodString;
@@ -230,31 +317,6 @@ export declare const rawGthConfigSchema: z.ZodObject<{
230
317
  timeout: z.ZodOptional<z.ZodNumber>;
231
318
  }, z.core.$strip>>]>>;
232
319
  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
320
  binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
259
321
  type: z.ZodEnum<{
260
322
  binary: "binary";
@@ -274,7 +336,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
274
336
  read: "read";
275
337
  none: "none";
276
338
  }>]>>;
277
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
339
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
340
+ enabled: z.ZodOptional<z.ZodBoolean>;
341
+ command: z.ZodOptional<z.ZodString>;
342
+ timeout: z.ZodOptional<z.ZodNumber>;
343
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
344
+ allowlist: z.ZodOptional<z.ZodBoolean>;
345
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
346
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
347
+ enabled: z.ZodOptional<z.ZodBoolean>;
348
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
349
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
350
+ model: z.ZodOptional<z.ZodObject<{
351
+ type: z.ZodOptional<z.ZodString>;
352
+ model: z.ZodOptional<z.ZodString>;
353
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
354
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
355
+ }, z.core.$loose>>;
356
+ }, z.core.$strip>]>>;
357
+ yolo: z.ZodOptional<z.ZodBoolean>;
358
+ }, z.core.$strip>]>>]>>;
278
359
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
279
360
  command: z.ZodString;
280
361
  description: z.ZodString;
@@ -309,7 +390,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
309
390
  read: "read";
310
391
  none: "none";
311
392
  }>]>>;
312
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
393
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
394
+ enabled: z.ZodOptional<z.ZodBoolean>;
395
+ command: z.ZodOptional<z.ZodString>;
396
+ timeout: z.ZodOptional<z.ZodNumber>;
397
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
398
+ allowlist: z.ZodOptional<z.ZodBoolean>;
399
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
400
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
401
+ enabled: z.ZodOptional<z.ZodBoolean>;
402
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
403
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
404
+ model: z.ZodOptional<z.ZodObject<{
405
+ type: z.ZodOptional<z.ZodString>;
406
+ model: z.ZodOptional<z.ZodString>;
407
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
408
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
409
+ }, z.core.$loose>>;
410
+ }, z.core.$strip>]>>;
411
+ yolo: z.ZodOptional<z.ZodBoolean>;
412
+ }, z.core.$strip>]>>]>>;
313
413
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
314
414
  command: z.ZodString;
315
415
  description: z.ZodString;
@@ -325,31 +425,6 @@ export declare const rawGthConfigSchema: z.ZodObject<{
325
425
  timeout: z.ZodOptional<z.ZodNumber>;
326
426
  }, z.core.$strip>>]>>;
327
427
  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
428
  binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
354
429
  type: z.ZodEnum<{
355
430
  binary: "binary";
@@ -369,7 +444,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
369
444
  read: "read";
370
445
  none: "none";
371
446
  }>]>>;
372
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
447
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
448
+ enabled: z.ZodOptional<z.ZodBoolean>;
449
+ command: z.ZodOptional<z.ZodString>;
450
+ timeout: z.ZodOptional<z.ZodNumber>;
451
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
452
+ allowlist: z.ZodOptional<z.ZodBoolean>;
453
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
454
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
455
+ enabled: z.ZodOptional<z.ZodBoolean>;
456
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
457
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
458
+ model: z.ZodOptional<z.ZodObject<{
459
+ type: z.ZodOptional<z.ZodString>;
460
+ model: z.ZodOptional<z.ZodString>;
461
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
462
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
463
+ }, z.core.$loose>>;
464
+ }, z.core.$strip>]>>;
465
+ yolo: z.ZodOptional<z.ZodBoolean>;
466
+ }, z.core.$strip>]>>]>>;
373
467
  customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
374
468
  command: z.ZodString;
375
469
  description: z.ZodString;
@@ -385,31 +479,6 @@ export declare const rawGthConfigSchema: z.ZodObject<{
385
479
  timeout: z.ZodOptional<z.ZodNumber>;
386
480
  }, z.core.$strip>>]>>;
387
481
  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
482
  binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
414
483
  type: z.ZodEnum<{
415
484
  binary: "binary";
@@ -429,7 +498,26 @@ export declare const rawGthConfigSchema: z.ZodObject<{
429
498
  read: "read";
430
499
  none: "none";
431
500
  }>]>>;
432
- builtInTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
501
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
502
+ enabled: z.ZodOptional<z.ZodBoolean>;
503
+ command: z.ZodOptional<z.ZodString>;
504
+ timeout: z.ZodOptional<z.ZodNumber>;
505
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
506
+ allowlist: z.ZodOptional<z.ZodBoolean>;
507
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
508
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
509
+ enabled: z.ZodOptional<z.ZodBoolean>;
510
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
511
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
512
+ model: z.ZodOptional<z.ZodObject<{
513
+ type: z.ZodOptional<z.ZodString>;
514
+ model: z.ZodOptional<z.ZodString>;
515
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
516
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
517
+ }, z.core.$loose>>;
518
+ }, z.core.$strip>]>>;
519
+ yolo: z.ZodOptional<z.ZodBoolean>;
520
+ }, z.core.$strip>]>>]>>;
433
521
  port: z.ZodOptional<z.ZodNumber>;
434
522
  cors: z.ZodOptional<z.ZodObject<{
435
523
  allowOrigin: z.ZodOptional<z.ZodString>;
@@ -453,10 +541,20 @@ export type RawGthConfigInput = z.infer<typeof rawGthConfigSchema>;
453
541
  * never drift from {@link rawGthConfigSchema}. Includes `$schema`.
454
542
  */
455
543
  export declare const KNOWN_TOP_LEVEL_KEYS: ReadonlySet<string>;
544
+ /**
545
+ * True when a raw config value is a plain (non-null, non-array) object, so the key scans
546
+ * ({@link findDeprecatedConfigIssues}, {@link findUnknownTopLevelKeys}) are safe to run. A
547
+ * `null`/array/primitive config (e.g. a JSON file that is just `null`, or a module
548
+ * `configure()` returning null) must NOT reach those scans — they'd throw on
549
+ * `hasOwnProperty`/`Object.keys`; the entry points instead hand it straight to
550
+ * `rawGthConfigSchema.safeParse`, which reports a clean "expected object" error.
551
+ */
552
+ export declare function isRecordConfig(value: unknown): value is Record<string, unknown>;
456
553
  /**
457
554
  * 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.
555
+ * surface. KNOWN deprecated names are rejected earlier by {@link findDeprecatedConfigIssues}
556
+ * (the entry points short-circuit on those), so a key that reaches here is a genuinely
557
+ * unknown key (a likely typo) that only warrants a warning.
460
558
  */
461
559
  export declare function findUnknownTopLevelKeys(raw: Record<string, unknown>): string[];
462
560
  /**
@@ -464,18 +562,38 @@ export declare function findUnknownTopLevelKeys(raw: Record<string, unknown>): s
464
562
  * becomes a line ` - <path>: <message>`, with `(root)` for top-level issues.
465
563
  */
466
564
  export declare function formatConfigValidationError(error: z.ZodError): string;
565
+ /** A single deprecated-config-shape rejection: the offending `path` and the migration message. */
566
+ export interface DeprecatedConfigIssue {
567
+ /** Dotted path of the offending key (e.g. `pr`, `commands.pr.contentProvider`). */
568
+ path: string;
569
+ /** Human message naming the canonical replacement + migration path. */
570
+ message: string;
571
+ }
572
+ /**
573
+ * GS2-28 — detect the removed pre-2.0 config shapes on the RAW input (read-only; no
574
+ * mutation), returning one {@link DeprecatedConfigIssue} per occurrence. A non-empty
575
+ * result is a HARD validation failure: 2.0 dropped back-compat coercion, so an old shape
576
+ * must error and point at the fix rather than be silently remapped or ignored.
577
+ *
578
+ * Detects:
579
+ * - (A) a COMMAND name ({@link COMMAND_KEYS}) at the config ROOT — must move under `commands.<cmd>`;
580
+ * - (C) a deprecated `*Provider*` name ({@link DEPRECATED_ROOT_PAIRS} at root,
581
+ * {@link DEPRECATED_COMMAND_PAIRS} per command) — must use its `*Source*` replacement;
582
+ * - (D, CFG-18) a removed per-command key folded into another ({@link REMOVED_COMMAND_KEYS}, e.g.
583
+ * `commands.<cmd>.devTools` → configure under `builtInTools`).
584
+ *
585
+ * Runs on the raw input specifically so nested `commands.*.contentProvider` is still visible
586
+ * (zod's per-command `z.object` would strip it before any schema-embedded check could fire).
587
+ * A genuinely-unknown key is NOT flagged here (it stays a warn-only unknown key), preserving
588
+ * the deliberate typo-tolerance.
589
+ */
590
+ export declare function findDeprecatedConfigIssues(raw: Record<string, unknown>): DeprecatedConfigIssue[];
467
591
  /**
468
- * B3 one-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".
592
+ * Render {@link DeprecatedConfigIssue}s as the same ` - <path>: <message>` block used for
593
+ * Zod validation errors, so a deprecated-shape rejection reads identically to a type-mismatch
594
+ * rejection (loader wraps it with `Invalid configuration in <source>:`).
474
595
  */
475
- export declare function preMapDeprecatedConfigNames<T extends Record<string, unknown>>(raw: T): {
476
- config: T;
477
- warnings: string[];
478
- };
596
+ export declare function formatDeprecatedConfigIssues(issues: ReadonlyArray<DeprecatedConfigIssue>): string;
479
597
  /**
480
598
  * Generate the JSON Schema for the raw config from {@link rawGthConfigSchema} using
481
599
  * zod 4's native `z.toJSONSchema`. The output is committed to
@@ -491,7 +609,7 @@ export declare function generateConfigJsonSchema(): Record<string, unknown>;
491
609
  export interface RawConfigValidationResult {
492
610
  /** True when the config parses against the schema (unknown keys do NOT make it false). */
493
611
  ok: boolean;
494
- /** Non-fatal advisories: deprecated-name remaps (B3) and unknown top-level keys. */
612
+ /** Non-fatal advisories: unknown top-level keys (likely typos). Deprecated shapes are hard errors, not warnings. */
495
613
  warnings: string[];
496
614
  /** Present only when `ok` is false: the path-scoped, multi-line validation message. */
497
615
  errorMessage?: string;
@@ -499,11 +617,11 @@ export interface RawConfigValidationResult {
499
617
  /**
500
618
  * Validate a freshly-loaded raw config object against {@link rawGthConfigSchema} and
501
619
  * 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.
620
+ * loader's policy: a removed pre-2.0 shape (a top-level command key or a deprecated
621
+ * `*Provider*` name) is a HARD failure that names the fix, unknown top-level keys warn but
622
+ * do not fail, and a genuine type mismatch on a known field fails with a path-scoped message.
505
623
  *
506
- * A shallow copy is taken before the (mutating) deprecated-name pre-map so the caller's
507
- * top-level object is not modified.
624
+ * Read-only: `findDeprecatedConfigIssues`, `findUnknownTopLevelKeys` and `safeParse` never
625
+ * mutate `raw`, so no defensive copy is needed.
508
626
  */
509
627
  export declare function validateRawGthConfig(raw: Record<string, unknown>): RawConfigValidationResult;