@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,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Types Module
|
|
3
|
+
*
|
|
4
|
+
* Shared types for the agent system. Extracted from agents/index.ts
|
|
5
|
+
* to break circular dependencies between agent implementations and the registry.
|
|
6
|
+
*
|
|
7
|
+
* AgentResult Discriminated Union (011-agent-result-unions):
|
|
8
|
+
* - AgentResult is a discriminated union with status: 'success' | 'failure' | 'skipped'
|
|
9
|
+
* - Use constructor helpers: AgentSuccess(), AgentFailure(), AgentSkipped()
|
|
10
|
+
* - Handle all variants with switch + assertNever in default
|
|
11
|
+
*/
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Constructor Helpers (FR-002, FR-012)
|
|
15
|
+
// Use these instead of object literals to ensure valid field combinations
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Create a successful agent result.
|
|
19
|
+
*/
|
|
20
|
+
export function AgentSuccess(params) {
|
|
21
|
+
return { status: 'success', ...params };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a failed agent result.
|
|
25
|
+
*/
|
|
26
|
+
export function AgentFailure(params) {
|
|
27
|
+
return {
|
|
28
|
+
status: 'failure',
|
|
29
|
+
agentId: params.agentId,
|
|
30
|
+
error: params.error,
|
|
31
|
+
failureStage: params.failureStage,
|
|
32
|
+
partialFindings: params.partialFindings ?? [],
|
|
33
|
+
metrics: params.metrics,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a skipped agent result.
|
|
38
|
+
*/
|
|
39
|
+
export function AgentSkipped(params) {
|
|
40
|
+
return { status: 'skipped', ...params };
|
|
41
|
+
}
|
|
42
|
+
// ============================================================================
|
|
43
|
+
// Type Guards (FR-001)
|
|
44
|
+
// ============================================================================
|
|
45
|
+
/**
|
|
46
|
+
* Type guard for success results.
|
|
47
|
+
*/
|
|
48
|
+
export function isSuccess(result) {
|
|
49
|
+
return result.status === 'success';
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Type guard for failure results.
|
|
53
|
+
*/
|
|
54
|
+
export function isFailure(result) {
|
|
55
|
+
return result.status === 'failure';
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Type guard for skipped results.
|
|
59
|
+
*/
|
|
60
|
+
export function isSkipped(result) {
|
|
61
|
+
return result.status === 'skipped';
|
|
62
|
+
}
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// Zod Serialization Schema (FR-025)
|
|
65
|
+
// Required for cache round-trip safety in cache/store.ts
|
|
66
|
+
// ============================================================================
|
|
67
|
+
/** Zod schema for AgentMetrics */
|
|
68
|
+
export const AgentMetricsSchema = z.object({
|
|
69
|
+
durationMs: z.number(),
|
|
70
|
+
filesProcessed: z.number(),
|
|
71
|
+
tokensUsed: z.number().optional(),
|
|
72
|
+
estimatedCostUsd: z.number().optional(),
|
|
73
|
+
});
|
|
74
|
+
/** Zod schema for Finding */
|
|
75
|
+
export const FindingSchema = z.object({
|
|
76
|
+
severity: z.enum(['error', 'warning', 'info']),
|
|
77
|
+
file: z.string(),
|
|
78
|
+
line: z.number().optional(),
|
|
79
|
+
endLine: z.number().optional(),
|
|
80
|
+
message: z.string(),
|
|
81
|
+
suggestion: z.string().optional(),
|
|
82
|
+
ruleId: z.string().optional(),
|
|
83
|
+
sourceAgent: z.string(),
|
|
84
|
+
fingerprint: z.string().optional(),
|
|
85
|
+
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
86
|
+
provenance: z.enum(['complete', 'partial']).optional(),
|
|
87
|
+
});
|
|
88
|
+
/** Zod schema for AgentResultSuccess */
|
|
89
|
+
export const AgentResultSuccessSchema = z.object({
|
|
90
|
+
status: z.literal('success'),
|
|
91
|
+
agentId: z.string(),
|
|
92
|
+
findings: z.array(FindingSchema),
|
|
93
|
+
metrics: AgentMetricsSchema,
|
|
94
|
+
});
|
|
95
|
+
/** Zod schema for AgentResultFailure */
|
|
96
|
+
export const AgentResultFailureSchema = z.object({
|
|
97
|
+
status: z.literal('failure'),
|
|
98
|
+
agentId: z.string(),
|
|
99
|
+
error: z.string(),
|
|
100
|
+
failureStage: z.enum(['preflight', 'exec', 'postprocess']),
|
|
101
|
+
partialFindings: z.array(FindingSchema),
|
|
102
|
+
metrics: AgentMetricsSchema,
|
|
103
|
+
});
|
|
104
|
+
/** Zod schema for AgentResultSkipped */
|
|
105
|
+
export const AgentResultSkippedSchema = z.object({
|
|
106
|
+
status: z.literal('skipped'),
|
|
107
|
+
agentId: z.string(),
|
|
108
|
+
reason: z.string(),
|
|
109
|
+
metrics: AgentMetricsSchema,
|
|
110
|
+
});
|
|
111
|
+
/** Discriminated union schema - validates exact shape */
|
|
112
|
+
export const AgentResultSchema = z.discriminatedUnion('status', [
|
|
113
|
+
AgentResultSuccessSchema,
|
|
114
|
+
AgentResultFailureSchema,
|
|
115
|
+
AgentResultSkippedSchema,
|
|
116
|
+
]);
|
|
117
|
+
/**
|
|
118
|
+
* Cache schema version - bump when AgentResultSchema changes shape.
|
|
119
|
+
* Included in cache keys to invalidate legacy entries.
|
|
120
|
+
* (012-fix-agent-result-regressions, FR-005)
|
|
121
|
+
*
|
|
122
|
+
* History:
|
|
123
|
+
* - v1: Original format (success: boolean, no status field) - DEPRECATED
|
|
124
|
+
* - v2: Discriminated union (status: 'success'|'failure'|'skipped')
|
|
125
|
+
*/
|
|
126
|
+
export const CACHE_SCHEMA_VERSION = 2;
|
|
127
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"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"}
|
package/dist/budget.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Budget Module
|
|
3
|
+
* Enforces per-PR and monthly cost limits
|
|
4
|
+
*/
|
|
5
|
+
import type { Limits } from './config.js';
|
|
6
|
+
export interface BudgetContext {
|
|
7
|
+
/** Number of files changed in the PR */
|
|
8
|
+
fileCount: number;
|
|
9
|
+
/** Total lines changed (additions + deletions) */
|
|
10
|
+
diffLines: number;
|
|
11
|
+
/** Estimated tokens for LLM input */
|
|
12
|
+
estimatedTokens: number;
|
|
13
|
+
}
|
|
14
|
+
export interface BudgetCheck {
|
|
15
|
+
allowed: boolean;
|
|
16
|
+
reason?: string;
|
|
17
|
+
/** Suggested reduced scope if over budget */
|
|
18
|
+
reducedScope?: {
|
|
19
|
+
maxFiles?: number;
|
|
20
|
+
maxLines?: number;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface CostEstimate {
|
|
24
|
+
/** Estimated USD cost for LLM calls */
|
|
25
|
+
estimatedUsd: number;
|
|
26
|
+
/** Breakdown by agent */
|
|
27
|
+
breakdown: Record<string, number>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Pricing constants for GPT-4o-mini model
|
|
31
|
+
* These MUST stay in sync with the hardcoded values in agents (pr_agent.ts, ai_semantic_review.ts)
|
|
32
|
+
* See test: "should use consistent pricing with budget module" in budget.test.ts
|
|
33
|
+
*/
|
|
34
|
+
export declare const COST_PER_1K_TOKENS_INPUT = 0.00015;
|
|
35
|
+
export declare const COST_PER_1K_TOKENS_OUTPUT = 0.0006;
|
|
36
|
+
export declare const ESTIMATED_OUTPUT_RATIO = 0.2;
|
|
37
|
+
/**
|
|
38
|
+
* Check if the PR is within budget limits
|
|
39
|
+
*/
|
|
40
|
+
export declare function checkBudget(context: BudgetContext, limits: Limits): BudgetCheck;
|
|
41
|
+
/**
|
|
42
|
+
* Estimate cost based on token count
|
|
43
|
+
*/
|
|
44
|
+
export declare function estimateCost(tokens: number): CostEstimate;
|
|
45
|
+
/**
|
|
46
|
+
* Estimate token count from diff content
|
|
47
|
+
* Rough approximation: 1 token ≈ 4 characters
|
|
48
|
+
*/
|
|
49
|
+
export declare function estimateTokens(diffContent: string): number;
|
|
50
|
+
/**
|
|
51
|
+
* Track monthly spending (stub - would use persistent storage in production)
|
|
52
|
+
*/
|
|
53
|
+
export interface MonthlyUsage {
|
|
54
|
+
month: string;
|
|
55
|
+
totalUsd: number;
|
|
56
|
+
prCount: number;
|
|
57
|
+
}
|
|
58
|
+
export declare function checkMonthlyBudget(currentUsage: MonthlyUsage, estimatedCost: number, monthlyLimit: number): BudgetCheck;
|
|
59
|
+
//# sourceMappingURL=budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,YAAY,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAChD,eAAO,MAAM,yBAAyB,SAAS,CAAC;AAChD,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAqC/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAYzD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,WAAW,CAWb"}
|
package/dist/budget.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Budget Module
|
|
3
|
+
* Enforces per-PR and monthly cost limits
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Pricing constants for GPT-4o-mini model
|
|
7
|
+
* These MUST stay in sync with the hardcoded values in agents (pr_agent.ts, ai_semantic_review.ts)
|
|
8
|
+
* See test: "should use consistent pricing with budget module" in budget.test.ts
|
|
9
|
+
*/
|
|
10
|
+
export const COST_PER_1K_TOKENS_INPUT = 0.00015;
|
|
11
|
+
export const COST_PER_1K_TOKENS_OUTPUT = 0.0006;
|
|
12
|
+
export const ESTIMATED_OUTPUT_RATIO = 0.2; // Output is typically 20% of input
|
|
13
|
+
/**
|
|
14
|
+
* Check if the PR is within budget limits
|
|
15
|
+
*/
|
|
16
|
+
export function checkBudget(context, limits) {
|
|
17
|
+
// Check file count limit
|
|
18
|
+
if (context.fileCount > limits.max_files) {
|
|
19
|
+
return {
|
|
20
|
+
allowed: false,
|
|
21
|
+
reason: `PR has ${context.fileCount} files, exceeds limit of ${limits.max_files}`,
|
|
22
|
+
reducedScope: { maxFiles: limits.max_files },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// Check diff lines limit
|
|
26
|
+
if (context.diffLines > limits.max_diff_lines) {
|
|
27
|
+
return {
|
|
28
|
+
allowed: false,
|
|
29
|
+
reason: `PR has ${context.diffLines} changed lines, exceeds limit of ${limits.max_diff_lines}`,
|
|
30
|
+
reducedScope: { maxLines: limits.max_diff_lines },
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// Check token limit
|
|
34
|
+
if (context.estimatedTokens > limits.max_tokens_per_pr) {
|
|
35
|
+
return {
|
|
36
|
+
allowed: false,
|
|
37
|
+
reason: `Estimated ${context.estimatedTokens} tokens, exceeds limit of ${limits.max_tokens_per_pr}`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Check estimated cost
|
|
41
|
+
const estimate = estimateCost(context.estimatedTokens);
|
|
42
|
+
if (estimate.estimatedUsd > limits.max_usd_per_pr) {
|
|
43
|
+
return {
|
|
44
|
+
allowed: false,
|
|
45
|
+
reason: `Estimated cost $${estimate.estimatedUsd.toFixed(2)} exceeds limit of $${limits.max_usd_per_pr.toFixed(2)}`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return { allowed: true };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Estimate cost based on token count
|
|
52
|
+
*/
|
|
53
|
+
export function estimateCost(tokens) {
|
|
54
|
+
const inputCost = (tokens / 1000) * COST_PER_1K_TOKENS_INPUT;
|
|
55
|
+
const outputTokens = tokens * ESTIMATED_OUTPUT_RATIO;
|
|
56
|
+
const outputCost = (outputTokens / 1000) * COST_PER_1K_TOKENS_OUTPUT;
|
|
57
|
+
return {
|
|
58
|
+
estimatedUsd: inputCost + outputCost,
|
|
59
|
+
breakdown: {
|
|
60
|
+
input: inputCost,
|
|
61
|
+
output: outputCost,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Estimate token count from diff content
|
|
67
|
+
* Rough approximation: 1 token ≈ 4 characters
|
|
68
|
+
*/
|
|
69
|
+
export function estimateTokens(diffContent) {
|
|
70
|
+
return Math.ceil(diffContent.length / 4);
|
|
71
|
+
}
|
|
72
|
+
export function checkMonthlyBudget(currentUsage, estimatedCost, monthlyLimit) {
|
|
73
|
+
const projectedTotal = currentUsage.totalUsd + estimatedCost;
|
|
74
|
+
if (projectedTotal > monthlyLimit) {
|
|
75
|
+
return {
|
|
76
|
+
allowed: false,
|
|
77
|
+
reason: `Monthly budget exhausted. Current: $${currentUsage.totalUsd.toFixed(2)}, Limit: $${monthlyLimit.toFixed(2)}`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return { allowed: true };
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Key Module
|
|
3
|
+
* Generates deterministic cache keys for review results
|
|
4
|
+
*
|
|
5
|
+
* (012-fix-agent-result-regressions) - Cache keys now include CACHE_SCHEMA_VERSION
|
|
6
|
+
* to automatically invalidate legacy cache entries when schema changes.
|
|
7
|
+
*/
|
|
8
|
+
/** Cache key prefix for namespacing (includes version for automatic invalidation) */
|
|
9
|
+
export declare const CACHE_KEY_PREFIX = "ai-review-v2";
|
|
10
|
+
/** Default cache directory path */
|
|
11
|
+
export declare const AI_REVIEW_CACHE_PATH = ".ai-review-cache";
|
|
12
|
+
export interface CacheKeyInputs {
|
|
13
|
+
prNumber: number;
|
|
14
|
+
headSha: string;
|
|
15
|
+
configHash: string;
|
|
16
|
+
agentId: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate a cache key for a review run
|
|
20
|
+
* Format: ai-review-{prNumber}-{headSha}-{configHash}-{agentId}
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateCacheKey(inputs: CacheKeyInputs): string;
|
|
23
|
+
/**
|
|
24
|
+
* Generate a restore key prefix for partial cache matches
|
|
25
|
+
* This allows fallback to older cached results for the same PR
|
|
26
|
+
*/
|
|
27
|
+
export declare function generateRestoreKeyPrefix(prNumber: number): string;
|
|
28
|
+
/**
|
|
29
|
+
* Generate a hash of the configuration
|
|
30
|
+
* Used for cache invalidation when config changes
|
|
31
|
+
*/
|
|
32
|
+
export declare function hashConfig(config: unknown): string;
|
|
33
|
+
/**
|
|
34
|
+
* Generate a hash of file contents for cache invalidation
|
|
35
|
+
*/
|
|
36
|
+
export declare function hashContent(content: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Parse a cache key to extract components
|
|
39
|
+
*
|
|
40
|
+
* (012-fix-agent-result-regressions) - Updated to handle versioned key format
|
|
41
|
+
* Supports both legacy format (ai-review-{prNumber}-{hash}) and new format
|
|
42
|
+
* (ai-review-v{version}-{prNumber}-{hash}) for backwards compatibility in parsing.
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseCacheKey(key: string): {
|
|
45
|
+
prNumber: number;
|
|
46
|
+
hash: string;
|
|
47
|
+
version?: number;
|
|
48
|
+
} | null;
|
|
49
|
+
//# sourceMappingURL=key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../src/cache/key.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,qFAAqF;AACrF,eAAO,MAAM,gBAAgB,iBAAuC,CAAC;AAErE,mCAAmC;AACnC,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAI/D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGlD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,GACV;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqB7D"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Key Module
|
|
3
|
+
* Generates deterministic cache keys for review results
|
|
4
|
+
*
|
|
5
|
+
* (012-fix-agent-result-regressions) - Cache keys now include CACHE_SCHEMA_VERSION
|
|
6
|
+
* to automatically invalidate legacy cache entries when schema changes.
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from 'crypto';
|
|
9
|
+
import { CACHE_SCHEMA_VERSION } from '../agents/types.js';
|
|
10
|
+
/** Cache key prefix for namespacing (includes version for automatic invalidation) */
|
|
11
|
+
export const CACHE_KEY_PREFIX = `ai-review-v${CACHE_SCHEMA_VERSION}`;
|
|
12
|
+
/** Default cache directory path */
|
|
13
|
+
export const AI_REVIEW_CACHE_PATH = '.ai-review-cache';
|
|
14
|
+
/**
|
|
15
|
+
* Generate a cache key for a review run
|
|
16
|
+
* Format: ai-review-{prNumber}-{headSha}-{configHash}-{agentId}
|
|
17
|
+
*/
|
|
18
|
+
export function generateCacheKey(inputs) {
|
|
19
|
+
const data = `${inputs.prNumber}:${inputs.headSha}:${inputs.configHash}:${inputs.agentId}`;
|
|
20
|
+
const hash = createHash('sha256').update(data).digest('hex').slice(0, 16);
|
|
21
|
+
return `${CACHE_KEY_PREFIX}-${inputs.prNumber}-${hash}`;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generate a restore key prefix for partial cache matches
|
|
25
|
+
* This allows fallback to older cached results for the same PR
|
|
26
|
+
*/
|
|
27
|
+
export function generateRestoreKeyPrefix(prNumber) {
|
|
28
|
+
return `${CACHE_KEY_PREFIX}-${prNumber}-`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate a hash of the configuration
|
|
32
|
+
* Used for cache invalidation when config changes
|
|
33
|
+
*/
|
|
34
|
+
export function hashConfig(config) {
|
|
35
|
+
const json = JSON.stringify(config, Object.keys(config).sort());
|
|
36
|
+
return createHash('sha256').update(json).digest('hex').slice(0, 16);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Generate a hash of file contents for cache invalidation
|
|
40
|
+
*/
|
|
41
|
+
export function hashContent(content) {
|
|
42
|
+
return createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parse a cache key to extract components
|
|
46
|
+
*
|
|
47
|
+
* (012-fix-agent-result-regressions) - Updated to handle versioned key format
|
|
48
|
+
* Supports both legacy format (ai-review-{prNumber}-{hash}) and new format
|
|
49
|
+
* (ai-review-v{version}-{prNumber}-{hash}) for backwards compatibility in parsing.
|
|
50
|
+
*/
|
|
51
|
+
export function parseCacheKey(key) {
|
|
52
|
+
// Try new versioned format first
|
|
53
|
+
const versionedMatch = key.match(/^ai-review-v(\d+)-(\d+)-([a-f0-9]+)$/);
|
|
54
|
+
if (versionedMatch && versionedMatch[1] && versionedMatch[2] && versionedMatch[3]) {
|
|
55
|
+
return {
|
|
56
|
+
version: parseInt(versionedMatch[1], 10),
|
|
57
|
+
prNumber: parseInt(versionedMatch[2], 10),
|
|
58
|
+
hash: versionedMatch[3],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Fall back to legacy format (for parsing only - new keys always use versioned format)
|
|
62
|
+
const legacyMatch = key.match(/^ai-review-(\d+)-([a-f0-9]+)$/);
|
|
63
|
+
if (legacyMatch && legacyMatch[1] && legacyMatch[2]) {
|
|
64
|
+
return {
|
|
65
|
+
prNumber: parseInt(legacyMatch[1], 10),
|
|
66
|
+
hash: legacyMatch[2],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/cache/key.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,qFAAqF;AACrF,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,oBAAoB,EAAE,CAAC;AAErE,mCAAmC;AACnC,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AASvD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAsB;IACrD,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;IAC3F,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1E,OAAO,GAAG,gBAAgB,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,OAAO,GAAG,gBAAgB,IAAI,QAAQ,GAAG,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAgB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAW;IAEX,iCAAiC;IACjC,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACzE,IAAI,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACxC,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,uFAAuF;IACvF,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/D,IAAI,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO;YACL,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;SACrB,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache Store Module
|
|
3
|
+
* Stores and retrieves cached review results
|
|
4
|
+
* Uses GitHub Actions cache in CI, file-based cache locally
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentResult } from '../agents/index.js';
|
|
7
|
+
export interface CacheEntry {
|
|
8
|
+
key: string;
|
|
9
|
+
result: AgentResult;
|
|
10
|
+
createdAt: string;
|
|
11
|
+
expiresAt: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get a cached result
|
|
15
|
+
*/
|
|
16
|
+
export declare function getCached(key: string): Promise<AgentResult | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Store a result in the cache
|
|
19
|
+
*/
|
|
20
|
+
export declare function setCache(key: string, result: AgentResult, ttlSeconds?: number): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Clear the cache
|
|
23
|
+
*/
|
|
24
|
+
export declare function clearCache(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Clean up expired cache entries
|
|
27
|
+
*/
|
|
28
|
+
export declare function cleanupExpired(): Promise<number>;
|
|
29
|
+
/**
|
|
30
|
+
* Find cached result for a PR (even with different SHA)
|
|
31
|
+
* Used for fallback when exact cache miss
|
|
32
|
+
*
|
|
33
|
+
* (012-fix-agent-result-regressions) - Now validates results through validateCachedResult()
|
|
34
|
+
* to ensure legacy/malformed entries are treated as cache misses.
|
|
35
|
+
*/
|
|
36
|
+
export declare function findCachedForPR(prNumber: number): Promise<AgentResult | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Save cache for GitHub Actions
|
|
39
|
+
* Call this at the end of a CI run to persist cache
|
|
40
|
+
*/
|
|
41
|
+
export declare function saveGitHubActionsCache(key: string): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Restore cache from GitHub Actions
|
|
44
|
+
* Call this at the start of a CI run
|
|
45
|
+
*/
|
|
46
|
+
export declare function restoreGitHubActionsCache(primaryKey: string, restoreKeys: string[]): Promise<string | undefined>;
|
|
47
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AA8GD;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAkDxE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,WAAW,EACnB,UAAU,SAAsB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBhD;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAoCtD;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqCnF;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB1E;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkB7B"}
|