@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,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Logger Module
|
|
3
|
+
*
|
|
4
|
+
* Single aggregation point for security-related logging events.
|
|
5
|
+
* All security-relevant code paths MUST use this module.
|
|
6
|
+
*
|
|
7
|
+
* Key guarantees:
|
|
8
|
+
* - Raw patterns are NEVER logged (only hashes)
|
|
9
|
+
* - Logging failures don't block execution
|
|
10
|
+
* - Consistent structured format across all events
|
|
11
|
+
*
|
|
12
|
+
* @see FR-021, FR-022, FR-023, FR-024
|
|
13
|
+
* @see specs/006-quality-enforcement/contracts/security-event.ts
|
|
14
|
+
*/
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
/**
|
|
17
|
+
* Security event categories
|
|
18
|
+
*/
|
|
19
|
+
export declare const SecurityEventCategory: z.ZodEnum<{
|
|
20
|
+
regex_validation: "regex_validation";
|
|
21
|
+
mitigation_applied: "mitigation_applied";
|
|
22
|
+
mitigation_failed: "mitigation_failed";
|
|
23
|
+
}>;
|
|
24
|
+
export type SecurityEventCategory = z.infer<typeof SecurityEventCategory>;
|
|
25
|
+
/**
|
|
26
|
+
* Event outcome states
|
|
27
|
+
*/
|
|
28
|
+
export declare const SecurityEventOutcome: z.ZodEnum<{
|
|
29
|
+
success: "success";
|
|
30
|
+
timeout: "timeout";
|
|
31
|
+
failure: "failure";
|
|
32
|
+
}>;
|
|
33
|
+
export type SecurityEventOutcome = z.infer<typeof SecurityEventOutcome>;
|
|
34
|
+
/**
|
|
35
|
+
* Error reasons for failed events
|
|
36
|
+
*/
|
|
37
|
+
export declare const MitigationErrorReason: z.ZodEnum<{
|
|
38
|
+
timeout: "timeout";
|
|
39
|
+
invalid_regex: "invalid_regex";
|
|
40
|
+
runtime_error: "runtime_error";
|
|
41
|
+
}>;
|
|
42
|
+
export type MitigationErrorReason = z.infer<typeof MitigationErrorReason>;
|
|
43
|
+
/**
|
|
44
|
+
* Pattern hash format: 16 hex characters (truncated SHA-256)
|
|
45
|
+
*/
|
|
46
|
+
export declare const PatternHash: z.ZodString;
|
|
47
|
+
export type PatternHash = z.infer<typeof PatternHash>;
|
|
48
|
+
/**
|
|
49
|
+
* Security event schema
|
|
50
|
+
*/
|
|
51
|
+
export declare const SecurityEventSchema: z.ZodObject<{
|
|
52
|
+
category: z.ZodEnum<{
|
|
53
|
+
regex_validation: "regex_validation";
|
|
54
|
+
mitigation_applied: "mitigation_applied";
|
|
55
|
+
mitigation_failed: "mitigation_failed";
|
|
56
|
+
}>;
|
|
57
|
+
ruleId: z.ZodString;
|
|
58
|
+
file: z.ZodString;
|
|
59
|
+
patternHash: z.ZodString;
|
|
60
|
+
durationMs: z.ZodNumber;
|
|
61
|
+
outcome: z.ZodEnum<{
|
|
62
|
+
success: "success";
|
|
63
|
+
timeout: "timeout";
|
|
64
|
+
failure: "failure";
|
|
65
|
+
}>;
|
|
66
|
+
errorReason: z.ZodOptional<z.ZodEnum<{
|
|
67
|
+
timeout: "timeout";
|
|
68
|
+
invalid_regex: "invalid_regex";
|
|
69
|
+
runtime_error: "runtime_error";
|
|
70
|
+
}>>;
|
|
71
|
+
timestamp: z.ZodString;
|
|
72
|
+
runId: z.ZodString;
|
|
73
|
+
}, z.core.$strip>;
|
|
74
|
+
export type SecurityEvent = z.infer<typeof SecurityEventSchema>;
|
|
75
|
+
/**
|
|
76
|
+
* Hash a regex pattern using SHA-256 and truncate to 16 hex characters.
|
|
77
|
+
*
|
|
78
|
+
* This ensures raw patterns are NEVER included in logs while still
|
|
79
|
+
* allowing correlation of events related to the same pattern.
|
|
80
|
+
*
|
|
81
|
+
* @param pattern - The regex pattern to hash
|
|
82
|
+
* @returns 16-character hex string (truncated SHA-256)
|
|
83
|
+
*/
|
|
84
|
+
export declare function hashPattern(pattern: string): PatternHash;
|
|
85
|
+
/**
|
|
86
|
+
* Run summary statistics
|
|
87
|
+
*/
|
|
88
|
+
export interface RunSummary {
|
|
89
|
+
runId: string;
|
|
90
|
+
totalEvents: number;
|
|
91
|
+
successCount: number;
|
|
92
|
+
failureCount: number;
|
|
93
|
+
timeoutCount: number;
|
|
94
|
+
totalDurationMs: number;
|
|
95
|
+
loggingFailuresTotal: number;
|
|
96
|
+
loggingFailuresByCategory: Record<string, number>;
|
|
97
|
+
loggingDegraded: boolean;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Input for creating a security event
|
|
101
|
+
*/
|
|
102
|
+
export interface SecurityEventInput {
|
|
103
|
+
category: SecurityEventCategory;
|
|
104
|
+
ruleId: string;
|
|
105
|
+
file: string;
|
|
106
|
+
pattern: string;
|
|
107
|
+
durationMs: number;
|
|
108
|
+
outcome: SecurityEventOutcome;
|
|
109
|
+
errorReason?: MitigationErrorReason;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Security logger instance interface
|
|
113
|
+
*/
|
|
114
|
+
export interface SecurityLogger {
|
|
115
|
+
/** Log a security event */
|
|
116
|
+
logSecurityEvent(input: SecurityEventInput): void;
|
|
117
|
+
/** Start a new logging run */
|
|
118
|
+
startRun(): string;
|
|
119
|
+
/** Get the current run ID */
|
|
120
|
+
getCurrentRunId(): string;
|
|
121
|
+
/** Get summary statistics for the current run */
|
|
122
|
+
getRunSummary(): RunSummary;
|
|
123
|
+
/** Get all events for the current run */
|
|
124
|
+
getRunEvents(): readonly SecurityEvent[];
|
|
125
|
+
/** Check if logging is in degraded mode */
|
|
126
|
+
isLoggingDegraded(): boolean;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Create a new security logger instance.
|
|
130
|
+
*
|
|
131
|
+
* Use this factory when you need isolated logger state (e.g., for testing).
|
|
132
|
+
* For most production use cases, use the default exported functions.
|
|
133
|
+
*
|
|
134
|
+
* @returns A new SecurityLogger instance with its own isolated state
|
|
135
|
+
*/
|
|
136
|
+
export declare function createSecurityLogger(): SecurityLogger;
|
|
137
|
+
/**
|
|
138
|
+
* Log a security event.
|
|
139
|
+
*
|
|
140
|
+
* This is the SOLE export for security logging. All security-relevant
|
|
141
|
+
* code paths MUST use this function.
|
|
142
|
+
*
|
|
143
|
+
* Guarantees (FR-023):
|
|
144
|
+
* - Logging failures don't block execution
|
|
145
|
+
* - Falls back to stderr on validation errors
|
|
146
|
+
* - Never throws exceptions
|
|
147
|
+
*
|
|
148
|
+
* @param input - Security event input (raw pattern will be hashed)
|
|
149
|
+
*/
|
|
150
|
+
export declare function logSecurityEvent(input: SecurityEventInput): void;
|
|
151
|
+
/**
|
|
152
|
+
* Start a new logging run
|
|
153
|
+
*/
|
|
154
|
+
export declare function startRun(): string;
|
|
155
|
+
/**
|
|
156
|
+
* Get the current run ID
|
|
157
|
+
*/
|
|
158
|
+
export declare function getCurrentRunId(): string;
|
|
159
|
+
/**
|
|
160
|
+
* Get summary statistics for the current run
|
|
161
|
+
*/
|
|
162
|
+
export declare function getRunSummary(): RunSummary;
|
|
163
|
+
/**
|
|
164
|
+
* Get all events for the current run (for testing/debugging)
|
|
165
|
+
*/
|
|
166
|
+
export declare function getRunEvents(): readonly SecurityEvent[];
|
|
167
|
+
/**
|
|
168
|
+
* Check if logging is in degraded mode
|
|
169
|
+
*/
|
|
170
|
+
export declare function isLoggingDegraded(): boolean;
|
|
171
|
+
/**
|
|
172
|
+
* Reset the default logger state for testing.
|
|
173
|
+
* This ensures test isolation when using module-level exports.
|
|
174
|
+
*
|
|
175
|
+
* @internal - Only use in test files
|
|
176
|
+
*/
|
|
177
|
+
export declare function resetForTesting(): void;
|
|
178
|
+
//# sourceMappingURL=security-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-logger.d.ts","sourceRoot":"","sources":["../src/security-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;EAIhC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;EAA4C,CAAC;AAC9E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;EAAwD,CAAC;AAC3F,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,WAAW,aAAkE,CAAC;AAC3F,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;iBAwB5B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAMhE;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAGxD;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,eAAe,EAAE,OAAO,CAAC;CAC1B;AAiCD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2BAA2B;IAC3B,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAClD,8BAA8B;IAC9B,QAAQ,IAAI,MAAM,CAAC;IACnB,6BAA6B;IAC7B,eAAe,IAAI,MAAM,CAAC;IAC1B,iDAAiD;IACjD,aAAa,IAAI,UAAU,CAAC;IAC5B,yCAAyC;IACzC,YAAY,IAAI,SAAS,aAAa,EAAE,CAAC;IACzC,2CAA2C;IAC3C,iBAAiB,IAAI,OAAO,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAoGrD;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAE1C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,aAAa,EAAE,CAEvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Logger Module
|
|
3
|
+
*
|
|
4
|
+
* Single aggregation point for security-related logging events.
|
|
5
|
+
* All security-relevant code paths MUST use this module.
|
|
6
|
+
*
|
|
7
|
+
* Key guarantees:
|
|
8
|
+
* - Raw patterns are NEVER logged (only hashes)
|
|
9
|
+
* - Logging failures don't block execution
|
|
10
|
+
* - Consistent structured format across all events
|
|
11
|
+
*
|
|
12
|
+
* @see FR-021, FR-022, FR-023, FR-024
|
|
13
|
+
* @see specs/006-quality-enforcement/contracts/security-event.ts
|
|
14
|
+
*/
|
|
15
|
+
import { createHash } from 'crypto';
|
|
16
|
+
import { z } from 'zod';
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Schema Definitions (FR-021)
|
|
19
|
+
// =============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Security event categories
|
|
22
|
+
*/
|
|
23
|
+
export const SecurityEventCategory = z.enum([
|
|
24
|
+
'regex_validation',
|
|
25
|
+
'mitigation_applied',
|
|
26
|
+
'mitigation_failed',
|
|
27
|
+
]);
|
|
28
|
+
/**
|
|
29
|
+
* Event outcome states
|
|
30
|
+
*/
|
|
31
|
+
export const SecurityEventOutcome = z.enum(['success', 'failure', 'timeout']);
|
|
32
|
+
/**
|
|
33
|
+
* Error reasons for failed events
|
|
34
|
+
*/
|
|
35
|
+
export const MitigationErrorReason = z.enum(['invalid_regex', 'timeout', 'runtime_error']);
|
|
36
|
+
/**
|
|
37
|
+
* Pattern hash format: 16 hex characters (truncated SHA-256)
|
|
38
|
+
*/
|
|
39
|
+
export const PatternHash = z.string().regex(/^[a-f0-9]{16}$/, 'Must be 16 hex characters');
|
|
40
|
+
/**
|
|
41
|
+
* Security event schema
|
|
42
|
+
*/
|
|
43
|
+
export const SecurityEventSchema = z
|
|
44
|
+
.object({
|
|
45
|
+
/** Event type classification */
|
|
46
|
+
category: SecurityEventCategory,
|
|
47
|
+
/** Rule or pattern identifier being validated */
|
|
48
|
+
ruleId: z.string().min(1),
|
|
49
|
+
/** File path being analyzed */
|
|
50
|
+
file: z.string().min(1),
|
|
51
|
+
/** SHA-256 hash of pattern (first 16 chars) - never raw pattern */
|
|
52
|
+
patternHash: PatternHash,
|
|
53
|
+
/** Processing duration in milliseconds */
|
|
54
|
+
durationMs: z.number().min(0),
|
|
55
|
+
/** Result of the operation */
|
|
56
|
+
outcome: SecurityEventOutcome,
|
|
57
|
+
/** Error reason (required when outcome is 'failure') */
|
|
58
|
+
errorReason: MitigationErrorReason.optional(),
|
|
59
|
+
/** ISO 8601 timestamp */
|
|
60
|
+
timestamp: z.string().datetime(),
|
|
61
|
+
/** Unique identifier for the analysis run */
|
|
62
|
+
runId: z.string().min(1),
|
|
63
|
+
})
|
|
64
|
+
.refine((data) => data.outcome !== 'failure' || data.errorReason !== undefined, {
|
|
65
|
+
message: 'errorReason is required when outcome is failure',
|
|
66
|
+
path: ['errorReason'],
|
|
67
|
+
});
|
|
68
|
+
// =============================================================================
|
|
69
|
+
// Pattern Hashing (FR-022)
|
|
70
|
+
// =============================================================================
|
|
71
|
+
/**
|
|
72
|
+
* Hash a regex pattern using SHA-256 and truncate to 16 hex characters.
|
|
73
|
+
*
|
|
74
|
+
* This ensures raw patterns are NEVER included in logs while still
|
|
75
|
+
* allowing correlation of events related to the same pattern.
|
|
76
|
+
*
|
|
77
|
+
* @param pattern - The regex pattern to hash
|
|
78
|
+
* @returns 16-character hex string (truncated SHA-256)
|
|
79
|
+
*/
|
|
80
|
+
export function hashPattern(pattern) {
|
|
81
|
+
const hash = createHash('sha256').update(pattern).digest('hex');
|
|
82
|
+
return hash.slice(0, 16);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Generate a unique run ID
|
|
86
|
+
*/
|
|
87
|
+
function generateRunId() {
|
|
88
|
+
return `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
89
|
+
}
|
|
90
|
+
function createInitialState() {
|
|
91
|
+
return {
|
|
92
|
+
runId: generateRunId(),
|
|
93
|
+
events: [],
|
|
94
|
+
loggingFailures: [],
|
|
95
|
+
isDegraded: false,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create a new security logger instance.
|
|
100
|
+
*
|
|
101
|
+
* Use this factory when you need isolated logger state (e.g., for testing).
|
|
102
|
+
* For most production use cases, use the default exported functions.
|
|
103
|
+
*
|
|
104
|
+
* @returns A new SecurityLogger instance with its own isolated state
|
|
105
|
+
*/
|
|
106
|
+
export function createSecurityLogger() {
|
|
107
|
+
let state = createInitialState();
|
|
108
|
+
/**
|
|
109
|
+
* Handle logging failures gracefully (FR-023)
|
|
110
|
+
*/
|
|
111
|
+
function handleLoggingFailure(category, error) {
|
|
112
|
+
state.loggingFailures.push({ category, error });
|
|
113
|
+
state.isDegraded = true;
|
|
114
|
+
// Fallback to stderr
|
|
115
|
+
try {
|
|
116
|
+
process.stderr.write(`[security] LOGGING_DEGRADED category=${category} error=${error}\n`);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Silently ignore if stderr is unavailable
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
logSecurityEvent(input) {
|
|
124
|
+
try {
|
|
125
|
+
const event = {
|
|
126
|
+
category: input.category,
|
|
127
|
+
ruleId: input.ruleId,
|
|
128
|
+
file: input.file,
|
|
129
|
+
patternHash: hashPattern(input.pattern),
|
|
130
|
+
durationMs: input.durationMs,
|
|
131
|
+
outcome: input.outcome,
|
|
132
|
+
errorReason: input.errorReason,
|
|
133
|
+
timestamp: new Date().toISOString(),
|
|
134
|
+
runId: state.runId,
|
|
135
|
+
};
|
|
136
|
+
// Validate the event
|
|
137
|
+
const result = SecurityEventSchema.safeParse(event);
|
|
138
|
+
if (!result.success) {
|
|
139
|
+
handleLoggingFailure(input.category, `Validation failed: ${result.error.message}`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Store the event
|
|
143
|
+
state.events.push(event);
|
|
144
|
+
// Log to stderr for immediate visibility (structured JSON)
|
|
145
|
+
const logLine = JSON.stringify({
|
|
146
|
+
level: 'security',
|
|
147
|
+
...event,
|
|
148
|
+
});
|
|
149
|
+
process.stderr.write(`[security] ${logLine}\n`);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
// FR-023: Logging failures don't block execution
|
|
153
|
+
handleLoggingFailure(input.category, error instanceof Error ? error.message : 'Unknown error');
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
startRun() {
|
|
157
|
+
state = createInitialState();
|
|
158
|
+
return state.runId;
|
|
159
|
+
},
|
|
160
|
+
getCurrentRunId() {
|
|
161
|
+
return state.runId;
|
|
162
|
+
},
|
|
163
|
+
getRunSummary() {
|
|
164
|
+
const successCount = state.events.filter((e) => e.outcome === 'success').length;
|
|
165
|
+
const failureCount = state.events.filter((e) => e.outcome === 'failure').length;
|
|
166
|
+
const timeoutCount = state.events.filter((e) => e.outcome === 'timeout').length;
|
|
167
|
+
const totalDurationMs = state.events.reduce((sum, e) => sum + e.durationMs, 0);
|
|
168
|
+
const loggingFailuresByCategory = {};
|
|
169
|
+
for (const failure of state.loggingFailures) {
|
|
170
|
+
loggingFailuresByCategory[failure.category] =
|
|
171
|
+
(loggingFailuresByCategory[failure.category] ?? 0) + 1;
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
runId: state.runId,
|
|
175
|
+
totalEvents: state.events.length,
|
|
176
|
+
successCount,
|
|
177
|
+
failureCount,
|
|
178
|
+
timeoutCount,
|
|
179
|
+
totalDurationMs,
|
|
180
|
+
loggingFailuresTotal: state.loggingFailures.length,
|
|
181
|
+
loggingFailuresByCategory,
|
|
182
|
+
loggingDegraded: state.isDegraded,
|
|
183
|
+
};
|
|
184
|
+
},
|
|
185
|
+
getRunEvents() {
|
|
186
|
+
return [...state.events];
|
|
187
|
+
},
|
|
188
|
+
isLoggingDegraded() {
|
|
189
|
+
return state.isDegraded;
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// =============================================================================
|
|
194
|
+
// Default Instance (Backwards Compatibility)
|
|
195
|
+
// =============================================================================
|
|
196
|
+
/**
|
|
197
|
+
* Default logger instance for module-level exports.
|
|
198
|
+
* Use createSecurityLogger() for isolated instances in tests.
|
|
199
|
+
*/
|
|
200
|
+
const defaultLogger = createSecurityLogger();
|
|
201
|
+
/**
|
|
202
|
+
* Log a security event.
|
|
203
|
+
*
|
|
204
|
+
* This is the SOLE export for security logging. All security-relevant
|
|
205
|
+
* code paths MUST use this function.
|
|
206
|
+
*
|
|
207
|
+
* Guarantees (FR-023):
|
|
208
|
+
* - Logging failures don't block execution
|
|
209
|
+
* - Falls back to stderr on validation errors
|
|
210
|
+
* - Never throws exceptions
|
|
211
|
+
*
|
|
212
|
+
* @param input - Security event input (raw pattern will be hashed)
|
|
213
|
+
*/
|
|
214
|
+
export function logSecurityEvent(input) {
|
|
215
|
+
defaultLogger.logSecurityEvent(input);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Start a new logging run
|
|
219
|
+
*/
|
|
220
|
+
export function startRun() {
|
|
221
|
+
return defaultLogger.startRun();
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get the current run ID
|
|
225
|
+
*/
|
|
226
|
+
export function getCurrentRunId() {
|
|
227
|
+
return defaultLogger.getCurrentRunId();
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get summary statistics for the current run
|
|
231
|
+
*/
|
|
232
|
+
export function getRunSummary() {
|
|
233
|
+
return defaultLogger.getRunSummary();
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get all events for the current run (for testing/debugging)
|
|
237
|
+
*/
|
|
238
|
+
export function getRunEvents() {
|
|
239
|
+
return defaultLogger.getRunEvents();
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Check if logging is in degraded mode
|
|
243
|
+
*/
|
|
244
|
+
export function isLoggingDegraded() {
|
|
245
|
+
return defaultLogger.isLoggingDegraded();
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Reset the default logger state for testing.
|
|
249
|
+
* This ensures test isolation when using module-level exports.
|
|
250
|
+
*
|
|
251
|
+
* @internal - Only use in test files
|
|
252
|
+
*/
|
|
253
|
+
export function resetForTesting() {
|
|
254
|
+
defaultLogger.startRun();
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=security-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-logger.js","sourceRoot":"","sources":["../src/security-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console Telemetry Backend
|
|
3
|
+
*
|
|
4
|
+
* Feature: 007-pnpm-timeout-telemetry
|
|
5
|
+
* Implements: FR-011
|
|
6
|
+
*
|
|
7
|
+
* Writes structured log lines to stdout for immediate visibility.
|
|
8
|
+
*/
|
|
9
|
+
import type { TelemetryBackend, TelemetryVerbosity } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Console backend configuration options.
|
|
12
|
+
*/
|
|
13
|
+
export interface ConsoleBackendOptions {
|
|
14
|
+
/** Verbosity level controls which fields are logged */
|
|
15
|
+
verbosity: TelemetryVerbosity;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Creates a console telemetry backend.
|
|
19
|
+
*
|
|
20
|
+
* @param options - Configuration options
|
|
21
|
+
* @returns TelemetryBackend implementation
|
|
22
|
+
*/
|
|
23
|
+
export declare function createConsoleBackend(options: ConsoleBackendOptions): TelemetryBackend;
|
|
24
|
+
//# sourceMappingURL=console.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/telemetry/backends/console.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAgB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uDAAuD;IACvD,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAwBD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,gBAAgB,CAsBrF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console Telemetry Backend
|
|
3
|
+
*
|
|
4
|
+
* Feature: 007-pnpm-timeout-telemetry
|
|
5
|
+
* Implements: FR-011
|
|
6
|
+
*
|
|
7
|
+
* Writes structured log lines to stdout for immediate visibility.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Formats a timeout event for console output based on verbosity level.
|
|
11
|
+
*/
|
|
12
|
+
function formatEvent(event, verbosity) {
|
|
13
|
+
const prefix = `[TIMEOUT] [${event.severity.toUpperCase()}]`;
|
|
14
|
+
switch (verbosity) {
|
|
15
|
+
case 'minimal':
|
|
16
|
+
return `${prefix} ${event.operation_id} duration=${event.duration_ms}ms`;
|
|
17
|
+
case 'standard':
|
|
18
|
+
return `${prefix} ${event.operation_id} duration=${event.duration_ms}ms threshold=${event.threshold_ms}ms at=${event.timestamp}`;
|
|
19
|
+
case 'verbose': {
|
|
20
|
+
const contextStr = event.allowed_context
|
|
21
|
+
? ` context=${JSON.stringify(event.allowed_context)}`
|
|
22
|
+
: '';
|
|
23
|
+
return `${prefix} ${event.operation_id} duration=${event.duration_ms}ms threshold=${event.threshold_ms}ms at=${event.timestamp}${contextStr}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Creates a console telemetry backend.
|
|
29
|
+
*
|
|
30
|
+
* @param options - Configuration options
|
|
31
|
+
* @returns TelemetryBackend implementation
|
|
32
|
+
*/
|
|
33
|
+
export function createConsoleBackend(options) {
|
|
34
|
+
const { verbosity } = options;
|
|
35
|
+
return {
|
|
36
|
+
async emit(event) {
|
|
37
|
+
try {
|
|
38
|
+
const message = formatEvent(event, verbosity);
|
|
39
|
+
// Use stderr for telemetry to avoid mixing with stdout
|
|
40
|
+
console.error(message);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Best-effort: swallow errors to avoid affecting control flow (FR-014)
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
async flush() {
|
|
47
|
+
// Console writes are immediate, nothing to flush
|
|
48
|
+
},
|
|
49
|
+
async close() {
|
|
50
|
+
// No resources to release
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/telemetry/backends/console.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH;;GAEG;AACH,SAAS,WAAW,CAAC,KAAmB,EAAE,SAA6B;IACrE,MAAM,MAAM,GAAG,cAAc,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC;IAE7D,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,YAAY,aAAa,KAAK,CAAC,WAAW,IAAI,CAAC;QAE3E,KAAK,UAAU;YACb,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,YAAY,aAAa,KAAK,CAAC,WAAW,gBAAgB,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,SAAS,EAAE,CAAC;QAEnI,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe;gBACtC,CAAC,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE;gBACrD,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,YAAY,aAAa,KAAK,CAAC,WAAW,gBAAgB,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;QAChJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE9B,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,KAAmB;YAC5B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBAC9C,uDAAuD;gBACvD,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;YACzE,CAAC;QACH,CAAC;QAED,KAAK,CAAC,KAAK;YACT,iDAAiD;QACnD,CAAC;QAED,KAAK,CAAC,KAAK;YACT,0BAA0B;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONL File Telemetry Backend
|
|
3
|
+
*
|
|
4
|
+
* Feature: 007-pnpm-timeout-telemetry
|
|
5
|
+
* Implements: FR-011, FR-014a
|
|
6
|
+
*
|
|
7
|
+
* Appends JSON objects to a file in JSONL format (one JSON object per line).
|
|
8
|
+
* Uses append-mode writes for durability without explicit flush.
|
|
9
|
+
*/
|
|
10
|
+
import type { TelemetryBackend, TelemetryVerbosity } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* JSONL backend configuration options.
|
|
13
|
+
*/
|
|
14
|
+
export interface JsonlBackendOptions {
|
|
15
|
+
/** Path to the JSONL output file */
|
|
16
|
+
filePath: string;
|
|
17
|
+
/** Verbosity level controls which fields are written */
|
|
18
|
+
verbosity: TelemetryVerbosity;
|
|
19
|
+
/** Max events to buffer before auto-flush (default: 100) */
|
|
20
|
+
bufferSize?: number;
|
|
21
|
+
/** Periodic flush interval in ms (default: 5000) */
|
|
22
|
+
flushIntervalMs?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Creates a JSONL file telemetry backend.
|
|
26
|
+
*
|
|
27
|
+
* @param options - Configuration options
|
|
28
|
+
* @returns TelemetryBackend implementation
|
|
29
|
+
*/
|
|
30
|
+
export declare function createJsonlBackend(options: JsonlBackendOptions): TelemetryBackend;
|
|
31
|
+
//# sourceMappingURL=jsonl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../../src/telemetry/backends/jsonl.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAgB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA4BD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,gBAAgB,CAuFjF"}
|