salmon-loop 0.2.3
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/LICENSE +21 -0
- package/README.md +144 -0
- package/README.zh-CN.md +144 -0
- package/dist/cli/argv/headless-detection.js +60 -0
- package/dist/cli/argv/print-mode.js +60 -0
- package/dist/cli/authorization/allowlist.js +908 -0
- package/dist/cli/authorization/non-interactive.js +166 -0
- package/dist/cli/authorization/provider.js +416 -0
- package/dist/cli/chat-interface.js +83 -0
- package/dist/cli/chat.js +492 -0
- package/dist/cli/cli-runtime-context.js +12 -0
- package/dist/cli/commander-error-adapter.js +35 -0
- package/dist/cli/commander-error-meta.js +13 -0
- package/dist/cli/commands/allowlist.js +270 -0
- package/dist/cli/commands/chat.js +120 -0
- package/dist/cli/commands/config.js +250 -0
- package/dist/cli/commands/context.js +57 -0
- package/dist/cli/commands/dispatcher.js +53 -0
- package/dist/cli/commands/exit.js +9 -0
- package/dist/cli/commands/llm-output.js +135 -0
- package/dist/cli/commands/log-mode.js +143 -0
- package/dist/cli/commands/mode.js +136 -0
- package/dist/cli/commands/new.js +18 -0
- package/dist/cli/commands/parallel.js +256 -0
- package/dist/cli/commands/queue.js +130 -0
- package/dist/cli/commands/registry.js +85 -0
- package/dist/cli/commands/restore.js +26 -0
- package/dist/cli/commands/run/assistant-message.js +14 -0
- package/dist/cli/commands/run/config-resolution.js +37 -0
- package/dist/cli/commands/run/early-errors.js +108 -0
- package/dist/cli/commands/run/execute.js +73 -0
- package/dist/cli/commands/run/extensions-resolution.js +22 -0
- package/dist/cli/commands/run/handler.js +434 -0
- package/dist/cli/commands/run/headless-error-writer.js +182 -0
- package/dist/cli/commands/run/instruction-guard.js +24 -0
- package/dist/cli/commands/run/loop-params.js +46 -0
- package/dist/cli/commands/run/mode.js +8 -0
- package/dist/cli/commands/run/parse-options.js +67 -0
- package/dist/cli/commands/run/persist-session.js +35 -0
- package/dist/cli/commands/run/preflight.js +156 -0
- package/dist/cli/commands/run/reporter-factory.js +52 -0
- package/dist/cli/commands/run/runtime-llm.js +56 -0
- package/dist/cli/commands/run/runtime-options.js +30 -0
- package/dist/cli/commands/run/session.js +19 -0
- package/dist/cli/commands/run/structured-output.js +106 -0
- package/dist/cli/commands/run/types.js +2 -0
- package/dist/cli/commands/run/validate-options.js +28 -0
- package/dist/cli/commands/run/verbose.js +36 -0
- package/dist/cli/commands/run.js +2 -0
- package/dist/cli/commands/serve.js +323 -0
- package/dist/cli/commands/session.js +77 -0
- package/dist/cli/commands/snapshot-interactive.js +165 -0
- package/dist/cli/commands/snapshot.js +159 -0
- package/dist/cli/commands/status.js +17 -0
- package/dist/cli/commands/subagent.js +178 -0
- package/dist/cli/commands/subcommand-suggestions.js +63 -0
- package/dist/cli/commands/tool-names.js +155 -0
- package/dist/cli/commands/types.js +2 -0
- package/dist/cli/commands/utils.js +42 -0
- package/dist/cli/config.js +16 -0
- package/dist/cli/crash-reporter.js +5 -0
- package/dist/cli/headless/anthropic-stream-normalized-encoder.js +164 -0
- package/dist/cli/headless/anthropic-stream-protocol.js +62 -0
- package/dist/cli/headless/json-protocol.js +124 -0
- package/dist/cli/headless/native-stream-normalized-encoder.js +206 -0
- package/dist/cli/headless/openai-responses-canonical-applier.js +94 -0
- package/dist/cli/headless/openai-responses-state.js +294 -0
- package/dist/cli/headless/openai-stream-encoder.js +152 -0
- package/dist/cli/headless/stdout-writer.js +9 -0
- package/dist/cli/headless/stream-json-protocol.js +136 -0
- package/dist/cli/index.js +8 -0
- package/dist/cli/locales/en.js +409 -0
- package/dist/cli/locales/index.js +7 -0
- package/dist/cli/program-bootstrap.js +14 -0
- package/dist/cli/program-commands.js +106 -0
- package/dist/cli/program-options.js +15 -0
- package/dist/cli/program-output-mode.js +11 -0
- package/dist/cli/program-parse.js +24 -0
- package/dist/cli/reporters/anthropic-stream.js +77 -0
- package/dist/cli/reporters/base.js +2 -0
- package/dist/cli/reporters/json.js +69 -0
- package/dist/cli/reporters/openai-stream.js +72 -0
- package/dist/cli/reporters/standard.js +226 -0
- package/dist/cli/reporters/stderr-log-reporter.js +71 -0
- package/dist/cli/reporters/stream-json.js +111 -0
- package/dist/cli/run-cli.js +25 -0
- package/dist/cli/slash/runtime.js +240 -0
- package/dist/cli/ui/App.js +273 -0
- package/dist/cli/ui/authorization/bus.js +35 -0
- package/dist/cli/ui/components/CommandInput.js +200 -0
- package/dist/cli/ui/components/CommandSuggestionList.js +20 -0
- package/dist/cli/ui/components/Markdown.js +423 -0
- package/dist/cli/ui/components/MessageList.js +34 -0
- package/dist/cli/ui/components/StatusBannerLine.js +7 -0
- package/dist/cli/ui/components/TodoDrawer.js +60 -0
- package/dist/cli/ui/components/WelcomeMessage.js +14 -0
- package/dist/cli/ui/components/animations/StretchingThinking.js +51 -0
- package/dist/cli/ui/components/animations/ThinkingWave.js +15 -0
- package/dist/cli/ui/components/animations/TypeIndicator.js +30 -0
- package/dist/cli/ui/components/layout/SplitPane.js +11 -0
- package/dist/cli/ui/components/messageList/MessageItem.js +27 -0
- package/dist/cli/ui/components/messageList/QueuePreviewList.js +11 -0
- package/dist/cli/ui/components/messageList/items/EmphasisMessageItem.js +20 -0
- package/dist/cli/ui/components/messageList/items/InterruptMessageItem.js +10 -0
- package/dist/cli/ui/components/messageList/items/LightweightMessageItem.js +12 -0
- package/dist/cli/ui/components/messageList/items/StandardMessageItem.js +23 -0
- package/dist/cli/ui/components/messageList/items/WelcomeMessageItem.js +7 -0
- package/dist/cli/ui/components/messageList/messageListLayout.js +27 -0
- package/dist/cli/ui/components/messageList/streaming.js +51 -0
- package/dist/cli/ui/components/messageList/types.js +2 -0
- package/dist/cli/ui/components/messageList/utils.js +7 -0
- package/dist/cli/ui/components/sidebar/FileContext.js +8 -0
- package/dist/cli/ui/components/sidebar/MissionControl.js +8 -0
- package/dist/cli/ui/config.js +59 -0
- package/dist/cli/ui/hooks/useCommandLifecycle.js +110 -0
- package/dist/cli/ui/hooks/useCommandSuggestions.js +87 -0
- package/dist/cli/ui/hooks/useInputHistory.js +57 -0
- package/dist/cli/ui/hooks/useLoopEvents.js +382 -0
- package/dist/cli/ui/hooks/useLoopState.js +73 -0
- package/dist/cli/ui/hooks/useOnionExit.js +31 -0
- package/dist/cli/ui/hooks/useTerminalDimensions.js +34 -0
- package/dist/cli/ui/index.js +136 -0
- package/dist/cli/ui/selection/bus.js +35 -0
- package/dist/cli/ui/status/formatStatusBanner.js +8 -0
- package/dist/cli/ui/store/context.js +17 -0
- package/dist/cli/ui/store/reducer.js +264 -0
- package/dist/cli/ui/store/types.js +81 -0
- package/dist/cli/ui/styles/theme.js +295 -0
- package/dist/cli/ui/types.js +2 -0
- package/dist/cli/ui/utils/sanitizer.js +122 -0
- package/dist/cli/ui/utils/transcript.js +28 -0
- package/dist/cli/utils/asyncQueue.js +125 -0
- package/dist/cli/utils/audit-scope.js +10 -0
- package/dist/cli/utils/detectors/index.js +38 -0
- package/dist/cli/utils/llm-output.js +34 -0
- package/dist/cli/utils/outcome-reporter.js +17 -0
- package/dist/cli/utils/safe-fs.js +184 -0
- package/dist/cli/utils/verify-resolver.js +34 -0
- package/dist/cli/utils/worktree-prepare-resolver.js +18 -0
- package/dist/core/adapters/fs/atomic-file-writer.js +129 -0
- package/dist/core/adapters/fs/file-adapter.js +95 -0
- package/dist/core/adapters/fs/filesystem.js +31 -0
- package/dist/core/adapters/fs/index.js +5 -0
- package/dist/core/adapters/fs/node-fs.js +7 -0
- package/dist/core/adapters/fs/readonly-filesystem.js +23 -0
- package/dist/core/adapters/git/git-adapter.js +704 -0
- package/dist/core/adapters/git/git-runner.js +119 -0
- package/dist/core/adapters/git/lock-manager.js +314 -0
- package/dist/core/adapters/git/types.js +2 -0
- package/dist/core/adapters/path/index.js +2 -0
- package/dist/core/adapters/path/path-adapter.js +23 -0
- package/dist/core/ast/guard.js +116 -0
- package/dist/core/ast/index.js +4 -0
- package/dist/core/ast/parser.js +284 -0
- package/dist/core/ast/validator.js +46 -0
- package/dist/core/backends/salmon-loop/task-executor.js +68 -0
- package/dist/core/checkpoint-domain/manifest-store.js +379 -0
- package/dist/core/checkpoint-domain/service.js +84 -0
- package/dist/core/checkpoint-domain/types.js +2 -0
- package/dist/core/config/defaults.js +50 -0
- package/dist/core/config/errors.js +11 -0
- package/dist/core/config/file-format.js +108 -0
- package/dist/core/config/index.js +7 -0
- package/dist/core/config/limits.js +77 -0
- package/dist/core/config/load.js +34 -0
- package/dist/core/config/normalize.js +35 -0
- package/dist/core/config/paths.js +20 -0
- package/dist/core/config/redact.js +16 -0
- package/dist/core/config/resolve-env.js +43 -0
- package/dist/core/config/resolve-llm.js +130 -0
- package/dist/core/config/resolve.js +68 -0
- package/dist/core/config/resolvers/ast-validation.js +8 -0
- package/dist/core/config/resolvers/context.js +21 -0
- package/dist/core/config/resolvers/observability.js +45 -0
- package/dist/core/config/resolvers/output.js +8 -0
- package/dist/core/config/resolvers/permission-mode.js +6 -0
- package/dist/core/config/resolvers/security.js +14 -0
- package/dist/core/config/resolvers/server.js +36 -0
- package/dist/core/config/resolvers/tool-authorization.js +39 -0
- package/dist/core/config/resolvers/ui.js +26 -0
- package/dist/core/config/types/config-file.js +2 -0
- package/dist/core/config/types/primitives.js +9 -0
- package/dist/core/config/types/resolved.js +2 -0
- package/dist/core/config/types.js +4 -0
- package/dist/core/config/validate.js +852 -0
- package/dist/core/context/assembly/default-prompt-assembler.js +7 -0
- package/dist/core/context/assembly/prompt-assembler.js +2 -0
- package/dist/core/context/ast/import-extractor.js +28 -0
- package/dist/core/context/ast/module-resolver.js +61 -0
- package/dist/core/context/ast/source-outline.js +25 -0
- package/dist/core/context/audit-constants.js +23 -0
- package/dist/core/context/audit.js +54 -0
- package/dist/core/context/budget/dynamic-adjuster.js +149 -0
- package/dist/core/context/budget/example-integration.js +49 -0
- package/dist/core/context/budget/integration.js +93 -0
- package/dist/core/context/builder.js +289 -0
- package/dist/core/context/cache/errors.js +16 -0
- package/dist/core/context/cache/incremental-updater.js +131 -0
- package/dist/core/context/cache/index.js +25 -0
- package/dist/core/context/cache/path-resolver.js +127 -0
- package/dist/core/context/cache/prompt-caching.js +207 -0
- package/dist/core/context/cache/store-factory.js +63 -0
- package/dist/core/context/cache/store.js +193 -0
- package/dist/core/context/cache/types.js +15 -0
- package/dist/core/context/compression/js-like-comments.js +139 -0
- package/dist/core/context/compression/smart-compress.js +61 -0
- package/dist/core/context/compression/whitespace.js +26 -0
- package/dist/core/context/dependencies.js +102 -0
- package/dist/core/context/effectiveness/index.js +25 -0
- package/dist/core/context/effectiveness/tracker.js +253 -0
- package/dist/core/context/effectiveness/types.js +15 -0
- package/dist/core/context/formatters/index.js +7 -0
- package/dist/core/context/formatters/json-converter.js +662 -0
- package/dist/core/context/formatters/types.js +6 -0
- package/dist/core/context/formatters/xml-context.js +296 -0
- package/dist/core/context/gatherers/architecture-gatherer.js +75 -0
- package/dist/core/context/gatherers/artifact-gatherer.js +53 -0
- package/dist/core/context/gatherers/ast-gatherer.js +370 -0
- package/dist/core/context/gatherers/ghost-dependency-gatherer.js +46 -0
- package/dist/core/context/gatherers/git-diff-gatherer.js +91 -0
- package/dist/core/context/gatherers/git-history-gatherer.js +57 -0
- package/dist/core/context/gatherers/knowledge-gatherer.js +101 -0
- package/dist/core/context/gatherers/metadata-gatherer.js +59 -0
- package/dist/core/context/gatherers/primary-text-gatherer.js +36 -0
- package/dist/core/context/gatherers/ripgrep-gatherer.js +104 -0
- package/dist/core/context/hash.js +52 -0
- package/dist/core/context/index.js +3 -0
- package/dist/core/context/keywords.js +179 -0
- package/dist/core/context/policies/budget-policy.js +36 -0
- package/dist/core/context/policies/pack-until-full.js +419 -0
- package/dist/core/context/scoring/relevance.js +191 -0
- package/dist/core/context/service-deps.js +32 -0
- package/dist/core/context/service-helpers.js +32 -0
- package/dist/core/context/service.js +265 -0
- package/dist/core/context/steps/context-budget.js +157 -0
- package/dist/core/context/steps/context-gather.js +71 -0
- package/dist/core/context/steps/context-primary.js +19 -0
- package/dist/core/context/steps/context-promotion.js +78 -0
- package/dist/core/context/steps/context-targets.js +85 -0
- package/dist/core/context/steps/types.js +2 -0
- package/dist/core/context/summarization/index.js +27 -0
- package/dist/core/context/summarization/prompts.js +80 -0
- package/dist/core/context/summarization/summarizer.js +377 -0
- package/dist/core/context/summarization/types.js +29 -0
- package/dist/core/context/targeting/churn-policy.js +27 -0
- package/dist/core/context/targeting/target-resolver.js +491 -0
- package/dist/core/context/token/adaptive-budget.js +364 -0
- package/dist/core/context/token/cache.js +163 -0
- package/dist/core/context/token/counter.js +190 -0
- package/dist/core/context/token/encoding-registry.js +173 -0
- package/dist/core/context/token/index.js +31 -0
- package/dist/core/context/token/token-budget.js +213 -0
- package/dist/core/context/token/types.js +10 -0
- package/dist/core/context/truncation/index.js +23 -0
- package/dist/core/context/truncation/semantic-truncator.js +103 -0
- package/dist/core/context/truncation/strategies/error-stack.js +94 -0
- package/dist/core/context/truncation/strategies/generic.js +48 -0
- package/dist/core/context/truncation/strategies/git-diff.js +99 -0
- package/dist/core/context/truncation/strategies/index.js +10 -0
- package/dist/core/context/truncation/strategies/json.js +142 -0
- package/dist/core/context/truncation/strategies/log.js +131 -0
- package/dist/core/context/truncation/strategies/test-result.js +140 -0
- package/dist/core/context/truncation/type-detector.js +133 -0
- package/dist/core/context/truncation/types.js +16 -0
- package/dist/core/context/types.js +2 -0
- package/dist/core/extensions/index.js +118 -0
- package/dist/core/extensions/load.js +36 -0
- package/dist/core/extensions/merge.js +29 -0
- package/dist/core/extensions/paths.js +40 -0
- package/dist/core/extensions/redact.js +37 -0
- package/dist/core/extensions/schemas.js +70 -0
- package/dist/core/extensions/types.js +2 -0
- package/dist/core/facades/cli-authorization-allowlist.js +3 -0
- package/dist/core/facades/cli-authorization-non-interactive.js +3 -0
- package/dist/core/facades/cli-authorization-provider.js +2 -0
- package/dist/core/facades/cli-chat.js +11 -0
- package/dist/core/facades/cli-command-allowlist.js +3 -0
- package/dist/core/facades/cli-command-chat.js +8 -0
- package/dist/core/facades/cli-command-checkpoint.js +3 -0
- package/dist/core/facades/cli-command-config.js +10 -0
- package/dist/core/facades/cli-command-dispatcher.js +2 -0
- package/dist/core/facades/cli-command-parallel.js +8 -0
- package/dist/core/facades/cli-command-session.js +2 -0
- package/dist/core/facades/cli-command-tool-names.js +6 -0
- package/dist/core/facades/cli-context.js +8 -0
- package/dist/core/facades/cli-headless.js +3 -0
- package/dist/core/facades/cli-observability.js +3 -0
- package/dist/core/facades/cli-program-bootstrap.js +2 -0
- package/dist/core/facades/cli-reporters.js +5 -0
- package/dist/core/facades/cli-run-execute.js +3 -0
- package/dist/core/facades/cli-run-handler.js +7 -0
- package/dist/core/facades/cli-run-headless-error-writer.js +2 -0
- package/dist/core/facades/cli-run-loop-params.js +2 -0
- package/dist/core/facades/cli-run-persist-session.js +2 -0
- package/dist/core/facades/cli-run-runtime-llm.js +5 -0
- package/dist/core/facades/cli-serve.js +21 -0
- package/dist/core/facades/cli-slash-runtime.js +9 -0
- package/dist/core/facades/cli-subagent.js +2 -0
- package/dist/core/facades/cli-ui.js +5 -0
- package/dist/core/facades/cli-utils-llm-output.js +3 -0
- package/dist/core/facades/cli-utils-path.js +2 -0
- package/dist/core/facades/cli-utils-worktree.js +2 -0
- package/dist/core/failure/diagnostics.js +221 -0
- package/dist/core/feedback/index.js +28 -0
- package/dist/core/feedback/parsers.js +59 -0
- package/dist/core/feedback/patterns.js +26 -0
- package/dist/core/feedback/types.js +2 -0
- package/dist/core/grizzco/domain/grizzco-types.js +41 -0
- package/dist/core/grizzco/dsl/DecisionEngine.js +149 -0
- package/dist/core/grizzco/dsl/MicroTaskRunner.js +39 -0
- package/dist/core/grizzco/dsl/llm-strategy.js +80 -0
- package/dist/core/grizzco/dsl/strategies.js +69 -0
- package/dist/core/grizzco/dsl/types.js +2 -0
- package/dist/core/grizzco/engine/observability/event-adapter.js +41 -0
- package/dist/core/grizzco/engine/observability/index.js +3 -0
- package/dist/core/grizzco/engine/observability/loop-telemetry.js +51 -0
- package/dist/core/grizzco/engine/outcome/index.js +2 -0
- package/dist/core/grizzco/engine/outcome/loop-result-mapper.js +167 -0
- package/dist/core/grizzco/engine/pipeline/pipeline.js +335 -0
- package/dist/core/grizzco/engine/pipeline/types.js +2 -0
- package/dist/core/grizzco/engine/transaction/attempt-failure.js +242 -0
- package/dist/core/grizzco/engine/transaction/authorization-summary.js +44 -0
- package/dist/core/grizzco/engine/transaction/index.js +3 -0
- package/dist/core/grizzco/engine/transaction/report-mapper.js +50 -0
- package/dist/core/grizzco/engine/transaction/retry-policy.js +19 -0
- package/dist/core/grizzco/engine/transaction/runner-builder.js +45 -0
- package/dist/core/grizzco/engine/transaction/session.js +58 -0
- package/dist/core/grizzco/engine/transaction/transaction-runner.js +193 -0
- package/dist/core/grizzco/engine/transaction/types.js +2 -0
- package/dist/core/grizzco/execution/Executor.js +58 -0
- package/dist/core/grizzco/execution/RejectionManager.js +71 -0
- package/dist/core/grizzco/execution/WorkerFactory.js +31 -0
- package/dist/core/grizzco/flows/SalmonLoopFlow.js +102 -0
- package/dist/core/grizzco/runtime/apply-back-runtime.js +136 -0
- package/dist/core/grizzco/runtime/apply-back-utils.js +13 -0
- package/dist/core/grizzco/runtime/host/host-runner.js +99 -0
- package/dist/core/grizzco/runtime/host/index.js +2 -0
- package/dist/core/grizzco/runtime/host/types.js +2 -0
- package/dist/core/grizzco/services/CachedService.js +42 -0
- package/dist/core/grizzco/services/implementations/default/GitConfigService.js +38 -0
- package/dist/core/grizzco/services/implementations/mock/MockLockService.js +11 -0
- package/dist/core/grizzco/services/implementations/mock/MockUserQuotaService.js +11 -0
- package/dist/core/grizzco/services/registry.js +30 -0
- package/dist/core/grizzco/services/types.js +2 -0
- package/dist/core/grizzco/steps/answer.js +75 -0
- package/dist/core/grizzco/steps/apply-back.js +46 -0
- package/dist/core/grizzco/steps/apply.js +136 -0
- package/dist/core/grizzco/steps/ast-validate.js +37 -0
- package/dist/core/grizzco/steps/audit.js +311 -0
- package/dist/core/grizzco/steps/context.js +74 -0
- package/dist/core/grizzco/steps/display-answer.js +6 -0
- package/dist/core/grizzco/steps/display-report.js +158 -0
- package/dist/core/grizzco/steps/display-research.js +6 -0
- package/dist/core/grizzco/steps/displayReview.js +6 -0
- package/dist/core/grizzco/steps/explore.js +245 -0
- package/dist/core/grizzco/steps/extractIssues.js +27 -0
- package/dist/core/grizzco/steps/generateFixPlan.js +13 -0
- package/dist/core/grizzco/steps/generateReview.js +71 -0
- package/dist/core/grizzco/steps/patch.js +220 -0
- package/dist/core/grizzco/steps/plan.js +191 -0
- package/dist/core/grizzco/steps/preflight.js +93 -0
- package/dist/core/grizzco/steps/prepare-deps.js +49 -0
- package/dist/core/grizzco/steps/read-only-shrink.js +4 -0
- package/dist/core/grizzco/steps/research.js +188 -0
- package/dist/core/grizzco/steps/rollback.js +138 -0
- package/dist/core/grizzco/steps/shrink.js +64 -0
- package/dist/core/grizzco/steps/validate.js +40 -0
- package/dist/core/grizzco/steps/verify.js +136 -0
- package/dist/core/grizzco/validation/AstValidationService.js +133 -0
- package/dist/core/grizzco/validation/ContextValidator.js +17 -0
- package/dist/core/grizzco/validation/ast-validation-policy.js +11 -0
- package/dist/core/grizzco/workers/direct-write-worker.js +44 -0
- package/dist/core/grizzco/workers/git-apply-worker.js +75 -0
- package/dist/core/grizzco/workers/i-merge-worker.js +2 -0
- package/dist/core/grizzco/workers/mm-three-way-worker.js +117 -0
- package/dist/core/grizzco/workers/no-op-worker.js +18 -0
- package/dist/core/grizzco/workers/overwrite-binary-worker.js +29 -0
- package/dist/core/grizzco/workers/strata-sync-worker.js +69 -0
- package/dist/core/grizzco/workers/three-way-merge-worker.js +84 -0
- package/dist/core/grizzco/workers/three-way-staged-worker.js +93 -0
- package/dist/core/grizzco/workers/union-merge-worker.js +71 -0
- package/dist/core/history/input-history.js +55 -0
- package/dist/core/intent/chat-intent.js +250 -0
- package/dist/core/interaction/events/bus.js +52 -0
- package/dist/core/interaction/model/events.js +2 -0
- package/dist/core/interaction/model/index.js +3 -0
- package/dist/core/interaction/model/task-state.js +9 -0
- package/dist/core/interaction/model/transition-policy.js +50 -0
- package/dist/core/interaction/model/types.js +2 -0
- package/dist/core/interaction/orchestration/facade.js +190 -0
- package/dist/core/interaction/orchestration/index.js +2 -0
- package/dist/core/interaction/orchestration/store.js +32 -0
- package/dist/core/interaction/sync/task-sync-engine.js +57 -0
- package/dist/core/interaction/turn-stop-reason.js +27 -0
- package/dist/core/language-support/index.js +3 -0
- package/dist/core/language-support/orchestrator.js +37 -0
- package/dist/core/language-support/strategies/extension-candidate-strategy.js +27 -0
- package/dist/core/language-support/strategies/index.js +3 -0
- package/dist/core/language-support/strategies/language-query-strategy.js +26 -0
- package/dist/core/llm/ai-sdk/chat-executor.js +88 -0
- package/dist/core/llm/ai-sdk/langfuse-headers.js +28 -0
- package/dist/core/llm/ai-sdk/message-mapper.js +240 -0
- package/dist/core/llm/ai-sdk/observation-context.js +16 -0
- package/dist/core/llm/ai-sdk/provider-factory.js +29 -0
- package/dist/core/llm/ai-sdk/request-params.js +18 -0
- package/dist/core/llm/ai-sdk/request-runtime.js +168 -0
- package/dist/core/llm/ai-sdk/result-mapper.js +31 -0
- package/dist/core/llm/ai-sdk/retry-classifier.js +82 -0
- package/dist/core/llm/ai-sdk/retry-executor.js +38 -0
- package/dist/core/llm/ai-sdk.js +92 -0
- package/dist/core/llm/audit.js +2 -0
- package/dist/core/llm/base-url.js +18 -0
- package/dist/core/llm/contracts/repair.js +68 -0
- package/dist/core/llm/errors.js +172 -0
- package/dist/core/llm/factory.js +21 -0
- package/dist/core/llm/http/index.js +2 -0
- package/dist/core/llm/index.js +6 -0
- package/dist/core/llm/message-composition.js +25 -0
- package/dist/core/llm/openai.js +69 -0
- package/dist/core/llm/output-policy.js +192 -0
- package/dist/core/llm/phase-router.js +55 -0
- package/dist/core/llm/redact.js +37 -0
- package/dist/core/llm/registry.js +81 -0
- package/dist/core/llm/retry-utils.js +114 -0
- package/dist/core/llm/stream-utils.js +87 -0
- package/dist/core/llm/utils.js +82 -0
- package/dist/core/observability/audit-file.js +199 -0
- package/dist/core/observability/audit-trail.js +125 -0
- package/dist/core/observability/authorization-decisions.js +54 -0
- package/dist/core/observability/debug-artifacts.js +61 -0
- package/dist/core/observability/error-envelope.js +63 -0
- package/dist/core/observability/error-mapping.js +271 -0
- package/dist/core/observability/ignored-error.js +6 -0
- package/dist/core/observability/logger.js +457 -0
- package/dist/core/observability/loop-event-reporter.js +46 -0
- package/dist/core/observability/monitor.js +240 -0
- package/dist/core/observability/run-outcome-reporter.js +15 -0
- package/dist/core/observability/token-usage.js +36 -0
- package/dist/core/observability/ui-log-sanitize.js +35 -0
- package/dist/core/patch/aggregator.js +93 -0
- package/dist/core/patch/diff.js +298 -0
- package/dist/core/permission-gate/default-gate.js +115 -0
- package/dist/core/permission-gate/gate.js +2 -0
- package/dist/core/permission-gate/types.js +2 -0
- package/dist/core/plan/index.js +2 -0
- package/dist/core/plan/manager.js +123 -0
- package/dist/core/plan/markdown-editor.js +238 -0
- package/dist/core/plan/storage.js +75 -0
- package/dist/core/plan/types.js +2 -0
- package/dist/core/plugin/interface.js +2 -0
- package/dist/core/plugin/loader.js +130 -0
- package/dist/core/plugin/registry.js +90 -0
- package/dist/core/plugin/validator.js +98 -0
- package/dist/core/prompts/registry.js +189 -0
- package/dist/core/prompts/runtime.js +69 -0
- package/dist/core/prompts/schema.js +2 -0
- package/dist/core/prompts/templates/phases/explore_user.hbs +26 -0
- package/dist/core/prompts/templates/phases/patch_user.hbs +57 -0
- package/dist/core/prompts/templates/phases/plan_user.hbs +33 -0
- package/dist/core/prompts/templates/system/_context_json_legend.hbs +21 -0
- package/dist/core/prompts/templates/system/_tool_defs.hbs +60 -0
- package/dist/core/prompts/templates/system/explore_system.hbs +26 -0
- package/dist/core/prompts/templates/system/main_system.hbs +18 -0
- package/dist/core/prompts/templates/system/patch_system.hbs +10 -0
- package/dist/core/prompts/templates/system/plan_system.hbs +1 -0
- package/dist/core/prompts/templates/system/reflection.hbs +39 -0
- package/dist/core/protocols/a2a/agent-card.js +30 -0
- package/dist/core/protocols/a2a/mapper.js +14 -0
- package/dist/core/protocols/a2a/sdk/auth-middleware.js +31 -0
- package/dist/core/protocols/a2a/sdk/executor.js +301 -0
- package/dist/core/protocols/a2a/sdk/server.js +24 -0
- package/dist/core/protocols/a2a/task-projection.js +45 -0
- package/dist/core/protocols/acp/acp-command-runner.js +204 -0
- package/dist/core/protocols/acp/acp-filesystem.js +43 -0
- package/dist/core/protocols/acp/checkpoint-meta.js +2 -0
- package/dist/core/protocols/acp/formal-agent.js +1201 -0
- package/dist/core/protocols/acp/handlers.js +51 -0
- package/dist/core/protocols/acp/permission-provider.js +122 -0
- package/dist/core/protocols/acp/stdio-server.js +116 -0
- package/dist/core/reflection/engine.js +55 -0
- package/dist/core/reflection/types.js +2 -0
- package/dist/core/runtime/agent-server-runtime.js +88 -0
- package/dist/core/runtime/bun-runtime.js +26 -0
- package/dist/core/runtime/command-runner-context.js +16 -0
- package/dist/core/runtime/exit-codes.js +11 -0
- package/dist/core/runtime/fastify-fetch-bridge.js +51 -0
- package/dist/core/runtime/fastify-server-bundle.js +26 -0
- package/dist/core/runtime/initialize.js +132 -0
- package/dist/core/runtime/loop-finalize.js +71 -0
- package/dist/core/runtime/loop-run-lifecycle.js +73 -0
- package/dist/core/runtime/loop-run-reporter.js +19 -0
- package/dist/core/runtime/loop-runtime-config.js +26 -0
- package/dist/core/runtime/loop-session-runner.js +30 -0
- package/dist/core/runtime/loop.js +84 -0
- package/dist/core/runtime/paths.js +84 -0
- package/dist/core/runtime/process-runner.js +16 -0
- package/dist/core/runtime/process-types.js +2 -0
- package/dist/core/runtime/semaphore.js +41 -0
- package/dist/core/runtime/sidecar-fastify-plugin.js +35 -0
- package/dist/core/runtime/sidecar-paths.js +47 -0
- package/dist/core/runtime/sidecar-route-catalog.js +103 -0
- package/dist/core/runtime/spawn-command.js +392 -0
- package/dist/core/runtime/spawn-interactive.js +71 -0
- package/dist/core/security/redaction.js +160 -0
- package/dist/core/session/compression.js +323 -0
- package/dist/core/session/flow.js +85 -0
- package/dist/core/session/manager.js +313 -0
- package/dist/core/session/pruning-strategy.js +153 -0
- package/dist/core/session/session-context-builder.js +122 -0
- package/dist/core/session/summary-sync.js +82 -0
- package/dist/core/session/token-tracker.js +82 -0
- package/dist/core/session/types.js +2 -0
- package/dist/core/skills/bridge.js +33 -0
- package/dist/core/skills/index.js +8 -0
- package/dist/core/skills/loader.js +80 -0
- package/dist/core/skills/parser.js +66 -0
- package/dist/core/skills/runtime/MicroTaskRunner.js +102 -0
- package/dist/core/skills/runtime/SkillRunner.js +108 -0
- package/dist/core/skills/strategy.js +29 -0
- package/dist/core/skills/types.js +2 -0
- package/dist/core/slash/index.js +6 -0
- package/dist/core/slash/parser.js +33 -0
- package/dist/core/slash/registry.js +78 -0
- package/dist/core/slash/router.js +76 -0
- package/dist/core/slash/steps/slash-decide.js +19 -0
- package/dist/core/slash/steps/slash-execute.js +73 -0
- package/dist/core/slash/steps/types.js +2 -0
- package/dist/core/slash/strategy.js +33 -0
- package/dist/core/slash/types.js +2 -0
- package/dist/core/strata/checkpoint/manager.js +492 -0
- package/dist/core/strata/checkpoint/snapshot-audit.js +88 -0
- package/dist/core/strata/checkpoint/snapshot-create.js +79 -0
- package/dist/core/strata/checkpoint/snapshot-write-tree.js +72 -0
- package/dist/core/strata/engine/shadow-merge-engine.js +394 -0
- package/dist/core/strata/index.js +15 -0
- package/dist/core/strata/interaction/content-guardian.js +59 -0
- package/dist/core/strata/interaction/file-system-provider.js +89 -0
- package/dist/core/strata/layers/file-state-resolver.js +157 -0
- package/dist/core/strata/layers/immutable-git-layer.js +42 -0
- package/dist/core/strata/layers/shadow-driver/copy-backend.js +114 -0
- package/dist/core/strata/layers/shadow-driver/env.js +29 -0
- package/dist/core/strata/layers/shadow-driver/error-classifier.js +41 -0
- package/dist/core/strata/layers/shadow-driver/index.js +17 -0
- package/dist/core/strata/layers/shadow-driver/readonly-lock.js +221 -0
- package/dist/core/strata/layers/shadow-driver/shadow-driver.js +234 -0
- package/dist/core/strata/layers/shadow-driver/strategy.js +86 -0
- package/dist/core/strata/layers/sidecar-layer.js +96 -0
- package/dist/core/strata/layers/worktree.js +240 -0
- package/dist/core/strata/runtime/environment.js +377 -0
- package/dist/core/strata/runtime/synchronizer.js +819 -0
- package/dist/core/strata/types.js +46 -0
- package/dist/core/streaming/canonical/canonical-responses-event-emitter.js +326 -0
- package/dist/core/streaming/canonical/function-call-item-id.js +13 -0
- package/dist/core/streaming/canonical/parts-from-llm-stream-chunk.js +54 -0
- package/dist/core/streaming/canonical/responses-event-emitter.js +127 -0
- package/dist/core/streaming/canonical/responses-events.js +2 -0
- package/dist/core/streaming/normalized-events.js +9 -0
- package/dist/core/streaming/normalized-from-text.js +47 -0
- package/dist/core/streaming/stream-assembler.js +347 -0
- package/dist/core/structured-output/index.js +3 -0
- package/dist/core/structured-output/json-extract.js +70 -0
- package/dist/core/structured-output/json-schema-validator.js +90 -0
- package/dist/core/structured-output/types.js +2 -0
- package/dist/core/sub-agent/artifacts/store.js +141 -0
- package/dist/core/sub-agent/artifacts/types.js +2 -0
- package/dist/core/sub-agent/controller.js +69 -0
- package/dist/core/sub-agent/core/loop.js +79 -0
- package/dist/core/sub-agent/core/manager.js +246 -0
- package/dist/core/sub-agent/registry-defaults.js +52 -0
- package/dist/core/sub-agent/registry.js +35 -0
- package/dist/core/sub-agent/tools/task-spawn.js +29 -0
- package/dist/core/sub-agent/types.js +23 -0
- package/dist/core/target-runtime/command-resolver.js +42 -0
- package/dist/core/target-runtime/index.js +3 -0
- package/dist/core/target-runtime/profile.js +73 -0
- package/dist/core/testgen/detector.js +17 -0
- package/dist/core/testgen/index.js +38 -0
- package/dist/core/testgen/templates.js +46 -0
- package/dist/core/tools/audit.js +140 -0
- package/dist/core/tools/authorization/types.js +2 -0
- package/dist/core/tools/budget.js +118 -0
- package/dist/core/tools/builtin/artifact.js +29 -0
- package/dist/core/tools/builtin/ast-grep.js +107 -0
- package/dist/core/tools/builtin/ast.js +62 -0
- package/dist/core/tools/builtin/code-search/backends/powershell.js +84 -0
- package/dist/core/tools/builtin/code-search/backends/rg.js +85 -0
- package/dist/core/tools/builtin/code-search/executor.js +87 -0
- package/dist/core/tools/builtin/code-search/parse/plain-grep.js +59 -0
- package/dist/core/tools/builtin/code-search/parse/rg-json.js +31 -0
- package/dist/core/tools/builtin/code-search/spec.js +82 -0
- package/dist/core/tools/builtin/fs.js +243 -0
- package/dist/core/tools/builtin/git.js +118 -0
- package/dist/core/tools/builtin/index.js +80 -0
- package/dist/core/tools/builtin/interaction.js +120 -0
- package/dist/core/tools/builtin/knowledge.js +98 -0
- package/dist/core/tools/builtin/plan.js +148 -0
- package/dist/core/tools/builtin/proposal.js +207 -0
- package/dist/core/tools/builtin/shell.js +71 -0
- package/dist/core/tools/builtin/verify.js +41 -0
- package/dist/core/tools/capability/executor.js +84 -0
- package/dist/core/tools/capability/runner.js +50 -0
- package/dist/core/tools/capability/types.js +2 -0
- package/dist/core/tools/dispatcher.js +80 -0
- package/dist/core/tools/headless-payload.js +37 -0
- package/dist/core/tools/loader.js +100 -0
- package/dist/core/tools/mapper.js +142 -0
- package/dist/core/tools/mcp/client.js +308 -0
- package/dist/core/tools/mcp/loader.js +110 -0
- package/dist/core/tools/mcp/schema.js +54 -0
- package/dist/core/tools/mcp/streamable-http.js +101 -0
- package/dist/core/tools/mcp/types.js +26 -0
- package/dist/core/tools/parallel/isolation.js +25 -0
- package/dist/core/tools/parallel/lock-manager.js +124 -0
- package/dist/core/tools/parallel/persistence.js +126 -0
- package/dist/core/tools/parallel/plan-builder.js +66 -0
- package/dist/core/tools/parallel/plan.js +2 -0
- package/dist/core/tools/parallel/refs.js +7 -0
- package/dist/core/tools/parallel/resolve-args.js +50 -0
- package/dist/core/tools/parallel/resource-helpers.js +35 -0
- package/dist/core/tools/parallel/resources.js +2 -0
- package/dist/core/tools/parallel/scheduler.js +372 -0
- package/dist/core/tools/parser.js +89 -0
- package/dist/core/tools/permissions/permission-rules.js +503 -0
- package/dist/core/tools/plugins/loader.js +102 -0
- package/dist/core/tools/policy.js +87 -0
- package/dist/core/tools/registry.js +29 -0
- package/dist/core/tools/router.js +514 -0
- package/dist/core/tools/sanitize.js +78 -0
- package/dist/core/tools/schema-utils.js +71 -0
- package/dist/core/tools/session.js +1105 -0
- package/dist/core/tools/streaming/ToolCallAccumulator.js +64 -0
- package/dist/core/tools/types.js +2 -0
- package/dist/core/types/authorization.js +2 -0
- package/dist/core/types/context.js +2 -0
- package/dist/core/types/errors.js +29 -0
- package/dist/core/types/execution.js +65 -0
- package/dist/core/types/index.js +9 -0
- package/dist/core/types/llm.js +9 -0
- package/dist/core/types/loop.js +2 -0
- package/dist/core/types/planning.js +2 -0
- package/dist/core/types/runtime.js +2 -0
- package/dist/core/types/usage.js +2 -0
- package/dist/core/ui/kaomoji.js +5 -0
- package/dist/core/utils/path.js +116 -0
- package/dist/core/utils/platform-shell.js +10 -0
- package/dist/core/utils/sanitizer.js +107 -0
- package/dist/core/verification/runner.js +265 -0
- package/dist/integrations/langfuse/litellm-langfuse-outcome-reporter.js +272 -0
- package/dist/integrations/langfuse/outcome-proxy.js +68 -0
- package/dist/interfaces/cli/task-runner.js +11 -0
- package/dist/languages/typescript/index.js +178 -0
- package/dist/locales/en.js +679 -0
- package/dist/locales/index.js +11 -0
- package/dist/utils/eol.js +35 -0
- package/package.json +153 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encoding registry using Strategy pattern.
|
|
3
|
+
*
|
|
4
|
+
* Allows registration of new encodings without modifying existing code.
|
|
5
|
+
* Follows Open/Closed Principle.
|
|
6
|
+
*/
|
|
7
|
+
import { get_encoding } from 'tiktoken';
|
|
8
|
+
/**
|
|
9
|
+
* Base encoding implementation using tiktoken.
|
|
10
|
+
*/
|
|
11
|
+
class TiktokenEncoding {
|
|
12
|
+
name;
|
|
13
|
+
models;
|
|
14
|
+
encoder = null;
|
|
15
|
+
initialized = false;
|
|
16
|
+
constructor(name, models) {
|
|
17
|
+
this.name = name;
|
|
18
|
+
this.models = models;
|
|
19
|
+
}
|
|
20
|
+
async initialize() {
|
|
21
|
+
if (this.initialized)
|
|
22
|
+
return;
|
|
23
|
+
this.encoder = get_encoding(this.getTiktokenName());
|
|
24
|
+
this.initialized = true;
|
|
25
|
+
}
|
|
26
|
+
encode(text) {
|
|
27
|
+
this.ensureInitialized();
|
|
28
|
+
return Array.from(this.encoder.encode(text));
|
|
29
|
+
}
|
|
30
|
+
decode(tokens) {
|
|
31
|
+
this.ensureInitialized();
|
|
32
|
+
const uint32Tokens = new Uint32Array(tokens);
|
|
33
|
+
const decoded = this.encoder.decode(uint32Tokens);
|
|
34
|
+
return new TextDecoder().decode(decoded);
|
|
35
|
+
}
|
|
36
|
+
count(text) {
|
|
37
|
+
return this.encode(text).length;
|
|
38
|
+
}
|
|
39
|
+
dispose() {
|
|
40
|
+
if (this.encoder) {
|
|
41
|
+
this.encoder.free();
|
|
42
|
+
this.encoder = null;
|
|
43
|
+
}
|
|
44
|
+
this.initialized = false;
|
|
45
|
+
}
|
|
46
|
+
ensureInitialized() {
|
|
47
|
+
if (!this.initialized || !this.encoder) {
|
|
48
|
+
throw new Error(`Encoding ${this.name} not initialized. Call initialize() first.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* cl100k_base encoding (GPT-4, GPT-3.5-turbo, Claude).
|
|
54
|
+
*/
|
|
55
|
+
class Cl100kEncoding extends TiktokenEncoding {
|
|
56
|
+
constructor() {
|
|
57
|
+
super('cl100k_base', ['openai-gpt4', 'openai-gpt35', 'anthropic-claude']);
|
|
58
|
+
}
|
|
59
|
+
getTiktokenName() {
|
|
60
|
+
return 'cl100k_base';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* o200k_base encoding (GPT-4o, GPT-4o-mini).
|
|
65
|
+
*/
|
|
66
|
+
class O200kEncoding extends TiktokenEncoding {
|
|
67
|
+
constructor() {
|
|
68
|
+
super('o200k_base', ['openai-gpt4o']);
|
|
69
|
+
}
|
|
70
|
+
getTiktokenName() {
|
|
71
|
+
return 'o200k_base';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Registry for encoding strategies.
|
|
76
|
+
*
|
|
77
|
+
* Features:
|
|
78
|
+
* - Register new encodings at runtime
|
|
79
|
+
* - Auto-select encoding by model family
|
|
80
|
+
* - Default encoding fallback
|
|
81
|
+
*/
|
|
82
|
+
export class EncodingRegistry {
|
|
83
|
+
encodings = new Map();
|
|
84
|
+
modelToEncoding = new Map();
|
|
85
|
+
initialized = false;
|
|
86
|
+
constructor() {
|
|
87
|
+
// Register default encodings
|
|
88
|
+
this.register(new Cl100kEncoding());
|
|
89
|
+
this.register(new O200kEncoding());
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Register a new encoding.
|
|
93
|
+
*/
|
|
94
|
+
register(encoding) {
|
|
95
|
+
this.encodings.set(encoding.name, encoding);
|
|
96
|
+
for (const model of encoding.models) {
|
|
97
|
+
this.modelToEncoding.set(model, encoding.name);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get encoding by type.
|
|
102
|
+
*/
|
|
103
|
+
get(encoding) {
|
|
104
|
+
const enc = this.encodings.get(encoding);
|
|
105
|
+
if (!enc) {
|
|
106
|
+
throw new Error(`Unknown encoding: ${encoding}`);
|
|
107
|
+
}
|
|
108
|
+
return enc;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get encoding for a model family.
|
|
112
|
+
* Returns default encoding if model not found.
|
|
113
|
+
*/
|
|
114
|
+
getByModel(model) {
|
|
115
|
+
const encodingName = this.modelToEncoding.get(model);
|
|
116
|
+
if (!encodingName) {
|
|
117
|
+
// Default fallback
|
|
118
|
+
return this.get('cl100k_base');
|
|
119
|
+
}
|
|
120
|
+
return this.get(encodingName);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get encoding type for a model family.
|
|
124
|
+
*/
|
|
125
|
+
getEncodingTypeForModel(model) {
|
|
126
|
+
return this.modelToEncoding.get(model) ?? 'cl100k_base';
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Check if encoding is registered.
|
|
130
|
+
*/
|
|
131
|
+
has(encoding) {
|
|
132
|
+
return this.encodings.has(encoding);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* List all registered encodings.
|
|
136
|
+
*/
|
|
137
|
+
listEncodings() {
|
|
138
|
+
return Array.from(this.encodings.keys());
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* List all registered models.
|
|
142
|
+
*/
|
|
143
|
+
listModels() {
|
|
144
|
+
return Array.from(this.modelToEncoding.keys());
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Initialize all encodings.
|
|
148
|
+
* Call once at application startup.
|
|
149
|
+
*/
|
|
150
|
+
async initializeAll() {
|
|
151
|
+
if (this.initialized)
|
|
152
|
+
return;
|
|
153
|
+
await Promise.all(Array.from(this.encodings.values()).map((e) => e.initialize()));
|
|
154
|
+
this.initialized = true;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Dispose all encodings.
|
|
158
|
+
* Call at application shutdown.
|
|
159
|
+
*/
|
|
160
|
+
disposeAll() {
|
|
161
|
+
for (const encoding of this.encodings.values()) {
|
|
162
|
+
encoding.dispose();
|
|
163
|
+
}
|
|
164
|
+
this.initialized = false;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Check if initialized.
|
|
168
|
+
*/
|
|
169
|
+
isInitialized() {
|
|
170
|
+
return this.initialized;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=encoding-registry.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token counting module.
|
|
3
|
+
*
|
|
4
|
+
* Provides accurate token counting with caching for performance optimization.
|
|
5
|
+
* Includes model-adaptive budget calculation.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { TokenCounter, TokenBudgetCalculator } from './token/index.js';
|
|
10
|
+
*
|
|
11
|
+
* const counter = new TokenCounter();
|
|
12
|
+
* await counter.initialize();
|
|
13
|
+
*
|
|
14
|
+
* // Simple counting
|
|
15
|
+
* const tokens = counter.count('Hello, world!');
|
|
16
|
+
*
|
|
17
|
+
* // Count for a model
|
|
18
|
+
* const tokens = counter.countByModel('Hello', 'openai-gpt4');
|
|
19
|
+
*
|
|
20
|
+
* // Model-adaptive budget
|
|
21
|
+
* const budget = new TokenBudgetCalculator();
|
|
22
|
+
* budget.setModel('gpt-4o');
|
|
23
|
+
* const defaultBudget = budget.getDefaultBudget();
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export { TokenCounter } from './counter.js';
|
|
27
|
+
export { TokenCache } from './cache.js';
|
|
28
|
+
export { EncodingRegistry } from './encoding-registry.js';
|
|
29
|
+
export { TokenBudgetCalculator, DEFAULT_TOKEN_BUDGET_CONFIG } from './token-budget.js';
|
|
30
|
+
export { AdaptiveBudgetCalculator, MODEL_CONTEXT_CONFIG, getAdaptiveBudgetCalculator, resetAdaptiveBudgetCalculator, getModelRecommendedBudget, getModelMinBudget, getModelMaxPrimaryTokens, } from './adaptive-budget.js';
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token budget calculator for context management.
|
|
3
|
+
*
|
|
4
|
+
* Provides token-based budget calculation as a replacement for character-based estimation.
|
|
5
|
+
* Designed for gradual migration from character-based to token-based budgeting.
|
|
6
|
+
*
|
|
7
|
+
* Supports model-adaptive budget via AdaptiveBudgetCalculator integration.
|
|
8
|
+
*/
|
|
9
|
+
import { LIMITS } from '../../config/limits.js';
|
|
10
|
+
import { getAdaptiveBudgetCalculator, } from './adaptive-budget.js';
|
|
11
|
+
import { TokenCounter } from './index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Default token budget configuration.
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_TOKEN_BUDGET_CONFIG = {
|
|
16
|
+
mode: 'token',
|
|
17
|
+
defaultTokenBudget: LIMITS.maxContextTokens,
|
|
18
|
+
minTokenBudget: LIMITS.minContextTokens,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Token budget calculator.
|
|
22
|
+
*
|
|
23
|
+
* Provides methods for calculating token counts of context components.
|
|
24
|
+
* Supports model-adaptive budget via setModel().
|
|
25
|
+
*/
|
|
26
|
+
export class TokenBudgetCalculator {
|
|
27
|
+
config;
|
|
28
|
+
tokenCounter = null;
|
|
29
|
+
initialized = false;
|
|
30
|
+
modelId = null;
|
|
31
|
+
modelConfig = null;
|
|
32
|
+
constructor(config = DEFAULT_TOKEN_BUDGET_CONFIG) {
|
|
33
|
+
this.config = config;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Initialize the calculator (loads tiktoken).
|
|
37
|
+
*/
|
|
38
|
+
async initialize() {
|
|
39
|
+
if (this.initialized)
|
|
40
|
+
return;
|
|
41
|
+
if (this.config.mode === 'token') {
|
|
42
|
+
this.tokenCounter = new TokenCounter();
|
|
43
|
+
await this.tokenCounter.initialize();
|
|
44
|
+
}
|
|
45
|
+
this.initialized = true;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Dispose resources.
|
|
49
|
+
*/
|
|
50
|
+
dispose() {
|
|
51
|
+
if (this.tokenCounter) {
|
|
52
|
+
this.tokenCounter.dispose();
|
|
53
|
+
this.tokenCounter = null;
|
|
54
|
+
}
|
|
55
|
+
this.initialized = false;
|
|
56
|
+
this.modelId = null;
|
|
57
|
+
this.modelConfig = null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Set model for adaptive budget calculation.
|
|
61
|
+
* This updates budget limits based on model capabilities.
|
|
62
|
+
*/
|
|
63
|
+
setModel(modelId) {
|
|
64
|
+
this.modelId = modelId;
|
|
65
|
+
this.modelConfig = getAdaptiveBudgetCalculator().resolveConfig(modelId);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get current model ID.
|
|
69
|
+
*/
|
|
70
|
+
getModel() {
|
|
71
|
+
return this.modelId;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get current model context config.
|
|
75
|
+
*/
|
|
76
|
+
getModelConfig() {
|
|
77
|
+
return this.modelConfig;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Set user budget configuration override.
|
|
81
|
+
*/
|
|
82
|
+
setUserConfig(config) {
|
|
83
|
+
getAdaptiveBudgetCalculator().setUserConfig(config);
|
|
84
|
+
// Refresh model config if model is set
|
|
85
|
+
if (this.modelId) {
|
|
86
|
+
this.modelConfig = getAdaptiveBudgetCalculator().resolveConfig(this.modelId);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get current budget mode.
|
|
91
|
+
*/
|
|
92
|
+
get mode() {
|
|
93
|
+
return this.config.mode;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Count tokens/chars for a string based on current mode.
|
|
97
|
+
*/
|
|
98
|
+
count(text) {
|
|
99
|
+
if (this.config.mode === 'char') {
|
|
100
|
+
return text.length;
|
|
101
|
+
}
|
|
102
|
+
if (!this.tokenCounter) {
|
|
103
|
+
// Fallback to char estimation if not initialized
|
|
104
|
+
return Math.ceil(text.length / 4);
|
|
105
|
+
}
|
|
106
|
+
return this.tokenCounter.count(text);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Calculate total tokens for context.
|
|
110
|
+
*/
|
|
111
|
+
calculateTotalTokens(context) {
|
|
112
|
+
const primary = this.count(context.primaryText ?? '');
|
|
113
|
+
const related = context.relatedFiles?.reduce((sum, file) => sum + this.count(file.content ?? ''), 0) ?? 0;
|
|
114
|
+
const snippets = context.rgSnippets.reduce((sum, snippet) => sum + this.count(snippet.content ?? ''), 0);
|
|
115
|
+
const diff = this.count(context.gitDiff ?? '') +
|
|
116
|
+
this.count(context.stagedDiff ?? '') +
|
|
117
|
+
this.count(context.unstagedDiff ?? '') +
|
|
118
|
+
this.count(context.untrackedDiff ?? '');
|
|
119
|
+
return primary + related + snippets + diff;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Calculate section-wise tokens.
|
|
123
|
+
*/
|
|
124
|
+
calculateSectionTokens(context) {
|
|
125
|
+
const primary = this.count(context.primaryText ?? '');
|
|
126
|
+
const relatedFiles = context.relatedFiles?.reduce((sum, f) => sum + this.count(f.content ?? ''), 0) ?? 0;
|
|
127
|
+
const rgSnippets = context.rgSnippets.reduce((sum, s) => sum + this.count(s.content ?? ''), 0);
|
|
128
|
+
const diffs = this.count(context.gitDiff ?? '') +
|
|
129
|
+
this.count(context.stagedDiff ?? '') +
|
|
130
|
+
this.count(context.unstagedDiff ?? '') +
|
|
131
|
+
this.count(context.untrackedDiff ?? '');
|
|
132
|
+
return {
|
|
133
|
+
primary,
|
|
134
|
+
relatedFiles,
|
|
135
|
+
rgSnippets,
|
|
136
|
+
diffs,
|
|
137
|
+
total: primary + relatedFiles + rgSnippets + diffs,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Calculate tokens for a file.
|
|
142
|
+
*/
|
|
143
|
+
calculateFileTokens(file) {
|
|
144
|
+
return this.count(file.content ?? '');
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Calculate tokens for a snippet.
|
|
148
|
+
*/
|
|
149
|
+
calculateSnippetTokens(snippet) {
|
|
150
|
+
return this.count(snippet.content ?? '');
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Calculate tokens for diffs.
|
|
154
|
+
*/
|
|
155
|
+
calculateDiffTokens(context) {
|
|
156
|
+
return (this.count(context.gitDiff ?? '') +
|
|
157
|
+
this.count(context.stagedDiff ?? '') +
|
|
158
|
+
this.count(context.unstagedDiff ?? '') +
|
|
159
|
+
this.count(context.untrackedDiff ?? ''));
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get default budget for current mode.
|
|
163
|
+
* If model is set, returns model-specific recommended budget.
|
|
164
|
+
*/
|
|
165
|
+
getDefaultBudget() {
|
|
166
|
+
if (this.modelConfig) {
|
|
167
|
+
return this.modelConfig.recommendedBudget;
|
|
168
|
+
}
|
|
169
|
+
return this.config.defaultTokenBudget;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get minimum budget for current mode.
|
|
173
|
+
* If model is set, returns model-specific minimum budget.
|
|
174
|
+
*/
|
|
175
|
+
getMinBudget() {
|
|
176
|
+
if (this.modelConfig) {
|
|
177
|
+
return this.modelConfig.minBudget;
|
|
178
|
+
}
|
|
179
|
+
return this.config.minTokenBudget;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get maximum primary tokens.
|
|
183
|
+
* If model is set, returns model-specific max primary tokens.
|
|
184
|
+
*/
|
|
185
|
+
getMaxPrimaryTokens() {
|
|
186
|
+
if (this.modelConfig) {
|
|
187
|
+
return this.modelConfig.maxPrimaryTokens;
|
|
188
|
+
}
|
|
189
|
+
return this.config.defaultTokenBudget;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Get output buffer for current model.
|
|
193
|
+
*/
|
|
194
|
+
getOutputBuffer() {
|
|
195
|
+
if (this.modelConfig) {
|
|
196
|
+
return this.modelConfig.outputBuffer;
|
|
197
|
+
}
|
|
198
|
+
return 4096; // Default output buffer
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Convert token budget to char estimate (for backwards compatibility).
|
|
202
|
+
*/
|
|
203
|
+
tokenToCharEstimate(tokens) {
|
|
204
|
+
return tokens * 4; // Rough estimate: 1 token ≈ 4 chars
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Convert char budget to token estimate.
|
|
208
|
+
*/
|
|
209
|
+
charToTokenEstimate(chars) {
|
|
210
|
+
return Math.ceil(chars / 4);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=token-budget.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic truncation module.
|
|
3
|
+
*
|
|
4
|
+
* Provides type-aware truncation for tool outputs.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { SemanticTruncator, truncateOutput } from './truncation/index.js';
|
|
9
|
+
*
|
|
10
|
+
* // Using convenience function
|
|
11
|
+
* const result = truncateOutput(output, 4000, 'error');
|
|
12
|
+
*
|
|
13
|
+
* // Using class
|
|
14
|
+
* const truncator = new SemanticTruncator();
|
|
15
|
+
* const result = truncator.truncate(output, 4000);
|
|
16
|
+
* console.log(result.keyInfoPreserved); // ['error_messages', 'stack_trace_top']
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export { SemanticTruncator, getSemanticTruncator, truncateOutput } from './semantic-truncator.js';
|
|
20
|
+
export { detectOutputType, detectOutputTypeWithHint } from './type-detector.js';
|
|
21
|
+
export { DEFAULT_TRUNCATION_CONFIG } from './types.js';
|
|
22
|
+
export { ErrorStackStrategy, JsonStrategy, GitDiffStrategy, LogStrategy, TestResultStrategy, GenericStrategy, } from './strategies/index.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic truncator - main entry point.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes output type and applies appropriate truncation strategy.
|
|
5
|
+
*/
|
|
6
|
+
import { ErrorStackStrategy, JsonStrategy, GitDiffStrategy, LogStrategy, TestResultStrategy, GenericStrategy, } from './strategies/index.js';
|
|
7
|
+
import { detectOutputType, detectOutputTypeWithHint } from './type-detector.js';
|
|
8
|
+
import { DEFAULT_TRUNCATION_CONFIG } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Semantic truncator with type-aware strategies.
|
|
11
|
+
*/
|
|
12
|
+
export class SemanticTruncator {
|
|
13
|
+
config;
|
|
14
|
+
strategies;
|
|
15
|
+
constructor(config = DEFAULT_TRUNCATION_CONFIG) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
// Register all strategies
|
|
18
|
+
this.strategies = [
|
|
19
|
+
new ErrorStackStrategy(config),
|
|
20
|
+
new JsonStrategy(config),
|
|
21
|
+
new GitDiffStrategy(config),
|
|
22
|
+
new LogStrategy(config),
|
|
23
|
+
new TestResultStrategy(config),
|
|
24
|
+
new GenericStrategy(config), // Must be last (fallback)
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Truncate output using appropriate strategy.
|
|
29
|
+
*
|
|
30
|
+
* @param output - Raw output string
|
|
31
|
+
* @param budget - Maximum character budget
|
|
32
|
+
* @param typeHint - Optional type hint for detection
|
|
33
|
+
* @returns Truncated output with metadata
|
|
34
|
+
*/
|
|
35
|
+
truncate(output, budget, typeHint) {
|
|
36
|
+
// Detect output type
|
|
37
|
+
const detection = typeHint
|
|
38
|
+
? detectOutputTypeWithHint(output, typeHint)
|
|
39
|
+
: detectOutputType(output);
|
|
40
|
+
// Find appropriate strategy
|
|
41
|
+
const strategy = this.findStrategy(detection.type);
|
|
42
|
+
// Apply truncation
|
|
43
|
+
return strategy.truncate(output, budget);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Truncate output with explicit type.
|
|
47
|
+
*
|
|
48
|
+
* @param output - Raw output string
|
|
49
|
+
* @param type - Explicit output type
|
|
50
|
+
* @param budget - Maximum character budget
|
|
51
|
+
* @returns Truncated output with metadata
|
|
52
|
+
*/
|
|
53
|
+
truncateWithType(output, type, budget) {
|
|
54
|
+
const strategy = this.findStrategy(type);
|
|
55
|
+
return strategy.truncate(output, budget);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Detect output type without truncating.
|
|
59
|
+
*
|
|
60
|
+
* @param output - Raw output string
|
|
61
|
+
* @returns Detected type with confidence
|
|
62
|
+
*/
|
|
63
|
+
detectType(output) {
|
|
64
|
+
return detectOutputType(output);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Find strategy for given type.
|
|
68
|
+
*/
|
|
69
|
+
findStrategy(type) {
|
|
70
|
+
for (const strategy of this.strategies) {
|
|
71
|
+
if (strategy.supportedTypes.includes(type)) {
|
|
72
|
+
return strategy;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Fallback to generic
|
|
76
|
+
return this.strategies[this.strategies.length - 1];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Global truncator instance.
|
|
81
|
+
*/
|
|
82
|
+
let globalTruncator = null;
|
|
83
|
+
/**
|
|
84
|
+
* Get global truncator instance.
|
|
85
|
+
*/
|
|
86
|
+
export function getSemanticTruncator() {
|
|
87
|
+
if (!globalTruncator) {
|
|
88
|
+
globalTruncator = new SemanticTruncator();
|
|
89
|
+
}
|
|
90
|
+
return globalTruncator;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Convenience function for semantic truncation.
|
|
94
|
+
*
|
|
95
|
+
* @param output - Raw output string
|
|
96
|
+
* @param budget - Maximum character budget
|
|
97
|
+
* @param typeHint - Optional type hint
|
|
98
|
+
* @returns Truncated output
|
|
99
|
+
*/
|
|
100
|
+
export function truncateOutput(output, budget, typeHint) {
|
|
101
|
+
return getSemanticTruncator().truncate(output, budget, typeHint);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=semantic-truncator.js.map
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error stack truncation strategy.
|
|
3
|
+
*
|
|
4
|
+
* Preserves complete error information - errors are critical for debugging.
|
|
5
|
+
* Only truncates if absolutely necessary, preserving the error message and
|
|
6
|
+
* top of stack trace.
|
|
7
|
+
*/
|
|
8
|
+
import { DEFAULT_TRUNCATION_CONFIG } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Error stack truncation strategy.
|
|
11
|
+
* Prioritizes preserving all error information.
|
|
12
|
+
*/
|
|
13
|
+
export class ErrorStackStrategy {
|
|
14
|
+
config;
|
|
15
|
+
name = 'error_stack';
|
|
16
|
+
supportedTypes = ['error_stack'];
|
|
17
|
+
constructor(config = DEFAULT_TRUNCATION_CONFIG) {
|
|
18
|
+
this.config = config;
|
|
19
|
+
}
|
|
20
|
+
canHandle(output) {
|
|
21
|
+
return /^\s*\w*Error:|^\s+at\s+.+\(/m.test(output);
|
|
22
|
+
}
|
|
23
|
+
truncate(output, budget) {
|
|
24
|
+
const lines = output.split('\n');
|
|
25
|
+
const keyInfoPreserved = [];
|
|
26
|
+
// If output fits in budget, return as-is
|
|
27
|
+
if (output.length <= budget) {
|
|
28
|
+
return {
|
|
29
|
+
content: output,
|
|
30
|
+
wasTruncated: false,
|
|
31
|
+
strategy: this.name,
|
|
32
|
+
keyInfoPreserved: ['complete_error'],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Find error lines (Error: TypeError:, etc.)
|
|
36
|
+
const errorLines = [];
|
|
37
|
+
const stackLines = [];
|
|
38
|
+
for (let i = 0; i < lines.length; i++) {
|
|
39
|
+
const line = lines[i];
|
|
40
|
+
if (/^\s*\w*Error:|TypeError:|ReferenceError:|SyntaxError:|RuntimeError:/i.test(line)) {
|
|
41
|
+
errorLines.push(i);
|
|
42
|
+
}
|
|
43
|
+
else if (/^\s+at\s+/.test(line)) {
|
|
44
|
+
stackLines.push(i);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Preserve error messages with context
|
|
48
|
+
const preservedIndices = new Set();
|
|
49
|
+
// Always preserve first line (often the error message)
|
|
50
|
+
preservedIndices.add(0);
|
|
51
|
+
// Preserve all error lines
|
|
52
|
+
for (const idx of errorLines) {
|
|
53
|
+
preservedIndices.add(idx);
|
|
54
|
+
// Add context lines around error
|
|
55
|
+
for (let j = Math.max(0, idx - this.config.contextLines); j <= Math.min(lines.length - 1, idx + this.config.contextLines); j++) {
|
|
56
|
+
preservedIndices.add(j);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Preserve top of stack trace (most relevant)
|
|
60
|
+
for (let i = 0; i < Math.min(5, stackLines.length); i++) {
|
|
61
|
+
preservedIndices.add(stackLines[i]);
|
|
62
|
+
}
|
|
63
|
+
// Build truncated output
|
|
64
|
+
const result = [];
|
|
65
|
+
let currentLength = 0;
|
|
66
|
+
let lastAdded = -2;
|
|
67
|
+
for (let i = 0; i < lines.length; i++) {
|
|
68
|
+
if (preservedIndices.has(i)) {
|
|
69
|
+
// Add truncation marker if there's a gap
|
|
70
|
+
if (i > lastAdded + 1 && lastAdded >= 0) {
|
|
71
|
+
result.push(this.config.truncationMarker);
|
|
72
|
+
currentLength += this.config.truncationMarker.length;
|
|
73
|
+
}
|
|
74
|
+
result.push(lines[i]);
|
|
75
|
+
currentLength += lines[i].length + 1; // +1 for newline
|
|
76
|
+
lastAdded = i;
|
|
77
|
+
}
|
|
78
|
+
// Check budget
|
|
79
|
+
if (currentLength > budget) {
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
keyInfoPreserved.push('error_messages');
|
|
84
|
+
if (stackLines.length > 0)
|
|
85
|
+
keyInfoPreserved.push('stack_trace_top');
|
|
86
|
+
return {
|
|
87
|
+
content: result.join('\n'),
|
|
88
|
+
wasTruncated: true,
|
|
89
|
+
strategy: this.name,
|
|
90
|
+
keyInfoPreserved,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=error-stack.js.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic truncation strategy.
|
|
3
|
+
*
|
|
4
|
+
* Fallback strategy that uses simple head/tail truncation
|
|
5
|
+
* with a marker in the middle.
|
|
6
|
+
*/
|
|
7
|
+
import { DEFAULT_TRUNCATION_CONFIG } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generic truncation strategy.
|
|
10
|
+
* Uses simple head/tail truncation.
|
|
11
|
+
*/
|
|
12
|
+
export class GenericStrategy {
|
|
13
|
+
config;
|
|
14
|
+
name = 'generic';
|
|
15
|
+
supportedTypes = ['generic'];
|
|
16
|
+
constructor(config = DEFAULT_TRUNCATION_CONFIG) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
}
|
|
19
|
+
canHandle(_output) {
|
|
20
|
+
return true; // Always can handle
|
|
21
|
+
}
|
|
22
|
+
truncate(output, budget) {
|
|
23
|
+
// If output fits in budget, return as-is
|
|
24
|
+
if (output.length <= budget) {
|
|
25
|
+
return {
|
|
26
|
+
content: output,
|
|
27
|
+
wasTruncated: false,
|
|
28
|
+
strategy: this.name,
|
|
29
|
+
keyInfoPreserved: ['complete_content'],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Reserve space for truncation marker
|
|
33
|
+
const markerLength = this.config.truncationMarker.length;
|
|
34
|
+
const availableBudget = budget - markerLength;
|
|
35
|
+
// Split budget between head and tail (50/50)
|
|
36
|
+
const headBudget = Math.floor(availableBudget / 2);
|
|
37
|
+
const tailBudget = availableBudget - headBudget;
|
|
38
|
+
const head = output.slice(0, headBudget);
|
|
39
|
+
const tail = output.slice(-tailBudget);
|
|
40
|
+
return {
|
|
41
|
+
content: `${head}${this.config.truncationMarker}${tail}`,
|
|
42
|
+
wasTruncated: true,
|
|
43
|
+
strategy: this.name,
|
|
44
|
+
keyInfoPreserved: ['head', 'tail'],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=generic.js.map
|