@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,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signal Handling Module
|
|
3
|
+
*
|
|
4
|
+
* Provides graceful shutdown handling for SIGINT (Ctrl+C) and SIGTERM signals.
|
|
5
|
+
* Ensures partial results are reported when execution is interrupted.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/signals
|
|
8
|
+
*/
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// State
|
|
11
|
+
// =============================================================================
|
|
12
|
+
let shutdownState = {
|
|
13
|
+
triggered: false,
|
|
14
|
+
};
|
|
15
|
+
let registeredCleanup;
|
|
16
|
+
let registeredOptions = {};
|
|
17
|
+
// Track registered handlers for cleanup
|
|
18
|
+
let sigintHandler;
|
|
19
|
+
let sigtermHandler;
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// Core Functions
|
|
22
|
+
// =============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Check if shutdown has been triggered
|
|
25
|
+
*
|
|
26
|
+
* Use this in long-running loops to check if the user has requested shutdown.
|
|
27
|
+
*
|
|
28
|
+
* @returns true if shutdown has been triggered
|
|
29
|
+
*/
|
|
30
|
+
export function isShutdownTriggered() {
|
|
31
|
+
return shutdownState.triggered;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get the current shutdown state
|
|
35
|
+
*
|
|
36
|
+
* @returns Current shutdown state object
|
|
37
|
+
*/
|
|
38
|
+
export function getShutdownState() {
|
|
39
|
+
return { ...shutdownState };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reset shutdown state
|
|
43
|
+
*
|
|
44
|
+
* Primarily used for testing. Clears the shutdown state and removes handlers.
|
|
45
|
+
*/
|
|
46
|
+
export function resetShutdownState() {
|
|
47
|
+
shutdownState = { triggered: false };
|
|
48
|
+
removeSignalHandlers();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Remove registered signal handlers
|
|
52
|
+
*
|
|
53
|
+
* Called during reset or when handlers need to be replaced.
|
|
54
|
+
*/
|
|
55
|
+
function removeSignalHandlers() {
|
|
56
|
+
if (sigintHandler) {
|
|
57
|
+
process.removeListener('SIGINT', sigintHandler);
|
|
58
|
+
sigintHandler = undefined;
|
|
59
|
+
}
|
|
60
|
+
if (sigtermHandler) {
|
|
61
|
+
process.removeListener('SIGTERM', sigtermHandler);
|
|
62
|
+
sigtermHandler = undefined;
|
|
63
|
+
}
|
|
64
|
+
registeredCleanup = undefined;
|
|
65
|
+
registeredOptions = {};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create a signal handler for the given signal type
|
|
69
|
+
*
|
|
70
|
+
* @param signal - The signal type
|
|
71
|
+
* @returns Signal handler function
|
|
72
|
+
*/
|
|
73
|
+
function createSignalHandler(signal) {
|
|
74
|
+
return async () => {
|
|
75
|
+
const logger = registeredOptions.logger ?? console;
|
|
76
|
+
// Prevent multiple shutdown triggers
|
|
77
|
+
if (shutdownState.triggered) {
|
|
78
|
+
logger.warn('\nForce quit requested. Exiting immediately.');
|
|
79
|
+
process.exit(130); // 128 + 2 (SIGINT)
|
|
80
|
+
}
|
|
81
|
+
// Mark shutdown as triggered
|
|
82
|
+
shutdownState = {
|
|
83
|
+
triggered: true,
|
|
84
|
+
signal,
|
|
85
|
+
timestamp: Date.now(),
|
|
86
|
+
};
|
|
87
|
+
if (signal === 'SIGINT') {
|
|
88
|
+
// User pressed Ctrl+C
|
|
89
|
+
if (registeredOptions.showPartialResultsMessage !== false) {
|
|
90
|
+
logger.log('\n\nReceived interrupt signal. Shutting down gracefully...');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// SIGTERM - typically from process manager
|
|
95
|
+
logger.log('\nReceived termination signal. Shutting down...');
|
|
96
|
+
}
|
|
97
|
+
// Run cleanup if registered
|
|
98
|
+
if (registeredCleanup) {
|
|
99
|
+
try {
|
|
100
|
+
await registeredCleanup();
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
104
|
+
logger.warn(`Cleanup error: ${errorMsg}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Exit with appropriate code if exitOnSignal is true (default)
|
|
108
|
+
// 128 + signal number: SIGINT = 2, SIGTERM = 15
|
|
109
|
+
if (registeredOptions.exitOnSignal !== false) {
|
|
110
|
+
const exitCode = signal === 'SIGINT' ? 130 : 143;
|
|
111
|
+
process.exit(exitCode);
|
|
112
|
+
}
|
|
113
|
+
// When exitOnSignal is false, the main function is responsible for checking
|
|
114
|
+
// isShutdownTriggered() and handling graceful exit
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Setup signal handlers for graceful shutdown
|
|
119
|
+
*
|
|
120
|
+
* Registers handlers for SIGINT (Ctrl+C) and SIGTERM that:
|
|
121
|
+
* 1. Set the shutdown state
|
|
122
|
+
* 2. Call the optional cleanup function
|
|
123
|
+
* 3. Exit with appropriate code (130 for SIGINT, 143 for SIGTERM)
|
|
124
|
+
*
|
|
125
|
+
* On second SIGINT (force quit), exits immediately without cleanup.
|
|
126
|
+
*
|
|
127
|
+
* @param options - Signal handler options
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```typescript
|
|
131
|
+
* setupSignalHandlers({
|
|
132
|
+
* cleanup: async () => {
|
|
133
|
+
* // Report partial results
|
|
134
|
+
* await reportPartialResults();
|
|
135
|
+
* },
|
|
136
|
+
* showPartialResultsMessage: true,
|
|
137
|
+
* });
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export function setupSignalHandlers(options = {}) {
|
|
141
|
+
// Remove existing handlers first
|
|
142
|
+
removeSignalHandlers();
|
|
143
|
+
// Store options and cleanup function
|
|
144
|
+
registeredCleanup = options.cleanup;
|
|
145
|
+
registeredOptions = options;
|
|
146
|
+
// Reset shutdown state
|
|
147
|
+
shutdownState = { triggered: false };
|
|
148
|
+
// Create and register handlers
|
|
149
|
+
sigintHandler = createSignalHandler('SIGINT');
|
|
150
|
+
sigtermHandler = createSignalHandler('SIGTERM');
|
|
151
|
+
process.on('SIGINT', sigintHandler);
|
|
152
|
+
process.on('SIGTERM', sigtermHandler);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Legacy function signature for backward compatibility
|
|
156
|
+
*
|
|
157
|
+
* @param cleanup - Cleanup function to call during shutdown
|
|
158
|
+
*/
|
|
159
|
+
export function setupSignalHandlersLegacy(cleanup) {
|
|
160
|
+
setupSignalHandlers({ cleanup });
|
|
161
|
+
}
|
|
162
|
+
let partialResultsContext;
|
|
163
|
+
/**
|
|
164
|
+
* Set the partial results context for progress tracking
|
|
165
|
+
*
|
|
166
|
+
* Call this when starting agent execution to enable accurate
|
|
167
|
+
* completion percentage in shutdown messages.
|
|
168
|
+
*
|
|
169
|
+
* @param context - Partial results tracking context
|
|
170
|
+
*/
|
|
171
|
+
export function setPartialResultsContext(context) {
|
|
172
|
+
partialResultsContext = context;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Update the partial results context
|
|
176
|
+
*
|
|
177
|
+
* Call this after each agent completes to update progress.
|
|
178
|
+
*
|
|
179
|
+
* @param update - Partial update to apply
|
|
180
|
+
*/
|
|
181
|
+
export function updatePartialResultsContext(update) {
|
|
182
|
+
if (partialResultsContext) {
|
|
183
|
+
partialResultsContext = { ...partialResultsContext, ...update };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get the current partial results context
|
|
188
|
+
*
|
|
189
|
+
* @returns Current context or undefined if not set
|
|
190
|
+
*/
|
|
191
|
+
export function getPartialResultsContext() {
|
|
192
|
+
return partialResultsContext ? { ...partialResultsContext } : undefined;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Clear the partial results context
|
|
196
|
+
*
|
|
197
|
+
* Call this after execution completes normally.
|
|
198
|
+
*/
|
|
199
|
+
export function clearPartialResultsContext() {
|
|
200
|
+
partialResultsContext = undefined;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Format a shutdown message with partial results information
|
|
204
|
+
*
|
|
205
|
+
* @param context - Partial results context
|
|
206
|
+
* @returns Formatted message lines
|
|
207
|
+
*/
|
|
208
|
+
export function formatPartialResultsMessage(context) {
|
|
209
|
+
const lines = [];
|
|
210
|
+
const completionPercent = context.totalAgents > 0 ? Math.round((context.completedAgents / context.totalAgents) * 100) : 0;
|
|
211
|
+
lines.push(`📊 SUMMARY [interrupted at ${completionPercent}%]`);
|
|
212
|
+
lines.push('');
|
|
213
|
+
if (context.completedAgentNames.length > 0) {
|
|
214
|
+
const completedList = context.completedAgentNames.map((name) => `${name} ✓`).join(', ');
|
|
215
|
+
lines.push(`Agents: ${context.completedAgents}/${context.totalAgents} completed`);
|
|
216
|
+
lines.push(` (${completedList}${context.currentAgent ? `, ${context.currentAgent} ✗ interrupted` : ''})`);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
lines.push(`Agents: 0/${context.totalAgents} completed (interrupted before any completed)`);
|
|
220
|
+
}
|
|
221
|
+
return lines;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=signals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/cli/signals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Report Module
|
|
3
|
+
*
|
|
4
|
+
* Feature 015: Config Wizard & Validation
|
|
5
|
+
* Converts PreflightResult to structured ValidationReport with severity categorization.
|
|
6
|
+
* Provides formatted console output for validation results.
|
|
7
|
+
*
|
|
8
|
+
* Exit code semantics (per spec FR-015):
|
|
9
|
+
* - Exit 1: Errors present (validation failed)
|
|
10
|
+
* - Exit 0: Warnings only (validation passed with notes)
|
|
11
|
+
* - Exit 0: Success (validation passed)
|
|
12
|
+
*
|
|
13
|
+
* @module validation-report
|
|
14
|
+
* @see {@link ../../../specs/015-config-wizard-validate/spec.md} Feature specification
|
|
15
|
+
*/
|
|
16
|
+
import type { PreflightResult } from '../phases/preflight.js';
|
|
17
|
+
import type { ResolvedConfigTuple } from '../config/providers.js';
|
|
18
|
+
/**
|
|
19
|
+
* Structured validation report with severity categorization.
|
|
20
|
+
*
|
|
21
|
+
* Categorizes preflight check messages into three severity levels:
|
|
22
|
+
* - **errors**: Critical issues that prevent execution (exit 1)
|
|
23
|
+
* - **warnings**: Non-blocking issues that should be reviewed (exit 0)
|
|
24
|
+
* - **info**: Informational messages for context (exit 0)
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const report: ValidationReport = {
|
|
29
|
+
* errors: ['Missing OPENAI_API_KEY'],
|
|
30
|
+
* warnings: ['WARNING: Legacy key format detected'],
|
|
31
|
+
* info: [],
|
|
32
|
+
* resolved: { provider: 'openai', model: 'gpt-4o', ... },
|
|
33
|
+
* valid: false,
|
|
34
|
+
* };
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export interface ValidationReport {
|
|
38
|
+
/** Errors that block execution (exit code 1) */
|
|
39
|
+
errors: string[];
|
|
40
|
+
/** Warnings that should be reviewed but don't block (exit code 0) */
|
|
41
|
+
warnings: string[];
|
|
42
|
+
/** Informational messages for context (exit code 0) */
|
|
43
|
+
info: string[];
|
|
44
|
+
/** Resolved configuration tuple on success (provider, model, key source) */
|
|
45
|
+
resolved?: ResolvedConfigTuple;
|
|
46
|
+
/** Overall validation status - true if no errors (warnings allowed) */
|
|
47
|
+
valid: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Convert PreflightResult to ValidationReport with severity categorization.
|
|
51
|
+
*
|
|
52
|
+
* Categorizes messages based on source:
|
|
53
|
+
* - result.errors → errors array
|
|
54
|
+
* - result.warnings → warnings array
|
|
55
|
+
*
|
|
56
|
+
* The `valid` field is true only when there are no errors (warnings are allowed).
|
|
57
|
+
*
|
|
58
|
+
* @param result - PreflightResult from runPreflightChecks()
|
|
59
|
+
* @returns ValidationReport with categorized messages and resolved config tuple
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const preflight = runPreflightChecks(config, context, env);
|
|
64
|
+
* const report = formatValidationReport(preflight);
|
|
65
|
+
*
|
|
66
|
+
* if (report.valid) {
|
|
67
|
+
* console.log('Config is valid');
|
|
68
|
+
* } else {
|
|
69
|
+
* console.log(`${report.errors.length} errors found`);
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function formatValidationReport(result: PreflightResult): ValidationReport;
|
|
74
|
+
/**
|
|
75
|
+
* Print validation report to console with formatted output.
|
|
76
|
+
*
|
|
77
|
+
* Output format and destinations:
|
|
78
|
+
* - Errors: "✗ ERROR: <message>" → stderr
|
|
79
|
+
* - Warnings: "⚠ WARNING: <message>" → stderr
|
|
80
|
+
* - Success: "✓ Configuration valid" → stdout
|
|
81
|
+
* - Resolved tuple details (provider, model, key source) → stdout
|
|
82
|
+
*
|
|
83
|
+
* When validation fails (errors present), shows error count in summary.
|
|
84
|
+
* When validation passes with warnings, shows "(with warnings)" suffix.
|
|
85
|
+
*
|
|
86
|
+
* @param report - ValidationReport to print
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```typescript
|
|
90
|
+
* const report = formatValidationReport(preflightResult);
|
|
91
|
+
* printValidationReport(report);
|
|
92
|
+
*
|
|
93
|
+
* // Output on success:
|
|
94
|
+
* // ✓ Configuration valid
|
|
95
|
+
* // Provider: openai
|
|
96
|
+
* // Model: gpt-4o
|
|
97
|
+
* // Key source: OPENAI_API_KEY
|
|
98
|
+
* // Config source: .ai-review.yml
|
|
99
|
+
*
|
|
100
|
+
* // Output on failure:
|
|
101
|
+
* // ✗ ERROR: Missing OPENAI_API_KEY
|
|
102
|
+
* // Validation failed with 1 error(s).
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export declare function printValidationReport(report: ValidationReport): void;
|
|
106
|
+
//# sourceMappingURL=validation-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-report.d.ts","sourceRoot":"","sources":["../../src/cli/validation-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,uDAAuD;IACvD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,uEAAuE;IACvE,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,CAWhF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA4BpE"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Report Module
|
|
3
|
+
*
|
|
4
|
+
* Feature 015: Config Wizard & Validation
|
|
5
|
+
* Converts PreflightResult to structured ValidationReport with severity categorization.
|
|
6
|
+
* Provides formatted console output for validation results.
|
|
7
|
+
*
|
|
8
|
+
* Exit code semantics (per spec FR-015):
|
|
9
|
+
* - Exit 1: Errors present (validation failed)
|
|
10
|
+
* - Exit 0: Warnings only (validation passed with notes)
|
|
11
|
+
* - Exit 0: Success (validation passed)
|
|
12
|
+
*
|
|
13
|
+
* @module validation-report
|
|
14
|
+
* @see {@link ../../../specs/015-config-wizard-validate/spec.md} Feature specification
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Convert PreflightResult to ValidationReport with severity categorization.
|
|
18
|
+
*
|
|
19
|
+
* Categorizes messages based on source:
|
|
20
|
+
* - result.errors → errors array
|
|
21
|
+
* - result.warnings → warnings array
|
|
22
|
+
*
|
|
23
|
+
* The `valid` field is true only when there are no errors (warnings are allowed).
|
|
24
|
+
*
|
|
25
|
+
* @param result - PreflightResult from runPreflightChecks()
|
|
26
|
+
* @returns ValidationReport with categorized messages and resolved config tuple
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const preflight = runPreflightChecks(config, context, env);
|
|
31
|
+
* const report = formatValidationReport(preflight);
|
|
32
|
+
*
|
|
33
|
+
* if (report.valid) {
|
|
34
|
+
* console.log('Config is valid');
|
|
35
|
+
* } else {
|
|
36
|
+
* console.log(`${report.errors.length} errors found`);
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export function formatValidationReport(result) {
|
|
41
|
+
const errors = [...result.errors];
|
|
42
|
+
const warnings = result.warnings ? [...result.warnings] : [];
|
|
43
|
+
return {
|
|
44
|
+
errors,
|
|
45
|
+
warnings,
|
|
46
|
+
info: [],
|
|
47
|
+
resolved: result.resolved,
|
|
48
|
+
valid: errors.length === 0,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Print validation report to console with formatted output.
|
|
53
|
+
*
|
|
54
|
+
* Output format and destinations:
|
|
55
|
+
* - Errors: "✗ ERROR: <message>" → stderr
|
|
56
|
+
* - Warnings: "⚠ WARNING: <message>" → stderr
|
|
57
|
+
* - Success: "✓ Configuration valid" → stdout
|
|
58
|
+
* - Resolved tuple details (provider, model, key source) → stdout
|
|
59
|
+
*
|
|
60
|
+
* When validation fails (errors present), shows error count in summary.
|
|
61
|
+
* When validation passes with warnings, shows "(with warnings)" suffix.
|
|
62
|
+
*
|
|
63
|
+
* @param report - ValidationReport to print
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const report = formatValidationReport(preflightResult);
|
|
68
|
+
* printValidationReport(report);
|
|
69
|
+
*
|
|
70
|
+
* // Output on success:
|
|
71
|
+
* // ✓ Configuration valid
|
|
72
|
+
* // Provider: openai
|
|
73
|
+
* // Model: gpt-4o
|
|
74
|
+
* // Key source: OPENAI_API_KEY
|
|
75
|
+
* // Config source: .ai-review.yml
|
|
76
|
+
*
|
|
77
|
+
* // Output on failure:
|
|
78
|
+
* // ✗ ERROR: Missing OPENAI_API_KEY
|
|
79
|
+
* // Validation failed with 1 error(s).
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export function printValidationReport(report) {
|
|
83
|
+
// Print errors to stderr
|
|
84
|
+
for (const err of report.errors) {
|
|
85
|
+
console.error(`✗ ERROR: ${err}`);
|
|
86
|
+
}
|
|
87
|
+
// Print warnings to stderr
|
|
88
|
+
for (const warn of report.warnings) {
|
|
89
|
+
console.error(`⚠ WARNING: ${warn}`);
|
|
90
|
+
}
|
|
91
|
+
// Print status and resolved tuple
|
|
92
|
+
if (report.valid) {
|
|
93
|
+
const status = report.warnings.length > 0
|
|
94
|
+
? '✓ Configuration valid (with warnings)'
|
|
95
|
+
: '✓ Configuration valid';
|
|
96
|
+
console.log(status);
|
|
97
|
+
if (report.resolved) {
|
|
98
|
+
console.log(` Provider: ${report.resolved.provider ?? 'none'}`);
|
|
99
|
+
console.log(` Model: ${report.resolved.model}`);
|
|
100
|
+
console.log(` Key source: ${report.resolved.keySource ?? '(not set)'}`);
|
|
101
|
+
console.log(` Config source: ${report.resolved.configSource}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
console.error(`\nValidation failed with ${report.errors.length} error(s).`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=validation-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-report.js","sourceRoot":"","sources":["../../src/cli/validation-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAqCH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAuB;IAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,OAAO;QACL,MAAM;QACN,QAAQ;QACR,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAwB;IAC5D,yBAAyB;IACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,2BAA2B;IAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,kCAAkC;IAClC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,MAAM,GACV,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,uCAAuC;YACzC,CAAC,CAAC,uBAAuB,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,QAAQ,CAAC,SAAS,IAAI,WAAW,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Module
|
|
3
|
+
*
|
|
4
|
+
* Re-exports from schemas and providers for clean imports.
|
|
5
|
+
*/
|
|
6
|
+
export { ConfigSchema, PassSchema, LimitsSchema, ModelsSchema, AgentSchema, ProviderSchema, type Config, type Pass, type Limits, type Models, type AgentId, type Provider, } from './schemas.js';
|
|
7
|
+
export { type LlmProvider, type ResolvedConfigTuple, RESOLVED_CONFIG_SCHEMA_VERSION, RESOLVED_CONFIG_RESOLUTION_VERSION, isCompletionsOnlyModel, inferProviderFromModel, resolveEffectiveModel, resolveProvider, resolveKeySource, resolveConfigSource, buildResolvedConfigTuple, } from './providers.js';
|
|
8
|
+
export { type ProviderDetectionResult, type ZeroConfigResult, type NoCredentialsResult, type GenerateZeroConfigResult, ZERO_CONFIG_LIMITS, ZERO_CONFIG_PASS_NAME, detectProvider, detectProviderWithDetails, generateZeroConfigDefaults, isZeroConfigSuccess, formatZeroConfigMessage, getZeroConfigDescription, } from './zero-config.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,KAAK,MAAM,EACX,KAAK,IAAI,EACT,KAAK,MAAM,EACX,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,KAAK,QAAQ,GACd,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,8BAA8B,EAC9B,kCAAkC,EAClC,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Module
|
|
3
|
+
*
|
|
4
|
+
* Re-exports from schemas and providers for clean imports.
|
|
5
|
+
*/
|
|
6
|
+
// Re-export all schemas and types
|
|
7
|
+
export { ConfigSchema, PassSchema, LimitsSchema, ModelsSchema, AgentSchema, ProviderSchema, } from './schemas.js';
|
|
8
|
+
// Re-export provider types and functions
|
|
9
|
+
export { RESOLVED_CONFIG_SCHEMA_VERSION, RESOLVED_CONFIG_RESOLUTION_VERSION, isCompletionsOnlyModel, inferProviderFromModel, resolveEffectiveModel, resolveProvider, resolveKeySource, resolveConfigSource, buildResolvedConfigTuple, } from './providers.js';
|
|
10
|
+
// Re-export zero-config types and functions
|
|
11
|
+
export { ZERO_CONFIG_LIMITS, ZERO_CONFIG_PASS_NAME, detectProvider, detectProviderWithDetails, generateZeroConfigDefaults, isZeroConfigSuccess, formatZeroConfigMessage, getZeroConfigDescription, } from './zero-config.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,kCAAkC;AAClC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,GAOf,MAAM,cAAc,CAAC;AAEtB,yCAAyC;AACzC,OAAO,EAGL,8BAA8B,EAC9B,kCAAkC,EAClC,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,4CAA4C;AAC5C,OAAO,EAKL,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
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 { type MitigationPattern, type PatternOverride, type ControlFlowConfig } from '../agents/control_flow/types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Result of pattern validation.
|
|
15
|
+
*/
|
|
16
|
+
export interface PatternValidationResult {
|
|
17
|
+
valid: boolean;
|
|
18
|
+
errors: PatternValidationError[];
|
|
19
|
+
warnings: PatternValidationWarning[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Pattern validation error.
|
|
23
|
+
*/
|
|
24
|
+
export interface PatternValidationError {
|
|
25
|
+
code: string;
|
|
26
|
+
path: string[];
|
|
27
|
+
message: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Pattern validation warning.
|
|
31
|
+
*/
|
|
32
|
+
export interface PatternValidationWarning {
|
|
33
|
+
code: string;
|
|
34
|
+
path: string[];
|
|
35
|
+
message: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Result of config parsing.
|
|
39
|
+
*/
|
|
40
|
+
export interface ConfigParseResult {
|
|
41
|
+
success: boolean;
|
|
42
|
+
config?: ControlFlowConfig;
|
|
43
|
+
errors: PatternValidationError[];
|
|
44
|
+
warnings: PatternValidationWarning[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Validate that a pattern is declarative and side-effect-free per FR-015.
|
|
48
|
+
*
|
|
49
|
+
* Patterns must only contain:
|
|
50
|
+
* - Function name matching (exact or regex)
|
|
51
|
+
* - Parameter constraints
|
|
52
|
+
* - Return value assertions
|
|
53
|
+
* - Module specifications
|
|
54
|
+
*
|
|
55
|
+
* No executable code, callbacks, or side effects are allowed.
|
|
56
|
+
*/
|
|
57
|
+
export declare function validatePatternIsDeclarative(pattern: MitigationPattern): PatternValidationResult;
|
|
58
|
+
/**
|
|
59
|
+
* Validate a pattern override.
|
|
60
|
+
*/
|
|
61
|
+
export declare function validatePatternOverride(override: PatternOverride): PatternValidationResult;
|
|
62
|
+
/**
|
|
63
|
+
* Parse and validate a control flow configuration.
|
|
64
|
+
*
|
|
65
|
+
* This function:
|
|
66
|
+
* 1. Parses the config using Zod schema
|
|
67
|
+
* 2. Validates each custom pattern is declarative (FR-015)
|
|
68
|
+
* 3. Validates pattern overrides
|
|
69
|
+
* 4. Checks for conflicts and issues
|
|
70
|
+
*/
|
|
71
|
+
export declare function parseControlFlowConfig(rawConfig: unknown): ConfigParseResult;
|
|
72
|
+
/**
|
|
73
|
+
* Apply pattern overrides to a set of patterns.
|
|
74
|
+
*
|
|
75
|
+
* Returns a new array with overrides applied.
|
|
76
|
+
*/
|
|
77
|
+
export declare function applyPatternOverrides(patterns: MitigationPattern[], overrides: PatternOverride[]): MitigationPattern[];
|
|
78
|
+
/**
|
|
79
|
+
* Filter out disabled patterns.
|
|
80
|
+
*/
|
|
81
|
+
export declare function filterDisabledPatterns(patterns: MitigationPattern[], disabledIds: string[]): MitigationPattern[];
|
|
82
|
+
/**
|
|
83
|
+
* Get effective patterns after applying overrides and filtering disabled.
|
|
84
|
+
*/
|
|
85
|
+
export declare function getEffectivePatterns(builtInPatterns: MitigationPattern[], customPatterns: MitigationPattern[], overrides: PatternOverride[], disabledIds: string[]): MitigationPattern[];
|
|
86
|
+
/**
|
|
87
|
+
* Format validation errors for display.
|
|
88
|
+
*/
|
|
89
|
+
export declare function formatValidationErrors(errors: PatternValidationError[]): string;
|
|
90
|
+
/**
|
|
91
|
+
* Format validation warnings for display.
|
|
92
|
+
*/
|
|
93
|
+
export declare function formatValidationWarnings(warnings: PatternValidationWarning[]): string;
|
|
94
|
+
//# sourceMappingURL=mitigation-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mitigation-config.d.ts","sourceRoot":"","sources":["../../src/config/mitigation-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAEvB,MAAM,iCAAiC,CAAC;AAMzC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,QAAQ,EAAE,wBAAwB,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,QAAQ,EAAE,wBAAwB,EAAE,CAAC;CACtC;AAwCD;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,iBAAiB,GAAG,uBAAuB,CAyHhG;AAwBD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,uBAAuB,CAmC1F;AAMD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,OAAO,GAAG,iBAAiB,CA+I5E;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,SAAS,EAAE,eAAe,EAAE,GAC3B,iBAAiB,EAAE,CAmBrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,WAAW,EAAE,MAAM,EAAE,GACpB,iBAAiB,EAAE,CAGrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,iBAAiB,EAAE,EACpC,cAAc,EAAE,iBAAiB,EAAE,EACnC,SAAS,EAAE,eAAe,EAAE,EAC5B,WAAW,EAAE,MAAM,EAAE,GACpB,iBAAiB,EAAE,CAYrB;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,CAM/E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,wBAAwB,EAAE,GAAG,MAAM,CAMrF"}
|