audit-tools 0.32.36 → 0.32.37
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.
- package/dist/audit/cli/validateCommand.d.ts.map +1 -1
- package/dist/audit/cli/validateCommand.js +10 -3
- package/dist/audit/cli/validateCommand.js.map +1 -1
- package/dist/audit/supervisor/sessionConfig.d.ts.map +1 -1
- package/dist/audit/supervisor/sessionConfig.js +18 -8
- package/dist/audit/supervisor/sessionConfig.js.map +1 -1
- package/dist/audit/types/analyzerCapability.d.ts +6 -6
- package/dist/audit/validation/sessionConfig.d.ts +1 -2
- package/dist/audit/validation/sessionConfig.d.ts.map +1 -1
- package/dist/audit/validation/sessionConfig.js +6 -361
- package/dist/audit/validation/sessionConfig.js.map +1 -1
- package/dist/remediate/phases/plan.d.ts.map +1 -1
- package/dist/remediate/phases/plan.js +3 -3
- package/dist/remediate/phases/plan.js.map +1 -1
- package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
- package/dist/remediate/steps/contractPipeline.js +2 -2
- package/dist/remediate/steps/contractPipeline.js.map +1 -1
- package/dist/remediate/steps/nextStep.d.ts.map +1 -1
- package/dist/remediate/steps/nextStep.js +11 -5
- package/dist/remediate/steps/nextStep.js.map +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/validation/sessionConfig.d.ts +41 -16
- package/dist/shared/validation/sessionConfig.d.ts.map +1 -1
- package/dist/shared/validation/sessionConfig.js +415 -26
- package/dist/shared/validation/sessionConfig.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,38 +1,427 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SessionConfig validation
|
|
2
|
+
* Canonical SessionConfig validation — the single source of truth for BOTH
|
|
3
|
+
* orchestrators (audit + remediate). Field-shape checks emit `error`-severity
|
|
4
|
+
* issues (the config cannot be used safely as-is); the
|
|
5
|
+
* `dangerously_skip_permissions` surface is a `warning` (a legitimate but
|
|
6
|
+
* security-sensitive operator choice that must never be silently honored —
|
|
7
|
+
* INV-shared-core-08).
|
|
3
8
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
9
|
+
* Rule (Auditor-agnostic robustness): both orchestrators MUST reject a malformed
|
|
10
|
+
* `session-config.json` at load rather than degrade silently to a floor. The
|
|
11
|
+
* shared {@link readValidatedSessionConfig} helper is the load-boundary chokepoint
|
|
12
|
+
* that guarantees this without either orchestrator having to remember to call the
|
|
13
|
+
* validator itself.
|
|
8
14
|
*/
|
|
9
|
-
import {
|
|
15
|
+
import { readOptionalJsonFile } from "../io/json.js";
|
|
16
|
+
import { ANALYZER_SETTINGS, DISPATCHABLE_SOURCE_PROVIDERS, PROVIDER_NAMES, SESSION_UI_MODES, } from "../types/sessionConfig.js";
|
|
17
|
+
import { formatValidationIssues, isRecord, pushValidationIssue, } from "./basic.js";
|
|
18
|
+
const VALID_PROVIDERS = new Set(PROVIDER_NAMES);
|
|
19
|
+
const VALID_UI_MODES = new Set(SESSION_UI_MODES);
|
|
20
|
+
const VALID_ANALYZER_SETTINGS = new Set(ANALYZER_SETTINGS);
|
|
21
|
+
const VALID_DISPATCHABLE_SOURCE_PROVIDERS = new Set(DISPATCHABLE_SOURCE_PROVIDERS);
|
|
10
22
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
* Every `QuotaModelLimits` field is a positive-integer count (token windows,
|
|
24
|
+
* per-minute rate limits, in-flight cap) that feeds admission sizing / rate
|
|
25
|
+
* limiting directly — an out-of-range value silently over- or under-admits (a
|
|
26
|
+
* too-large `context_tokens` over-sizes packets → the exact overrun C1 guards
|
|
27
|
+
* against). Reject it at config load rather than let it reach the scheduler.
|
|
28
|
+
*/
|
|
29
|
+
// Token windows and per-minute rate limits must be strictly positive integers.
|
|
30
|
+
// `max_concurrent` is separate: the runtime treats 0 as the documented
|
|
31
|
+
// "unlimited" sentinel (`positiveIntCapOrNull` maps 0 → null), so it allows a
|
|
32
|
+
// non-negative integer.
|
|
33
|
+
const QUOTA_POSITIVE_INT_FIELDS = [
|
|
34
|
+
"context_tokens",
|
|
35
|
+
"output_tokens",
|
|
36
|
+
"requests_per_minute",
|
|
37
|
+
"input_tokens_per_minute",
|
|
38
|
+
"output_tokens_per_minute",
|
|
39
|
+
];
|
|
40
|
+
function validateQuotaModelLimits(value, path, issues) {
|
|
41
|
+
if (!isRecord(value)) {
|
|
42
|
+
pushIssue(issues, path, "quota must be a JSON object.");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const badFields = new Set();
|
|
46
|
+
for (const key of QUOTA_POSITIVE_INT_FIELDS) {
|
|
47
|
+
const entry = value[key];
|
|
48
|
+
if (entry !== undefined &&
|
|
49
|
+
(typeof entry !== "number" || !Number.isInteger(entry) || entry <= 0)) {
|
|
50
|
+
pushIssue(issues, `${path}.${key}`, `${key} must be a positive integer when provided.`);
|
|
51
|
+
badFields.add(key);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const maxConcurrent = value.max_concurrent;
|
|
55
|
+
if (maxConcurrent !== undefined &&
|
|
56
|
+
(typeof maxConcurrent !== "number" ||
|
|
57
|
+
!Number.isInteger(maxConcurrent) ||
|
|
58
|
+
maxConcurrent < 0)) {
|
|
59
|
+
pushIssue(issues, `${path}.max_concurrent`, "max_concurrent must be a non-negative integer when provided (0 = unlimited).");
|
|
60
|
+
}
|
|
61
|
+
// Cross-field: a reserved output that meets or exceeds the context leaves no
|
|
62
|
+
// room for input. Skip when either field already failed its per-field check
|
|
63
|
+
// (the per-field error is the actionable one; a second message here is noise).
|
|
64
|
+
const context = value.context_tokens;
|
|
65
|
+
const output = value.output_tokens;
|
|
66
|
+
if (typeof context === "number" &&
|
|
67
|
+
typeof output === "number" &&
|
|
68
|
+
Number.isFinite(context) &&
|
|
69
|
+
Number.isFinite(output) &&
|
|
70
|
+
!badFields.has("context_tokens") &&
|
|
71
|
+
!badFields.has("output_tokens") &&
|
|
72
|
+
output >= context) {
|
|
73
|
+
pushIssue(issues, `${path}.output_tokens`, "output_tokens must be less than context_tokens (no room for input otherwise).");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validate `sessionConfig.sources[]` — the explicit dispatchable-source pool
|
|
78
|
+
* list. Shape-guards each entry's provider and (the C1 concern) its `quota`,
|
|
79
|
+
* which is now the single source of truth for a source pool's admission budget.
|
|
80
|
+
*/
|
|
81
|
+
function validateDispatchableSources(value, issues) {
|
|
82
|
+
if (value === undefined)
|
|
83
|
+
return;
|
|
84
|
+
if (!Array.isArray(value)) {
|
|
85
|
+
pushIssue(issues, "sources", "sources must be an array of dispatchable source objects.");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
value.forEach((source, index) => {
|
|
89
|
+
const path = `sources[${index}]`;
|
|
90
|
+
if (!isRecord(source)) {
|
|
91
|
+
pushIssue(issues, path, "each source must be a JSON object.");
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const provider = source.provider;
|
|
95
|
+
if (typeof provider !== "string" ||
|
|
96
|
+
!VALID_DISPATCHABLE_SOURCE_PROVIDERS.has(provider)) {
|
|
97
|
+
pushIssue(issues, `${path}.provider`, `provider must be one of: ${Array.from(VALID_DISPATCHABLE_SOURCE_PROVIDERS).join(", ")}.`);
|
|
98
|
+
}
|
|
99
|
+
if (source.quota !== undefined) {
|
|
100
|
+
validateQuotaModelLimits(source.quota, `${path}.quota`, issues);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function pushIssue(issues, path, message) {
|
|
105
|
+
pushValidationIssue(issues, path, message);
|
|
106
|
+
}
|
|
107
|
+
function validateStringArray(value, path, label, issues, options = {}) {
|
|
108
|
+
if (!Array.isArray(value)) {
|
|
109
|
+
pushIssue(issues, path, `${label} must be an array of strings.`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (!options.allowEmptyArray && value.length === 0) {
|
|
113
|
+
pushIssue(issues, path, `${label} must not be empty.`);
|
|
114
|
+
}
|
|
115
|
+
for (const [index, item] of value.entries()) {
|
|
116
|
+
if (typeof item !== "string" || item.trim().length === 0) {
|
|
117
|
+
pushIssue(issues, `${path}[${index}]`, `${label} entries must be non-empty strings.`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function validateEnvOverlay(value, path, issues) {
|
|
122
|
+
if (!isRecord(value)) {
|
|
123
|
+
pushIssue(issues, path, "env must be an object of string values.");
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
127
|
+
if (typeof entry !== "string") {
|
|
128
|
+
pushIssue(issues, `${path}.${key}`, "Environment override values must be strings.");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function validateTemplateProviderSection(value, path, issues, required) {
|
|
133
|
+
if (value === undefined) {
|
|
134
|
+
if (required) {
|
|
135
|
+
pushIssue(issues, path, "Provider requires this config section with a non-empty command_template.");
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (!isRecord(value)) {
|
|
140
|
+
pushIssue(issues, path, "Provider config must be a JSON object.");
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (value.command_template === undefined) {
|
|
144
|
+
if (required) {
|
|
145
|
+
pushIssue(issues, `${path}.command_template`, "command_template is required for this provider.");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
validateStringArray(value.command_template, `${path}.command_template`, "command_template", issues);
|
|
150
|
+
}
|
|
151
|
+
if (value.env !== undefined) {
|
|
152
|
+
validateEnvOverlay(value.env, `${path}.env`, issues);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function validateAgentProviderSection(value, path, issues) {
|
|
156
|
+
if (value === undefined) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (!isRecord(value)) {
|
|
160
|
+
pushIssue(issues, path, "Provider config must be a JSON object.");
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (value.command !== undefined) {
|
|
164
|
+
if (typeof value.command !== "string" || value.command.trim().length === 0) {
|
|
165
|
+
pushIssue(issues, `${path}.command`, "command must be a non-empty string when provided.");
|
|
166
|
+
}
|
|
167
|
+
else if (!isSupportedConfiguredCommand(value.command)) {
|
|
168
|
+
pushIssue(issues, `${path}.command`, "command must be a bare executable name or direct executable path. Put CLI flags in extra_args.");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (value.extra_args !== undefined) {
|
|
172
|
+
validateStringArray(value.extra_args, `${path}.extra_args`, "extra_args", issues, { allowEmptyArray: true });
|
|
173
|
+
}
|
|
174
|
+
if (path === "claude_code" && value.dangerously_skip_permissions !== undefined) {
|
|
175
|
+
if (typeof value.dangerously_skip_permissions !== "boolean") {
|
|
176
|
+
pushIssue(issues, `${path}.dangerously_skip_permissions`, "dangerously_skip_permissions must be a boolean when provided.");
|
|
177
|
+
}
|
|
178
|
+
else if (value.dangerously_skip_permissions === true) {
|
|
179
|
+
// INV-shared-core-08: never silently honor a host-permission bypass —
|
|
180
|
+
// surface it as a warning (a legitimate but security-sensitive choice), not
|
|
181
|
+
// an error that blocks the config from loading.
|
|
182
|
+
pushValidationIssue(issues, `${path}.dangerously_skip_permissions`, "dangerously_skip_permissions is set to true — this bypasses host permission controls and should only be used in fully trusted, isolated environments. Verify this is intentional.", "warning");
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Validate the `openai_compatible` provider section. Unlike the agentic CLI
|
|
188
|
+
* sections, this one has no `command`/PATH semantics — it is an HTTP endpoint, so
|
|
189
|
+
* we type-check the URL/model/key/tuning fields and, when this provider is the
|
|
190
|
+
* selected one, require the endpoint + model (the API key is resolved from the
|
|
191
|
+
* environment at launch, so its presence is not validated here).
|
|
192
|
+
*/
|
|
193
|
+
function validateOpenAiCompatibleSection(value, path, issues, required) {
|
|
194
|
+
if (value === undefined) {
|
|
195
|
+
if (required) {
|
|
196
|
+
pushIssue(issues, path, "Provider requires this config section with base_url and model.");
|
|
197
|
+
}
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (!isRecord(value)) {
|
|
201
|
+
pushIssue(issues, path, "Provider config must be a JSON object.");
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
for (const key of ["base_url", "model", "api_key_env", "api_key"]) {
|
|
205
|
+
const entry = value[key];
|
|
206
|
+
if (entry !== undefined &&
|
|
207
|
+
(typeof entry !== "string" || entry.trim().length === 0)) {
|
|
208
|
+
pushIssue(issues, `${path}.${key}`, `${key} must be a non-empty string when provided.`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (required) {
|
|
212
|
+
for (const key of ["base_url", "model"]) {
|
|
213
|
+
if (value[key] === undefined) {
|
|
214
|
+
pushIssue(issues, `${path}.${key}`, `${key} is required for the openai-compatible provider.`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (value.headers !== undefined) {
|
|
219
|
+
validateEnvOverlay(value.headers, `${path}.headers`, issues);
|
|
220
|
+
}
|
|
221
|
+
for (const key of [
|
|
222
|
+
"temperature",
|
|
223
|
+
"max_output_tokens",
|
|
224
|
+
"referenced_files_max",
|
|
225
|
+
"referenced_file_byte_cap",
|
|
226
|
+
"referenced_files_total_byte_cap",
|
|
227
|
+
]) {
|
|
228
|
+
const entry = value[key];
|
|
229
|
+
if (entry !== undefined && (typeof entry !== "number" || !Number.isFinite(entry))) {
|
|
230
|
+
pushIssue(issues, `${path}.${key}`, `${key} must be a finite number when provided.`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
for (const key of ["response_format_json", "include_referenced_files"]) {
|
|
234
|
+
if (value[key] !== undefined && typeof value[key] !== "boolean") {
|
|
235
|
+
pushIssue(issues, `${path}.${key}`, `${key} must be a boolean when provided.`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (value.quota !== undefined) {
|
|
239
|
+
validateQuotaModelLimits(value.quota, `${path}.quota`, issues);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function startsWithPathPrefix(command) {
|
|
243
|
+
return (command.startsWith(".") ||
|
|
244
|
+
command.startsWith("/") ||
|
|
245
|
+
command.startsWith("\\\\") ||
|
|
246
|
+
/^[A-Za-z]:[\\/]/.test(command));
|
|
247
|
+
}
|
|
248
|
+
function containsForbiddenCommandSyntax(command) {
|
|
249
|
+
return /[\r\n"'`|&;<>]/.test(command);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* A configured provider `command` must be either a bare executable name or a
|
|
253
|
+
* direct executable path — never a compound string with flags/metacharacters
|
|
254
|
+
* (those go in `extra_args`). Shared so the field validator and the audit
|
|
255
|
+
* env-probe agree on what a valid command looks like.
|
|
256
|
+
*/
|
|
257
|
+
export function isBareExecutableName(command) {
|
|
258
|
+
return (command.length > 0 &&
|
|
259
|
+
!/\s/.test(command) &&
|
|
260
|
+
!containsForbiddenCommandSyntax(command) &&
|
|
261
|
+
!/[\\/]/.test(command) &&
|
|
262
|
+
!/^[A-Za-z]:/.test(command));
|
|
263
|
+
}
|
|
264
|
+
export function isDirectExecutablePath(command) {
|
|
265
|
+
return (command.length > 0 &&
|
|
266
|
+
!containsForbiddenCommandSyntax(command) &&
|
|
267
|
+
startsWithPathPrefix(command));
|
|
268
|
+
}
|
|
269
|
+
export function isSupportedConfiguredCommand(command) {
|
|
270
|
+
const trimmed = command.trim();
|
|
271
|
+
if (trimmed.length === 0 || trimmed !== command) {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
return isBareExecutableName(trimmed) || isDirectExecutablePath(trimmed);
|
|
275
|
+
}
|
|
276
|
+
function validateRoutingTiers(value, issues) {
|
|
277
|
+
if (!isRecord(value)) {
|
|
278
|
+
pushIssue(issues, "dispatch.routing_tiers", "dispatch.routing_tiers must be a JSON object.");
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
for (const key of ["deep_at", "standard_at"]) {
|
|
282
|
+
const cut = value[key];
|
|
283
|
+
if (cut !== undefined &&
|
|
284
|
+
(typeof cut !== "number" || !Number.isFinite(cut) || cut < 0 || cut > 1)) {
|
|
285
|
+
pushIssue(issues, `dispatch.routing_tiers.${key}`, `dispatch.routing_tiers.${key} must be a number in [0, 1] when provided.`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (typeof value.deep_at === "number" &&
|
|
289
|
+
typeof value.standard_at === "number" &&
|
|
290
|
+
value.deep_at < value.standard_at) {
|
|
291
|
+
pushIssue(issues, "dispatch.routing_tiers", "dispatch.routing_tiers.deep_at must be >= standard_at.");
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Validate a SessionConfig's field shapes and surface security-sensitive
|
|
296
|
+
* settings. Returns a (possibly empty) list of {@link ValidationIssue}s; `error`
|
|
297
|
+
* severity means the config cannot be used safely, `warning` means the caller
|
|
298
|
+
* should surface the concern before proceeding (see {@link readValidatedSessionConfig}).
|
|
20
299
|
*/
|
|
21
|
-
export function validateSessionConfig(
|
|
300
|
+
export function validateSessionConfig(value) {
|
|
22
301
|
const issues = [];
|
|
23
|
-
if (
|
|
24
|
-
pushValidationIssue(issues, path, `Expected a SessionConfig object, got ${typeof config}.`);
|
|
302
|
+
if (value === undefined) {
|
|
25
303
|
return issues;
|
|
26
304
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
305
|
+
if (!isRecord(value)) {
|
|
306
|
+
pushIssue(issues, "session_config", "Session config must be a JSON object.");
|
|
307
|
+
return issues;
|
|
308
|
+
}
|
|
309
|
+
const provider = value.provider;
|
|
310
|
+
if (provider !== undefined) {
|
|
311
|
+
if (typeof provider !== "string") {
|
|
312
|
+
pushIssue(issues, "provider", "provider must be a string.");
|
|
313
|
+
}
|
|
314
|
+
else if (!VALID_PROVIDERS.has(provider)) {
|
|
315
|
+
pushIssue(issues, "provider", `Unsupported provider "${provider}". Expected one of: ${Array.from(VALID_PROVIDERS).join(", ")}.`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const hostProvider = value.host_provider;
|
|
319
|
+
if (hostProvider !== undefined) {
|
|
320
|
+
if (typeof hostProvider !== "string") {
|
|
321
|
+
pushIssue(issues, "host_provider", "host_provider must be a string.");
|
|
322
|
+
}
|
|
323
|
+
else if (!VALID_PROVIDERS.has(hostProvider)) {
|
|
324
|
+
pushIssue(issues, "host_provider", `Unsupported host_provider "${hostProvider}". Expected one of: ${Array.from(VALID_PROVIDERS).join(", ")}.`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
const timeoutMs = value.timeout_ms;
|
|
328
|
+
if (timeoutMs !== undefined &&
|
|
329
|
+
(!Number.isInteger(timeoutMs) || Number(timeoutMs) <= 0)) {
|
|
330
|
+
pushIssue(issues, "timeout_ms", "timeout_ms must be a positive integer number of milliseconds.");
|
|
331
|
+
}
|
|
332
|
+
const uiMode = value.ui_mode;
|
|
333
|
+
if (uiMode !== undefined) {
|
|
334
|
+
if (typeof uiMode !== "string" || !VALID_UI_MODES.has(uiMode)) {
|
|
335
|
+
pushIssue(issues, "ui_mode", `ui_mode must be one of: ${Array.from(VALID_UI_MODES).join(", ")}.`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (value.host_can_dispatch_subagents !== undefined &&
|
|
339
|
+
typeof value.host_can_dispatch_subagents !== "boolean") {
|
|
340
|
+
pushIssue(issues, "host_can_dispatch_subagents", "host_can_dispatch_subagents must be a boolean when provided.");
|
|
341
|
+
}
|
|
342
|
+
if (value.autonomous_mode !== undefined &&
|
|
343
|
+
typeof value.autonomous_mode !== "boolean") {
|
|
344
|
+
pushIssue(issues, "autonomous_mode", "autonomous_mode must be a boolean when provided.");
|
|
345
|
+
}
|
|
346
|
+
validateTemplateProviderSection(value.subprocess_template, "subprocess_template", issues, provider === "subprocess-template");
|
|
347
|
+
validateTemplateProviderSection(value.vscode_task, "vscode_task", issues, provider === "vscode-task");
|
|
348
|
+
validateTemplateProviderSection(value.antigravity, "antigravity", issues, provider === "antigravity");
|
|
349
|
+
validateAgentProviderSection(value.claude_code, "claude_code", issues);
|
|
350
|
+
validateAgentProviderSection(value.codex, "codex", issues);
|
|
351
|
+
validateAgentProviderSection(value.opencode, "opencode", issues);
|
|
352
|
+
validateOpenAiCompatibleSection(value.openai_compatible, "openai_compatible", issues, provider === "openai-compatible");
|
|
353
|
+
validateDispatchableSources(value.sources, issues);
|
|
354
|
+
if (value.synthesis !== undefined) {
|
|
355
|
+
if (!isRecord(value.synthesis)) {
|
|
356
|
+
pushIssue(issues, "synthesis", "synthesis must be a JSON object.");
|
|
357
|
+
}
|
|
358
|
+
else if (value.synthesis.narrative !== undefined &&
|
|
359
|
+
typeof value.synthesis.narrative !== "boolean") {
|
|
360
|
+
pushIssue(issues, "synthesis.narrative", "synthesis.narrative must be a boolean when provided.");
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (value.dispatch !== undefined) {
|
|
364
|
+
if (!isRecord(value.dispatch)) {
|
|
365
|
+
pushIssue(issues, "dispatch", "dispatch must be a JSON object.");
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
if (value.dispatch.confirm_threshold !== undefined &&
|
|
369
|
+
(!Number.isInteger(value.dispatch.confirm_threshold) ||
|
|
370
|
+
Number(value.dispatch.confirm_threshold) < 0)) {
|
|
371
|
+
pushIssue(issues, "dispatch.confirm_threshold", "dispatch.confirm_threshold must be a non-negative integer when provided.");
|
|
372
|
+
}
|
|
373
|
+
if (value.dispatch.max_packets !== undefined &&
|
|
374
|
+
(!Number.isInteger(value.dispatch.max_packets) ||
|
|
375
|
+
Number(value.dispatch.max_packets) < 0)) {
|
|
376
|
+
pushIssue(issues, "dispatch.max_packets", "dispatch.max_packets must be a non-negative integer when provided.");
|
|
377
|
+
}
|
|
378
|
+
if (value.dispatch.routing_tiers !== undefined) {
|
|
379
|
+
validateRoutingTiers(value.dispatch.routing_tiers, issues);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (value.analyzers !== undefined) {
|
|
384
|
+
if (!isRecord(value.analyzers)) {
|
|
385
|
+
pushIssue(issues, "analyzers", "analyzers must be a JSON object mapping analyzer id to a setting.");
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
for (const [id, setting] of Object.entries(value.analyzers)) {
|
|
389
|
+
if (typeof setting !== "string" ||
|
|
390
|
+
!VALID_ANALYZER_SETTINGS.has(setting)) {
|
|
391
|
+
pushIssue(issues, `analyzers.${id}`, `analyzers.${id} must be one of: ${Array.from(VALID_ANALYZER_SETTINGS).join(", ")}.`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
35
395
|
}
|
|
36
396
|
return issues;
|
|
37
397
|
}
|
|
398
|
+
/**
|
|
399
|
+
* Read `session-config.json` from `path` and validate it at the load boundary —
|
|
400
|
+
* the single chokepoint both orchestrators route through so a malformed config
|
|
401
|
+
* fails loud instead of degrading silently to a floor (Auditor-agnostic
|
|
402
|
+
* robustness; "keep orchestrators in parity"). Returns `undefined` when the file
|
|
403
|
+
* is absent (a run with no session config is legal), the typed config when valid,
|
|
404
|
+
* and THROWS on any `error`-severity issue. `warning`-severity issues (e.g.
|
|
405
|
+
* `dangerously_skip_permissions=true`) do not block the load; they are surfaced
|
|
406
|
+
* via `onWarnings` (defaulting to a stderr write so a security-sensitive setting
|
|
407
|
+
* is never silently honored — same surface both orchestrators get).
|
|
408
|
+
*/
|
|
409
|
+
export async function readValidatedSessionConfig(path, options = {}) {
|
|
410
|
+
const raw = await readOptionalJsonFile(path);
|
|
411
|
+
if (raw === undefined) {
|
|
412
|
+
return undefined;
|
|
413
|
+
}
|
|
414
|
+
const issues = validateSessionConfig(raw);
|
|
415
|
+
const errors = issues.filter((issue) => issue.severity === "error");
|
|
416
|
+
if (errors.length > 0) {
|
|
417
|
+
throw new Error(`Invalid ${path}:\n${formatValidationIssues(errors).replace(/^ {2}/gm, "- ")}`);
|
|
418
|
+
}
|
|
419
|
+
const warnings = issues.filter((issue) => issue.severity === "warning");
|
|
420
|
+
if (warnings.length > 0) {
|
|
421
|
+
const surface = options.onWarnings ??
|
|
422
|
+
((w) => console.warn(`Warnings in ${path}:\n${formatValidationIssues(w).replace(/^ {2}/gm, "- ")}`));
|
|
423
|
+
surface(warnings);
|
|
424
|
+
}
|
|
425
|
+
return raw;
|
|
426
|
+
}
|
|
38
427
|
//# sourceMappingURL=sessionConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionConfig.js","sourceRoot":"","sources":["../../../src/shared/validation/sessionConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAe,EACf,IAAI,GAAG,EAAE;IAET,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClD,mBAAmB,CACjB,MAAM,EACN,IAAI,EACJ,wCAAwC,OAAO,MAAM,GAAG,CACzD,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,GAAG,MAAiC,CAAC;IAE5C,uEAAuE;IACvE,sEAAsE;IACtE,0EAA0E;IAC1E,IACE,CAAC,CAAC,aAAa,CAAC,KAAK,IAAI;QACzB,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,QAAQ;QACnC,CAAC,CAAC,aAAa,CAA6B,CAAC,8BAA8B,CAAC,KAAK,IAAI,EACtF,CAAC;QACD,mBAAmB,CACjB,MAAM,EACN,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,2CAA2C,CAAC,CAAC,CAAC,0CAA0C,EACtG,mLAAmL,EACnL,SAAS,CACV,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"sessionConfig.js","sourceRoot":"","sources":["../../../src/shared/validation/sessionConfig.ts"],"names":[],"mappings":"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"}
|