@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,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow loader - loads workflows from YAML files.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, existsSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { parseAllDocuments } from 'yaml';
|
|
7
|
+
import { parseYamlSecure, YAML_SECURITY_LIMITS } from '../utils/yaml-parser.js';
|
|
8
|
+
import { PATHS } from '../constants.js';
|
|
9
|
+
/** Default file name for workflow definitions */
|
|
10
|
+
export const DEFAULT_WORKFLOWS_FILE = PATHS.DEFAULT_WORKFLOWS_FILE;
|
|
11
|
+
/**
|
|
12
|
+
* Load workflows from a YAML file.
|
|
13
|
+
* Supports both single-document and multi-document YAML (separated by ---).
|
|
14
|
+
*/
|
|
15
|
+
export function loadWorkflowsFromFile(path) {
|
|
16
|
+
if (!existsSync(path)) {
|
|
17
|
+
throw new Error(`Workflow file not found: ${path}`);
|
|
18
|
+
}
|
|
19
|
+
const content = readFileSync(path, 'utf-8');
|
|
20
|
+
// Check if content has multiple YAML documents (separated by ---)
|
|
21
|
+
if (content.includes('\n---')) {
|
|
22
|
+
// Parse as multi-document YAML
|
|
23
|
+
const documents = parseAllDocuments(content);
|
|
24
|
+
const rawWorkflows = [];
|
|
25
|
+
for (const doc of documents) {
|
|
26
|
+
if (doc.errors && doc.errors.length > 0) {
|
|
27
|
+
throw new Error(`YAML parse error: ${doc.errors[0].message}`);
|
|
28
|
+
}
|
|
29
|
+
const parsed = doc.toJS({
|
|
30
|
+
maxAliasCount: YAML_SECURITY_LIMITS.MAX_ALIAS_COUNT,
|
|
31
|
+
});
|
|
32
|
+
if (parsed) {
|
|
33
|
+
rawWorkflows.push(parsed);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return rawWorkflows.map((raw, index) => validateAndNormalizeWorkflow(raw, path, index));
|
|
37
|
+
}
|
|
38
|
+
// Single document - use secure parser
|
|
39
|
+
const parsed = parseYamlSecure(content);
|
|
40
|
+
// Handle single workflow or array of workflows
|
|
41
|
+
const rawWorkflows = Array.isArray(parsed) ? parsed : [parsed];
|
|
42
|
+
return rawWorkflows.map((raw, index) => validateAndNormalizeWorkflow(raw, path, index));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Try to load workflows from the default file in a directory.
|
|
46
|
+
* Returns null if file doesn't exist.
|
|
47
|
+
*
|
|
48
|
+
* This enables auto-discovery of workflow files similar to how
|
|
49
|
+
* scenarios are auto-loaded from bellwether-tests.yaml.
|
|
50
|
+
*/
|
|
51
|
+
export function tryLoadDefaultWorkflows(directory) {
|
|
52
|
+
const path = join(directory, DEFAULT_WORKFLOWS_FILE);
|
|
53
|
+
if (!existsSync(path)) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
return loadWorkflowsFromFile(path);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// If the file exists but is invalid, return null rather than throwing
|
|
61
|
+
// This allows the interview to proceed without workflows
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validate and normalize a workflow definition.
|
|
67
|
+
*/
|
|
68
|
+
function validateAndNormalizeWorkflow(data, source, index) {
|
|
69
|
+
// Required fields
|
|
70
|
+
if (!data.id || typeof data.id !== 'string') {
|
|
71
|
+
throw new Error(`Workflow ${index + 1} from ${source} missing required field: id`);
|
|
72
|
+
}
|
|
73
|
+
if (!data.name || typeof data.name !== 'string') {
|
|
74
|
+
throw new Error(`Workflow ${index + 1} from ${source} missing required field: name`);
|
|
75
|
+
}
|
|
76
|
+
if (!data.steps || !Array.isArray(data.steps) || data.steps.length === 0) {
|
|
77
|
+
throw new Error(`Workflow ${index + 1} from ${source} missing required field: steps (must be non-empty array)`);
|
|
78
|
+
}
|
|
79
|
+
// Validate each step
|
|
80
|
+
const steps = data.steps.map((step, stepIndex) => {
|
|
81
|
+
if (!step.tool || typeof step.tool !== 'string') {
|
|
82
|
+
throw new Error(`Step ${stepIndex + 1} in workflow "${data.id}" missing required field: tool`);
|
|
83
|
+
}
|
|
84
|
+
// Validate argMapping format
|
|
85
|
+
if (step.argMapping) {
|
|
86
|
+
for (const [param, expr] of Object.entries(step.argMapping)) {
|
|
87
|
+
if (typeof expr !== 'string' || !expr.startsWith('$steps[')) {
|
|
88
|
+
throw new Error(`Invalid argMapping for "${param}" in step ${stepIndex + 1} of workflow "${data.id}". ` +
|
|
89
|
+
`Expected format: $steps[N].result.path.to.value`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Validate assertions
|
|
94
|
+
const assertions = step.assertions?.map((a, aIndex) => {
|
|
95
|
+
if (!a.path || typeof a.path !== 'string') {
|
|
96
|
+
throw new Error(`Assertion ${aIndex + 1} in step ${stepIndex + 1} of workflow "${data.id}" missing required field: path`);
|
|
97
|
+
}
|
|
98
|
+
const validConditions = ['exists', 'equals', 'contains', 'truthy', 'type'];
|
|
99
|
+
if (!a.condition || !validConditions.includes(a.condition)) {
|
|
100
|
+
throw new Error(`Assertion ${aIndex + 1} in step ${stepIndex + 1} of workflow "${data.id}" has invalid condition. ` +
|
|
101
|
+
`Valid conditions: ${validConditions.join(', ')}`);
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
path: a.path,
|
|
105
|
+
condition: a.condition,
|
|
106
|
+
value: a.value,
|
|
107
|
+
message: a.message,
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
tool: step.tool,
|
|
112
|
+
description: step.description ?? `Call ${step.tool}`,
|
|
113
|
+
args: step.args,
|
|
114
|
+
argMapping: step.argMapping,
|
|
115
|
+
optional: step.optional ?? false,
|
|
116
|
+
assertions,
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
return {
|
|
120
|
+
id: data.id,
|
|
121
|
+
name: data.name,
|
|
122
|
+
description: data.description ?? `Workflow: ${data.name}`,
|
|
123
|
+
expectedOutcome: data.expectedOutcome ?? 'Workflow completes successfully',
|
|
124
|
+
steps,
|
|
125
|
+
discovered: false,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Generate a sample workflow YAML template.
|
|
130
|
+
*/
|
|
131
|
+
export function generateSampleWorkflowYaml() {
|
|
132
|
+
return `# Workflow Definition
|
|
133
|
+
# Save this file and reference it with: --workflows ./my-workflows.yaml
|
|
134
|
+
|
|
135
|
+
# Single workflow
|
|
136
|
+
id: search_and_get
|
|
137
|
+
name: Search and Retrieve
|
|
138
|
+
description: Search for items and retrieve details
|
|
139
|
+
|
|
140
|
+
expectedOutcome: Successfully find and retrieve item details
|
|
141
|
+
|
|
142
|
+
steps:
|
|
143
|
+
- tool: search_items
|
|
144
|
+
description: Search for items matching criteria
|
|
145
|
+
args:
|
|
146
|
+
query: "example search"
|
|
147
|
+
limit: 10
|
|
148
|
+
assertions:
|
|
149
|
+
- path: items
|
|
150
|
+
condition: exists
|
|
151
|
+
message: Search should return items array
|
|
152
|
+
|
|
153
|
+
- tool: get_item_details
|
|
154
|
+
description: Get details for first search result
|
|
155
|
+
argMapping:
|
|
156
|
+
id: "$steps[0].result.items[0].id"
|
|
157
|
+
assertions:
|
|
158
|
+
- path: name
|
|
159
|
+
condition: exists
|
|
160
|
+
- path: status
|
|
161
|
+
condition: equals
|
|
162
|
+
value: "active"
|
|
163
|
+
|
|
164
|
+
- tool: get_item_history
|
|
165
|
+
description: Optional - get history if available
|
|
166
|
+
optional: true
|
|
167
|
+
argMapping:
|
|
168
|
+
itemId: "$steps[1].result.id"
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
# You can define multiple workflows in one file using YAML document separators
|
|
172
|
+
|
|
173
|
+
id: create_and_verify
|
|
174
|
+
name: Create and Verify
|
|
175
|
+
description: Create a new item and verify it exists
|
|
176
|
+
|
|
177
|
+
steps:
|
|
178
|
+
- tool: create_item
|
|
179
|
+
description: Create a new item
|
|
180
|
+
args:
|
|
181
|
+
name: "Test Item"
|
|
182
|
+
type: "example"
|
|
183
|
+
|
|
184
|
+
- tool: get_item_details
|
|
185
|
+
description: Verify the item was created
|
|
186
|
+
argMapping:
|
|
187
|
+
id: "$steps[0].result.id"
|
|
188
|
+
assertions:
|
|
189
|
+
- path: name
|
|
190
|
+
condition: equals
|
|
191
|
+
value: "Test Item"
|
|
192
|
+
`;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State tracker - tracks state changes during workflow execution.
|
|
3
|
+
*
|
|
4
|
+
* This module provides functionality to:
|
|
5
|
+
* - Classify tools by their state role (reader, writer, both)
|
|
6
|
+
* - Identify probe tools that can capture state
|
|
7
|
+
* - Take state snapshots before/after workflow steps
|
|
8
|
+
* - Detect state changes between snapshots
|
|
9
|
+
* - Infer dependencies between workflow steps
|
|
10
|
+
*
|
|
11
|
+
* RELIABILITY: All probe tool calls have timeouts to prevent indefinite hangs.
|
|
12
|
+
*/
|
|
13
|
+
import type { MCPClient } from '../transport/mcp-client.js';
|
|
14
|
+
import type { MCPTool } from '../transport/types.js';
|
|
15
|
+
import type { LLMClient } from '../llm/client.js';
|
|
16
|
+
import type { ToolStateInfo, StateSnapshot, StateChange, StateDependency, WorkflowStateTracking, StateTrackingOptions, WorkflowStepResult } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Timeout configuration for state tracking operations.
|
|
19
|
+
*/
|
|
20
|
+
export interface StateTrackerTimeoutConfig {
|
|
21
|
+
/** Timeout for state snapshot operations in ms */
|
|
22
|
+
snapshotTimeout?: number;
|
|
23
|
+
/** Timeout for individual probe tool calls in ms */
|
|
24
|
+
probeTimeout?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* State tracker for workflow execution.
|
|
28
|
+
*/
|
|
29
|
+
export declare class StateTracker {
|
|
30
|
+
private client;
|
|
31
|
+
private tools;
|
|
32
|
+
private options;
|
|
33
|
+
private logger;
|
|
34
|
+
private toolClassifications;
|
|
35
|
+
private probeTools;
|
|
36
|
+
private snapshotTimeout;
|
|
37
|
+
private probeTimeout;
|
|
38
|
+
constructor(client: MCPClient, tools: MCPTool[], _llm?: LLMClient, options?: StateTrackingOptions, timeoutConfig?: StateTrackerTimeoutConfig);
|
|
39
|
+
/**
|
|
40
|
+
* Classify all tools by their state role.
|
|
41
|
+
*/
|
|
42
|
+
private classifyTools;
|
|
43
|
+
/**
|
|
44
|
+
* Classify a single tool by analyzing its name and description.
|
|
45
|
+
*/
|
|
46
|
+
private classifyTool;
|
|
47
|
+
/**
|
|
48
|
+
* Infer state types from tool description.
|
|
49
|
+
*/
|
|
50
|
+
private inferStateTypes;
|
|
51
|
+
/**
|
|
52
|
+
* Get the classification for a specific tool.
|
|
53
|
+
*/
|
|
54
|
+
getToolInfo(toolName: string): ToolStateInfo | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* Get all tool classifications.
|
|
57
|
+
*/
|
|
58
|
+
getAllToolInfo(): ToolStateInfo[];
|
|
59
|
+
/**
|
|
60
|
+
* Get available probe tools.
|
|
61
|
+
*/
|
|
62
|
+
getProbeTools(): string[];
|
|
63
|
+
/**
|
|
64
|
+
* Take a state snapshot using available probe tools.
|
|
65
|
+
*
|
|
66
|
+
* RELIABILITY: Each probe tool call has an individual timeout to prevent hangs.
|
|
67
|
+
* The entire snapshot operation also has a total timeout.
|
|
68
|
+
*
|
|
69
|
+
* @param afterStepIndex - The step index this snapshot was taken after
|
|
70
|
+
* @param snapshotTimeoutMs - Optional total timeout for the snapshot operation (overrides configured timeout)
|
|
71
|
+
*/
|
|
72
|
+
takeSnapshot(afterStepIndex: number, snapshotTimeoutMs?: number): Promise<StateSnapshot>;
|
|
73
|
+
/**
|
|
74
|
+
* Extract content from a tool call result.
|
|
75
|
+
*/
|
|
76
|
+
private extractContent;
|
|
77
|
+
/**
|
|
78
|
+
* Generate a hash for state data.
|
|
79
|
+
*/
|
|
80
|
+
private hashState;
|
|
81
|
+
/**
|
|
82
|
+
* Compare two snapshots and identify changes.
|
|
83
|
+
*/
|
|
84
|
+
compareSnapshots(before: StateSnapshot, after: StateSnapshot, causedByStep: number): StateChange[];
|
|
85
|
+
/**
|
|
86
|
+
* Infer dependencies between workflow steps based on state changes and tool roles.
|
|
87
|
+
*/
|
|
88
|
+
inferDependencies(stepResults: WorkflowStepResult[]): StateDependency[];
|
|
89
|
+
/**
|
|
90
|
+
* Verify dependencies using state snapshots.
|
|
91
|
+
*/
|
|
92
|
+
verifyDependencies(dependencies: StateDependency[], _snapshots: StateSnapshot[], changes: StateChange[]): StateDependency[];
|
|
93
|
+
/**
|
|
94
|
+
* Generate a summary of state tracking results.
|
|
95
|
+
*/
|
|
96
|
+
generateSummary(tracking: WorkflowStateTracking): Promise<string>;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=state-tracker.d.ts.map
|