@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,121 @@
|
|
|
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 { appendFile } from 'node:fs/promises';
|
|
11
|
+
/**
|
|
12
|
+
* Formats a timeout event for JSONL output based on verbosity level.
|
|
13
|
+
*/
|
|
14
|
+
function formatEvent(event, verbosity) {
|
|
15
|
+
switch (verbosity) {
|
|
16
|
+
case 'minimal':
|
|
17
|
+
return JSON.stringify({
|
|
18
|
+
operation_id: event.operation_id,
|
|
19
|
+
duration_ms: event.duration_ms,
|
|
20
|
+
severity: event.severity,
|
|
21
|
+
});
|
|
22
|
+
case 'standard':
|
|
23
|
+
return JSON.stringify({
|
|
24
|
+
operation_id: event.operation_id,
|
|
25
|
+
duration_ms: event.duration_ms,
|
|
26
|
+
threshold_ms: event.threshold_ms,
|
|
27
|
+
timestamp: event.timestamp,
|
|
28
|
+
severity: event.severity,
|
|
29
|
+
});
|
|
30
|
+
case 'verbose':
|
|
31
|
+
return JSON.stringify(event);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Creates a JSONL file telemetry backend.
|
|
36
|
+
*
|
|
37
|
+
* @param options - Configuration options
|
|
38
|
+
* @returns TelemetryBackend implementation
|
|
39
|
+
*/
|
|
40
|
+
export function createJsonlBackend(options) {
|
|
41
|
+
const { filePath, verbosity, bufferSize = 100, flushIntervalMs = 5000 } = options;
|
|
42
|
+
const buffer = [];
|
|
43
|
+
let flushTimer = null;
|
|
44
|
+
let hasLoggedError = false;
|
|
45
|
+
let closed = false;
|
|
46
|
+
/**
|
|
47
|
+
* Writes buffered events to file.
|
|
48
|
+
* @param force - If true, write even if closed (used during shutdown)
|
|
49
|
+
*/
|
|
50
|
+
async function writeBuffer(force = false) {
|
|
51
|
+
if (buffer.length === 0)
|
|
52
|
+
return;
|
|
53
|
+
if (closed && !force)
|
|
54
|
+
return;
|
|
55
|
+
const lines = buffer.splice(0).join('\n') + '\n';
|
|
56
|
+
try {
|
|
57
|
+
// Use append mode for durability
|
|
58
|
+
await appendFile(filePath, lines, { encoding: 'utf8' });
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// Log error once per run (FR-014)
|
|
62
|
+
if (!hasLoggedError) {
|
|
63
|
+
hasLoggedError = true;
|
|
64
|
+
console.error(`[TELEMETRY] JSONL write error: ${error}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Starts periodic flush timer.
|
|
70
|
+
*/
|
|
71
|
+
function startFlushTimer() {
|
|
72
|
+
if (flushTimer === null && flushIntervalMs > 0) {
|
|
73
|
+
flushTimer = setInterval(() => {
|
|
74
|
+
writeBuffer().catch(() => {
|
|
75
|
+
// Swallow errors in timer callback
|
|
76
|
+
});
|
|
77
|
+
}, flushIntervalMs);
|
|
78
|
+
// Unref timer so it doesn't keep the process alive
|
|
79
|
+
flushTimer.unref();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Stops periodic flush timer.
|
|
84
|
+
*/
|
|
85
|
+
function stopFlushTimer() {
|
|
86
|
+
if (flushTimer !== null) {
|
|
87
|
+
clearInterval(flushTimer);
|
|
88
|
+
flushTimer = null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
async emit(event) {
|
|
93
|
+
if (closed)
|
|
94
|
+
return;
|
|
95
|
+
try {
|
|
96
|
+
const line = formatEvent(event, verbosity);
|
|
97
|
+
buffer.push(line);
|
|
98
|
+
// Start timer on first event
|
|
99
|
+
startFlushTimer();
|
|
100
|
+
// Auto-flush if buffer is full
|
|
101
|
+
if (buffer.length >= bufferSize) {
|
|
102
|
+
await writeBuffer();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Best-effort: swallow errors to avoid affecting control flow (FR-014)
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
async flush() {
|
|
110
|
+
await writeBuffer();
|
|
111
|
+
},
|
|
112
|
+
async close() {
|
|
113
|
+
if (closed)
|
|
114
|
+
return;
|
|
115
|
+
closed = true;
|
|
116
|
+
stopFlushTimer();
|
|
117
|
+
await writeBuffer(true); // Force write remaining buffer
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=jsonl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../../src/telemetry/backends/jsonl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Emitter
|
|
3
|
+
*
|
|
4
|
+
* Feature: 007-pnpm-timeout-telemetry
|
|
5
|
+
* Implements: FR-014
|
|
6
|
+
*
|
|
7
|
+
* Low-overhead event emission with failure logging (once per run).
|
|
8
|
+
*/
|
|
9
|
+
import type { TelemetryBackend, TimeoutEvent } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Emitter that dispatches events to multiple backends.
|
|
12
|
+
* Implements best-effort semantics with failure logging.
|
|
13
|
+
*/
|
|
14
|
+
export declare class TelemetryEmitter {
|
|
15
|
+
private backends;
|
|
16
|
+
private hasLoggedEmitError;
|
|
17
|
+
/**
|
|
18
|
+
* Registers a backend for event dispatch.
|
|
19
|
+
*/
|
|
20
|
+
addBackend(backend: TelemetryBackend): void;
|
|
21
|
+
/**
|
|
22
|
+
* Removes all registered backends.
|
|
23
|
+
*/
|
|
24
|
+
clearBackends(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Emits an event to all registered backends.
|
|
27
|
+
* Best-effort: failures are logged once per run (FR-014).
|
|
28
|
+
*/
|
|
29
|
+
emit(event: TimeoutEvent): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Flushes all backends.
|
|
32
|
+
*/
|
|
33
|
+
flush(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Closes all backends and releases resources.
|
|
36
|
+
*/
|
|
37
|
+
close(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Returns the number of registered backends.
|
|
40
|
+
*/
|
|
41
|
+
get backendCount(): number;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/telemetry/emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,kBAAkB,CAAS;IAEnC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAI3C;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;CACF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Emitter
|
|
3
|
+
*
|
|
4
|
+
* Feature: 007-pnpm-timeout-telemetry
|
|
5
|
+
* Implements: FR-014
|
|
6
|
+
*
|
|
7
|
+
* Low-overhead event emission with failure logging (once per run).
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Emitter that dispatches events to multiple backends.
|
|
11
|
+
* Implements best-effort semantics with failure logging.
|
|
12
|
+
*/
|
|
13
|
+
export class TelemetryEmitter {
|
|
14
|
+
backends = [];
|
|
15
|
+
hasLoggedEmitError = false;
|
|
16
|
+
/**
|
|
17
|
+
* Registers a backend for event dispatch.
|
|
18
|
+
*/
|
|
19
|
+
addBackend(backend) {
|
|
20
|
+
this.backends.push(backend);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Removes all registered backends.
|
|
24
|
+
*/
|
|
25
|
+
clearBackends() {
|
|
26
|
+
this.backends = [];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Emits an event to all registered backends.
|
|
30
|
+
* Best-effort: failures are logged once per run (FR-014).
|
|
31
|
+
*/
|
|
32
|
+
async emit(event) {
|
|
33
|
+
if (this.backends.length === 0)
|
|
34
|
+
return;
|
|
35
|
+
// Fire-and-forget to all backends in parallel
|
|
36
|
+
await Promise.all(this.backends.map(async (backend) => {
|
|
37
|
+
try {
|
|
38
|
+
await backend.emit(event);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
// Log once per run
|
|
42
|
+
if (!this.hasLoggedEmitError) {
|
|
43
|
+
this.hasLoggedEmitError = true;
|
|
44
|
+
console.error(`[TELEMETRY] Emit error: ${error}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Flushes all backends.
|
|
51
|
+
*/
|
|
52
|
+
async flush() {
|
|
53
|
+
await Promise.all(this.backends.map(async (backend) => {
|
|
54
|
+
try {
|
|
55
|
+
await backend.flush();
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Swallow flush errors
|
|
59
|
+
}
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Closes all backends and releases resources.
|
|
64
|
+
*/
|
|
65
|
+
async close() {
|
|
66
|
+
await Promise.all(this.backends.map(async (backend) => {
|
|
67
|
+
try {
|
|
68
|
+
await backend.close();
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Swallow close errors
|
|
72
|
+
}
|
|
73
|
+
}));
|
|
74
|
+
this.clearBackends();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Returns the number of registered backends.
|
|
78
|
+
*/
|
|
79
|
+
get backendCount() {
|
|
80
|
+
return this.backends.length;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/telemetry/emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACnB,QAAQ,GAAuB,EAAE,CAAC;IAClC,kBAAkB,GAAG,KAAK,CAAC;IAEnC;;OAEG;IACH,UAAU,CAAC,OAAyB;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,KAAmB;QAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEvC,8CAA8C;QAC9C,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,mBAAmB;gBACnB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAC7B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAC/B,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Hook Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Feature: 007-pnpm-timeout-telemetry
|
|
5
|
+
* Implements: FR-008, FR-014
|
|
6
|
+
*
|
|
7
|
+
* Coordinates telemetry configuration and event dispatch.
|
|
8
|
+
*/
|
|
9
|
+
import type { TelemetryConfig, TimeoutEventInput } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* TelemetryHook manages the telemetry lifecycle and dispatches events.
|
|
12
|
+
*/
|
|
13
|
+
export declare class TelemetryHook {
|
|
14
|
+
private config;
|
|
15
|
+
private emitter;
|
|
16
|
+
private initialized;
|
|
17
|
+
/**
|
|
18
|
+
* Configures telemetry with the given settings.
|
|
19
|
+
* Creates backends based on the configuration.
|
|
20
|
+
*/
|
|
21
|
+
configure(config: Partial<TelemetryConfig>): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Initializes backends based on current configuration.
|
|
24
|
+
*/
|
|
25
|
+
private initializeBackends;
|
|
26
|
+
/**
|
|
27
|
+
* Emits a timeout event if telemetry is enabled.
|
|
28
|
+
* Best-effort: failures do not affect control flow.
|
|
29
|
+
*/
|
|
30
|
+
emit(input: TimeoutEventInput): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Flushes all pending events.
|
|
33
|
+
* Called at shutdown/run summary points.
|
|
34
|
+
*/
|
|
35
|
+
flush(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Closes all backends and releases resources.
|
|
38
|
+
*/
|
|
39
|
+
close(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Returns whether telemetry is enabled.
|
|
42
|
+
*/
|
|
43
|
+
isEnabled(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Returns the current configuration (for testing).
|
|
46
|
+
*/
|
|
47
|
+
getConfig(): TelemetryConfig;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Factory function for creating TelemetryHook (for testability).
|
|
51
|
+
*/
|
|
52
|
+
export declare function createTelemetryHook(): TelemetryHook;
|
|
53
|
+
//# sourceMappingURL=hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/telemetry/hook.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAoB,MAAM,YAAY,CAAC;AAMvF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAoD;IAClE,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,WAAW,CAAS;IAE5B;;;OAGG;IACG,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBhE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnD;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,SAAS,IAAI,eAAe;CAG7B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Hook Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Feature: 007-pnpm-timeout-telemetry
|
|
5
|
+
* Implements: FR-008, FR-014
|
|
6
|
+
*
|
|
7
|
+
* Coordinates telemetry configuration and event dispatch.
|
|
8
|
+
*/
|
|
9
|
+
import { DEFAULT_TELEMETRY_CONFIG, createTimeoutEvent, TelemetryConfigSchema } from './types.js';
|
|
10
|
+
import { TelemetryEmitter } from './emitter.js';
|
|
11
|
+
import { createConsoleBackend } from './backends/console.js';
|
|
12
|
+
import { createJsonlBackend } from './backends/jsonl.js';
|
|
13
|
+
/**
|
|
14
|
+
* TelemetryHook manages the telemetry lifecycle and dispatches events.
|
|
15
|
+
*/
|
|
16
|
+
export class TelemetryHook {
|
|
17
|
+
config = { ...DEFAULT_TELEMETRY_CONFIG };
|
|
18
|
+
emitter = new TelemetryEmitter();
|
|
19
|
+
initialized = false;
|
|
20
|
+
/**
|
|
21
|
+
* Configures telemetry with the given settings.
|
|
22
|
+
* Creates backends based on the configuration.
|
|
23
|
+
*/
|
|
24
|
+
async configure(config) {
|
|
25
|
+
// Merge with defaults and validate
|
|
26
|
+
const merged = TelemetryConfigSchema.parse({
|
|
27
|
+
...this.config,
|
|
28
|
+
...config,
|
|
29
|
+
});
|
|
30
|
+
// Close existing backends if reconfiguring
|
|
31
|
+
// Await close() to prevent race condition - close() already clears backends
|
|
32
|
+
if (this.initialized) {
|
|
33
|
+
await this.emitter.close();
|
|
34
|
+
}
|
|
35
|
+
this.config = merged;
|
|
36
|
+
// Create backends if enabled
|
|
37
|
+
if (this.config.enabled) {
|
|
38
|
+
this.initializeBackends();
|
|
39
|
+
}
|
|
40
|
+
this.initialized = true;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Initializes backends based on current configuration.
|
|
44
|
+
*/
|
|
45
|
+
initializeBackends() {
|
|
46
|
+
for (const backendType of this.config.backends) {
|
|
47
|
+
let backend;
|
|
48
|
+
switch (backendType) {
|
|
49
|
+
case 'console':
|
|
50
|
+
backend = createConsoleBackend({
|
|
51
|
+
verbosity: this.config.verbosity,
|
|
52
|
+
});
|
|
53
|
+
break;
|
|
54
|
+
case 'jsonl':
|
|
55
|
+
if (!this.config.jsonl_path) {
|
|
56
|
+
console.error('[TELEMETRY] JSONL backend requires jsonl_path');
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
backend = createJsonlBackend({
|
|
60
|
+
filePath: this.config.jsonl_path,
|
|
61
|
+
verbosity: this.config.verbosity,
|
|
62
|
+
bufferSize: this.config.buffer_size,
|
|
63
|
+
flushIntervalMs: this.config.flush_interval_ms,
|
|
64
|
+
});
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
this.emitter.addBackend(backend);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Emits a timeout event if telemetry is enabled.
|
|
72
|
+
* Best-effort: failures do not affect control flow.
|
|
73
|
+
*/
|
|
74
|
+
async emit(input) {
|
|
75
|
+
if (!this.config.enabled)
|
|
76
|
+
return;
|
|
77
|
+
try {
|
|
78
|
+
const event = createTimeoutEvent(input);
|
|
79
|
+
await this.emitter.emit(event);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Best-effort: swallow errors
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Flushes all pending events.
|
|
87
|
+
* Called at shutdown/run summary points.
|
|
88
|
+
*/
|
|
89
|
+
async flush() {
|
|
90
|
+
await this.emitter.flush();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Closes all backends and releases resources.
|
|
94
|
+
*/
|
|
95
|
+
async close() {
|
|
96
|
+
await this.emitter.close();
|
|
97
|
+
this.initialized = false;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Returns whether telemetry is enabled.
|
|
101
|
+
*/
|
|
102
|
+
isEnabled() {
|
|
103
|
+
return this.config.enabled;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Returns the current configuration (for testing).
|
|
107
|
+
*/
|
|
108
|
+
getConfig() {
|
|
109
|
+
return { ...this.config };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Factory function for creating TelemetryHook (for testability).
|
|
114
|
+
*/
|
|
115
|
+
export function createTelemetryHook() {
|
|
116
|
+
return new TelemetryHook();
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/telemetry/hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeout Telemetry Public API
|
|
3
|
+
*
|
|
4
|
+
* Feature: 007-pnpm-timeout-telemetry
|
|
5
|
+
* Implements: FR-010
|
|
6
|
+
*
|
|
7
|
+
* Public exports for the telemetry module.
|
|
8
|
+
*/
|
|
9
|
+
import { TelemetryHook, createTelemetryHook } from './hook.js';
|
|
10
|
+
import type { TelemetryConfig, TimeoutEventInput, TimeoutEvent, TelemetryBackend, TelemetryBackendType, TelemetryVerbosity, TimeoutSeverity, AllowedContext } from './types.js';
|
|
11
|
+
import { TelemetryConfigSchema } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Parses telemetry configuration from environment variables.
|
|
14
|
+
*
|
|
15
|
+
* Environment Variables:
|
|
16
|
+
* - TELEMETRY_ENABLED: 'true' or 'false' (default: 'false')
|
|
17
|
+
* - TELEMETRY_BACKENDS: Comma-separated list of backends (default: 'console')
|
|
18
|
+
* - TELEMETRY_JSONL_PATH: Path for JSONL output (required if jsonl backend used)
|
|
19
|
+
* - TELEMETRY_VERBOSITY: 'minimal', 'standard', or 'verbose' (default: 'standard')
|
|
20
|
+
* - TELEMETRY_BUFFER_SIZE: Max events to buffer (default: 100)
|
|
21
|
+
* - TELEMETRY_FLUSH_INTERVAL_MS: Flush interval in ms (default: 5000)
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseEnvConfig(): Partial<TelemetryConfig>;
|
|
24
|
+
/**
|
|
25
|
+
* Configures the global telemetry instance.
|
|
26
|
+
*
|
|
27
|
+
* @param config - Telemetry configuration
|
|
28
|
+
*/
|
|
29
|
+
export declare function configureTelemetry(config: Partial<TelemetryConfig>): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Configures telemetry from environment variables.
|
|
32
|
+
* Convenience function that parses env vars and applies config.
|
|
33
|
+
*/
|
|
34
|
+
export declare function configureFromEnv(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Emits a timeout event if telemetry is enabled.
|
|
37
|
+
* Best-effort: failures do not affect control flow.
|
|
38
|
+
*
|
|
39
|
+
* @param event - Timeout event data (timestamp auto-generated)
|
|
40
|
+
*/
|
|
41
|
+
export declare function emitTimeoutEvent(event: TimeoutEventInput): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Flushes all pending telemetry events.
|
|
44
|
+
* Should be called at shutdown/run summary points.
|
|
45
|
+
*/
|
|
46
|
+
export declare function flushTelemetry(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Closes the telemetry system and releases resources.
|
|
49
|
+
*/
|
|
50
|
+
export declare function closeTelemetry(): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Returns whether telemetry is enabled.
|
|
53
|
+
*/
|
|
54
|
+
export declare function isTelemetryEnabled(): boolean;
|
|
55
|
+
export type { TelemetryConfig, TimeoutEventInput, TimeoutEvent, TelemetryBackend, TelemetryBackendType, TelemetryVerbosity, TimeoutSeverity, AllowedContext, };
|
|
56
|
+
export { TelemetryConfigSchema, createTelemetryHook, TelemetryHook };
|
|
57
|
+
export { TimeoutEventSchema, TimeoutSeverity as TimeoutSeveritySchema } from './types.js';
|
|
58
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAA6C,MAAM,YAAY,CAAC;AAsB9F;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAwDzD;AAMD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAExF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKtD;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9E;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpD;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAKpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAMD,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,cAAc,GACf,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,aAAa,EAAE,CAAC;AAGrE,OAAO,EAAE,kBAAkB,EAAE,eAAe,IAAI,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeout Telemetry Public API
|
|
3
|
+
*
|
|
4
|
+
* Feature: 007-pnpm-timeout-telemetry
|
|
5
|
+
* Implements: FR-010
|
|
6
|
+
*
|
|
7
|
+
* Public exports for the telemetry module.
|
|
8
|
+
*/
|
|
9
|
+
import { TelemetryHook, createTelemetryHook } from './hook.js';
|
|
10
|
+
import { TelemetryConfigSchema, TelemetryBackendType as BackendTypeSchema } from './types.js';
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// Global Telemetry Instance
|
|
13
|
+
// =============================================================================
|
|
14
|
+
let globalHook = null;
|
|
15
|
+
/**
|
|
16
|
+
* Gets or creates the global telemetry hook instance.
|
|
17
|
+
*/
|
|
18
|
+
function getGlobalHook() {
|
|
19
|
+
if (globalHook === null) {
|
|
20
|
+
globalHook = createTelemetryHook();
|
|
21
|
+
}
|
|
22
|
+
return globalHook;
|
|
23
|
+
}
|
|
24
|
+
// =============================================================================
|
|
25
|
+
// Environment Variable Configuration
|
|
26
|
+
// =============================================================================
|
|
27
|
+
/**
|
|
28
|
+
* Parses telemetry configuration from environment variables.
|
|
29
|
+
*
|
|
30
|
+
* Environment Variables:
|
|
31
|
+
* - TELEMETRY_ENABLED: 'true' or 'false' (default: 'false')
|
|
32
|
+
* - TELEMETRY_BACKENDS: Comma-separated list of backends (default: 'console')
|
|
33
|
+
* - TELEMETRY_JSONL_PATH: Path for JSONL output (required if jsonl backend used)
|
|
34
|
+
* - TELEMETRY_VERBOSITY: 'minimal', 'standard', or 'verbose' (default: 'standard')
|
|
35
|
+
* - TELEMETRY_BUFFER_SIZE: Max events to buffer (default: 100)
|
|
36
|
+
* - TELEMETRY_FLUSH_INTERVAL_MS: Flush interval in ms (default: 5000)
|
|
37
|
+
*/
|
|
38
|
+
export function parseEnvConfig() {
|
|
39
|
+
const config = {};
|
|
40
|
+
// TELEMETRY_ENABLED
|
|
41
|
+
const enabledStr = process.env['TELEMETRY_ENABLED'];
|
|
42
|
+
if (enabledStr !== undefined) {
|
|
43
|
+
config.enabled = enabledStr.toLowerCase() === 'true';
|
|
44
|
+
}
|
|
45
|
+
// TELEMETRY_BACKENDS
|
|
46
|
+
const backendsStr = process.env['TELEMETRY_BACKENDS'];
|
|
47
|
+
if (backendsStr) {
|
|
48
|
+
const backends = backendsStr.split(',').map((b) => b.trim());
|
|
49
|
+
const validBackends = [];
|
|
50
|
+
for (const b of backends) {
|
|
51
|
+
const result = BackendTypeSchema.safeParse(b);
|
|
52
|
+
if (result.success) {
|
|
53
|
+
validBackends.push(result.data);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (validBackends.length > 0) {
|
|
57
|
+
config.backends = validBackends;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// TELEMETRY_JSONL_PATH
|
|
61
|
+
const jsonlPath = process.env['TELEMETRY_JSONL_PATH'];
|
|
62
|
+
if (jsonlPath) {
|
|
63
|
+
config.jsonl_path = jsonlPath;
|
|
64
|
+
}
|
|
65
|
+
// TELEMETRY_VERBOSITY
|
|
66
|
+
const verbosity = process.env['TELEMETRY_VERBOSITY'];
|
|
67
|
+
if (verbosity === 'minimal' || verbosity === 'standard' || verbosity === 'verbose') {
|
|
68
|
+
config.verbosity = verbosity;
|
|
69
|
+
}
|
|
70
|
+
// TELEMETRY_BUFFER_SIZE
|
|
71
|
+
const bufferSizeStr = process.env['TELEMETRY_BUFFER_SIZE'];
|
|
72
|
+
if (bufferSizeStr) {
|
|
73
|
+
const bufferSize = parseInt(bufferSizeStr, 10);
|
|
74
|
+
if (!isNaN(bufferSize) && bufferSize > 0) {
|
|
75
|
+
config.buffer_size = bufferSize;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// TELEMETRY_FLUSH_INTERVAL_MS
|
|
79
|
+
const flushIntervalStr = process.env['TELEMETRY_FLUSH_INTERVAL_MS'];
|
|
80
|
+
if (flushIntervalStr) {
|
|
81
|
+
const flushInterval = parseInt(flushIntervalStr, 10);
|
|
82
|
+
if (!isNaN(flushInterval) && flushInterval >= 100) {
|
|
83
|
+
config.flush_interval_ms = flushInterval;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return config;
|
|
87
|
+
}
|
|
88
|
+
// =============================================================================
|
|
89
|
+
// Public API Functions
|
|
90
|
+
// =============================================================================
|
|
91
|
+
/**
|
|
92
|
+
* Configures the global telemetry instance.
|
|
93
|
+
*
|
|
94
|
+
* @param config - Telemetry configuration
|
|
95
|
+
*/
|
|
96
|
+
export async function configureTelemetry(config) {
|
|
97
|
+
await getGlobalHook().configure(config);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Configures telemetry from environment variables.
|
|
101
|
+
* Convenience function that parses env vars and applies config.
|
|
102
|
+
*/
|
|
103
|
+
export async function configureFromEnv() {
|
|
104
|
+
const config = parseEnvConfig();
|
|
105
|
+
if (Object.keys(config).length > 0) {
|
|
106
|
+
await configureTelemetry(config);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Emits a timeout event if telemetry is enabled.
|
|
111
|
+
* Best-effort: failures do not affect control flow.
|
|
112
|
+
*
|
|
113
|
+
* @param event - Timeout event data (timestamp auto-generated)
|
|
114
|
+
*/
|
|
115
|
+
export async function emitTimeoutEvent(event) {
|
|
116
|
+
await getGlobalHook().emit(event);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Flushes all pending telemetry events.
|
|
120
|
+
* Should be called at shutdown/run summary points.
|
|
121
|
+
*/
|
|
122
|
+
export async function flushTelemetry() {
|
|
123
|
+
await getGlobalHook().flush();
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Closes the telemetry system and releases resources.
|
|
127
|
+
*/
|
|
128
|
+
export async function closeTelemetry() {
|
|
129
|
+
if (globalHook !== null) {
|
|
130
|
+
await globalHook.close();
|
|
131
|
+
globalHook = null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Returns whether telemetry is enabled.
|
|
136
|
+
*/
|
|
137
|
+
export function isTelemetryEnabled() {
|
|
138
|
+
return getGlobalHook().isEnabled();
|
|
139
|
+
}
|
|
140
|
+
export { TelemetryConfigSchema, createTelemetryHook, TelemetryHook };
|
|
141
|
+
// Re-export types schema for validation
|
|
142
|
+
export { TimeoutEventSchema, TimeoutSeverity as TimeoutSeveritySchema } from './types.js';
|
|
143
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"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"}
|