@oddessentials/odd-ai-reviewers 1.0.0
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/README.md +190 -0
- package/dist/__tests__/hermetic-setup.d.ts +55 -0
- package/dist/__tests__/hermetic-setup.d.ts.map +1 -0
- package/dist/__tests__/hermetic-setup.js +62 -0
- package/dist/__tests__/hermetic-setup.js.map +1 -0
- package/dist/__tests__/test-utils/hermetic.d.ts +84 -0
- package/dist/__tests__/test-utils/hermetic.d.ts.map +1 -0
- package/dist/__tests__/test-utils/hermetic.js +147 -0
- package/dist/__tests__/test-utils/hermetic.js.map +1 -0
- package/dist/agents/ai_semantic_review.d.ts +12 -0
- package/dist/agents/ai_semantic_review.d.ts.map +1 -0
- package/dist/agents/ai_semantic_review.js +317 -0
- package/dist/agents/ai_semantic_review.js.map +1 -0
- package/dist/agents/control_flow/budget.d.ts +162 -0
- package/dist/agents/control_flow/budget.d.ts.map +1 -0
- package/dist/agents/control_flow/budget.js +331 -0
- package/dist/agents/control_flow/budget.js.map +1 -0
- package/dist/agents/control_flow/cfg-builder.d.ts +26 -0
- package/dist/agents/control_flow/cfg-builder.d.ts.map +1 -0
- package/dist/agents/control_flow/cfg-builder.js +776 -0
- package/dist/agents/control_flow/cfg-builder.js.map +1 -0
- package/dist/agents/control_flow/cfg-types.d.ts +186 -0
- package/dist/agents/control_flow/cfg-types.d.ts.map +1 -0
- package/dist/agents/control_flow/cfg-types.js +114 -0
- package/dist/agents/control_flow/cfg-types.js.map +1 -0
- package/dist/agents/control_flow/finding-generator.d.ts +118 -0
- package/dist/agents/control_flow/finding-generator.d.ts.map +1 -0
- package/dist/agents/control_flow/finding-generator.js +354 -0
- package/dist/agents/control_flow/finding-generator.js.map +1 -0
- package/dist/agents/control_flow/index.d.ts +39 -0
- package/dist/agents/control_flow/index.d.ts.map +1 -0
- package/dist/agents/control_flow/index.js +270 -0
- package/dist/agents/control_flow/index.js.map +1 -0
- package/dist/agents/control_flow/logger.d.ts +333 -0
- package/dist/agents/control_flow/logger.d.ts.map +1 -0
- package/dist/agents/control_flow/logger.js +607 -0
- package/dist/agents/control_flow/logger.js.map +1 -0
- package/dist/agents/control_flow/mitigation-detector.d.ts +207 -0
- package/dist/agents/control_flow/mitigation-detector.d.ts.map +1 -0
- package/dist/agents/control_flow/mitigation-detector.js +625 -0
- package/dist/agents/control_flow/mitigation-detector.js.map +1 -0
- package/dist/agents/control_flow/mitigation-patterns.d.ts +53 -0
- package/dist/agents/control_flow/mitigation-patterns.d.ts.map +1 -0
- package/dist/agents/control_flow/mitigation-patterns.js +620 -0
- package/dist/agents/control_flow/mitigation-patterns.js.map +1 -0
- package/dist/agents/control_flow/path-analyzer.d.ts +287 -0
- package/dist/agents/control_flow/path-analyzer.d.ts.map +1 -0
- package/dist/agents/control_flow/path-analyzer.js +695 -0
- package/dist/agents/control_flow/path-analyzer.js.map +1 -0
- package/dist/agents/control_flow/pattern-validator.d.ts +132 -0
- package/dist/agents/control_flow/pattern-validator.d.ts.map +1 -0
- package/dist/agents/control_flow/pattern-validator.js +420 -0
- package/dist/agents/control_flow/pattern-validator.js.map +1 -0
- package/dist/agents/control_flow/timeout-regex.d.ts +144 -0
- package/dist/agents/control_flow/timeout-regex.d.ts.map +1 -0
- package/dist/agents/control_flow/timeout-regex.js +339 -0
- package/dist/agents/control_flow/timeout-regex.js.map +1 -0
- package/dist/agents/control_flow/types.d.ts +782 -0
- package/dist/agents/control_flow/types.d.ts.map +1 -0
- package/dist/agents/control_flow/types.js +428 -0
- package/dist/agents/control_flow/types.js.map +1 -0
- package/dist/agents/control_flow/vulnerability-detector.d.ts +85 -0
- package/dist/agents/control_flow/vulnerability-detector.d.ts.map +1 -0
- package/dist/agents/control_flow/vulnerability-detector.js +493 -0
- package/dist/agents/control_flow/vulnerability-detector.js.map +1 -0
- package/dist/agents/date-utils.d.ts +19 -0
- package/dist/agents/date-utils.d.ts.map +1 -0
- package/dist/agents/date-utils.js +29 -0
- package/dist/agents/date-utils.js.map +1 -0
- package/dist/agents/index.d.ts +25 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +50 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/json-utils.d.ts +34 -0
- package/dist/agents/json-utils.d.ts.map +1 -0
- package/dist/agents/json-utils.js +62 -0
- package/dist/agents/json-utils.js.map +1 -0
- package/dist/agents/local_llm.d.ts +24 -0
- package/dist/agents/local_llm.d.ts.map +1 -0
- package/dist/agents/local_llm.js +566 -0
- package/dist/agents/local_llm.js.map +1 -0
- package/dist/agents/metadata.d.ts +57 -0
- package/dist/agents/metadata.d.ts.map +1 -0
- package/dist/agents/metadata.js +45 -0
- package/dist/agents/metadata.js.map +1 -0
- package/dist/agents/opencode.d.ts +18 -0
- package/dist/agents/opencode.d.ts.map +1 -0
- package/dist/agents/opencode.js +364 -0
- package/dist/agents/opencode.js.map +1 -0
- package/dist/agents/path-filter.d.ts +25 -0
- package/dist/agents/path-filter.d.ts.map +1 -0
- package/dist/agents/path-filter.js +43 -0
- package/dist/agents/path-filter.js.map +1 -0
- package/dist/agents/pr_agent.d.ts +3 -0
- package/dist/agents/pr_agent.d.ts.map +1 -0
- package/dist/agents/pr_agent.js +312 -0
- package/dist/agents/pr_agent.js.map +1 -0
- package/dist/agents/retry.d.ts +12 -0
- package/dist/agents/retry.d.ts.map +1 -0
- package/dist/agents/retry.js +65 -0
- package/dist/agents/retry.js.map +1 -0
- package/dist/agents/reviewdog.d.ts +24 -0
- package/dist/agents/reviewdog.d.ts.map +1 -0
- package/dist/agents/reviewdog.js +259 -0
- package/dist/agents/reviewdog.js.map +1 -0
- package/dist/agents/security.d.ts +49 -0
- package/dist/agents/security.d.ts.map +1 -0
- package/dist/agents/security.js +302 -0
- package/dist/agents/security.js.map +1 -0
- package/dist/agents/semgrep.d.ts +8 -0
- package/dist/agents/semgrep.d.ts.map +1 -0
- package/dist/agents/semgrep.js +157 -0
- package/dist/agents/semgrep.js.map +1 -0
- package/dist/agents/types.d.ts +450 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +127 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/budget.d.ts +59 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +82 -0
- package/dist/budget.js.map +1 -0
- package/dist/cache/key.d.ts +49 -0
- package/dist/cache/key.d.ts.map +1 -0
- package/dist/cache/key.js +71 -0
- package/dist/cache/key.js.map +1 -0
- package/dist/cache/store.d.ts +47 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +328 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cli/commands/check.d.ts +60 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +163 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/index.d.ts +12 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +12 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/local-review.d.ts +149 -0
- package/dist/cli/commands/local-review.d.ts.map +1 -0
- package/dist/cli/commands/local-review.js +755 -0
- package/dist/cli/commands/local-review.js.map +1 -0
- package/dist/cli/config-wizard.d.ts +87 -0
- package/dist/cli/config-wizard.d.ts.map +1 -0
- package/dist/cli/config-wizard.js +240 -0
- package/dist/cli/config-wizard.js.map +1 -0
- package/dist/cli/dependencies/catalog.d.ts +44 -0
- package/dist/cli/dependencies/catalog.d.ts.map +1 -0
- package/dist/cli/dependencies/catalog.js +89 -0
- package/dist/cli/dependencies/catalog.js.map +1 -0
- package/dist/cli/dependencies/checker.d.ts +42 -0
- package/dist/cli/dependencies/checker.d.ts.map +1 -0
- package/dist/cli/dependencies/checker.js +240 -0
- package/dist/cli/dependencies/checker.js.map +1 -0
- package/dist/cli/dependencies/index.d.ts +16 -0
- package/dist/cli/dependencies/index.d.ts.map +1 -0
- package/dist/cli/dependencies/index.js +16 -0
- package/dist/cli/dependencies/index.js.map +1 -0
- package/dist/cli/dependencies/messages.d.ts +58 -0
- package/dist/cli/dependencies/messages.d.ts.map +1 -0
- package/dist/cli/dependencies/messages.js +183 -0
- package/dist/cli/dependencies/messages.js.map +1 -0
- package/dist/cli/dependencies/platform.d.ts +25 -0
- package/dist/cli/dependencies/platform.d.ts.map +1 -0
- package/dist/cli/dependencies/platform.js +42 -0
- package/dist/cli/dependencies/platform.js.map +1 -0
- package/dist/cli/dependencies/schemas.d.ts +65 -0
- package/dist/cli/dependencies/schemas.d.ts.map +1 -0
- package/dist/cli/dependencies/schemas.js +42 -0
- package/dist/cli/dependencies/schemas.js.map +1 -0
- package/dist/cli/dependencies/types.d.ts +112 -0
- package/dist/cli/dependencies/types.d.ts.map +1 -0
- package/dist/cli/dependencies/types.js +6 -0
- package/dist/cli/dependencies/types.js.map +1 -0
- package/dist/cli/dependencies/version.d.ts +67 -0
- package/dist/cli/dependencies/version.d.ts.map +1 -0
- package/dist/cli/dependencies/version.js +125 -0
- package/dist/cli/dependencies/version.js.map +1 -0
- package/dist/cli/git-context.d.ts +105 -0
- package/dist/cli/git-context.d.ts.map +1 -0
- package/dist/cli/git-context.js +313 -0
- package/dist/cli/git-context.js.map +1 -0
- package/dist/cli/interactive-prompts.d.ts +126 -0
- package/dist/cli/interactive-prompts.d.ts.map +1 -0
- package/dist/cli/interactive-prompts.js +128 -0
- package/dist/cli/interactive-prompts.js.map +1 -0
- package/dist/cli/options/index.d.ts +7 -0
- package/dist/cli/options/index.d.ts.map +1 -0
- package/dist/cli/options/index.js +11 -0
- package/dist/cli/options/index.js.map +1 -0
- package/dist/cli/options/local-review-options.d.ts +221 -0
- package/dist/cli/options/local-review-options.d.ts.map +1 -0
- package/dist/cli/options/local-review-options.js +332 -0
- package/dist/cli/options/local-review-options.js.map +1 -0
- package/dist/cli/output/colors.d.ts +154 -0
- package/dist/cli/output/colors.d.ts.map +1 -0
- package/dist/cli/output/colors.js +255 -0
- package/dist/cli/output/colors.js.map +1 -0
- package/dist/cli/output/errors.d.ts +157 -0
- package/dist/cli/output/errors.d.ts.map +1 -0
- package/dist/cli/output/errors.js +266 -0
- package/dist/cli/output/errors.js.map +1 -0
- package/dist/cli/output/index.d.ts +12 -0
- package/dist/cli/output/index.d.ts.map +1 -0
- package/dist/cli/output/index.js +15 -0
- package/dist/cli/output/index.js.map +1 -0
- package/dist/cli/output/progress.d.ts +237 -0
- package/dist/cli/output/progress.d.ts.map +1 -0
- package/dist/cli/output/progress.js +405 -0
- package/dist/cli/output/progress.js.map +1 -0
- package/dist/cli/signals.d.ts +145 -0
- package/dist/cli/signals.d.ts.map +1 -0
- package/dist/cli/signals.js +223 -0
- package/dist/cli/signals.js.map +1 -0
- package/dist/cli/validation-report.d.ts +106 -0
- package/dist/cli/validation-report.d.ts.map +1 -0
- package/dist/cli/validation-report.js +108 -0
- package/dist/cli/validation-report.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +12 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/mitigation-config.d.ts +94 -0
- package/dist/config/mitigation-config.d.ts.map +1 -0
- package/dist/config/mitigation-config.js +430 -0
- package/dist/config/mitigation-config.js.map +1 -0
- package/dist/config/providers.d.ts +118 -0
- package/dist/config/providers.d.ts.map +1 -0
- package/dist/config/providers.js +229 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/schemas.d.ts +278 -0
- package/dist/config/schemas.d.ts.map +1 -0
- package/dist/config/schemas.js +111 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/config/zero-config.d.ts +126 -0
- package/dist/config/zero-config.d.ts.map +1 -0
- package/dist/config/zero-config.js +243 -0
- package/dist/config/zero-config.js.map +1 -0
- package/dist/config.d.ts +110 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +302 -0
- package/dist/config.js.map +1 -0
- package/dist/diff.d.ts +224 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +832 -0
- package/dist/diff.js.map +1 -0
- package/dist/git-validators.d.ts +106 -0
- package/dist/git-validators.d.ts.map +1 -0
- package/dist/git-validators.js +224 -0
- package/dist/git-validators.js.map +1 -0
- package/dist/main.d.ts +61 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +704 -0
- package/dist/main.js.map +1 -0
- package/dist/phases/execute.d.ts +60 -0
- package/dist/phases/execute.d.ts.map +1 -0
- package/dist/phases/execute.js +168 -0
- package/dist/phases/execute.js.map +1 -0
- package/dist/phases/index.d.ts +9 -0
- package/dist/phases/index.d.ts.map +1 -0
- package/dist/phases/index.js +9 -0
- package/dist/phases/index.js.map +1 -0
- package/dist/phases/preflight.d.ts +40 -0
- package/dist/phases/preflight.d.ts.map +1 -0
- package/dist/phases/preflight.js +122 -0
- package/dist/phases/preflight.js.map +1 -0
- package/dist/phases/report.d.ts +51 -0
- package/dist/phases/report.d.ts.map +1 -0
- package/dist/phases/report.js +152 -0
- package/dist/phases/report.js.map +1 -0
- package/dist/policy.d.ts +33 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +34 -0
- package/dist/policy.js.map +1 -0
- package/dist/preflight.d.ts +181 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +627 -0
- package/dist/preflight.js.map +1 -0
- package/dist/report/ado.d.ts +53 -0
- package/dist/report/ado.d.ts.map +1 -0
- package/dist/report/ado.js +411 -0
- package/dist/report/ado.js.map +1 -0
- package/dist/report/agent-icons.d.ts +36 -0
- package/dist/report/agent-icons.d.ts.map +1 -0
- package/dist/report/agent-icons.js +46 -0
- package/dist/report/agent-icons.js.map +1 -0
- package/dist/report/base.d.ts +30 -0
- package/dist/report/base.d.ts.map +1 -0
- package/dist/report/base.js +64 -0
- package/dist/report/base.js.map +1 -0
- package/dist/report/formats.d.ts +206 -0
- package/dist/report/formats.d.ts.map +1 -0
- package/dist/report/formats.js +481 -0
- package/dist/report/formats.js.map +1 -0
- package/dist/report/github.d.ts +44 -0
- package/dist/report/github.d.ts.map +1 -0
- package/dist/report/github.js +409 -0
- package/dist/report/github.js.map +1 -0
- package/dist/report/line-resolver.d.ts +208 -0
- package/dist/report/line-resolver.d.ts.map +1 -0
- package/dist/report/line-resolver.js +578 -0
- package/dist/report/line-resolver.js.map +1 -0
- package/dist/report/resolution.d.ts +158 -0
- package/dist/report/resolution.d.ts.map +1 -0
- package/dist/report/resolution.js +272 -0
- package/dist/report/resolution.js.map +1 -0
- package/dist/report/sanitize.d.ts +32 -0
- package/dist/report/sanitize.d.ts.map +1 -0
- package/dist/report/sanitize.js +84 -0
- package/dist/report/sanitize.js.map +1 -0
- package/dist/report/terminal.d.ts +440 -0
- package/dist/report/terminal.d.ts.map +1 -0
- package/dist/report/terminal.js +840 -0
- package/dist/report/terminal.js.map +1 -0
- package/dist/reviewignore.d.ts +125 -0
- package/dist/reviewignore.d.ts.map +1 -0
- package/dist/reviewignore.js +335 -0
- package/dist/reviewignore.js.map +1 -0
- package/dist/security-logger.d.ts +178 -0
- package/dist/security-logger.d.ts.map +1 -0
- package/dist/security-logger.js +256 -0
- package/dist/security-logger.js.map +1 -0
- package/dist/telemetry/backends/console.d.ts +24 -0
- package/dist/telemetry/backends/console.d.ts.map +1 -0
- package/dist/telemetry/backends/console.js +54 -0
- package/dist/telemetry/backends/console.js.map +1 -0
- package/dist/telemetry/backends/jsonl.d.ts +31 -0
- package/dist/telemetry/backends/jsonl.d.ts.map +1 -0
- package/dist/telemetry/backends/jsonl.js +121 -0
- package/dist/telemetry/backends/jsonl.js.map +1 -0
- package/dist/telemetry/emitter.d.ts +43 -0
- package/dist/telemetry/emitter.d.ts.map +1 -0
- package/dist/telemetry/emitter.js +83 -0
- package/dist/telemetry/emitter.js.map +1 -0
- package/dist/telemetry/hook.d.ts +53 -0
- package/dist/telemetry/hook.d.ts.map +1 -0
- package/dist/telemetry/hook.js +118 -0
- package/dist/telemetry/hook.js.map +1 -0
- package/dist/telemetry/index.d.ts +58 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +143 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/types.d.ts +139 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +133 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/trust.d.ts +65 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +78 -0
- package/dist/trust.js.map +1 -0
- package/dist/types/assert-never.d.ts +30 -0
- package/dist/types/assert-never.d.ts.map +1 -0
- package/dist/types/assert-never.js +32 -0
- package/dist/types/assert-never.js.map +1 -0
- package/dist/types/branded.d.ts +172 -0
- package/dist/types/branded.d.ts.map +1 -0
- package/dist/types/branded.js +262 -0
- package/dist/types/branded.js.map +1 -0
- package/dist/types/errors.d.ts +320 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +551 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +37 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +77 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/result.d.ts +323 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +423 -0
- package/dist/types/result.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mitigation Configuration Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses and validates custom mitigation pattern configuration.
|
|
5
|
+
* Implements:
|
|
6
|
+
* - T052: Config parser using Zod schemas
|
|
7
|
+
* - T053: Pattern validation ensuring declarative/side-effect-free per FR-015
|
|
8
|
+
* - T054: Pattern override support (confidence, deprecated)
|
|
9
|
+
* - T055: Pattern disable list support
|
|
10
|
+
* - FR-016: Validate patterns at configuration time with clear error messages
|
|
11
|
+
*/
|
|
12
|
+
import { ControlFlowConfigSchema, } from '../agents/control_flow/types.js';
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// FR-015: Declarative Pattern Validation
|
|
15
|
+
// =============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Reserved words that cannot be used in pattern names (security measure).
|
|
18
|
+
*/
|
|
19
|
+
const RESERVED_PATTERN_WORDS = [
|
|
20
|
+
'eval',
|
|
21
|
+
'Function',
|
|
22
|
+
'setTimeout',
|
|
23
|
+
'setInterval',
|
|
24
|
+
'exec',
|
|
25
|
+
'spawn',
|
|
26
|
+
'require',
|
|
27
|
+
'import',
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* Maximum allowed pattern name/namePattern length.
|
|
31
|
+
*/
|
|
32
|
+
const MAX_PATTERN_NAME_LENGTH = 256;
|
|
33
|
+
/**
|
|
34
|
+
* Maximum allowed patterns in a single configuration.
|
|
35
|
+
*/
|
|
36
|
+
const MAX_CUSTOM_PATTERNS = 100;
|
|
37
|
+
/**
|
|
38
|
+
* Maximum allowed overrides in a single configuration.
|
|
39
|
+
*/
|
|
40
|
+
const MAX_PATTERN_OVERRIDES = 200;
|
|
41
|
+
/**
|
|
42
|
+
* Maximum allowed disabled patterns in a single configuration.
|
|
43
|
+
*/
|
|
44
|
+
const MAX_DISABLED_PATTERNS = 200;
|
|
45
|
+
/**
|
|
46
|
+
* Validate that a pattern is declarative and side-effect-free per FR-015.
|
|
47
|
+
*
|
|
48
|
+
* Patterns must only contain:
|
|
49
|
+
* - Function name matching (exact or regex)
|
|
50
|
+
* - Parameter constraints
|
|
51
|
+
* - Return value assertions
|
|
52
|
+
* - Module specifications
|
|
53
|
+
*
|
|
54
|
+
* No executable code, callbacks, or side effects are allowed.
|
|
55
|
+
*/
|
|
56
|
+
export function validatePatternIsDeclarative(pattern) {
|
|
57
|
+
const errors = [];
|
|
58
|
+
const warnings = [];
|
|
59
|
+
// Check pattern ID is valid
|
|
60
|
+
if (!pattern.id || pattern.id.trim().length === 0) {
|
|
61
|
+
errors.push({
|
|
62
|
+
code: 'EMPTY_PATTERN_ID',
|
|
63
|
+
path: ['id'],
|
|
64
|
+
message: 'Pattern ID cannot be empty',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// Check for reserved words in pattern name matching
|
|
68
|
+
if (pattern.match.name) {
|
|
69
|
+
for (const reserved of RESERVED_PATTERN_WORDS) {
|
|
70
|
+
if (pattern.match.name === reserved) {
|
|
71
|
+
errors.push({
|
|
72
|
+
code: 'RESERVED_PATTERN_NAME',
|
|
73
|
+
path: ['match', 'name'],
|
|
74
|
+
message: `Pattern name "${reserved}" is reserved and cannot be used`,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Validate namePattern is a valid regex
|
|
80
|
+
if (pattern.match.namePattern) {
|
|
81
|
+
if (pattern.match.namePattern.length > MAX_PATTERN_NAME_LENGTH) {
|
|
82
|
+
errors.push({
|
|
83
|
+
code: 'PATTERN_TOO_LONG',
|
|
84
|
+
path: ['match', 'namePattern'],
|
|
85
|
+
message: `Pattern regex exceeds maximum length of ${MAX_PATTERN_NAME_LENGTH} characters`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
// Trust: REPO_CONFIG - Pattern from repository configuration, validated at config load time
|
|
90
|
+
// Control: Try-catch validates syntax before use. See docs/security/regex-threat-model.md
|
|
91
|
+
// eslint-disable-next-line security/detect-non-literal-regexp -- Validated config pattern
|
|
92
|
+
new RegExp(pattern.match.namePattern);
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
errors.push({
|
|
96
|
+
code: 'INVALID_REGEX',
|
|
97
|
+
path: ['match', 'namePattern'],
|
|
98
|
+
message: `Invalid regex pattern: ${e.message}`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// Check for overly complex/dangerous regex patterns
|
|
102
|
+
if (hasExponentialRegex(pattern.match.namePattern)) {
|
|
103
|
+
warnings.push({
|
|
104
|
+
code: 'COMPLEX_REGEX',
|
|
105
|
+
path: ['match', 'namePattern'],
|
|
106
|
+
message: 'Pattern contains potentially slow regex. Consider simplifying.',
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Either name or namePattern should be specified for function/method calls
|
|
111
|
+
if ((pattern.match.type === 'function_call' || pattern.match.type === 'method_call') &&
|
|
112
|
+
!pattern.match.name &&
|
|
113
|
+
!pattern.match.namePattern) {
|
|
114
|
+
errors.push({
|
|
115
|
+
code: 'MISSING_MATCH_CRITERIA',
|
|
116
|
+
path: ['match'],
|
|
117
|
+
message: 'Function/method call patterns must specify either name or namePattern',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// Validate parameter constraints are reasonable
|
|
121
|
+
if (pattern.match.parameters) {
|
|
122
|
+
const seenIndices = new Set();
|
|
123
|
+
for (let i = 0; i < pattern.match.parameters.length; i++) {
|
|
124
|
+
const param = pattern.match.parameters[i];
|
|
125
|
+
if (!param)
|
|
126
|
+
continue;
|
|
127
|
+
if (seenIndices.has(param.index)) {
|
|
128
|
+
errors.push({
|
|
129
|
+
code: 'DUPLICATE_PARAM_INDEX',
|
|
130
|
+
path: ['match', 'parameters', i.toString()],
|
|
131
|
+
message: `Duplicate parameter index: ${param.index}`,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
seenIndices.add(param.index);
|
|
135
|
+
if (param.index < 0 || param.index > 10) {
|
|
136
|
+
warnings.push({
|
|
137
|
+
code: 'UNUSUAL_PARAM_INDEX',
|
|
138
|
+
path: ['match', 'parameters', i.toString()],
|
|
139
|
+
message: `Parameter index ${param.index} is unusual. Most functions have fewer than 10 parameters.`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Check that mitigates contains at least one entry
|
|
145
|
+
if (!pattern.mitigates || pattern.mitigates.length === 0) {
|
|
146
|
+
errors.push({
|
|
147
|
+
code: 'EMPTY_MITIGATES',
|
|
148
|
+
path: ['mitigates'],
|
|
149
|
+
message: 'Pattern must mitigate at least one vulnerability type',
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
// Warn about deprecated patterns without reason
|
|
153
|
+
if (pattern.deprecated && !pattern.deprecationReason) {
|
|
154
|
+
warnings.push({
|
|
155
|
+
code: 'DEPRECATED_NO_REASON',
|
|
156
|
+
path: ['deprecationReason'],
|
|
157
|
+
message: 'Deprecated patterns should include a deprecation reason',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
valid: errors.length === 0,
|
|
162
|
+
errors,
|
|
163
|
+
warnings,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Check if a regex pattern might have exponential backtracking.
|
|
168
|
+
* This is a simple heuristic check, not a complete analysis.
|
|
169
|
+
*/
|
|
170
|
+
function hasExponentialRegex(pattern) {
|
|
171
|
+
// Check for nested quantifiers like (a+)+ or (a*)*
|
|
172
|
+
if (/\([^)]*[+*]\)[+*]/.test(pattern)) {
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
// Check for overlapping alternatives with quantifiers
|
|
176
|
+
if (/\([^|)]*\|[^)]*\)[+*]/.test(pattern)) {
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
// =============================================================================
|
|
182
|
+
// Pattern Override Validation
|
|
183
|
+
// =============================================================================
|
|
184
|
+
/**
|
|
185
|
+
* Validate a pattern override.
|
|
186
|
+
*/
|
|
187
|
+
export function validatePatternOverride(override) {
|
|
188
|
+
const errors = [];
|
|
189
|
+
const warnings = [];
|
|
190
|
+
if (!override.patternId || override.patternId.trim().length === 0) {
|
|
191
|
+
errors.push({
|
|
192
|
+
code: 'EMPTY_PATTERN_ID',
|
|
193
|
+
path: ['patternId'],
|
|
194
|
+
message: 'Override must specify a pattern ID',
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
// Warn if override has no actual changes
|
|
198
|
+
if (override.confidence === undefined && override.deprecated === undefined) {
|
|
199
|
+
warnings.push({
|
|
200
|
+
code: 'NO_OVERRIDE_CHANGES',
|
|
201
|
+
path: [],
|
|
202
|
+
message: 'Override has no changes specified (confidence or deprecated)',
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// Warn about deprecation without reason
|
|
206
|
+
if (override.deprecated && !override.deprecationReason) {
|
|
207
|
+
warnings.push({
|
|
208
|
+
code: 'DEPRECATED_NO_REASON',
|
|
209
|
+
path: ['deprecationReason'],
|
|
210
|
+
message: 'Deprecated overrides should include a deprecation reason',
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
valid: errors.length === 0,
|
|
215
|
+
errors,
|
|
216
|
+
warnings,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// =============================================================================
|
|
220
|
+
// Configuration Parsing
|
|
221
|
+
// =============================================================================
|
|
222
|
+
/**
|
|
223
|
+
* Parse and validate a control flow configuration.
|
|
224
|
+
*
|
|
225
|
+
* This function:
|
|
226
|
+
* 1. Parses the config using Zod schema
|
|
227
|
+
* 2. Validates each custom pattern is declarative (FR-015)
|
|
228
|
+
* 3. Validates pattern overrides
|
|
229
|
+
* 4. Checks for conflicts and issues
|
|
230
|
+
*/
|
|
231
|
+
export function parseControlFlowConfig(rawConfig) {
|
|
232
|
+
const errors = [];
|
|
233
|
+
const warnings = [];
|
|
234
|
+
// Step 1: Parse with Zod schema
|
|
235
|
+
const parseResult = ControlFlowConfigSchema.safeParse(rawConfig);
|
|
236
|
+
if (!parseResult.success) {
|
|
237
|
+
for (const issue of parseResult.error.issues) {
|
|
238
|
+
errors.push({
|
|
239
|
+
code: 'SCHEMA_VALIDATION',
|
|
240
|
+
path: issue.path.map(String),
|
|
241
|
+
message: issue.message,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
return { success: false, errors, warnings };
|
|
245
|
+
}
|
|
246
|
+
const config = parseResult.data;
|
|
247
|
+
// Step 2: Validate custom patterns count
|
|
248
|
+
if (config.mitigationPatterns.length > MAX_CUSTOM_PATTERNS) {
|
|
249
|
+
errors.push({
|
|
250
|
+
code: 'TOO_MANY_PATTERNS',
|
|
251
|
+
path: ['mitigationPatterns'],
|
|
252
|
+
message: `Too many custom patterns. Maximum is ${MAX_CUSTOM_PATTERNS}, got ${config.mitigationPatterns.length}`,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// Step 3: Validate each custom pattern
|
|
256
|
+
const patternIds = new Set();
|
|
257
|
+
for (let i = 0; i < config.mitigationPatterns.length; i++) {
|
|
258
|
+
const pattern = config.mitigationPatterns[i];
|
|
259
|
+
if (!pattern)
|
|
260
|
+
continue;
|
|
261
|
+
// Check for duplicate IDs
|
|
262
|
+
if (patternIds.has(pattern.id)) {
|
|
263
|
+
errors.push({
|
|
264
|
+
code: 'DUPLICATE_PATTERN_ID',
|
|
265
|
+
path: ['mitigationPatterns', i.toString()],
|
|
266
|
+
message: `Duplicate pattern ID: ${pattern.id}`,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
patternIds.add(pattern.id);
|
|
270
|
+
// Validate pattern is declarative
|
|
271
|
+
const patternResult = validatePatternIsDeclarative(pattern);
|
|
272
|
+
for (const error of patternResult.errors) {
|
|
273
|
+
errors.push({
|
|
274
|
+
...error,
|
|
275
|
+
path: ['mitigationPatterns', i.toString(), ...error.path],
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
for (const warning of patternResult.warnings) {
|
|
279
|
+
warnings.push({
|
|
280
|
+
...warning,
|
|
281
|
+
path: ['mitigationPatterns', i.toString(), ...warning.path],
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Step 4: Validate overrides count
|
|
286
|
+
if (config.patternOverrides.length > MAX_PATTERN_OVERRIDES) {
|
|
287
|
+
errors.push({
|
|
288
|
+
code: 'TOO_MANY_OVERRIDES',
|
|
289
|
+
path: ['patternOverrides'],
|
|
290
|
+
message: `Too many pattern overrides. Maximum is ${MAX_PATTERN_OVERRIDES}, got ${config.patternOverrides.length}`,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
// Step 5: Validate each override
|
|
294
|
+
const overrideIds = new Set();
|
|
295
|
+
for (let i = 0; i < config.patternOverrides.length; i++) {
|
|
296
|
+
const override = config.patternOverrides[i];
|
|
297
|
+
if (!override)
|
|
298
|
+
continue;
|
|
299
|
+
// Check for duplicate override IDs
|
|
300
|
+
if (overrideIds.has(override.patternId)) {
|
|
301
|
+
warnings.push({
|
|
302
|
+
code: 'DUPLICATE_OVERRIDE',
|
|
303
|
+
path: ['patternOverrides', i.toString()],
|
|
304
|
+
message: `Multiple overrides for pattern: ${override.patternId}. Only the last one will apply.`,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
overrideIds.add(override.patternId);
|
|
308
|
+
// Validate override
|
|
309
|
+
const overrideResult = validatePatternOverride(override);
|
|
310
|
+
for (const error of overrideResult.errors) {
|
|
311
|
+
errors.push({
|
|
312
|
+
...error,
|
|
313
|
+
path: ['patternOverrides', i.toString(), ...error.path],
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
for (const warning of overrideResult.warnings) {
|
|
317
|
+
warnings.push({
|
|
318
|
+
...warning,
|
|
319
|
+
path: ['patternOverrides', i.toString(), ...warning.path],
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Step 6: Validate disabled patterns count
|
|
324
|
+
if (config.disabledPatterns.length > MAX_DISABLED_PATTERNS) {
|
|
325
|
+
errors.push({
|
|
326
|
+
code: 'TOO_MANY_DISABLED',
|
|
327
|
+
path: ['disabledPatterns'],
|
|
328
|
+
message: `Too many disabled patterns. Maximum is ${MAX_DISABLED_PATTERNS}, got ${config.disabledPatterns.length}`,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
// Step 7: Check for duplicates in disabled patterns
|
|
332
|
+
const disabledSet = new Set();
|
|
333
|
+
for (let i = 0; i < config.disabledPatterns.length; i++) {
|
|
334
|
+
const id = config.disabledPatterns[i];
|
|
335
|
+
if (!id)
|
|
336
|
+
continue;
|
|
337
|
+
if (disabledSet.has(id)) {
|
|
338
|
+
warnings.push({
|
|
339
|
+
code: 'DUPLICATE_DISABLED',
|
|
340
|
+
path: ['disabledPatterns', i.toString()],
|
|
341
|
+
message: `Pattern "${id}" is listed multiple times in disabled patterns`,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
disabledSet.add(id);
|
|
345
|
+
}
|
|
346
|
+
// Step 8: Check for conflicts between overrides and disabled
|
|
347
|
+
for (const override of config.patternOverrides) {
|
|
348
|
+
if (config.disabledPatterns.includes(override.patternId)) {
|
|
349
|
+
warnings.push({
|
|
350
|
+
code: 'OVERRIDE_DISABLED_CONFLICT',
|
|
351
|
+
path: ['patternOverrides'],
|
|
352
|
+
message: `Pattern "${override.patternId}" has an override but is also disabled. The pattern will be disabled.`,
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
success: errors.length === 0,
|
|
358
|
+
config: errors.length === 0 ? config : undefined,
|
|
359
|
+
errors,
|
|
360
|
+
warnings,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
// =============================================================================
|
|
364
|
+
// Pattern Application
|
|
365
|
+
// =============================================================================
|
|
366
|
+
/**
|
|
367
|
+
* Apply pattern overrides to a set of patterns.
|
|
368
|
+
*
|
|
369
|
+
* Returns a new array with overrides applied.
|
|
370
|
+
*/
|
|
371
|
+
export function applyPatternOverrides(patterns, overrides) {
|
|
372
|
+
const overrideMap = new Map();
|
|
373
|
+
for (const override of overrides) {
|
|
374
|
+
overrideMap.set(override.patternId, override);
|
|
375
|
+
}
|
|
376
|
+
return patterns.map((pattern) => {
|
|
377
|
+
const override = overrideMap.get(pattern.id);
|
|
378
|
+
if (!override) {
|
|
379
|
+
return pattern;
|
|
380
|
+
}
|
|
381
|
+
return {
|
|
382
|
+
...pattern,
|
|
383
|
+
confidence: override.confidence ?? pattern.confidence,
|
|
384
|
+
deprecated: override.deprecated ?? pattern.deprecated,
|
|
385
|
+
deprecationReason: override.deprecationReason ?? pattern.deprecationReason,
|
|
386
|
+
};
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Filter out disabled patterns.
|
|
391
|
+
*/
|
|
392
|
+
export function filterDisabledPatterns(patterns, disabledIds) {
|
|
393
|
+
const disabledSet = new Set(disabledIds);
|
|
394
|
+
return patterns.filter((p) => !disabledSet.has(p.id));
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Get effective patterns after applying overrides and filtering disabled.
|
|
398
|
+
*/
|
|
399
|
+
export function getEffectivePatterns(builtInPatterns, customPatterns, overrides, disabledIds) {
|
|
400
|
+
// Combine built-in and custom patterns
|
|
401
|
+
const allPatterns = [...builtInPatterns, ...customPatterns];
|
|
402
|
+
// Apply overrides
|
|
403
|
+
const withOverrides = applyPatternOverrides(allPatterns, overrides);
|
|
404
|
+
// Filter disabled
|
|
405
|
+
const filtered = filterDisabledPatterns(withOverrides, disabledIds);
|
|
406
|
+
// Filter deprecated
|
|
407
|
+
return filtered.filter((p) => !p.deprecated);
|
|
408
|
+
}
|
|
409
|
+
// =============================================================================
|
|
410
|
+
// Error Formatting
|
|
411
|
+
// =============================================================================
|
|
412
|
+
/**
|
|
413
|
+
* Format validation errors for display.
|
|
414
|
+
*/
|
|
415
|
+
export function formatValidationErrors(errors) {
|
|
416
|
+
if (errors.length === 0) {
|
|
417
|
+
return 'No errors';
|
|
418
|
+
}
|
|
419
|
+
return errors.map((e) => `[${e.code}] ${e.path.join('.')}: ${e.message}`).join('\n');
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Format validation warnings for display.
|
|
423
|
+
*/
|
|
424
|
+
export function formatValidationWarnings(warnings) {
|
|
425
|
+
if (warnings.length === 0) {
|
|
426
|
+
return 'No warnings';
|
|
427
|
+
}
|
|
428
|
+
return warnings.map((w) => `[${w.code}] ${w.path.join('.')}: ${w.message}`).join('\n');
|
|
429
|
+
}
|
|
430
|
+
//# sourceMappingURL=mitigation-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mitigation-config.js","sourceRoot":"","sources":["../../src/config/mitigation-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider Resolution Module
|
|
3
|
+
*
|
|
4
|
+
* Handles LLM provider resolution with strict precedence rules.
|
|
5
|
+
* Extracted from config.ts to improve modularity.
|
|
6
|
+
*/
|
|
7
|
+
import type { Config, AgentId } from './schemas.js';
|
|
8
|
+
/**
|
|
9
|
+
* Check if model is a completions-only model (not chat-compatible).
|
|
10
|
+
* Used for preflight validation to prevent 404 errors.
|
|
11
|
+
*
|
|
12
|
+
* @param model - Model name to check
|
|
13
|
+
* @returns true if model is completions-only and NOT compatible with chat API
|
|
14
|
+
*/
|
|
15
|
+
export declare function isCompletionsOnlyModel(model: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Provider type for LLM agents.
|
|
18
|
+
* Router resolves provider once; agents use this without guessing.
|
|
19
|
+
*/
|
|
20
|
+
export type LlmProvider = 'anthropic' | 'openai' | 'azure-openai' | 'ollama';
|
|
21
|
+
/**
|
|
22
|
+
* Resolved configuration tuple for logging and reproducibility (FR-011).
|
|
23
|
+
* Captures the fully resolved state at preflight time.
|
|
24
|
+
*
|
|
25
|
+
* INVARIANT: This tuple is logged at preflight and locked for the entire run.
|
|
26
|
+
* INVARIANT: keySource logs env var name, never the actual secret value.
|
|
27
|
+
*/
|
|
28
|
+
export interface ResolvedConfigTuple {
|
|
29
|
+
/** Resolved LLM provider */
|
|
30
|
+
provider: LlmProvider | null;
|
|
31
|
+
/** Effective model name (may be auto-applied default for single-key setups) */
|
|
32
|
+
model: string;
|
|
33
|
+
/** Source of API key, e.g., "env:OPENAI_API_KEY" */
|
|
34
|
+
keySource: string | null;
|
|
35
|
+
/** Source of config: "file" (from .ai-review.yml), "defaults" (built-in), "merged" (both) */
|
|
36
|
+
configSource: 'file' | 'defaults' | 'merged';
|
|
37
|
+
/** Path to config file if file source */
|
|
38
|
+
configPath?: string;
|
|
39
|
+
/** Tuple format version - increment when fields are added/changed */
|
|
40
|
+
schemaVersion: number;
|
|
41
|
+
/** Resolution logic version - increment when resolution behavior changes */
|
|
42
|
+
resolutionVersion: number;
|
|
43
|
+
}
|
|
44
|
+
/** Current schema version for ResolvedConfigTuple */
|
|
45
|
+
export declare const RESOLVED_CONFIG_SCHEMA_VERSION = 1;
|
|
46
|
+
/** Current resolution logic version */
|
|
47
|
+
export declare const RESOLVED_CONFIG_RESOLUTION_VERSION = 1;
|
|
48
|
+
/**
|
|
49
|
+
* Resolve the key source string for a provider (FR-011 logging).
|
|
50
|
+
*
|
|
51
|
+
* INVARIANT: Returns env var name, NEVER the actual secret value.
|
|
52
|
+
* INVARIANT: For Azure, returns first present key (API_KEY takes precedence).
|
|
53
|
+
*
|
|
54
|
+
* @param provider - The resolved provider
|
|
55
|
+
* @param env - Environment variables to check
|
|
56
|
+
* @returns Key source string like "env:OPENAI_API_KEY" or null if no key found
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveKeySource(provider: LlmProvider, env: Record<string, string | undefined>): string | null;
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the config source based on whether config came from file or defaults.
|
|
61
|
+
*
|
|
62
|
+
* @param config - The resolved configuration
|
|
63
|
+
* @param configPath - Path to config file, or undefined if no file loaded
|
|
64
|
+
* @returns Config source: 'file', 'defaults', or 'merged'
|
|
65
|
+
*/
|
|
66
|
+
export declare function resolveConfigSource(config: Config, configPath: string | undefined): 'file' | 'defaults' | 'merged';
|
|
67
|
+
/**
|
|
68
|
+
* Infer provider from model name (heuristic, not contract).
|
|
69
|
+
* Used for preflight validation to catch provider/model mismatches early.
|
|
70
|
+
*
|
|
71
|
+
* @param model - Model name to classify
|
|
72
|
+
* @returns Inferred provider or 'unknown' if can't determine
|
|
73
|
+
*/
|
|
74
|
+
export declare function inferProviderFromModel(model: string): 'anthropic' | 'openai' | 'unknown';
|
|
75
|
+
/**
|
|
76
|
+
* Resolve effective model using precedence order:
|
|
77
|
+
* 1. MODEL env var (user override)
|
|
78
|
+
* 2. config.models.default (repo config)
|
|
79
|
+
*
|
|
80
|
+
* INVARIANT: Router owns model resolution. Agents receive the resolved model.
|
|
81
|
+
* INVARIANT: No hardcoded fallbacks. Misconfiguration fails preflight.
|
|
82
|
+
*/
|
|
83
|
+
export declare function resolveEffectiveModel(config: Config, env: Record<string, string | undefined>): string;
|
|
84
|
+
/**
|
|
85
|
+
* Resolve the effective LLM provider for an agent.
|
|
86
|
+
*
|
|
87
|
+
* PRECEDENCE ORDER:
|
|
88
|
+
* 1. Explicit config.provider field (user override - T010)
|
|
89
|
+
* 2. Anthropic wins if agent supports it and key is present
|
|
90
|
+
* 3. Azure only for Azure-capable agents
|
|
91
|
+
* 4. OpenAI as fallback
|
|
92
|
+
*
|
|
93
|
+
* INVARIANT: Explicit provider bypasses auto-detection.
|
|
94
|
+
* INVARIANT: Azure only for Azure-capable agents.
|
|
95
|
+
* INVARIANT: No silent fallback. Missing keys = preflight failure.
|
|
96
|
+
*
|
|
97
|
+
* @param agentId - The agent to resolve provider for
|
|
98
|
+
* @param env - Environment variables to check for keys
|
|
99
|
+
* @param explicitProvider - Optional explicit provider from config.provider field
|
|
100
|
+
* @returns Provider to use, or null if no valid provider available
|
|
101
|
+
*/
|
|
102
|
+
export declare function resolveProvider(agentId: AgentId, env: Record<string, string | undefined>, explicitProvider?: LlmProvider): LlmProvider | null;
|
|
103
|
+
/**
|
|
104
|
+
* Build the resolved configuration tuple for logging (FR-011).
|
|
105
|
+
*
|
|
106
|
+
* INVARIANT: This tuple captures the fully resolved state at preflight time.
|
|
107
|
+
* INVARIANT: keySource logs env var name, NEVER the actual secret value.
|
|
108
|
+
* INVARIANT: Tuple is immutable after construction.
|
|
109
|
+
*
|
|
110
|
+
* @param provider - Resolved provider (may be null for static-only runs)
|
|
111
|
+
* @param model - Effective model name
|
|
112
|
+
* @param env - Environment variables for key source resolution
|
|
113
|
+
* @param config - Configuration for config source resolution
|
|
114
|
+
* @param configPath - Path to config file, or undefined if no file loaded
|
|
115
|
+
* @returns Fully populated ResolvedConfigTuple
|
|
116
|
+
*/
|
|
117
|
+
export declare function buildResolvedConfigTuple(provider: LlmProvider | null, model: string, env: Record<string, string | undefined>, config: Config, configPath: string | undefined): ResolvedConfigTuple;
|
|
118
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/config/providers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAkBpD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,QAAQ,CAAC;AAE7E;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,4BAA4B;IAC5B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAE7B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IAEd,oDAAoD;IACpD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,6FAA6F;IAC7F,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;IAE7C,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,qEAAqE;IACrE,aAAa,EAAE,MAAM,CAAC;IAEtB,4EAA4E;IAC5E,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,qDAAqD;AACrD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,uCAAuC;AACvC,eAAO,MAAM,kCAAkC,IAAI,CAAC;AAapD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,MAAM,GAAG,IAAI,CAYf;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,MAAM,GAAG,UAAU,GAAG,QAAQ,CAoBhC;AAcD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAIxF;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,MAAM,CAeR;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,gBAAgB,CAAC,EAAE,WAAW,GAC7B,WAAW,GAAG,IAAI,CAkDpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,WAAW,GAAG,IAAI,EAC5B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,mBAAmB,CAmBrB"}
|