@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,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Truncation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides intelligent content truncation that preserves structure
|
|
5
|
+
* for different content types (JSON, Markdown, plain text).
|
|
6
|
+
*
|
|
7
|
+
* Unlike simple string truncation, these functions:
|
|
8
|
+
* - Preserve JSON structure (valid JSON output)
|
|
9
|
+
* - Preserve Markdown headers and section structure
|
|
10
|
+
* - Truncate at natural boundaries (sentences, paragraphs)
|
|
11
|
+
* - Provide helpful truncation indicators
|
|
12
|
+
*/
|
|
13
|
+
/** Content type for smart truncation */
|
|
14
|
+
export type ContentType = 'json' | 'markdown' | 'text';
|
|
15
|
+
/** Options for smart truncation */
|
|
16
|
+
export interface SmartTruncateOptions {
|
|
17
|
+
/** Maximum length in characters */
|
|
18
|
+
maxLength: number;
|
|
19
|
+
/** Content type for appropriate truncation strategy */
|
|
20
|
+
contentType?: ContentType;
|
|
21
|
+
/** Whether to preserve JSON structure (for JSON content) */
|
|
22
|
+
preserveJsonStructure?: boolean;
|
|
23
|
+
/** Whether to preserve markdown headers (for markdown content) */
|
|
24
|
+
preserveMarkdownHeaders?: boolean;
|
|
25
|
+
/** Minimum array items to show when truncating JSON arrays */
|
|
26
|
+
minArrayItems?: number;
|
|
27
|
+
/** Custom truncation indicator */
|
|
28
|
+
truncationIndicator?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Result of smart truncation */
|
|
31
|
+
export interface TruncationResult {
|
|
32
|
+
/** The truncated content */
|
|
33
|
+
content: string;
|
|
34
|
+
/** Whether truncation occurred */
|
|
35
|
+
wasTruncated: boolean;
|
|
36
|
+
/** Original length */
|
|
37
|
+
originalLength: number;
|
|
38
|
+
/** Number of characters removed */
|
|
39
|
+
charactersRemoved: number;
|
|
40
|
+
/** Items omitted (for arrays/objects) */
|
|
41
|
+
itemsOmitted?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Smart truncate content based on type.
|
|
45
|
+
*
|
|
46
|
+
* @param content - Content to truncate
|
|
47
|
+
* @param options - Truncation options
|
|
48
|
+
* @returns Truncation result
|
|
49
|
+
*/
|
|
50
|
+
export declare function smartTruncate(content: string, options: SmartTruncateOptions): TruncationResult;
|
|
51
|
+
/**
|
|
52
|
+
* Simple string truncation with indicator.
|
|
53
|
+
*
|
|
54
|
+
* @param content - Content to truncate
|
|
55
|
+
* @param maxLength - Maximum length
|
|
56
|
+
* @param indicator - Truncation indicator
|
|
57
|
+
* @returns Truncation result
|
|
58
|
+
*/
|
|
59
|
+
export declare function simpleTruncate(content: string, maxLength: number, indicator?: string): TruncationResult;
|
|
60
|
+
/**
|
|
61
|
+
* Smart truncate JSON while preserving valid structure.
|
|
62
|
+
*
|
|
63
|
+
* @param content - JSON string to truncate
|
|
64
|
+
* @param maxLength - Maximum length
|
|
65
|
+
* @param minArrayItems - Minimum array items to preserve
|
|
66
|
+
* @param indicator - Custom truncation indicator
|
|
67
|
+
* @returns Truncation result
|
|
68
|
+
*/
|
|
69
|
+
export declare function smartTruncateJson(content: string, maxLength: number, minArrayItems?: number, indicator?: string): TruncationResult;
|
|
70
|
+
/**
|
|
71
|
+
* Smart truncate Markdown while preserving structure.
|
|
72
|
+
*
|
|
73
|
+
* @param content - Markdown content to truncate
|
|
74
|
+
* @param maxLength - Maximum length
|
|
75
|
+
* @param indicator - Custom truncation indicator
|
|
76
|
+
* @returns Truncation result
|
|
77
|
+
*/
|
|
78
|
+
export declare function smartTruncateMarkdown(content: string, maxLength: number, indicator?: string): TruncationResult;
|
|
79
|
+
/**
|
|
80
|
+
* Detect content type from content.
|
|
81
|
+
*
|
|
82
|
+
* @param content - Content to analyze
|
|
83
|
+
* @returns Detected content type
|
|
84
|
+
*/
|
|
85
|
+
export declare function detectContentType(content: string): ContentType;
|
|
86
|
+
/**
|
|
87
|
+
* Get the appropriate example length based on options.
|
|
88
|
+
*
|
|
89
|
+
* @param fullExamples - Whether to use full example length
|
|
90
|
+
* @param customLength - Custom length override
|
|
91
|
+
* @returns Example length to use
|
|
92
|
+
*/
|
|
93
|
+
export declare function getExampleLength(fullExamples: boolean, customLength?: number): number;
|
|
94
|
+
//# sourceMappingURL=smart-truncate.d.ts.map
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Truncation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides intelligent content truncation that preserves structure
|
|
5
|
+
* for different content types (JSON, Markdown, plain text).
|
|
6
|
+
*
|
|
7
|
+
* Unlike simple string truncation, these functions:
|
|
8
|
+
* - Preserve JSON structure (valid JSON output)
|
|
9
|
+
* - Preserve Markdown headers and section structure
|
|
10
|
+
* - Truncate at natural boundaries (sentences, paragraphs)
|
|
11
|
+
* - Provide helpful truncation indicators
|
|
12
|
+
*/
|
|
13
|
+
import { EXAMPLE_OUTPUT } from '../constants.js';
|
|
14
|
+
// ==================== Main Functions ====================
|
|
15
|
+
/**
|
|
16
|
+
* Smart truncate content based on type.
|
|
17
|
+
*
|
|
18
|
+
* @param content - Content to truncate
|
|
19
|
+
* @param options - Truncation options
|
|
20
|
+
* @returns Truncation result
|
|
21
|
+
*/
|
|
22
|
+
export function smartTruncate(content, options) {
|
|
23
|
+
const { maxLength, contentType = detectContentType(content), preserveJsonStructure = EXAMPLE_OUTPUT.SMART_TRUNCATE.preserveJsonStructure, preserveMarkdownHeaders = EXAMPLE_OUTPUT.SMART_TRUNCATE.preserveMarkdownHeaders, minArrayItems = EXAMPLE_OUTPUT.SMART_TRUNCATE.minArrayItems, truncationIndicator, } = options;
|
|
24
|
+
const originalLength = content.length;
|
|
25
|
+
// No truncation needed
|
|
26
|
+
if (originalLength <= maxLength) {
|
|
27
|
+
return {
|
|
28
|
+
content,
|
|
29
|
+
wasTruncated: false,
|
|
30
|
+
originalLength,
|
|
31
|
+
charactersRemoved: 0,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
let result;
|
|
35
|
+
switch (contentType) {
|
|
36
|
+
case 'json':
|
|
37
|
+
result = preserveJsonStructure
|
|
38
|
+
? smartTruncateJson(content, maxLength, minArrayItems, truncationIndicator)
|
|
39
|
+
: simpleTruncate(content, maxLength, truncationIndicator ?? EXAMPLE_OUTPUT.TRUNCATION_INDICATORS.json);
|
|
40
|
+
break;
|
|
41
|
+
case 'markdown':
|
|
42
|
+
result = preserveMarkdownHeaders
|
|
43
|
+
? smartTruncateMarkdown(content, maxLength, truncationIndicator)
|
|
44
|
+
: simpleTruncate(content, maxLength, truncationIndicator ?? EXAMPLE_OUTPUT.TRUNCATION_INDICATORS.markdown);
|
|
45
|
+
break;
|
|
46
|
+
default:
|
|
47
|
+
result = simpleTruncate(content, maxLength, truncationIndicator ?? EXAMPLE_OUTPUT.TRUNCATION_INDICATORS.text);
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Simple string truncation with indicator.
|
|
53
|
+
*
|
|
54
|
+
* @param content - Content to truncate
|
|
55
|
+
* @param maxLength - Maximum length
|
|
56
|
+
* @param indicator - Truncation indicator
|
|
57
|
+
* @returns Truncation result
|
|
58
|
+
*/
|
|
59
|
+
export function simpleTruncate(content, maxLength, indicator = EXAMPLE_OUTPUT.TRUNCATION_INDICATORS.text) {
|
|
60
|
+
const originalLength = content.length;
|
|
61
|
+
if (originalLength <= maxLength) {
|
|
62
|
+
return {
|
|
63
|
+
content,
|
|
64
|
+
wasTruncated: false,
|
|
65
|
+
originalLength,
|
|
66
|
+
charactersRemoved: 0,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const truncateAt = maxLength - indicator.length;
|
|
70
|
+
if (truncateAt <= EXAMPLE_OUTPUT.MIN_TRUNCATION_INDICATOR_LENGTH) {
|
|
71
|
+
// Not enough room for indicator, just truncate
|
|
72
|
+
return {
|
|
73
|
+
content: content.slice(0, maxLength),
|
|
74
|
+
wasTruncated: true,
|
|
75
|
+
originalLength,
|
|
76
|
+
charactersRemoved: originalLength - maxLength,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// Try to truncate at a word boundary
|
|
80
|
+
let cutPoint = truncateAt;
|
|
81
|
+
const lastSpace = content.lastIndexOf(' ', truncateAt);
|
|
82
|
+
const lastNewline = content.lastIndexOf('\n', truncateAt);
|
|
83
|
+
const boundary = Math.max(lastSpace, lastNewline);
|
|
84
|
+
// Only use boundary if it's not too far back (within 20% of truncateAt)
|
|
85
|
+
if (boundary > truncateAt * 0.8) {
|
|
86
|
+
cutPoint = boundary;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
content: content.slice(0, cutPoint) + indicator,
|
|
90
|
+
wasTruncated: true,
|
|
91
|
+
originalLength,
|
|
92
|
+
charactersRemoved: originalLength - cutPoint - indicator.length,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// ==================== JSON Truncation ====================
|
|
96
|
+
/**
|
|
97
|
+
* Smart truncate JSON while preserving valid structure.
|
|
98
|
+
*
|
|
99
|
+
* @param content - JSON string to truncate
|
|
100
|
+
* @param maxLength - Maximum length
|
|
101
|
+
* @param minArrayItems - Minimum array items to preserve
|
|
102
|
+
* @param indicator - Custom truncation indicator
|
|
103
|
+
* @returns Truncation result
|
|
104
|
+
*/
|
|
105
|
+
export function smartTruncateJson(content, maxLength, minArrayItems = EXAMPLE_OUTPUT.SMART_TRUNCATE.minArrayItems, indicator) {
|
|
106
|
+
const originalLength = content.length;
|
|
107
|
+
if (originalLength <= maxLength) {
|
|
108
|
+
return {
|
|
109
|
+
content,
|
|
110
|
+
wasTruncated: false,
|
|
111
|
+
originalLength,
|
|
112
|
+
charactersRemoved: 0,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// Try to parse as JSON
|
|
116
|
+
let parsed;
|
|
117
|
+
try {
|
|
118
|
+
parsed = JSON.parse(content);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Not valid JSON, fall back to simple truncation
|
|
122
|
+
return simpleTruncate(content, maxLength, indicator ?? EXAMPLE_OUTPUT.TRUNCATION_INDICATORS.json);
|
|
123
|
+
}
|
|
124
|
+
// Recursively truncate the JSON object
|
|
125
|
+
const truncated = truncateJsonValue(parsed, maxLength, minArrayItems);
|
|
126
|
+
const result = JSON.stringify(truncated.value, null, 2);
|
|
127
|
+
return {
|
|
128
|
+
content: result,
|
|
129
|
+
wasTruncated: true,
|
|
130
|
+
originalLength,
|
|
131
|
+
charactersRemoved: originalLength - result.length,
|
|
132
|
+
itemsOmitted: truncated.itemsOmitted,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Recursively truncate a JSON value.
|
|
137
|
+
*/
|
|
138
|
+
function truncateJsonValue(value, maxLength, minItems, depth = 0) {
|
|
139
|
+
// Prevent infinite recursion
|
|
140
|
+
if (depth > 10) {
|
|
141
|
+
return { value: '...', itemsOmitted: 0 };
|
|
142
|
+
}
|
|
143
|
+
// Primitives pass through
|
|
144
|
+
if (value === null || typeof value !== 'object') {
|
|
145
|
+
if (typeof value === 'string' && value.length > maxLength / 4) {
|
|
146
|
+
// Truncate long strings
|
|
147
|
+
return {
|
|
148
|
+
value: value.slice(0, Math.floor(maxLength / 4)) + '...',
|
|
149
|
+
itemsOmitted: 0,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
return { value, itemsOmitted: 0 };
|
|
153
|
+
}
|
|
154
|
+
// Handle arrays
|
|
155
|
+
if (Array.isArray(value)) {
|
|
156
|
+
return truncateJsonArray(value, maxLength, minItems, depth);
|
|
157
|
+
}
|
|
158
|
+
// Handle objects
|
|
159
|
+
return truncateJsonObject(value, maxLength, minItems, depth);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Truncate a JSON array.
|
|
163
|
+
*/
|
|
164
|
+
function truncateJsonArray(arr, maxLength, minItems, depth) {
|
|
165
|
+
if (arr.length === 0) {
|
|
166
|
+
return { value: [], itemsOmitted: 0 };
|
|
167
|
+
}
|
|
168
|
+
// Check if current serialization fits
|
|
169
|
+
const serialized = JSON.stringify(arr, null, 2);
|
|
170
|
+
if (serialized.length <= maxLength) {
|
|
171
|
+
return { value: arr, itemsOmitted: 0 };
|
|
172
|
+
}
|
|
173
|
+
// Calculate how many items we can keep
|
|
174
|
+
const itemBudget = Math.max(minItems, Math.floor(maxLength / 100));
|
|
175
|
+
let totalOmitted = 0;
|
|
176
|
+
if (arr.length <= itemBudget) {
|
|
177
|
+
// Truncate individual items
|
|
178
|
+
const truncatedItems = arr.map((item) => {
|
|
179
|
+
const result = truncateJsonValue(item, Math.floor(maxLength / arr.length), minItems, depth + 1);
|
|
180
|
+
totalOmitted += result.itemsOmitted;
|
|
181
|
+
return result.value;
|
|
182
|
+
});
|
|
183
|
+
return { value: truncatedItems, itemsOmitted: totalOmitted };
|
|
184
|
+
}
|
|
185
|
+
// Keep first minItems and add indicator
|
|
186
|
+
const kept = arr.slice(0, itemBudget).map((item) => {
|
|
187
|
+
const result = truncateJsonValue(item, Math.floor(maxLength / itemBudget), minItems, depth + 1);
|
|
188
|
+
totalOmitted += result.itemsOmitted;
|
|
189
|
+
return result.value;
|
|
190
|
+
});
|
|
191
|
+
const omitted = arr.length - itemBudget;
|
|
192
|
+
totalOmitted += omitted;
|
|
193
|
+
kept.push(EXAMPLE_OUTPUT.SMART_TRUNCATE.arrayOmittedTemplate.replace('{count}', String(omitted)));
|
|
194
|
+
return { value: kept, itemsOmitted: totalOmitted };
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Truncate a JSON object.
|
|
198
|
+
*/
|
|
199
|
+
function truncateJsonObject(obj, maxLength, minItems, depth) {
|
|
200
|
+
const keys = Object.keys(obj);
|
|
201
|
+
if (keys.length === 0) {
|
|
202
|
+
return { value: {}, itemsOmitted: 0 };
|
|
203
|
+
}
|
|
204
|
+
// Check if current serialization fits
|
|
205
|
+
const serialized = JSON.stringify(obj, null, 2);
|
|
206
|
+
if (serialized.length <= maxLength) {
|
|
207
|
+
return { value: obj, itemsOmitted: 0 };
|
|
208
|
+
}
|
|
209
|
+
// Calculate how many keys we can keep
|
|
210
|
+
const keyBudget = Math.max(minItems, Math.floor(maxLength / 100));
|
|
211
|
+
let totalOmitted = 0;
|
|
212
|
+
if (keys.length <= keyBudget) {
|
|
213
|
+
// Truncate individual values
|
|
214
|
+
const truncated = {};
|
|
215
|
+
for (const key of keys) {
|
|
216
|
+
const result = truncateJsonValue(obj[key], Math.floor(maxLength / keys.length), minItems, depth + 1);
|
|
217
|
+
truncated[key] = result.value;
|
|
218
|
+
totalOmitted += result.itemsOmitted;
|
|
219
|
+
}
|
|
220
|
+
return { value: truncated, itemsOmitted: totalOmitted };
|
|
221
|
+
}
|
|
222
|
+
// Keep first keyBudget keys and add indicator
|
|
223
|
+
const truncated = {};
|
|
224
|
+
const keptKeys = keys.slice(0, keyBudget);
|
|
225
|
+
for (const key of keptKeys) {
|
|
226
|
+
const result = truncateJsonValue(obj[key], Math.floor(maxLength / keyBudget), minItems, depth + 1);
|
|
227
|
+
truncated[key] = result.value;
|
|
228
|
+
totalOmitted += result.itemsOmitted;
|
|
229
|
+
}
|
|
230
|
+
const omitted = keys.length - keyBudget;
|
|
231
|
+
totalOmitted += omitted;
|
|
232
|
+
truncated['...'] = EXAMPLE_OUTPUT.SMART_TRUNCATE.objectOmittedTemplate.replace('{count}', String(omitted));
|
|
233
|
+
return { value: truncated, itemsOmitted: totalOmitted };
|
|
234
|
+
}
|
|
235
|
+
// ==================== Markdown Truncation ====================
|
|
236
|
+
/**
|
|
237
|
+
* Smart truncate Markdown while preserving structure.
|
|
238
|
+
*
|
|
239
|
+
* @param content - Markdown content to truncate
|
|
240
|
+
* @param maxLength - Maximum length
|
|
241
|
+
* @param indicator - Custom truncation indicator
|
|
242
|
+
* @returns Truncation result
|
|
243
|
+
*/
|
|
244
|
+
export function smartTruncateMarkdown(content, maxLength, indicator) {
|
|
245
|
+
const originalLength = content.length;
|
|
246
|
+
const truncIndicator = indicator ?? EXAMPLE_OUTPUT.TRUNCATION_INDICATORS.markdown;
|
|
247
|
+
if (originalLength <= maxLength) {
|
|
248
|
+
return {
|
|
249
|
+
content,
|
|
250
|
+
wasTruncated: false,
|
|
251
|
+
originalLength,
|
|
252
|
+
charactersRemoved: 0,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const lines = content.split('\n');
|
|
256
|
+
const result = [];
|
|
257
|
+
let currentLength = 0;
|
|
258
|
+
const targetLength = maxLength - truncIndicator.length;
|
|
259
|
+
for (const line of lines) {
|
|
260
|
+
const lineLength = line.length + 1; // +1 for newline
|
|
261
|
+
// Always include headers (they're important for structure)
|
|
262
|
+
const isHeader = /^#{1,6}\s/.test(line);
|
|
263
|
+
if (currentLength + lineLength <= targetLength) {
|
|
264
|
+
result.push(line);
|
|
265
|
+
currentLength += lineLength;
|
|
266
|
+
}
|
|
267
|
+
else if (isHeader && currentLength + lineLength <= maxLength * 1.1) {
|
|
268
|
+
// Allow slight overflow for headers
|
|
269
|
+
result.push(line);
|
|
270
|
+
currentLength += lineLength;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
// Try to truncate the current line at a sentence boundary
|
|
275
|
+
const remaining = targetLength - currentLength;
|
|
276
|
+
if (remaining > 50) {
|
|
277
|
+
const truncatedLine = truncateAtSentence(line, remaining);
|
|
278
|
+
if (truncatedLine.length > 0) {
|
|
279
|
+
result.push(truncatedLine);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const truncatedContent = result.join('\n') + truncIndicator;
|
|
286
|
+
return {
|
|
287
|
+
content: truncatedContent,
|
|
288
|
+
wasTruncated: true,
|
|
289
|
+
originalLength,
|
|
290
|
+
charactersRemoved: originalLength - truncatedContent.length,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Truncate text at a sentence boundary.
|
|
295
|
+
*/
|
|
296
|
+
function truncateAtSentence(text, maxLength) {
|
|
297
|
+
if (text.length <= maxLength) {
|
|
298
|
+
return text;
|
|
299
|
+
}
|
|
300
|
+
// Find last sentence ending before maxLength
|
|
301
|
+
const truncated = text.slice(0, maxLength);
|
|
302
|
+
const lastPeriod = truncated.lastIndexOf('. ');
|
|
303
|
+
const lastQuestion = truncated.lastIndexOf('? ');
|
|
304
|
+
const lastExclamation = truncated.lastIndexOf('! ');
|
|
305
|
+
const sentenceEnd = Math.max(lastPeriod, lastQuestion, lastExclamation);
|
|
306
|
+
if (sentenceEnd > maxLength * 0.5) {
|
|
307
|
+
return text.slice(0, sentenceEnd + 1);
|
|
308
|
+
}
|
|
309
|
+
// Fall back to word boundary
|
|
310
|
+
const lastSpace = truncated.lastIndexOf(' ');
|
|
311
|
+
if (lastSpace > maxLength * 0.7) {
|
|
312
|
+
return text.slice(0, lastSpace);
|
|
313
|
+
}
|
|
314
|
+
return truncated;
|
|
315
|
+
}
|
|
316
|
+
// ==================== Utility Functions ====================
|
|
317
|
+
/**
|
|
318
|
+
* Detect content type from content.
|
|
319
|
+
*
|
|
320
|
+
* @param content - Content to analyze
|
|
321
|
+
* @returns Detected content type
|
|
322
|
+
*/
|
|
323
|
+
export function detectContentType(content) {
|
|
324
|
+
const trimmed = content.trim();
|
|
325
|
+
// Check for JSON
|
|
326
|
+
if ((trimmed.startsWith('{') && trimmed.endsWith('}')) ||
|
|
327
|
+
(trimmed.startsWith('[') && trimmed.endsWith(']'))) {
|
|
328
|
+
try {
|
|
329
|
+
JSON.parse(trimmed);
|
|
330
|
+
return 'json';
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
// Not valid JSON
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
// Check for Markdown indicators
|
|
337
|
+
if (trimmed.includes('\n#') ||
|
|
338
|
+
trimmed.startsWith('#') ||
|
|
339
|
+
/^[-*]\s/.test(trimmed) ||
|
|
340
|
+
/^\d+\.\s/.test(trimmed) ||
|
|
341
|
+
trimmed.includes('```') ||
|
|
342
|
+
trimmed.includes('**') ||
|
|
343
|
+
trimmed.includes('__')) {
|
|
344
|
+
return 'markdown';
|
|
345
|
+
}
|
|
346
|
+
return 'text';
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Get the appropriate example length based on options.
|
|
350
|
+
*
|
|
351
|
+
* @param fullExamples - Whether to use full example length
|
|
352
|
+
* @param customLength - Custom length override
|
|
353
|
+
* @returns Example length to use
|
|
354
|
+
*/
|
|
355
|
+
export function getExampleLength(fullExamples, customLength) {
|
|
356
|
+
if (customLength !== undefined) {
|
|
357
|
+
return customLength;
|
|
358
|
+
}
|
|
359
|
+
return fullExamples ? EXAMPLE_OUTPUT.FULL_LENGTH : EXAMPLE_OUTPUT.DEFAULT_LENGTH;
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=smart-truncate.js.map
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized timeout management utilities.
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent timeout handling across all async operations
|
|
5
|
+
* to prevent indefinite hangs and improve reliability.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default timeout values in milliseconds.
|
|
9
|
+
*
|
|
10
|
+
* These reference the centralized constants where applicable,
|
|
11
|
+
* ensuring consistency across the codebase.
|
|
12
|
+
*/
|
|
13
|
+
export declare const DEFAULT_TIMEOUTS: {
|
|
14
|
+
/** Timeout for individual tool calls - uses INTERVIEW.TOOL_TIMEOUT */
|
|
15
|
+
readonly toolCall: 30000;
|
|
16
|
+
/** Timeout for LLM API calls - uses TIMEOUTS.INTERVIEW */
|
|
17
|
+
readonly llmCall: 60000;
|
|
18
|
+
/** Timeout for state snapshots - uses WORKFLOW.STATE_SNAPSHOT_TIMEOUT */
|
|
19
|
+
readonly stateSnapshot: 10000;
|
|
20
|
+
/** Timeout for individual probe tool calls - uses WORKFLOW.PROBE_TOOL_TIMEOUT */
|
|
21
|
+
readonly probeTool: 5000;
|
|
22
|
+
/** Timeout for resource reads - uses INTERVIEW.RESOURCE_TIMEOUT */
|
|
23
|
+
readonly resourceRead: 15000;
|
|
24
|
+
/** Timeout for HTTP requests - uses TIMEOUTS.CLOUD_API */
|
|
25
|
+
readonly httpRequest: 30000;
|
|
26
|
+
/** Timeout for SSE connection establishment */
|
|
27
|
+
readonly sseConnect: 10000;
|
|
28
|
+
/** Timeout for interview question generation (longer for local models) */
|
|
29
|
+
readonly questionGeneration: 120000;
|
|
30
|
+
/** Timeout for response analysis */
|
|
31
|
+
readonly responseAnalysis: 60000;
|
|
32
|
+
/** Timeout for profile synthesis */
|
|
33
|
+
readonly profileSynthesis: 120000;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Timeout configuration that can be passed to operations.
|
|
37
|
+
*/
|
|
38
|
+
export interface TimeoutConfig {
|
|
39
|
+
/** Timeout in milliseconds */
|
|
40
|
+
timeoutMs: number;
|
|
41
|
+
/** Name of the operation (for error messages) */
|
|
42
|
+
operationName: string;
|
|
43
|
+
/** Whether to log timeout warnings */
|
|
44
|
+
logWarning?: boolean;
|
|
45
|
+
/** Custom error message */
|
|
46
|
+
errorMessage?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Error class for timeout errors.
|
|
50
|
+
*/
|
|
51
|
+
export declare class TimeoutError extends Error {
|
|
52
|
+
readonly operationName: string;
|
|
53
|
+
readonly timeoutMs: number;
|
|
54
|
+
constructor(operationName: string, timeoutMs: number, message?: string);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Error class for aborted operations.
|
|
58
|
+
*/
|
|
59
|
+
export declare class AbortError extends Error {
|
|
60
|
+
readonly operationName: string;
|
|
61
|
+
constructor(operationName: string, message?: string);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if an AbortSignal is aborted and throw AbortError if so.
|
|
65
|
+
*
|
|
66
|
+
* @param signal - The AbortSignal to check
|
|
67
|
+
* @param operationName - Name of the operation for error messages
|
|
68
|
+
* @throws AbortError if the signal is aborted
|
|
69
|
+
*/
|
|
70
|
+
export declare function checkAborted(signal: AbortSignal | undefined, operationName: string): void;
|
|
71
|
+
/**
|
|
72
|
+
* Wrap a promise with a timeout.
|
|
73
|
+
*
|
|
74
|
+
* @param promise - The promise to wrap
|
|
75
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
76
|
+
* @param operationName - Name of the operation for error messages
|
|
77
|
+
* @returns The promise result or throws TimeoutError
|
|
78
|
+
*/
|
|
79
|
+
export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, operationName: string): Promise<T>;
|
|
80
|
+
/**
|
|
81
|
+
* Wrap a promise with a timeout and return a result object instead of throwing.
|
|
82
|
+
*
|
|
83
|
+
* @param promise - The promise to wrap
|
|
84
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
85
|
+
* @param operationName - Name of the operation
|
|
86
|
+
* @returns Object with either result or error
|
|
87
|
+
*/
|
|
88
|
+
export declare function withTimeoutResult<T>(promise: Promise<T>, timeoutMs: number, operationName: string): Promise<{
|
|
89
|
+
success: true;
|
|
90
|
+
result: T;
|
|
91
|
+
} | {
|
|
92
|
+
success: false;
|
|
93
|
+
error: TimeoutError | Error;
|
|
94
|
+
}>;
|
|
95
|
+
/**
|
|
96
|
+
* Create an abort controller that automatically aborts after a timeout.
|
|
97
|
+
*
|
|
98
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
99
|
+
* @param operationName - Name of the operation
|
|
100
|
+
* @returns AbortController and cleanup function
|
|
101
|
+
*/
|
|
102
|
+
export declare function createTimeoutAbortController(timeoutMs: number, operationName: string): {
|
|
103
|
+
controller: AbortController;
|
|
104
|
+
cleanup: () => void;
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Execute multiple promises with individual timeouts.
|
|
108
|
+
* Returns results for all, including those that timed out.
|
|
109
|
+
*
|
|
110
|
+
* @param operations - Array of operations with their timeouts
|
|
111
|
+
* @returns Array of results (either success with value or failure with error)
|
|
112
|
+
*/
|
|
113
|
+
export declare function withTimeoutAll<T>(operations: Array<{
|
|
114
|
+
promise: Promise<T>;
|
|
115
|
+
timeoutMs: number;
|
|
116
|
+
operationName: string;
|
|
117
|
+
}>): Promise<Array<{
|
|
118
|
+
success: true;
|
|
119
|
+
result: T;
|
|
120
|
+
} | {
|
|
121
|
+
success: false;
|
|
122
|
+
error: Error;
|
|
123
|
+
operationName: string;
|
|
124
|
+
}>>;
|
|
125
|
+
/**
|
|
126
|
+
* Execute a function with a timeout, retrying on timeout up to maxRetries.
|
|
127
|
+
*
|
|
128
|
+
* @param fn - Function to execute
|
|
129
|
+
* @param timeoutMs - Timeout per attempt
|
|
130
|
+
* @param operationName - Name of the operation
|
|
131
|
+
* @param maxRetries - Maximum number of retries (default: 1)
|
|
132
|
+
* @returns The function result
|
|
133
|
+
*/
|
|
134
|
+
export declare function withTimeoutRetry<T>(fn: () => Promise<T>, timeoutMs: number, operationName: string, maxRetries?: number): Promise<T>;
|
|
135
|
+
/**
|
|
136
|
+
* Create a deadline-based timeout manager.
|
|
137
|
+
* Useful for operations with multiple steps that should complete within a total time.
|
|
138
|
+
*
|
|
139
|
+
* @param totalTimeoutMs - Total time allowed for all operations
|
|
140
|
+
* @param operationName - Name of the overall operation
|
|
141
|
+
* @returns Deadline manager
|
|
142
|
+
*/
|
|
143
|
+
export declare function createDeadline(totalTimeoutMs: number, operationName: string): {
|
|
144
|
+
/** Get remaining time in milliseconds */
|
|
145
|
+
getRemainingMs: () => number;
|
|
146
|
+
/** Check if deadline has passed */
|
|
147
|
+
isExpired: () => boolean;
|
|
148
|
+
/** Get timeout for a sub-operation (remaining time or max, whichever is smaller) */
|
|
149
|
+
getTimeoutFor: (maxMs: number) => number;
|
|
150
|
+
/** Throw if deadline has passed */
|
|
151
|
+
checkDeadline: () => void;
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=timeout.d.ts.map
|