@dotsetlabs/bellwether 0.10.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/CHANGELOG.md +291 -0
- package/LICENSE +21 -0
- package/README.md +739 -0
- package/dist/auth/credentials.d.ts +64 -0
- package/dist/auth/credentials.js +218 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.js +6 -0
- package/dist/auth/keychain.d.ts +64 -0
- package/dist/auth/keychain.js +268 -0
- package/dist/baseline/ab-testing.d.ts +80 -0
- package/dist/baseline/ab-testing.js +236 -0
- package/dist/baseline/ai-compatibility-scorer.d.ts +95 -0
- package/dist/baseline/ai-compatibility-scorer.js +606 -0
- package/dist/baseline/calibration.d.ts +77 -0
- package/dist/baseline/calibration.js +136 -0
- package/dist/baseline/category-matching.d.ts +85 -0
- package/dist/baseline/category-matching.js +289 -0
- package/dist/baseline/change-impact-analyzer.d.ts +98 -0
- package/dist/baseline/change-impact-analyzer.js +592 -0
- package/dist/baseline/comparator.d.ts +64 -0
- package/dist/baseline/comparator.js +916 -0
- package/dist/baseline/confidence.d.ts +55 -0
- package/dist/baseline/confidence.js +122 -0
- package/dist/baseline/converter.d.ts +61 -0
- package/dist/baseline/converter.js +585 -0
- package/dist/baseline/dependency-analyzer.d.ts +89 -0
- package/dist/baseline/dependency-analyzer.js +567 -0
- package/dist/baseline/deprecation-tracker.d.ts +133 -0
- package/dist/baseline/deprecation-tracker.js +322 -0
- package/dist/baseline/diff.d.ts +55 -0
- package/dist/baseline/diff.js +1584 -0
- package/dist/baseline/documentation-scorer.d.ts +205 -0
- package/dist/baseline/documentation-scorer.js +466 -0
- package/dist/baseline/embeddings.d.ts +118 -0
- package/dist/baseline/embeddings.js +251 -0
- package/dist/baseline/error-analyzer.d.ts +198 -0
- package/dist/baseline/error-analyzer.js +721 -0
- package/dist/baseline/evaluation/evaluator.d.ts +42 -0
- package/dist/baseline/evaluation/evaluator.js +323 -0
- package/dist/baseline/evaluation/expanded-dataset.d.ts +45 -0
- package/dist/baseline/evaluation/expanded-dataset.js +1164 -0
- package/dist/baseline/evaluation/golden-dataset.d.ts +58 -0
- package/dist/baseline/evaluation/golden-dataset.js +717 -0
- package/dist/baseline/evaluation/index.d.ts +15 -0
- package/dist/baseline/evaluation/index.js +15 -0
- package/dist/baseline/evaluation/types.d.ts +186 -0
- package/dist/baseline/evaluation/types.js +8 -0
- package/dist/baseline/external-dependency-detector.d.ts +181 -0
- package/dist/baseline/external-dependency-detector.js +524 -0
- package/dist/baseline/golden-output.d.ts +162 -0
- package/dist/baseline/golden-output.js +636 -0
- package/dist/baseline/health-scorer.d.ts +174 -0
- package/dist/baseline/health-scorer.js +451 -0
- package/dist/baseline/incremental-checker.d.ts +97 -0
- package/dist/baseline/incremental-checker.js +174 -0
- package/dist/baseline/index.d.ts +31 -0
- package/dist/baseline/index.js +42 -0
- package/dist/baseline/migration-generator.d.ts +137 -0
- package/dist/baseline/migration-generator.js +554 -0
- package/dist/baseline/migrations.d.ts +60 -0
- package/dist/baseline/migrations.js +197 -0
- package/dist/baseline/performance-tracker.d.ts +214 -0
- package/dist/baseline/performance-tracker.js +577 -0
- package/dist/baseline/pr-comment-generator.d.ts +117 -0
- package/dist/baseline/pr-comment-generator.js +546 -0
- package/dist/baseline/response-fingerprint.d.ts +127 -0
- package/dist/baseline/response-fingerprint.js +728 -0
- package/dist/baseline/response-schema-tracker.d.ts +129 -0
- package/dist/baseline/response-schema-tracker.js +420 -0
- package/dist/baseline/risk-scorer.d.ts +54 -0
- package/dist/baseline/risk-scorer.js +434 -0
- package/dist/baseline/saver.d.ts +89 -0
- package/dist/baseline/saver.js +554 -0
- package/dist/baseline/scenario-generator.d.ts +151 -0
- package/dist/baseline/scenario-generator.js +905 -0
- package/dist/baseline/schema-compare.d.ts +86 -0
- package/dist/baseline/schema-compare.js +557 -0
- package/dist/baseline/schema-evolution.d.ts +189 -0
- package/dist/baseline/schema-evolution.js +467 -0
- package/dist/baseline/semantic.d.ts +203 -0
- package/dist/baseline/semantic.js +908 -0
- package/dist/baseline/synonyms.d.ts +60 -0
- package/dist/baseline/synonyms.js +386 -0
- package/dist/baseline/telemetry.d.ts +165 -0
- package/dist/baseline/telemetry.js +294 -0
- package/dist/baseline/test-pruner.d.ts +120 -0
- package/dist/baseline/test-pruner.js +387 -0
- package/dist/baseline/types.d.ts +449 -0
- package/dist/baseline/types.js +5 -0
- package/dist/baseline/version.d.ts +138 -0
- package/dist/baseline/version.js +206 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.js +5 -0
- package/dist/cache/response-cache.d.ts +151 -0
- package/dist/cache/response-cache.js +287 -0
- package/dist/ci/index.d.ts +60 -0
- package/dist/ci/index.js +342 -0
- package/dist/cli/commands/auth.d.ts +12 -0
- package/dist/cli/commands/auth.js +352 -0
- package/dist/cli/commands/badge.d.ts +3 -0
- package/dist/cli/commands/badge.js +74 -0
- package/dist/cli/commands/baseline-accept.d.ts +15 -0
- package/dist/cli/commands/baseline-accept.js +178 -0
- package/dist/cli/commands/baseline-migrate.d.ts +12 -0
- package/dist/cli/commands/baseline-migrate.js +164 -0
- package/dist/cli/commands/baseline.d.ts +14 -0
- package/dist/cli/commands/baseline.js +449 -0
- package/dist/cli/commands/beta.d.ts +10 -0
- package/dist/cli/commands/beta.js +231 -0
- package/dist/cli/commands/check.d.ts +11 -0
- package/dist/cli/commands/check.js +820 -0
- package/dist/cli/commands/cloud/badge.d.ts +3 -0
- package/dist/cli/commands/cloud/badge.js +74 -0
- package/dist/cli/commands/cloud/diff.d.ts +6 -0
- package/dist/cli/commands/cloud/diff.js +79 -0
- package/dist/cli/commands/cloud/history.d.ts +6 -0
- package/dist/cli/commands/cloud/history.js +102 -0
- package/dist/cli/commands/cloud/link.d.ts +9 -0
- package/dist/cli/commands/cloud/link.js +119 -0
- package/dist/cli/commands/cloud/login.d.ts +7 -0
- package/dist/cli/commands/cloud/login.js +499 -0
- package/dist/cli/commands/cloud/projects.d.ts +6 -0
- package/dist/cli/commands/cloud/projects.js +44 -0
- package/dist/cli/commands/cloud/shared.d.ts +7 -0
- package/dist/cli/commands/cloud/shared.js +42 -0
- package/dist/cli/commands/cloud/teams.d.ts +8 -0
- package/dist/cli/commands/cloud/teams.js +169 -0
- package/dist/cli/commands/cloud/upload.d.ts +8 -0
- package/dist/cli/commands/cloud/upload.js +181 -0
- package/dist/cli/commands/contract.d.ts +11 -0
- package/dist/cli/commands/contract.js +280 -0
- package/dist/cli/commands/discover.d.ts +3 -0
- package/dist/cli/commands/discover.js +82 -0
- package/dist/cli/commands/eval.d.ts +9 -0
- package/dist/cli/commands/eval.js +187 -0
- package/dist/cli/commands/explore.d.ts +11 -0
- package/dist/cli/commands/explore.js +437 -0
- package/dist/cli/commands/feedback.d.ts +9 -0
- package/dist/cli/commands/feedback.js +174 -0
- package/dist/cli/commands/golden.d.ts +12 -0
- package/dist/cli/commands/golden.js +407 -0
- package/dist/cli/commands/history.d.ts +10 -0
- package/dist/cli/commands/history.js +202 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.js +219 -0
- package/dist/cli/commands/interview.d.ts +3 -0
- package/dist/cli/commands/interview.js +903 -0
- package/dist/cli/commands/link.d.ts +10 -0
- package/dist/cli/commands/link.js +169 -0
- package/dist/cli/commands/login.d.ts +7 -0
- package/dist/cli/commands/login.js +499 -0
- package/dist/cli/commands/preset.d.ts +33 -0
- package/dist/cli/commands/preset.js +297 -0
- package/dist/cli/commands/profile.d.ts +33 -0
- package/dist/cli/commands/profile.js +286 -0
- package/dist/cli/commands/registry.d.ts +11 -0
- package/dist/cli/commands/registry.js +146 -0
- package/dist/cli/commands/shared.d.ts +79 -0
- package/dist/cli/commands/shared.js +196 -0
- package/dist/cli/commands/teams.d.ts +8 -0
- package/dist/cli/commands/teams.js +169 -0
- package/dist/cli/commands/test.d.ts +9 -0
- package/dist/cli/commands/test.js +500 -0
- package/dist/cli/commands/upload.d.ts +8 -0
- package/dist/cli/commands/upload.js +223 -0
- package/dist/cli/commands/validate-config.d.ts +6 -0
- package/dist/cli/commands/validate-config.js +35 -0
- package/dist/cli/commands/verify.d.ts +11 -0
- package/dist/cli/commands/verify.js +283 -0
- package/dist/cli/commands/watch.d.ts +12 -0
- package/dist/cli/commands/watch.js +253 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.js +178 -0
- package/dist/cli/interactive.d.ts +47 -0
- package/dist/cli/interactive.js +216 -0
- package/dist/cli/output/terminal-reporter.d.ts +19 -0
- package/dist/cli/output/terminal-reporter.js +104 -0
- package/dist/cli/output.d.ts +226 -0
- package/dist/cli/output.js +438 -0
- package/dist/cli/utils/env.d.ts +5 -0
- package/dist/cli/utils/env.js +14 -0
- package/dist/cli/utils/progress.d.ts +59 -0
- package/dist/cli/utils/progress.js +206 -0
- package/dist/cli/utils/server-context.d.ts +10 -0
- package/dist/cli/utils/server-context.js +36 -0
- package/dist/cloud/auth.d.ts +144 -0
- package/dist/cloud/auth.js +374 -0
- package/dist/cloud/client.d.ts +24 -0
- package/dist/cloud/client.js +65 -0
- package/dist/cloud/http-client.d.ts +38 -0
- package/dist/cloud/http-client.js +215 -0
- package/dist/cloud/index.d.ts +23 -0
- package/dist/cloud/index.js +25 -0
- package/dist/cloud/mock-client.d.ts +107 -0
- package/dist/cloud/mock-client.js +545 -0
- package/dist/cloud/types.d.ts +515 -0
- package/dist/cloud/types.js +15 -0
- package/dist/config/defaults.d.ts +160 -0
- package/dist/config/defaults.js +169 -0
- package/dist/config/loader.d.ts +24 -0
- package/dist/config/loader.js +122 -0
- package/dist/config/template.d.ts +42 -0
- package/dist/config/template.js +647 -0
- package/dist/config/validator.d.ts +2112 -0
- package/dist/config/validator.js +658 -0
- package/dist/constants/cloud.d.ts +107 -0
- package/dist/constants/cloud.js +110 -0
- package/dist/constants/core.d.ts +521 -0
- package/dist/constants/core.js +556 -0
- package/dist/constants/testing.d.ts +1283 -0
- package/dist/constants/testing.js +1568 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.js +10 -0
- package/dist/contract/index.d.ts +6 -0
- package/dist/contract/index.js +5 -0
- package/dist/contract/validator.d.ts +177 -0
- package/dist/contract/validator.js +574 -0
- package/dist/cost/index.d.ts +6 -0
- package/dist/cost/index.js +5 -0
- package/dist/cost/tracker.d.ts +134 -0
- package/dist/cost/tracker.js +313 -0
- package/dist/discovery/discovery.d.ts +16 -0
- package/dist/discovery/discovery.js +173 -0
- package/dist/discovery/types.d.ts +51 -0
- package/dist/discovery/types.js +2 -0
- package/dist/docs/agents.d.ts +3 -0
- package/dist/docs/agents.js +995 -0
- package/dist/docs/contract.d.ts +51 -0
- package/dist/docs/contract.js +1681 -0
- package/dist/docs/generator.d.ts +4 -0
- package/dist/docs/generator.js +4 -0
- package/dist/docs/html-reporter.d.ts +9 -0
- package/dist/docs/html-reporter.js +757 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +11 -0
- package/dist/docs/junit-reporter.d.ts +18 -0
- package/dist/docs/junit-reporter.js +210 -0
- package/dist/docs/report.d.ts +14 -0
- package/dist/docs/report.js +44 -0
- package/dist/docs/sarif-reporter.d.ts +19 -0
- package/dist/docs/sarif-reporter.js +335 -0
- package/dist/docs/shared.d.ts +35 -0
- package/dist/docs/shared.js +162 -0
- package/dist/docs/templates.d.ts +12 -0
- package/dist/docs/templates.js +76 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.js +6 -0
- package/dist/errors/retry.d.ts +92 -0
- package/dist/errors/retry.js +323 -0
- package/dist/errors/types.d.ts +321 -0
- package/dist/errors/types.js +584 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +32 -0
- package/dist/interview/dependency-resolver.d.ts +11 -0
- package/dist/interview/dependency-resolver.js +32 -0
- package/dist/interview/interviewer.d.ts +232 -0
- package/dist/interview/interviewer.js +1939 -0
- package/dist/interview/mock-response-generator.d.ts +7 -0
- package/dist/interview/mock-response-generator.js +102 -0
- package/dist/interview/orchestrator.d.ts +237 -0
- package/dist/interview/orchestrator.js +1296 -0
- package/dist/interview/rate-limiter.d.ts +15 -0
- package/dist/interview/rate-limiter.js +55 -0
- package/dist/interview/response-validator.d.ts +10 -0
- package/dist/interview/response-validator.js +132 -0
- package/dist/interview/schema-inferrer.d.ts +8 -0
- package/dist/interview/schema-inferrer.js +71 -0
- package/dist/interview/schema-test-generator.d.ts +71 -0
- package/dist/interview/schema-test-generator.js +834 -0
- package/dist/interview/smart-value-generator.d.ts +155 -0
- package/dist/interview/smart-value-generator.js +554 -0
- package/dist/interview/stateful-test-runner.d.ts +19 -0
- package/dist/interview/stateful-test-runner.js +106 -0
- package/dist/interview/types.d.ts +561 -0
- package/dist/interview/types.js +2 -0
- package/dist/llm/anthropic.d.ts +41 -0
- package/dist/llm/anthropic.js +355 -0
- package/dist/llm/client.d.ts +123 -0
- package/dist/llm/client.js +42 -0
- package/dist/llm/factory.d.ts +38 -0
- package/dist/llm/factory.js +145 -0
- package/dist/llm/fallback.d.ts +140 -0
- package/dist/llm/fallback.js +379 -0
- package/dist/llm/index.d.ts +18 -0
- package/dist/llm/index.js +15 -0
- package/dist/llm/ollama.d.ts +37 -0
- package/dist/llm/ollama.js +330 -0
- package/dist/llm/openai.d.ts +25 -0
- package/dist/llm/openai.js +320 -0
- package/dist/llm/token-budget.d.ts +161 -0
- package/dist/llm/token-budget.js +395 -0
- package/dist/logging/logger.d.ts +70 -0
- package/dist/logging/logger.js +130 -0
- package/dist/metrics/collector.d.ts +106 -0
- package/dist/metrics/collector.js +547 -0
- package/dist/metrics/index.d.ts +7 -0
- package/dist/metrics/index.js +7 -0
- package/dist/metrics/prometheus.d.ts +20 -0
- package/dist/metrics/prometheus.js +241 -0
- package/dist/metrics/types.d.ts +209 -0
- package/dist/metrics/types.js +5 -0
- package/dist/persona/builtins.d.ts +54 -0
- package/dist/persona/builtins.js +219 -0
- package/dist/persona/index.d.ts +8 -0
- package/dist/persona/index.js +8 -0
- package/dist/persona/loader.d.ts +30 -0
- package/dist/persona/loader.js +190 -0
- package/dist/persona/types.d.ts +144 -0
- package/dist/persona/types.js +5 -0
- package/dist/persona/validation.d.ts +94 -0
- package/dist/persona/validation.js +332 -0
- package/dist/prompts/index.d.ts +5 -0
- package/dist/prompts/index.js +5 -0
- package/dist/prompts/templates.d.ts +180 -0
- package/dist/prompts/templates.js +431 -0
- package/dist/registry/client.d.ts +49 -0
- package/dist/registry/client.js +191 -0
- package/dist/registry/index.d.ts +7 -0
- package/dist/registry/index.js +6 -0
- package/dist/registry/types.d.ts +140 -0
- package/dist/registry/types.js +6 -0
- package/dist/scenarios/evaluator.d.ts +43 -0
- package/dist/scenarios/evaluator.js +206 -0
- package/dist/scenarios/index.d.ts +10 -0
- package/dist/scenarios/index.js +9 -0
- package/dist/scenarios/loader.d.ts +20 -0
- package/dist/scenarios/loader.js +285 -0
- package/dist/scenarios/types.d.ts +153 -0
- package/dist/scenarios/types.js +8 -0
- package/dist/security/index.d.ts +17 -0
- package/dist/security/index.js +18 -0
- package/dist/security/payloads.d.ts +61 -0
- package/dist/security/payloads.js +268 -0
- package/dist/security/security-tester.d.ts +42 -0
- package/dist/security/security-tester.js +582 -0
- package/dist/security/types.d.ts +166 -0
- package/dist/security/types.js +8 -0
- package/dist/transport/base-transport.d.ts +59 -0
- package/dist/transport/base-transport.js +38 -0
- package/dist/transport/http-transport.d.ts +67 -0
- package/dist/transport/http-transport.js +238 -0
- package/dist/transport/mcp-client.d.ts +141 -0
- package/dist/transport/mcp-client.js +496 -0
- package/dist/transport/sse-transport.d.ts +88 -0
- package/dist/transport/sse-transport.js +316 -0
- package/dist/transport/stdio-transport.d.ts +43 -0
- package/dist/transport/stdio-transport.js +238 -0
- package/dist/transport/types.d.ts +125 -0
- package/dist/transport/types.js +16 -0
- package/dist/utils/concurrency.d.ts +123 -0
- package/dist/utils/concurrency.js +213 -0
- package/dist/utils/formatters.d.ts +16 -0
- package/dist/utils/formatters.js +37 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/jsonpath.d.ts +87 -0
- package/dist/utils/jsonpath.js +326 -0
- package/dist/utils/markdown.d.ts +113 -0
- package/dist/utils/markdown.js +265 -0
- package/dist/utils/network.d.ts +14 -0
- package/dist/utils/network.js +17 -0
- package/dist/utils/sanitize.d.ts +92 -0
- package/dist/utils/sanitize.js +191 -0
- package/dist/utils/semantic.d.ts +194 -0
- package/dist/utils/semantic.js +1051 -0
- package/dist/utils/smart-truncate.d.ts +94 -0
- package/dist/utils/smart-truncate.js +361 -0
- package/dist/utils/timeout.d.ts +153 -0
- package/dist/utils/timeout.js +205 -0
- package/dist/utils/yaml-parser.d.ts +58 -0
- package/dist/utils/yaml-parser.js +86 -0
- package/dist/validation/index.d.ts +32 -0
- package/dist/validation/index.js +32 -0
- package/dist/validation/semantic-test-generator.d.ts +50 -0
- package/dist/validation/semantic-test-generator.js +176 -0
- package/dist/validation/semantic-types.d.ts +66 -0
- package/dist/validation/semantic-types.js +94 -0
- package/dist/validation/semantic-validator.d.ts +38 -0
- package/dist/validation/semantic-validator.js +340 -0
- package/dist/verification/index.d.ts +6 -0
- package/dist/verification/index.js +5 -0
- package/dist/verification/types.d.ts +133 -0
- package/dist/verification/types.js +5 -0
- package/dist/verification/verifier.d.ts +30 -0
- package/dist/verification/verifier.js +309 -0
- package/dist/version.d.ts +19 -0
- package/dist/version.js +48 -0
- package/dist/workflow/auto-generator.d.ts +27 -0
- package/dist/workflow/auto-generator.js +513 -0
- package/dist/workflow/discovery.d.ts +40 -0
- package/dist/workflow/discovery.js +195 -0
- package/dist/workflow/executor.d.ts +82 -0
- package/dist/workflow/executor.js +611 -0
- package/dist/workflow/index.d.ts +10 -0
- package/dist/workflow/index.js +10 -0
- package/dist/workflow/loader.d.ts +24 -0
- package/dist/workflow/loader.js +194 -0
- package/dist/workflow/state-tracker.d.ts +98 -0
- package/dist/workflow/state-tracker.js +424 -0
- package/dist/workflow/types.d.ts +337 -0
- package/dist/workflow/types.js +5 -0
- package/package.json +94 -0
- package/schemas/bellwether-check.schema.json +651 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prometheus metrics exporter.
|
|
3
|
+
*
|
|
4
|
+
* Exports metrics in Prometheus text format for scraping.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Default histogram buckets for latency metrics (in ms).
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_LATENCY_BUCKETS = [10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000];
|
|
10
|
+
/**
|
|
11
|
+
* Metric definitions for Prometheus export.
|
|
12
|
+
*/
|
|
13
|
+
const METRIC_DEFINITIONS = [
|
|
14
|
+
// Token usage metrics
|
|
15
|
+
{
|
|
16
|
+
name: 'bellwether_llm_tokens_total',
|
|
17
|
+
type: 'counter',
|
|
18
|
+
help: 'Total number of tokens used',
|
|
19
|
+
labels: ['provider', 'model', 'direction'],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'bellwether_llm_calls_total',
|
|
23
|
+
type: 'counter',
|
|
24
|
+
help: 'Total number of LLM API calls',
|
|
25
|
+
labels: ['provider', 'model'],
|
|
26
|
+
},
|
|
27
|
+
// Cost metrics
|
|
28
|
+
{
|
|
29
|
+
name: 'bellwether_cost_usd_total',
|
|
30
|
+
type: 'counter',
|
|
31
|
+
help: 'Total cost in USD',
|
|
32
|
+
labels: ['provider'],
|
|
33
|
+
},
|
|
34
|
+
// Operation timing metrics
|
|
35
|
+
{
|
|
36
|
+
name: 'bellwether_operation_duration_seconds',
|
|
37
|
+
type: 'histogram',
|
|
38
|
+
help: 'Duration of operations in seconds',
|
|
39
|
+
labels: ['operation', 'status'],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'bellwether_operation_total',
|
|
43
|
+
type: 'counter',
|
|
44
|
+
help: 'Total number of operations',
|
|
45
|
+
labels: ['operation', 'status'],
|
|
46
|
+
},
|
|
47
|
+
// Error metrics
|
|
48
|
+
{
|
|
49
|
+
name: 'bellwether_errors_total',
|
|
50
|
+
type: 'counter',
|
|
51
|
+
help: 'Total number of errors',
|
|
52
|
+
labels: ['category', 'retryable'],
|
|
53
|
+
},
|
|
54
|
+
// Interview metrics
|
|
55
|
+
{
|
|
56
|
+
name: 'bellwether_interview_tools_discovered',
|
|
57
|
+
type: 'gauge',
|
|
58
|
+
help: 'Number of tools discovered in current interview',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'bellwether_interview_questions_generated',
|
|
62
|
+
type: 'gauge',
|
|
63
|
+
help: 'Number of questions generated in current interview',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'bellwether_interview_tool_calls_total',
|
|
67
|
+
type: 'counter',
|
|
68
|
+
help: 'Total tool calls in current interview',
|
|
69
|
+
labels: ['status'],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'bellwether_interview_duration_seconds',
|
|
73
|
+
type: 'gauge',
|
|
74
|
+
help: 'Duration of current/last interview in seconds',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'bellwether_interview_progress_ratio',
|
|
78
|
+
type: 'gauge',
|
|
79
|
+
help: 'Progress of current interview (0-1)',
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
/**
|
|
83
|
+
* Export metrics in Prometheus text format.
|
|
84
|
+
*/
|
|
85
|
+
export function exportPrometheusMetrics(collector) {
|
|
86
|
+
const lines = [];
|
|
87
|
+
const aggregated = collector.getAggregatedMetrics();
|
|
88
|
+
const interview = collector.getInterviewMetrics();
|
|
89
|
+
// Helper to add metric header
|
|
90
|
+
const addHeader = (metric) => {
|
|
91
|
+
lines.push(`# HELP ${metric.name} ${metric.help}`);
|
|
92
|
+
lines.push(`# TYPE ${metric.name} ${metric.type}`);
|
|
93
|
+
};
|
|
94
|
+
// Helper to format labels
|
|
95
|
+
const formatLabels = (labels) => {
|
|
96
|
+
if (!labels || Object.keys(labels).length === 0)
|
|
97
|
+
return '';
|
|
98
|
+
const pairs = Object.entries(labels).map(([k, v]) => `${k}="${escapeLabel(v)}"`);
|
|
99
|
+
return `{${pairs.join(',')}}`;
|
|
100
|
+
};
|
|
101
|
+
// Helper to add metric value
|
|
102
|
+
const addValue = (name, value, labels) => {
|
|
103
|
+
lines.push(`${name}${formatLabels(labels)} ${value}`);
|
|
104
|
+
};
|
|
105
|
+
// Token usage metrics
|
|
106
|
+
const tokenMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_llm_tokens_total');
|
|
107
|
+
addHeader(tokenMetric);
|
|
108
|
+
for (const usage of aggregated.tokenUsage) {
|
|
109
|
+
addValue(tokenMetric.name, usage.totalInputTokens, {
|
|
110
|
+
provider: usage.provider,
|
|
111
|
+
model: usage.model,
|
|
112
|
+
direction: 'input',
|
|
113
|
+
});
|
|
114
|
+
addValue(tokenMetric.name, usage.totalOutputTokens, {
|
|
115
|
+
provider: usage.provider,
|
|
116
|
+
model: usage.model,
|
|
117
|
+
direction: 'output',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// LLM calls metric
|
|
121
|
+
const callsMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_llm_calls_total');
|
|
122
|
+
addHeader(callsMetric);
|
|
123
|
+
for (const usage of aggregated.tokenUsage) {
|
|
124
|
+
addValue(callsMetric.name, usage.callCount, {
|
|
125
|
+
provider: usage.provider,
|
|
126
|
+
model: usage.model,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// Cost metrics
|
|
130
|
+
const costMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_cost_usd_total');
|
|
131
|
+
addHeader(costMetric);
|
|
132
|
+
for (const cost of aggregated.costByProvider) {
|
|
133
|
+
addValue(costMetric.name, cost.costUSD, { provider: cost.provider });
|
|
134
|
+
}
|
|
135
|
+
// Operation duration histogram
|
|
136
|
+
const durationMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_operation_duration_seconds');
|
|
137
|
+
addHeader(durationMetric);
|
|
138
|
+
for (const stat of aggregated.operationStats) {
|
|
139
|
+
// Add histogram buckets
|
|
140
|
+
const buckets = calculateHistogramBuckets(collector.getRawRecords().timing
|
|
141
|
+
.filter(r => r.operation === stat.operation)
|
|
142
|
+
.map(r => r.durationMs / 1000), // Convert to seconds
|
|
143
|
+
DEFAULT_LATENCY_BUCKETS.map(b => b / 1000));
|
|
144
|
+
for (let i = 0; i < buckets.le.length; i++) {
|
|
145
|
+
addValue(`${durationMetric.name}_bucket`, buckets.counts[i], {
|
|
146
|
+
operation: stat.operation,
|
|
147
|
+
status: 'all',
|
|
148
|
+
le: buckets.le[i] === Infinity ? '+Inf' : String(buckets.le[i]),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
addValue(`${durationMetric.name}_sum`, buckets.sum, { operation: stat.operation, status: 'all' });
|
|
152
|
+
addValue(`${durationMetric.name}_count`, buckets.count, { operation: stat.operation, status: 'all' });
|
|
153
|
+
}
|
|
154
|
+
// Operation total counter
|
|
155
|
+
const opTotalMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_operation_total');
|
|
156
|
+
addHeader(opTotalMetric);
|
|
157
|
+
for (const stat of aggregated.operationStats) {
|
|
158
|
+
addValue(opTotalMetric.name, stat.successCount, { operation: stat.operation, status: 'success' });
|
|
159
|
+
addValue(opTotalMetric.name, stat.failureCount, { operation: stat.operation, status: 'failure' });
|
|
160
|
+
}
|
|
161
|
+
// Error metrics
|
|
162
|
+
const errorMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_errors_total');
|
|
163
|
+
addHeader(errorMetric);
|
|
164
|
+
for (const stat of aggregated.errorStats) {
|
|
165
|
+
addValue(errorMetric.name, stat.retryableCount, { category: stat.category, retryable: 'true' });
|
|
166
|
+
addValue(errorMetric.name, stat.terminalCount, { category: stat.category, retryable: 'false' });
|
|
167
|
+
}
|
|
168
|
+
// Interview-specific metrics
|
|
169
|
+
if (interview) {
|
|
170
|
+
const toolsMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_interview_tools_discovered');
|
|
171
|
+
addHeader(toolsMetric);
|
|
172
|
+
addValue(toolsMetric.name, interview.toolsDiscovered);
|
|
173
|
+
const questionsMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_interview_questions_generated');
|
|
174
|
+
addHeader(questionsMetric);
|
|
175
|
+
addValue(questionsMetric.name, interview.questionsGenerated);
|
|
176
|
+
const toolCallsMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_interview_tool_calls_total');
|
|
177
|
+
addHeader(toolCallsMetric);
|
|
178
|
+
addValue(toolCallsMetric.name, interview.toolCallsSucceeded, { status: 'success' });
|
|
179
|
+
addValue(toolCallsMetric.name, interview.toolCallsFailed, { status: 'failure' });
|
|
180
|
+
const durationGauge = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_interview_duration_seconds');
|
|
181
|
+
addHeader(durationGauge);
|
|
182
|
+
const durationSec = interview.totalDurationMs
|
|
183
|
+
? interview.totalDurationMs / 1000
|
|
184
|
+
: (Date.now() - interview.startedAt.getTime()) / 1000;
|
|
185
|
+
addValue(durationGauge.name, durationSec);
|
|
186
|
+
const progressMetric = METRIC_DEFINITIONS.find(m => m.name === 'bellwether_interview_progress_ratio');
|
|
187
|
+
addHeader(progressMetric);
|
|
188
|
+
const expectedCalls = interview.toolsDiscovered * 5;
|
|
189
|
+
const progress = expectedCalls > 0 ? Math.min(1, interview.toolCallsMade / expectedCalls) : 0;
|
|
190
|
+
addValue(progressMetric.name, progress);
|
|
191
|
+
}
|
|
192
|
+
return lines.join('\n');
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Calculate histogram buckets from raw values.
|
|
196
|
+
*/
|
|
197
|
+
function calculateHistogramBuckets(values, boundaries) {
|
|
198
|
+
const bucketBoundaries = [...boundaries, Infinity];
|
|
199
|
+
const counts = new Array(bucketBoundaries.length).fill(0);
|
|
200
|
+
let sum = 0;
|
|
201
|
+
for (const value of values) {
|
|
202
|
+
sum += value;
|
|
203
|
+
for (let i = 0; i < bucketBoundaries.length; i++) {
|
|
204
|
+
if (value <= bucketBoundaries[i]) {
|
|
205
|
+
counts[i]++;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Make counts cumulative
|
|
210
|
+
for (let i = 1; i < counts.length; i++) {
|
|
211
|
+
counts[i] += counts[i - 1];
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
le: bucketBoundaries,
|
|
215
|
+
counts,
|
|
216
|
+
sum,
|
|
217
|
+
count: values.length,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Escape label value for Prometheus format.
|
|
222
|
+
*/
|
|
223
|
+
function escapeLabel(value) {
|
|
224
|
+
return value
|
|
225
|
+
.replace(/\\/g, '\\\\')
|
|
226
|
+
.replace(/"/g, '\\"')
|
|
227
|
+
.replace(/\n/g, '\\n');
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Export metrics as JSON for dashboard consumption.
|
|
231
|
+
*/
|
|
232
|
+
export function exportMetricsJSON(collector) {
|
|
233
|
+
return JSON.stringify(collector.getDashboardMetrics(), null, 2);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get metric definitions for documentation.
|
|
237
|
+
*/
|
|
238
|
+
export function getMetricDefinitions() {
|
|
239
|
+
return [...METRIC_DEFINITIONS];
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=prometheus.js.map
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics collection types for observability.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Error category for metrics tracking.
|
|
6
|
+
*/
|
|
7
|
+
export type ErrorCategory = 'transport' | 'llm_auth' | 'llm_rate_limit' | 'llm_quota' | 'llm_refusal' | 'llm_parse' | 'llm_connection' | 'llm_timeout' | 'interview' | 'workflow' | 'config' | 'unknown';
|
|
8
|
+
/**
|
|
9
|
+
* Operation type for timing metrics.
|
|
10
|
+
*/
|
|
11
|
+
export type OperationType = 'llm_call' | 'llm_stream' | 'tool_call' | 'discovery' | 'question_generation' | 'response_analysis' | 'profile_synthesis' | 'summary_generation' | 'interview_total' | 'workflow_execution' | 'assertion_evaluation' | 'baseline_comparison';
|
|
12
|
+
/**
|
|
13
|
+
* Token usage record.
|
|
14
|
+
*/
|
|
15
|
+
export interface TokenUsageRecord {
|
|
16
|
+
provider: string;
|
|
17
|
+
model: string;
|
|
18
|
+
inputTokens: number;
|
|
19
|
+
outputTokens: number;
|
|
20
|
+
timestamp: Date;
|
|
21
|
+
operation?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Operation timing record.
|
|
25
|
+
*/
|
|
26
|
+
export interface TimingRecord {
|
|
27
|
+
operation: OperationType;
|
|
28
|
+
durationMs: number;
|
|
29
|
+
success: boolean;
|
|
30
|
+
timestamp: Date;
|
|
31
|
+
metadata?: Record<string, unknown>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Error record for metrics.
|
|
35
|
+
*/
|
|
36
|
+
export interface ErrorRecord {
|
|
37
|
+
category: ErrorCategory;
|
|
38
|
+
code: string;
|
|
39
|
+
message: string;
|
|
40
|
+
timestamp: Date;
|
|
41
|
+
retryable: boolean;
|
|
42
|
+
operation?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Cost record.
|
|
46
|
+
*/
|
|
47
|
+
export interface CostRecord {
|
|
48
|
+
provider: string;
|
|
49
|
+
model: string;
|
|
50
|
+
inputCost: number;
|
|
51
|
+
outputCost: number;
|
|
52
|
+
totalCost: number;
|
|
53
|
+
timestamp: Date;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Interview metrics summary.
|
|
57
|
+
*/
|
|
58
|
+
export interface InterviewMetrics {
|
|
59
|
+
/** Start time */
|
|
60
|
+
startedAt: Date;
|
|
61
|
+
/** End time */
|
|
62
|
+
endedAt?: Date;
|
|
63
|
+
/** Total duration in ms */
|
|
64
|
+
totalDurationMs?: number;
|
|
65
|
+
/** Tools discovered */
|
|
66
|
+
toolsDiscovered: number;
|
|
67
|
+
/** Questions generated */
|
|
68
|
+
questionsGenerated: number;
|
|
69
|
+
/** Tool calls made */
|
|
70
|
+
toolCallsMade: number;
|
|
71
|
+
/** Tool calls succeeded */
|
|
72
|
+
toolCallsSucceeded: number;
|
|
73
|
+
/** Tool calls failed */
|
|
74
|
+
toolCallsFailed: number;
|
|
75
|
+
/** Personas used */
|
|
76
|
+
personasUsed: number;
|
|
77
|
+
/** LLM calls made */
|
|
78
|
+
llmCallsMade: number;
|
|
79
|
+
/** Total input tokens */
|
|
80
|
+
totalInputTokens: number;
|
|
81
|
+
/** Total output tokens */
|
|
82
|
+
totalOutputTokens: number;
|
|
83
|
+
/** Total cost USD */
|
|
84
|
+
totalCostUSD: number;
|
|
85
|
+
/** Errors by category */
|
|
86
|
+
errorsByCategory: Record<ErrorCategory, number>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Aggregated metrics for a time period.
|
|
90
|
+
*/
|
|
91
|
+
export interface AggregatedMetrics {
|
|
92
|
+
/** Time period start */
|
|
93
|
+
periodStart: Date;
|
|
94
|
+
/** Time period end */
|
|
95
|
+
periodEnd: Date;
|
|
96
|
+
/** Token usage by provider/model */
|
|
97
|
+
tokenUsage: {
|
|
98
|
+
provider: string;
|
|
99
|
+
model: string;
|
|
100
|
+
totalInputTokens: number;
|
|
101
|
+
totalOutputTokens: number;
|
|
102
|
+
callCount: number;
|
|
103
|
+
}[];
|
|
104
|
+
/** Operation timing statistics */
|
|
105
|
+
operationStats: {
|
|
106
|
+
operation: OperationType;
|
|
107
|
+
count: number;
|
|
108
|
+
successCount: number;
|
|
109
|
+
failureCount: number;
|
|
110
|
+
avgDurationMs: number;
|
|
111
|
+
minDurationMs: number;
|
|
112
|
+
maxDurationMs: number;
|
|
113
|
+
p50DurationMs: number;
|
|
114
|
+
p95DurationMs: number;
|
|
115
|
+
p99DurationMs: number;
|
|
116
|
+
}[];
|
|
117
|
+
/** Error statistics */
|
|
118
|
+
errorStats: {
|
|
119
|
+
category: ErrorCategory;
|
|
120
|
+
count: number;
|
|
121
|
+
retryableCount: number;
|
|
122
|
+
terminalCount: number;
|
|
123
|
+
}[];
|
|
124
|
+
/** Total cost */
|
|
125
|
+
totalCostUSD: number;
|
|
126
|
+
costByProvider: {
|
|
127
|
+
provider: string;
|
|
128
|
+
costUSD: number;
|
|
129
|
+
}[];
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Prometheus metric types.
|
|
133
|
+
*/
|
|
134
|
+
export type PrometheusMetricType = 'counter' | 'gauge' | 'histogram' | 'summary';
|
|
135
|
+
/**
|
|
136
|
+
* Prometheus metric definition.
|
|
137
|
+
*/
|
|
138
|
+
export interface PrometheusMetric {
|
|
139
|
+
name: string;
|
|
140
|
+
type: PrometheusMetricType;
|
|
141
|
+
help: string;
|
|
142
|
+
labels?: string[];
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Prometheus metric value.
|
|
146
|
+
*/
|
|
147
|
+
export interface PrometheusMetricValue {
|
|
148
|
+
name: string;
|
|
149
|
+
value: number;
|
|
150
|
+
labels?: Record<string, string>;
|
|
151
|
+
timestamp?: number;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Histogram bucket configuration.
|
|
155
|
+
*/
|
|
156
|
+
export interface HistogramBuckets {
|
|
157
|
+
/** Bucket boundaries */
|
|
158
|
+
le: number[];
|
|
159
|
+
/** Count per bucket */
|
|
160
|
+
counts: number[];
|
|
161
|
+
/** Total sum */
|
|
162
|
+
sum: number;
|
|
163
|
+
/** Total count */
|
|
164
|
+
count: number;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Dashboard-compatible metrics output.
|
|
168
|
+
*/
|
|
169
|
+
export interface DashboardMetrics {
|
|
170
|
+
/** Timestamp of metrics snapshot */
|
|
171
|
+
timestamp: string;
|
|
172
|
+
/** Interview summary */
|
|
173
|
+
interview: {
|
|
174
|
+
status: 'running' | 'completed' | 'failed';
|
|
175
|
+
progress: number;
|
|
176
|
+
toolsTotal: number;
|
|
177
|
+
toolsCompleted: number;
|
|
178
|
+
questionsTotal: number;
|
|
179
|
+
questionsCompleted: number;
|
|
180
|
+
};
|
|
181
|
+
/** Token usage */
|
|
182
|
+
tokens: {
|
|
183
|
+
input: number;
|
|
184
|
+
output: number;
|
|
185
|
+
total: number;
|
|
186
|
+
};
|
|
187
|
+
/** Cost */
|
|
188
|
+
cost: {
|
|
189
|
+
current: number;
|
|
190
|
+
projected: number;
|
|
191
|
+
currency: string;
|
|
192
|
+
};
|
|
193
|
+
/** Performance */
|
|
194
|
+
performance: {
|
|
195
|
+
avgLLMLatencyMs: number;
|
|
196
|
+
avgToolLatencyMs: number;
|
|
197
|
+
errorsTotal: number;
|
|
198
|
+
successRate: number;
|
|
199
|
+
};
|
|
200
|
+
/** Provider breakdown */
|
|
201
|
+
providers: {
|
|
202
|
+
name: string;
|
|
203
|
+
calls: number;
|
|
204
|
+
tokens: number;
|
|
205
|
+
errors: number;
|
|
206
|
+
avgLatencyMs: number;
|
|
207
|
+
}[];
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in persona definitions.
|
|
3
|
+
*/
|
|
4
|
+
import type { Persona, BuiltInPersonaId } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Technical Writer persona - balanced documentation focus.
|
|
7
|
+
*/
|
|
8
|
+
export declare const technicalWriterPersona: Persona;
|
|
9
|
+
/**
|
|
10
|
+
* Security Tester persona - vulnerability-focused.
|
|
11
|
+
*
|
|
12
|
+
* Note: Prompts are designed to avoid triggering LLM safety filters while still
|
|
13
|
+
* enabling meaningful security testing. We describe test categories rather than
|
|
14
|
+
* including specific payloads, letting the LLM generate appropriate test inputs.
|
|
15
|
+
*/
|
|
16
|
+
export declare const securityTesterPersona: Persona;
|
|
17
|
+
/**
|
|
18
|
+
* QA Engineer persona - edge case and error focus.
|
|
19
|
+
*/
|
|
20
|
+
export declare const qaEngineerPersona: Persona;
|
|
21
|
+
/**
|
|
22
|
+
* Novice User persona - usability and error message focus.
|
|
23
|
+
*/
|
|
24
|
+
export declare const noviceUserPersona: Persona;
|
|
25
|
+
/**
|
|
26
|
+
* Map of built-in persona IDs to definitions.
|
|
27
|
+
*/
|
|
28
|
+
export declare const BUILTIN_PERSONAS: Record<BuiltInPersonaId, Persona>;
|
|
29
|
+
/**
|
|
30
|
+
* Get a built-in persona by ID.
|
|
31
|
+
*/
|
|
32
|
+
export declare function getBuiltinPersona(id: BuiltInPersonaId): Persona;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a persona ID is a built-in.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isBuiltinPersona(id: string): id is BuiltInPersonaId;
|
|
37
|
+
/**
|
|
38
|
+
* Get all built-in persona IDs.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getBuiltinPersonaIds(): BuiltInPersonaId[];
|
|
41
|
+
/**
|
|
42
|
+
* Default persona for interviews.
|
|
43
|
+
*/
|
|
44
|
+
export declare const DEFAULT_PERSONA: Persona;
|
|
45
|
+
/**
|
|
46
|
+
* Parse persona list from string array of persona IDs.
|
|
47
|
+
* Returns the DEFAULT_PERSONA if the list is empty or contains no valid personas.
|
|
48
|
+
*
|
|
49
|
+
* @param personaList - Array of persona ID strings
|
|
50
|
+
* @param warnOnUnknown - Optional callback for unknown persona warnings
|
|
51
|
+
* @returns Array of resolved Persona objects
|
|
52
|
+
*/
|
|
53
|
+
export declare function parsePersonas(personaList: string[], warnOnUnknown?: (unknownName: string, validNames: string[]) => void): Persona[];
|
|
54
|
+
//# sourceMappingURL=builtins.d.ts.map
|