@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,673 @@
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
+ /**
39
+ * Zod schema for the raw, on-disk Gaunt Sloth config. Loose at the top level so
40
+ * unknown keys are preserved (warn-only via {@link findUnknownTopLevelKeys}).
41
+ */
42
+ export declare const rawGthConfigSchema: z.ZodObject<{
43
+ $schema: z.ZodOptional<z.ZodString>;
44
+ llm: z.ZodOptional<z.ZodObject<{
45
+ type: z.ZodOptional<z.ZodString>;
46
+ model: z.ZodOptional<z.ZodString>;
47
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
48
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
49
+ }, z.core.$loose>>;
50
+ agent: z.ZodOptional<z.ZodObject<{
51
+ backend: z.ZodOptional<z.ZodEnum<{
52
+ deep: "deep";
53
+ lean: "lean";
54
+ }>>;
55
+ }, z.core.$strip>>;
56
+ history: z.ZodOptional<z.ZodObject<{
57
+ enabled: z.ZodOptional<z.ZodBoolean>;
58
+ dbPath: z.ZodOptional<z.ZodString>;
59
+ }, z.core.$strip>>;
60
+ memory: z.ZodOptional<z.ZodObject<{
61
+ enabled: z.ZodOptional<z.ZodBoolean>;
62
+ }, z.core.$strip>>;
63
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
64
+ type: z.ZodEnum<{
65
+ audio: "audio";
66
+ binary: "binary";
67
+ file: "file";
68
+ image: "image";
69
+ video: "video";
70
+ }>;
71
+ extensions: z.ZodArray<z.ZodString>;
72
+ maxSize: z.ZodOptional<z.ZodNumber>;
73
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
74
+ }, z.core.$strip>>]>>;
75
+ contentSource: z.ZodOptional<z.ZodString>;
76
+ requirementSource: z.ZodOptional<z.ZodString>;
77
+ contentSourceConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
78
+ requirementSourceConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
79
+ projectGuidelines: z.ZodOptional<z.ZodString>;
80
+ identityProfile: z.ZodOptional<z.ZodString>;
81
+ includeCurrentDateAfterGuidelines: z.ZodOptional<z.ZodBoolean>;
82
+ organization: z.ZodOptional<z.ZodObject<{
83
+ name: z.ZodOptional<z.ZodString>;
84
+ locale: z.ZodOptional<z.ZodString>;
85
+ timezone: z.ZodOptional<z.ZodString>;
86
+ }, z.core.$strip>>;
87
+ projectReviewInstructions: z.ZodOptional<z.ZodString>;
88
+ noDefaultPrompts: z.ZodOptional<z.ZodBoolean>;
89
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
90
+ all: "all";
91
+ none: "none";
92
+ read: "read";
93
+ }>]>>;
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
+ fileSet: z.ZodOptional<z.ZodEnum<{
114
+ all: "all";
115
+ gitignore: "gitignore";
116
+ }>>;
117
+ }, z.core.$strip>]>>]>>;
118
+ tools: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
119
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
120
+ middleware: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
121
+ streamOutput: z.ZodOptional<z.ZodBoolean>;
122
+ writeOutputToFile: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>;
123
+ writeBinaryOutputsToFile: z.ZodOptional<z.ZodBoolean>;
124
+ useColour: z.ZodOptional<z.ZodBoolean>;
125
+ streamSessionInferenceLog: z.ZodOptional<z.ZodBoolean>;
126
+ canInterruptInferenceWithEsc: z.ZodOptional<z.ZodBoolean>;
127
+ debugLog: z.ZodOptional<z.ZodBoolean>;
128
+ recursionLimit: z.ZodOptional<z.ZodNumber>;
129
+ consoleLevel: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
130
+ customTools: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
131
+ command: z.ZodString;
132
+ description: z.ZodString;
133
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
134
+ description: z.ZodString;
135
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
136
+ "absolute-paths": "absolute-paths";
137
+ "directory-traversal": "directory-traversal";
138
+ "null-bytes": "null-bytes";
139
+ "shell-injection": "shell-injection";
140
+ }>>>;
141
+ }, z.core.$strip>>>;
142
+ timeout: z.ZodOptional<z.ZodNumber>;
143
+ }, z.core.$strip>>>;
144
+ mcpServers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
145
+ tls: z.ZodOptional<z.ZodObject<{
146
+ extraCaCerts: z.ZodOptional<z.ZodArray<z.ZodString>>;
147
+ rejectUnauthorized: z.ZodOptional<z.ZodBoolean>;
148
+ }, z.core.$strip>>;
149
+ a2aAgents: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
150
+ builtInToolsConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
151
+ aiignore: z.ZodOptional<z.ZodObject<{
152
+ enabled: z.ZodOptional<z.ZodBoolean>;
153
+ patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
154
+ }, z.core.$strip>>;
155
+ commands: z.ZodOptional<z.ZodObject<{
156
+ pr: z.ZodOptional<z.ZodObject<{
157
+ contentSource: z.ZodOptional<z.ZodString>;
158
+ requirementSource: z.ZodOptional<z.ZodString>;
159
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
160
+ all: "all";
161
+ none: "none";
162
+ read: "read";
163
+ }>]>>;
164
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
165
+ enabled: z.ZodOptional<z.ZodBoolean>;
166
+ command: z.ZodOptional<z.ZodString>;
167
+ timeout: z.ZodOptional<z.ZodNumber>;
168
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
169
+ allowlist: z.ZodOptional<z.ZodBoolean>;
170
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
171
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
172
+ enabled: z.ZodOptional<z.ZodBoolean>;
173
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
174
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
175
+ model: z.ZodOptional<z.ZodObject<{
176
+ type: z.ZodOptional<z.ZodString>;
177
+ model: z.ZodOptional<z.ZodString>;
178
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
179
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
180
+ }, z.core.$loose>>;
181
+ }, z.core.$strip>]>>;
182
+ yolo: z.ZodOptional<z.ZodBoolean>;
183
+ fileSet: z.ZodOptional<z.ZodEnum<{
184
+ all: "all";
185
+ gitignore: "gitignore";
186
+ }>>;
187
+ }, z.core.$strip>]>>]>>;
188
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
189
+ command: z.ZodString;
190
+ description: z.ZodString;
191
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
192
+ description: z.ZodString;
193
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
194
+ "absolute-paths": "absolute-paths";
195
+ "directory-traversal": "directory-traversal";
196
+ "null-bytes": "null-bytes";
197
+ "shell-injection": "shell-injection";
198
+ }>>>;
199
+ }, z.core.$strip>>>;
200
+ timeout: z.ZodOptional<z.ZodNumber>;
201
+ }, z.core.$strip>>]>>;
202
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
203
+ logWorkForReviewInSeconds: z.ZodOptional<z.ZodNumber>;
204
+ rating: z.ZodOptional<z.ZodObject<{
205
+ enabled: z.ZodOptional<z.ZodBoolean>;
206
+ passThreshold: z.ZodOptional<z.ZodNumber>;
207
+ maxRating: z.ZodOptional<z.ZodNumber>;
208
+ minRating: z.ZodOptional<z.ZodNumber>;
209
+ errorOnReviewFail: z.ZodOptional<z.ZodBoolean>;
210
+ }, z.core.$strip>>;
211
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
212
+ type: z.ZodEnum<{
213
+ audio: "audio";
214
+ binary: "binary";
215
+ file: "file";
216
+ image: "image";
217
+ video: "video";
218
+ }>;
219
+ extensions: z.ZodArray<z.ZodString>;
220
+ maxSize: z.ZodOptional<z.ZodNumber>;
221
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
222
+ }, z.core.$strip>>]>>;
223
+ }, z.core.$strip>>;
224
+ review: z.ZodOptional<z.ZodObject<{
225
+ contentSource: z.ZodOptional<z.ZodString>;
226
+ requirementSource: z.ZodOptional<z.ZodString>;
227
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
228
+ all: "all";
229
+ none: "none";
230
+ read: "read";
231
+ }>]>>;
232
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
233
+ enabled: z.ZodOptional<z.ZodBoolean>;
234
+ command: z.ZodOptional<z.ZodString>;
235
+ timeout: z.ZodOptional<z.ZodNumber>;
236
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
237
+ allowlist: z.ZodOptional<z.ZodBoolean>;
238
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
239
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
240
+ enabled: z.ZodOptional<z.ZodBoolean>;
241
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
242
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
243
+ model: z.ZodOptional<z.ZodObject<{
244
+ type: z.ZodOptional<z.ZodString>;
245
+ model: z.ZodOptional<z.ZodString>;
246
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
247
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
248
+ }, z.core.$loose>>;
249
+ }, z.core.$strip>]>>;
250
+ yolo: z.ZodOptional<z.ZodBoolean>;
251
+ fileSet: z.ZodOptional<z.ZodEnum<{
252
+ all: "all";
253
+ gitignore: "gitignore";
254
+ }>>;
255
+ }, z.core.$strip>]>>]>>;
256
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
257
+ command: z.ZodString;
258
+ description: z.ZodString;
259
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
260
+ description: z.ZodString;
261
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
262
+ "absolute-paths": "absolute-paths";
263
+ "directory-traversal": "directory-traversal";
264
+ "null-bytes": "null-bytes";
265
+ "shell-injection": "shell-injection";
266
+ }>>>;
267
+ }, z.core.$strip>>>;
268
+ timeout: z.ZodOptional<z.ZodNumber>;
269
+ }, z.core.$strip>>]>>;
270
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
271
+ rating: z.ZodOptional<z.ZodObject<{
272
+ enabled: z.ZodOptional<z.ZodBoolean>;
273
+ passThreshold: z.ZodOptional<z.ZodNumber>;
274
+ maxRating: z.ZodOptional<z.ZodNumber>;
275
+ minRating: z.ZodOptional<z.ZodNumber>;
276
+ errorOnReviewFail: z.ZodOptional<z.ZodBoolean>;
277
+ }, z.core.$strip>>;
278
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
279
+ type: z.ZodEnum<{
280
+ audio: "audio";
281
+ binary: "binary";
282
+ file: "file";
283
+ image: "image";
284
+ video: "video";
285
+ }>;
286
+ extensions: z.ZodArray<z.ZodString>;
287
+ maxSize: z.ZodOptional<z.ZodNumber>;
288
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
289
+ }, z.core.$strip>>]>>;
290
+ }, z.core.$strip>>;
291
+ ask: z.ZodOptional<z.ZodObject<{
292
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
293
+ all: "all";
294
+ none: "none";
295
+ read: "read";
296
+ }>]>>;
297
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
298
+ enabled: z.ZodOptional<z.ZodBoolean>;
299
+ command: z.ZodOptional<z.ZodString>;
300
+ timeout: z.ZodOptional<z.ZodNumber>;
301
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
302
+ allowlist: z.ZodOptional<z.ZodBoolean>;
303
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
304
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
305
+ enabled: z.ZodOptional<z.ZodBoolean>;
306
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
307
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
308
+ model: z.ZodOptional<z.ZodObject<{
309
+ type: z.ZodOptional<z.ZodString>;
310
+ model: z.ZodOptional<z.ZodString>;
311
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
312
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
313
+ }, z.core.$loose>>;
314
+ }, z.core.$strip>]>>;
315
+ yolo: z.ZodOptional<z.ZodBoolean>;
316
+ fileSet: z.ZodOptional<z.ZodEnum<{
317
+ all: "all";
318
+ gitignore: "gitignore";
319
+ }>>;
320
+ }, z.core.$strip>]>>]>>;
321
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
322
+ command: z.ZodString;
323
+ description: z.ZodString;
324
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
325
+ description: z.ZodString;
326
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
327
+ "absolute-paths": "absolute-paths";
328
+ "directory-traversal": "directory-traversal";
329
+ "null-bytes": "null-bytes";
330
+ "shell-injection": "shell-injection";
331
+ }>>>;
332
+ }, z.core.$strip>>>;
333
+ timeout: z.ZodOptional<z.ZodNumber>;
334
+ }, z.core.$strip>>]>>;
335
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
336
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
337
+ type: z.ZodEnum<{
338
+ audio: "audio";
339
+ binary: "binary";
340
+ file: "file";
341
+ image: "image";
342
+ video: "video";
343
+ }>;
344
+ extensions: z.ZodArray<z.ZodString>;
345
+ maxSize: z.ZodOptional<z.ZodNumber>;
346
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
347
+ }, z.core.$strip>>]>>;
348
+ }, z.core.$strip>>;
349
+ chat: z.ZodOptional<z.ZodObject<{
350
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
351
+ all: "all";
352
+ none: "none";
353
+ read: "read";
354
+ }>]>>;
355
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
356
+ enabled: z.ZodOptional<z.ZodBoolean>;
357
+ command: z.ZodOptional<z.ZodString>;
358
+ timeout: z.ZodOptional<z.ZodNumber>;
359
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
360
+ allowlist: z.ZodOptional<z.ZodBoolean>;
361
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
362
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
363
+ enabled: z.ZodOptional<z.ZodBoolean>;
364
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
365
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
366
+ model: z.ZodOptional<z.ZodObject<{
367
+ type: z.ZodOptional<z.ZodString>;
368
+ model: z.ZodOptional<z.ZodString>;
369
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
370
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
371
+ }, z.core.$loose>>;
372
+ }, z.core.$strip>]>>;
373
+ yolo: z.ZodOptional<z.ZodBoolean>;
374
+ fileSet: z.ZodOptional<z.ZodEnum<{
375
+ all: "all";
376
+ gitignore: "gitignore";
377
+ }>>;
378
+ }, z.core.$strip>]>>]>>;
379
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
380
+ command: z.ZodString;
381
+ description: z.ZodString;
382
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
383
+ description: z.ZodString;
384
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
385
+ "absolute-paths": "absolute-paths";
386
+ "directory-traversal": "directory-traversal";
387
+ "null-bytes": "null-bytes";
388
+ "shell-injection": "shell-injection";
389
+ }>>>;
390
+ }, z.core.$strip>>>;
391
+ timeout: z.ZodOptional<z.ZodNumber>;
392
+ }, z.core.$strip>>]>>;
393
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
394
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
395
+ type: z.ZodEnum<{
396
+ audio: "audio";
397
+ binary: "binary";
398
+ file: "file";
399
+ image: "image";
400
+ video: "video";
401
+ }>;
402
+ extensions: z.ZodArray<z.ZodString>;
403
+ maxSize: z.ZodOptional<z.ZodNumber>;
404
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
405
+ }, z.core.$strip>>]>>;
406
+ }, z.core.$strip>>;
407
+ code: z.ZodOptional<z.ZodObject<{
408
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
409
+ all: "all";
410
+ none: "none";
411
+ read: "read";
412
+ }>]>>;
413
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
414
+ enabled: z.ZodOptional<z.ZodBoolean>;
415
+ command: z.ZodOptional<z.ZodString>;
416
+ timeout: z.ZodOptional<z.ZodNumber>;
417
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
418
+ allowlist: z.ZodOptional<z.ZodBoolean>;
419
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
420
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
421
+ enabled: z.ZodOptional<z.ZodBoolean>;
422
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
423
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
424
+ model: z.ZodOptional<z.ZodObject<{
425
+ type: z.ZodOptional<z.ZodString>;
426
+ model: z.ZodOptional<z.ZodString>;
427
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
428
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
429
+ }, z.core.$loose>>;
430
+ }, z.core.$strip>]>>;
431
+ yolo: z.ZodOptional<z.ZodBoolean>;
432
+ fileSet: z.ZodOptional<z.ZodEnum<{
433
+ all: "all";
434
+ gitignore: "gitignore";
435
+ }>>;
436
+ }, z.core.$strip>]>>]>>;
437
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
438
+ command: z.ZodString;
439
+ description: z.ZodString;
440
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
441
+ description: z.ZodString;
442
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
443
+ "absolute-paths": "absolute-paths";
444
+ "directory-traversal": "directory-traversal";
445
+ "null-bytes": "null-bytes";
446
+ "shell-injection": "shell-injection";
447
+ }>>>;
448
+ }, z.core.$strip>>>;
449
+ timeout: z.ZodOptional<z.ZodNumber>;
450
+ }, z.core.$strip>>]>>;
451
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
452
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
453
+ type: z.ZodEnum<{
454
+ audio: "audio";
455
+ binary: "binary";
456
+ file: "file";
457
+ image: "image";
458
+ video: "video";
459
+ }>;
460
+ extensions: z.ZodArray<z.ZodString>;
461
+ maxSize: z.ZodOptional<z.ZodNumber>;
462
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
463
+ }, z.core.$strip>>]>>;
464
+ }, z.core.$strip>>;
465
+ exec: z.ZodOptional<z.ZodObject<{
466
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
467
+ all: "all";
468
+ none: "none";
469
+ read: "read";
470
+ }>]>>;
471
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
472
+ enabled: z.ZodOptional<z.ZodBoolean>;
473
+ command: z.ZodOptional<z.ZodString>;
474
+ timeout: z.ZodOptional<z.ZodNumber>;
475
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
476
+ allowlist: z.ZodOptional<z.ZodBoolean>;
477
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
478
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
479
+ enabled: z.ZodOptional<z.ZodBoolean>;
480
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
481
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
482
+ model: z.ZodOptional<z.ZodObject<{
483
+ type: z.ZodOptional<z.ZodString>;
484
+ model: z.ZodOptional<z.ZodString>;
485
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
486
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
487
+ }, z.core.$loose>>;
488
+ }, z.core.$strip>]>>;
489
+ yolo: z.ZodOptional<z.ZodBoolean>;
490
+ fileSet: z.ZodOptional<z.ZodEnum<{
491
+ all: "all";
492
+ gitignore: "gitignore";
493
+ }>>;
494
+ }, z.core.$strip>]>>]>>;
495
+ customTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodRecord<z.ZodString, z.ZodObject<{
496
+ command: z.ZodString;
497
+ description: z.ZodString;
498
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
499
+ description: z.ZodString;
500
+ allow: z.ZodOptional<z.ZodArray<z.ZodEnum<{
501
+ "absolute-paths": "absolute-paths";
502
+ "directory-traversal": "directory-traversal";
503
+ "null-bytes": "null-bytes";
504
+ "shell-injection": "shell-injection";
505
+ }>>>;
506
+ }, z.core.$strip>>>;
507
+ timeout: z.ZodOptional<z.ZodNumber>;
508
+ }, z.core.$strip>>]>>;
509
+ allowedTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
510
+ binaryFormats: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodArray<z.ZodObject<{
511
+ type: z.ZodEnum<{
512
+ audio: "audio";
513
+ binary: "binary";
514
+ file: "file";
515
+ image: "image";
516
+ video: "video";
517
+ }>;
518
+ extensions: z.ZodArray<z.ZodString>;
519
+ maxSize: z.ZodOptional<z.ZodNumber>;
520
+ mimeTypes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
521
+ }, z.core.$strip>>]>>;
522
+ }, z.core.$strip>>;
523
+ api: z.ZodOptional<z.ZodObject<{
524
+ filesystem: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodEnum<{
525
+ all: "all";
526
+ none: "none";
527
+ read: "read";
528
+ }>]>>;
529
+ builtInTools: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
530
+ enabled: z.ZodOptional<z.ZodBoolean>;
531
+ command: z.ZodOptional<z.ZodString>;
532
+ timeout: z.ZodOptional<z.ZodNumber>;
533
+ maxOutputBytes: z.ZodOptional<z.ZodNumber>;
534
+ allowlist: z.ZodOptional<z.ZodBoolean>;
535
+ persistAllowlist: z.ZodOptional<z.ZodBoolean>;
536
+ judge: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
537
+ enabled: z.ZodOptional<z.ZodBoolean>;
538
+ autoApproveLow: z.ZodOptional<z.ZodBoolean>;
539
+ blockHigh: z.ZodOptional<z.ZodBoolean>;
540
+ model: z.ZodOptional<z.ZodObject<{
541
+ type: z.ZodOptional<z.ZodString>;
542
+ model: z.ZodOptional<z.ZodString>;
543
+ configuration: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
544
+ apiKeyEnvironmentVariable: z.ZodOptional<z.ZodString>;
545
+ }, z.core.$loose>>;
546
+ }, z.core.$strip>]>>;
547
+ yolo: z.ZodOptional<z.ZodBoolean>;
548
+ fileSet: z.ZodOptional<z.ZodEnum<{
549
+ all: "all";
550
+ gitignore: "gitignore";
551
+ }>>;
552
+ }, z.core.$strip>]>>]>>;
553
+ port: z.ZodOptional<z.ZodNumber>;
554
+ cors: z.ZodOptional<z.ZodObject<{
555
+ allowOrigin: z.ZodOptional<z.ZodString>;
556
+ allowMethods: z.ZodOptional<z.ZodString>;
557
+ allowHeaders: z.ZodOptional<z.ZodString>;
558
+ }, z.core.$strip>>;
559
+ }, z.core.$strip>>;
560
+ }, z.core.$strip>>;
561
+ commit: z.ZodOptional<z.ZodObject<{
562
+ coAuthor: z.ZodOptional<z.ZodObject<{
563
+ name: z.ZodOptional<z.ZodString>;
564
+ email: z.ZodOptional<z.ZodString>;
565
+ }, z.core.$strip>>;
566
+ }, z.core.$strip>>;
567
+ modelDisplayName: z.ZodOptional<z.ZodString>;
568
+ injectModelContext: z.ZodOptional<z.ZodBoolean>;
569
+ debugDump: z.ZodOptional<z.ZodObject<{
570
+ redact: z.ZodOptional<z.ZodBoolean>;
571
+ }, z.core.$strip>>;
572
+ allowDirs: z.ZodOptional<z.ZodArray<z.ZodString>>;
573
+ askWriteMode: z.ZodOptional<z.ZodBoolean>;
574
+ output: z.ZodOptional<z.ZodObject<{
575
+ header: z.ZodOptional<z.ZodBoolean>;
576
+ }, z.core.$strip>>;
577
+ reporters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
578
+ }, z.core.$loose>;
579
+ /**
580
+ * Type inferred from {@link rawGthConfigSchema}. This is additive and intentionally
581
+ * separate from the hand-written `RawGthConfig` interface in `config.ts` (it omits
582
+ * the deprecated aliases). Prefer `RawGthConfig` for the public surface.
583
+ */
584
+ export type RawGthConfigInput = z.infer<typeof rawGthConfigSchema>;
585
+ /**
586
+ * The set of known top-level config keys, derived from the schema shape so it can
587
+ * never drift from {@link rawGthConfigSchema}. Includes `$schema`.
588
+ */
589
+ export declare const KNOWN_TOP_LEVEL_KEYS: ReadonlySet<string>;
590
+ /**
591
+ * True when a raw config value is a plain (non-null, non-array) object, so the key scans
592
+ * ({@link findDeprecatedConfigIssues}, {@link findUnknownTopLevelKeys}) are safe to run. A
593
+ * `null`/array/primitive config (e.g. a JSON file that is just `null`, or a module
594
+ * `configure()` returning null) must NOT reach those scans — they'd throw on
595
+ * `hasOwnProperty`/`Object.keys`; the entry points instead hand it straight to
596
+ * `rawGthConfigSchema.safeParse`, which reports a clean "expected object" error.
597
+ */
598
+ export declare function isRecordConfig(value: unknown): value is Record<string, unknown>;
599
+ /**
600
+ * Return the top-level keys present in `raw` that are not part of the known config
601
+ * surface. KNOWN deprecated names are rejected earlier by {@link findDeprecatedConfigIssues}
602
+ * (the entry points short-circuit on those), so a key that reaches here is a genuinely
603
+ * unknown key (a likely typo) that only warrants a warning.
604
+ */
605
+ export declare function findUnknownTopLevelKeys(raw: Record<string, unknown>): string[];
606
+ /**
607
+ * Render a friendly, path-scoped validation message from a Zod error. Each issue
608
+ * becomes a line ` - <path>: <message>`, with `(root)` for top-level issues.
609
+ */
610
+ export declare function formatConfigValidationError(error: z.ZodError): string;
611
+ /** A single deprecated-config-shape rejection: the offending `path` and the migration message. */
612
+ export interface DeprecatedConfigIssue {
613
+ /** Dotted path of the offending key (e.g. `pr`, `commands.pr.contentProvider`). */
614
+ path: string;
615
+ /** Human message naming the canonical replacement + migration path. */
616
+ message: string;
617
+ }
618
+ /**
619
+ * GS2-28 — detect the removed pre-2.0 config shapes on the RAW input (read-only; no
620
+ * mutation), returning one {@link DeprecatedConfigIssue} per occurrence. A non-empty
621
+ * result is a HARD validation failure: 2.0 dropped back-compat coercion, so an old shape
622
+ * must error and point at the fix rather than be silently remapped or ignored.
623
+ *
624
+ * Detects:
625
+ * - (A) a COMMAND name ({@link COMMAND_KEYS}) at the config ROOT — must move under `commands.<cmd>`;
626
+ * - (C) a deprecated `*Provider*` name ({@link DEPRECATED_ROOT_PAIRS} at root,
627
+ * {@link DEPRECATED_COMMAND_PAIRS} per command) — must use its `*Source*` replacement;
628
+ * - (D, CFG-18) a removed per-command key folded into another ({@link REMOVED_COMMAND_KEYS}, e.g.
629
+ * `commands.<cmd>.devTools` → configure under `builtInTools`).
630
+ *
631
+ * Runs on the raw input specifically so nested `commands.*.contentProvider` is still visible
632
+ * (zod's per-command `z.object` would strip it before any schema-embedded check could fire).
633
+ * A genuinely-unknown key is NOT flagged here (it stays a warn-only unknown key), preserving
634
+ * the deliberate typo-tolerance.
635
+ */
636
+ export declare function findDeprecatedConfigIssues(raw: Record<string, unknown>): DeprecatedConfigIssue[];
637
+ /**
638
+ * Render {@link DeprecatedConfigIssue}s as the same ` - <path>: <message>` block used for
639
+ * Zod validation errors, so a deprecated-shape rejection reads identically to a type-mismatch
640
+ * rejection (loader wraps it with `Invalid configuration in <source>:`).
641
+ */
642
+ export declare function formatDeprecatedConfigIssues(issues: ReadonlyArray<DeprecatedConfigIssue>): string;
643
+ /**
644
+ * Generate the JSON Schema for the raw config from {@link rawGthConfigSchema} using
645
+ * zod 4's native `z.toJSONSchema`. The output is committed to
646
+ * `packages/core/schema/gsloth-config.schema.json` and asserted by a golden test.
647
+ */
648
+ export declare function generateConfigJsonSchema(): Record<string, unknown>;
649
+ /**
650
+ * The structured outcome of validating a single raw config layer, WITHOUT any side
651
+ * effects (no console output, no `exit`). This is the read-side counterpart to the
652
+ * loader's `validateRawConfigLayer` (which warns + `exit`s inline): `gth config validate`
653
+ * uses it to render its own output and choose its own exit code.
654
+ */
655
+ export interface RawConfigValidationResult {
656
+ /** True when the config parses against the schema (unknown keys do NOT make it false). */
657
+ ok: boolean;
658
+ /** Non-fatal advisories: unknown top-level keys (likely typos). Deprecated shapes are hard errors, not warnings. */
659
+ warnings: string[];
660
+ /** Present only when `ok` is false: the path-scoped, multi-line validation message. */
661
+ errorMessage?: string;
662
+ }
663
+ /**
664
+ * Validate a freshly-loaded raw config object against {@link rawGthConfigSchema} and
665
+ * report the outcome as data (a pure function — no `displayWarning`/`exit`). Mirrors the
666
+ * loader's policy: a removed pre-2.0 shape (a top-level command key or a deprecated
667
+ * `*Provider*` name) is a HARD failure that names the fix, unknown top-level keys warn but
668
+ * do not fail, and a genuine type mismatch on a known field fails with a path-scoped message.
669
+ *
670
+ * Read-only: `findDeprecatedConfigIssues`, `findUnknownTopLevelKeys` and `safeParse` never
671
+ * mutate `raw`, so no defensive copy is needed.
672
+ */
673
+ export declare function validateRawGthConfig(raw: Record<string, unknown>): RawConfigValidationResult;