audit-tools 0.32.35 → 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.
Files changed (78) hide show
  1. package/dist/audit/cli/rollingAuditDispatch.d.ts.map +1 -1
  2. package/dist/audit/cli/rollingAuditDispatch.js +20 -1
  3. package/dist/audit/cli/rollingAuditDispatch.js.map +1 -1
  4. package/dist/audit/cli/validateCommand.d.ts.map +1 -1
  5. package/dist/audit/cli/validateCommand.js +10 -3
  6. package/dist/audit/cli/validateCommand.js.map +1 -1
  7. package/dist/audit/orchestrator/rollingDispatch.d.ts.map +1 -1
  8. package/dist/audit/orchestrator/rollingDispatch.js +1 -0
  9. package/dist/audit/orchestrator/rollingDispatch.js.map +1 -1
  10. package/dist/audit/quota/index.d.ts +5 -0
  11. package/dist/audit/quota/index.d.ts.map +1 -1
  12. package/dist/audit/supervisor/sessionConfig.d.ts.map +1 -1
  13. package/dist/audit/supervisor/sessionConfig.js +18 -8
  14. package/dist/audit/supervisor/sessionConfig.js.map +1 -1
  15. package/dist/audit/types/analyzerCapability.d.ts +6 -6
  16. package/dist/audit/validation/sessionConfig.d.ts +1 -2
  17. package/dist/audit/validation/sessionConfig.d.ts.map +1 -1
  18. package/dist/audit/validation/sessionConfig.js +6 -361
  19. package/dist/audit/validation/sessionConfig.js.map +1 -1
  20. package/dist/remediate/phases/plan.d.ts.map +1 -1
  21. package/dist/remediate/phases/plan.js +3 -3
  22. package/dist/remediate/phases/plan.js.map +1 -1
  23. package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
  24. package/dist/remediate/steps/contractPipeline.js +2 -2
  25. package/dist/remediate/steps/contractPipeline.js.map +1 -1
  26. package/dist/remediate/steps/nextStep.d.ts +10 -0
  27. package/dist/remediate/steps/nextStep.d.ts.map +1 -1
  28. package/dist/remediate/steps/nextStep.js +26 -5
  29. package/dist/remediate/steps/nextStep.js.map +1 -1
  30. package/dist/remediate/steps/providerNodeDispatch.d.ts.map +1 -1
  31. package/dist/remediate/steps/providerNodeDispatch.js +5 -1
  32. package/dist/remediate/steps/providerNodeDispatch.js.map +1 -1
  33. package/dist/shared/dispatch/admissionLoop.d.ts.map +1 -1
  34. package/dist/shared/dispatch/admissionLoop.js +1 -0
  35. package/dist/shared/dispatch/admissionLoop.js.map +1 -1
  36. package/dist/shared/dispatch/costRank.d.ts +20 -1
  37. package/dist/shared/dispatch/costRank.d.ts.map +1 -1
  38. package/dist/shared/dispatch/costRank.js +22 -2
  39. package/dist/shared/dispatch/costRank.js.map +1 -1
  40. package/dist/shared/dispatch/rollingDispatch.d.ts +52 -1
  41. package/dist/shared/dispatch/rollingDispatch.d.ts.map +1 -1
  42. package/dist/shared/dispatch/rollingDispatch.js +48 -5
  43. package/dist/shared/dispatch/rollingDispatch.js.map +1 -1
  44. package/dist/shared/dispatch/unifiedRolling.d.ts +10 -0
  45. package/dist/shared/dispatch/unifiedRolling.d.ts.map +1 -1
  46. package/dist/shared/dispatch/unifiedRolling.js +7 -0
  47. package/dist/shared/dispatch/unifiedRolling.js.map +1 -1
  48. package/dist/shared/friction/stepBoundaryCapture.d.ts +6 -1
  49. package/dist/shared/friction/stepBoundaryCapture.d.ts.map +1 -1
  50. package/dist/shared/friction/stepBoundaryCapture.js +3 -0
  51. package/dist/shared/friction/stepBoundaryCapture.js.map +1 -1
  52. package/dist/shared/index.d.ts +1 -1
  53. package/dist/shared/index.d.ts.map +1 -1
  54. package/dist/shared/index.js +1 -1
  55. package/dist/shared/index.js.map +1 -1
  56. package/dist/shared/providers/openAiCompatibleProvider.d.ts +17 -0
  57. package/dist/shared/providers/openAiCompatibleProvider.d.ts.map +1 -1
  58. package/dist/shared/providers/openAiCompatibleProvider.js +32 -0
  59. package/dist/shared/providers/openAiCompatibleProvider.js.map +1 -1
  60. package/dist/shared/providers/types.d.ts +12 -0
  61. package/dist/shared/providers/types.d.ts.map +1 -1
  62. package/dist/shared/quota/apiPool.d.ts.map +1 -1
  63. package/dist/shared/quota/apiPool.js +15 -0
  64. package/dist/shared/quota/apiPool.js.map +1 -1
  65. package/dist/shared/quota/capacity.d.ts +23 -0
  66. package/dist/shared/quota/capacity.d.ts.map +1 -1
  67. package/dist/shared/quota/capacity.js +9 -0
  68. package/dist/shared/quota/capacity.js.map +1 -1
  69. package/dist/shared/types/rollingDispatch.d.ts +11 -0
  70. package/dist/shared/types/rollingDispatch.d.ts.map +1 -1
  71. package/dist/shared/types/sessionConfig.d.ts +15 -0
  72. package/dist/shared/types/sessionConfig.d.ts.map +1 -1
  73. package/dist/shared/types/sessionConfig.js.map +1 -1
  74. package/dist/shared/validation/sessionConfig.d.ts +41 -16
  75. package/dist/shared/validation/sessionConfig.d.ts.map +1 -1
  76. package/dist/shared/validation/sessionConfig.js +415 -26
  77. package/dist/shared/validation/sessionConfig.js.map +1 -1
  78. package/package.json +1 -1
@@ -1,38 +1,427 @@
1
1
  /**
2
- * SessionConfig validation utilities.
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
- * INV-shared-core-08: ClaudeCodeConfig.dangerously_skip_permissions is a
5
- * security-sensitive flag that must be validated/surfaced rather than silently
6
- * honored. This module provides the canonical validation pass for SessionConfig
7
- * so both orchestrators produce consistent, auditable warnings.
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 { pushValidationIssue } from "./basic.js";
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
- * Validate a SessionConfig for security-sensitive and misconfiguration issues.
12
- *
13
- * Returns a (possibly empty) list of ValidationIssues. Severity "error" means
14
- * the config cannot be used safely; severity "warning" means the caller should
15
- * surface the concern before proceeding.
16
- *
17
- * INV-shared-core-08: dangerously_skip_permissions=true is flagged as a
18
- * high-severity warning so operators are always aware when host permission
19
- * checks are being bypassed.
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(config, path = "") {
300
+ export function validateSessionConfig(value) {
22
301
  const issues = [];
23
- if (config === null || typeof config !== "object") {
24
- pushValidationIssue(issues, path, `Expected a SessionConfig object, got ${typeof config}.`);
302
+ if (value === undefined) {
25
303
  return issues;
26
304
  }
27
- const c = config;
28
- // INV-shared-core-08: flag dangerously_skip_permissions so it is never
29
- // silently honored. This is a security-sensitive flag — bypasses host
30
- // permission checks that are the primary guard against unintended writes.
31
- if (c["claude_code"] !== null &&
32
- typeof c["claude_code"] === "object" &&
33
- c["claude_code"]["dangerously_skip_permissions"] === true) {
34
- pushValidationIssue(issues, path ? `${path}.claude_code.dangerously_skip_permissions` : "claude_code.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");
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "audit-tools",
3
- "version": "0.32.35",
3
+ "version": "0.32.37",
4
4
  "private": false,
5
5
  "license": "ISC",
6
6
  "description": "Portable hybrid code auditing + remediation orchestrators for arbitrary repositories.",