byterover-cli 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -56
- package/bin/dev.js +1 -1
- package/dist/commands/cipher-agent/run.d.ts +111 -0
- package/dist/commands/cipher-agent/run.js +493 -0
- package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
- package/dist/commands/cipher-agent/set-prompt.js +53 -0
- package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
- package/dist/commands/cipher-agent/show-prompt.js +48 -0
- package/dist/commands/clear.d.ts +6 -0
- package/dist/commands/clear.js +36 -15
- package/dist/commands/curate.d.ts +74 -0
- package/dist/commands/curate.js +396 -0
- package/dist/commands/foo.d.ts +12 -0
- package/dist/commands/foo.js +61 -0
- package/dist/commands/gen-rules.d.ts +3 -0
- package/dist/commands/gen-rules.js +39 -20
- package/dist/commands/init.d.ts +63 -3
- package/dist/commands/init.js +285 -70
- package/dist/commands/login.js +9 -4
- package/dist/commands/pull.d.ts +33 -0
- package/dist/commands/pull.js +115 -0
- package/dist/commands/push.d.ts +13 -13
- package/dist/commands/push.js +81 -101
- package/dist/commands/query.d.ts +63 -0
- package/dist/commands/query.js +349 -0
- package/dist/commands/space/list.d.ts +5 -2
- package/dist/commands/space/list.js +60 -56
- package/dist/commands/space/switch.d.ts +16 -0
- package/dist/commands/space/switch.js +102 -53
- package/dist/commands/status.d.ts +5 -2
- package/dist/commands/status.js +43 -33
- package/dist/commands/watch.d.ts +23 -0
- package/dist/commands/watch.js +171 -0
- package/dist/config/auth.config.js +14 -2
- package/dist/config/context-tree-domains.d.ts +12 -0
- package/dist/config/context-tree-domains.js +29 -0
- package/dist/config/environment.d.ts +6 -0
- package/dist/config/environment.js +9 -2
- package/dist/constants.d.ts +5 -0
- package/dist/constants.js +6 -0
- package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
- package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
- package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
- package/dist/core/domain/cipher/agent/agent-state.js +59 -0
- package/dist/core/domain/cipher/agent/index.d.ts +7 -0
- package/dist/core/domain/cipher/agent/index.js +7 -0
- package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
- package/dist/core/domain/cipher/agent-events/index.js +7 -0
- package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
- package/dist/core/domain/cipher/agent-events/types.js +42 -0
- package/dist/core/domain/cipher/blob/types.d.ts +108 -0
- package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
- package/dist/core/domain/cipher/errors/blob-error.js +68 -0
- package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
- package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
- package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
- package/dist/core/domain/cipher/errors/llm-error.js +161 -0
- package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
- package/dist/core/domain/cipher/errors/memory-error.js +62 -0
- package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
- package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
- package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
- package/dist/core/domain/cipher/errors/process-error.js +173 -0
- package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
- package/dist/core/domain/cipher/errors/session-error.js +74 -0
- package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
- package/dist/core/domain/cipher/errors/tool-error.js +81 -0
- package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
- package/dist/core/domain/cipher/memory/types.d.ts +102 -0
- package/dist/core/domain/cipher/memory/types.js +4 -0
- package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
- package/dist/core/domain/cipher/parsed-interaction.js +25 -0
- package/dist/core/domain/cipher/process/types.d.ts +286 -0
- package/dist/core/domain/cipher/session/types.d.ts +54 -0
- package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
- package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
- package/dist/core/domain/cipher/todos/index.d.ts +4 -0
- package/dist/core/domain/cipher/todos/index.js +4 -0
- package/dist/core/domain/cipher/todos/types.d.ts +57 -0
- package/dist/core/domain/cipher/todos/types.js +5 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
- package/dist/core/domain/cipher/tools/constants.js +24 -0
- package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
- package/dist/core/domain/cipher/tools/tool-error.js +246 -0
- package/dist/core/domain/cipher/tools/types.d.ts +145 -0
- package/dist/core/domain/entities/brv-config.d.ts +42 -6
- package/dist/core/domain/entities/brv-config.js +115 -17
- package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
- package/dist/core/domain/entities/cogit-push-context.js +91 -0
- package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
- package/dist/core/domain/entities/cogit-push-response.js +31 -0
- package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
- package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
- package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
- package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
- package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
- package/dist/core/domain/entities/cogit-snapshot.js +58 -0
- package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
- package/dist/core/domain/entities/context-tree-index.js +27 -0
- package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
- package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
- package/dist/core/domain/entities/event.d.ts +1 -1
- package/dist/core/domain/entities/event.js +3 -1
- package/dist/core/domain/entities/parser.d.ts +567 -0
- package/dist/core/domain/entities/parser.js +10 -0
- package/dist/core/domain/entities/playbook.d.ts +2 -23
- package/dist/core/domain/entities/playbook.js +2 -70
- package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
- package/dist/core/domain/errors/brv-config-version-error.js +21 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
- package/dist/core/domain/knowledge/directory-manager.js +145 -0
- package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
- package/dist/core/domain/knowledge/markdown-writer.js +18 -0
- package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
- package/dist/core/domain/knowledge/relation-parser.js +131 -0
- package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
- package/dist/core/interfaces/cipher/cipher-services.js +1 -0
- package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
- package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
- package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
- package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
- package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
- package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
- package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
- package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
- package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
- package/dist/core/interfaces/cipher/i-file-system.js +1 -0
- package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
- package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
- package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
- package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
- package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
- package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
- package/dist/core/interfaces/cipher/i-logger.js +28 -0
- package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
- package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
- package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
- package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
- package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
- package/dist/core/interfaces/cipher/i-process-service.js +1 -0
- package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
- package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
- package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
- package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
- package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
- package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
- package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
- package/dist/core/interfaces/cipher/llm-types.js +5 -0
- package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
- package/dist/core/interfaces/cipher/message-types.js +5 -0
- package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
- package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
- package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
- package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
- package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
- package/dist/core/interfaces/i-cogit-push-service.js +1 -0
- package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
- package/dist/core/interfaces/i-context-file-reader.js +1 -0
- package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
- package/dist/core/interfaces/i-context-tree-service.js +1 -0
- package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
- package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
- package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
- package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
- package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
- package/dist/core/interfaces/i-file-watcher-service.js +1 -0
- package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
- package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
- package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
- package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
- package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
- package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
- package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
- package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
- package/dist/hooks/error/clean-errors.d.ts +7 -0
- package/dist/hooks/error/clean-errors.js +50 -0
- package/dist/hooks/init/welcome.js +72 -1
- package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
- package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
- package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
- package/dist/infra/cipher/agent-service-factory.js +212 -0
- package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
- package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
- package/dist/infra/cipher/blob/index.d.ts +10 -0
- package/dist/infra/cipher/blob/index.js +12 -0
- package/dist/infra/cipher/blob/migrations.d.ts +63 -0
- package/dist/infra/cipher/blob/migrations.js +148 -0
- package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
- package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
- package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
- package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
- package/dist/infra/cipher/cipher-agent.d.ts +182 -0
- package/dist/infra/cipher/cipher-agent.js +317 -0
- package/dist/infra/cipher/command-parser.d.ts +23 -0
- package/dist/infra/cipher/command-parser.js +85 -0
- package/dist/infra/cipher/display/todo-display.d.ts +23 -0
- package/dist/infra/cipher/display/todo-display.js +129 -0
- package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
- package/dist/infra/cipher/events/event-emitter.js +158 -0
- package/dist/infra/cipher/exit-codes.d.ts +44 -0
- package/dist/infra/cipher/exit-codes.js +58 -0
- package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
- package/dist/infra/cipher/file-system/file-system-service.js +641 -0
- package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
- package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
- package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
- package/dist/infra/cipher/file-system/glob-utils.js +120 -0
- package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
- package/dist/infra/cipher/file-system/path-validator.js +184 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
- package/dist/infra/cipher/interactive-commands.d.ts +16 -0
- package/dist/infra/cipher/interactive-commands.js +198 -0
- package/dist/infra/cipher/interactive-loop.d.ts +24 -0
- package/dist/infra/cipher/interactive-loop.js +352 -0
- package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
- package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
- package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
- package/dist/infra/cipher/llm/context/compression/index.js +5 -0
- package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
- package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
- package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
- package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
- package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
- package/dist/infra/cipher/llm/context/compression/types.js +1 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
- package/dist/infra/cipher/llm/context/context-manager.js +419 -0
- package/dist/infra/cipher/llm/context/index.d.ts +2 -0
- package/dist/infra/cipher/llm/context/index.js +2 -0
- package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
- package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
- package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
- package/dist/infra/cipher/llm/context/utils.js +89 -0
- package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
- package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
- package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
- package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
- package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
- package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
- package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
- package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
- package/dist/infra/cipher/llm/generators/index.js +13 -0
- package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
- package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
- package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
- package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
- package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
- package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
- package/dist/infra/cipher/llm/index.d.ts +9 -0
- package/dist/infra/cipher/llm/index.js +13 -0
- package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
- package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
- package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
- package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
- package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
- package/dist/infra/cipher/llm/response-validator.js +157 -0
- package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
- package/dist/infra/cipher/llm/retry/index.js +10 -0
- package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
- package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
- package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
- package/dist/infra/cipher/llm/thought-parser.js +190 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
- package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
- package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
- package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
- package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
- package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
- package/dist/infra/cipher/logger/console-logger.js +63 -0
- package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
- package/dist/infra/cipher/logger/event-based-logger.js +92 -0
- package/dist/infra/cipher/memory/index.d.ts +6 -0
- package/dist/infra/cipher/memory/index.js +7 -0
- package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
- package/dist/infra/cipher/memory/memory-manager.js +523 -0
- package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
- package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
- package/dist/infra/cipher/process/command-validator.d.ts +59 -0
- package/dist/infra/cipher/process/command-validator.js +266 -0
- package/dist/infra/cipher/process/index.d.ts +8 -0
- package/dist/infra/cipher/process/index.js +8 -0
- package/dist/infra/cipher/process/process-service.d.ts +95 -0
- package/dist/infra/cipher/process/process-service.js +439 -0
- package/dist/infra/cipher/session/chat-session.d.ts +80 -0
- package/dist/infra/cipher/session/chat-session.js +165 -0
- package/dist/infra/cipher/session/index.d.ts +6 -0
- package/dist/infra/cipher/session/index.js +5 -0
- package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
- package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
- package/dist/infra/cipher/session/session-manager.d.ts +109 -0
- package/dist/infra/cipher/session/session-manager.js +172 -0
- package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
- package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
- package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
- package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
- package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
- package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
- package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
- package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
- package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
- package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
- package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
- package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
- package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
- package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
- package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
- package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
- package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
- package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
- package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
- package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
- package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
- package/dist/infra/cipher/tools/index.d.ts +18 -0
- package/dist/infra/cipher/tools/index.js +19 -0
- package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
- package/dist/infra/cipher/tools/policy-engine.js +110 -0
- package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
- package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
- package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
- package/dist/infra/cipher/tools/tool-invocation.js +294 -0
- package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
- package/dist/infra/cipher/tools/tool-manager.js +209 -0
- package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
- package/dist/infra/cipher/tools/tool-markers.js +49 -0
- package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
- package/dist/infra/cipher/tools/tool-provider.js +196 -0
- package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
- package/dist/infra/cipher/tools/tool-registry.js +144 -0
- package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
- package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
- package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
- package/dist/infra/cipher/validation/workspace-validator.js +37 -0
- package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
- package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
- package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
- package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
- package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
- package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
- package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
- package/dist/infra/cogit/http-cogit-push-service.js +104 -0
- package/dist/infra/config/file-config-store.js +9 -3
- package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
- package/dist/infra/context-tree/file-context-file-reader.js +46 -0
- package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
- package/dist/infra/context-tree/file-context-tree-service.js +46 -0
- package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
- package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
- package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
- package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
- package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
- package/dist/infra/memory/http-memory-storage-service.js +4 -3
- package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
- package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
- package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
- package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
- package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
- package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
- package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
- package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
- package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
- package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
- package/dist/infra/parsers/clean/shared.d.ts +84 -0
- package/dist/infra/parsers/clean/shared.js +273 -0
- package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
- package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
- package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
- package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
- package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
- package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
- package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
- package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
- package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
- package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
- package/dist/infra/space/http-space-service.js +2 -1
- package/dist/infra/team/http-team-service.js +2 -1
- package/dist/infra/user/http-user-service.js +2 -1
- package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
- package/dist/infra/watcher/file-watcher-service.js +81 -0
- package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
- package/dist/infra/workspace/workspace-detector-service.js +165 -0
- package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
- package/dist/resources/prompts/modes/autonomous.yml +9 -0
- package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
- package/dist/resources/prompts/reflection.yml +27 -0
- package/dist/resources/prompts/system-prompt.yml +82 -0
- package/dist/resources/prompts/tool-outputs.yml +30 -0
- package/dist/templates/README.md +6 -7
- package/dist/templates/sections/command-reference.md +40 -111
- package/dist/templates/sections/workflow.md +3 -30
- package/dist/utils/emoji-helpers.d.ts +38 -0
- package/dist/utils/emoji-helpers.js +42 -0
- package/dist/utils/error-handler.d.ts +51 -0
- package/dist/utils/error-handler.js +169 -0
- package/dist/utils/error-helpers.d.ts +30 -0
- package/dist/utils/error-helpers.js +47 -0
- package/dist/utils/file-helpers.d.ts +15 -0
- package/dist/utils/file-helpers.js +44 -0
- package/dist/utils/oclif-error-helpers.d.ts +40 -0
- package/dist/utils/oclif-error-helpers.js +46 -0
- package/dist/utils/tool-display-formatter.d.ts +53 -0
- package/dist/utils/tool-display-formatter.js +257 -0
- package/oclif.manifest.json +381 -141
- package/package.json +27 -6
- package/dist/commands/add.d.ts +0 -49
- package/dist/commands/add.js +0 -192
- package/dist/commands/complete.d.ts +0 -108
- package/dist/commands/complete.js +0 -340
- package/dist/commands/retrieve.d.ts +0 -26
- package/dist/commands/retrieve.js +0 -101
- package/dist/core/domain/entities/curator-output.d.ts +0 -14
- package/dist/core/domain/entities/curator-output.js +0 -23
- package/dist/core/domain/entities/delta-batch.d.ts +0 -30
- package/dist/core/domain/entities/delta-batch.js +0 -52
- package/dist/core/domain/entities/delta-operation.d.ts +0 -31
- package/dist/core/domain/entities/delta-operation.js +0 -50
- package/dist/core/domain/entities/executor-output.d.ts +0 -27
- package/dist/core/domain/entities/executor-output.js +0 -33
- package/dist/core/domain/entities/reflector-output.d.ts +0 -38
- package/dist/core/domain/entities/reflector-output.js +0 -44
- package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
- package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
- package/dist/core/interfaces/i-delta-store.d.ts +0 -15
- package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
- package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
- package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
- package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
- package/dist/infra/ace/ace-file-utils.d.ts +0 -46
- package/dist/infra/ace/ace-file-utils.js +0 -83
- package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
- package/dist/infra/ace/ace-prompt-templates.js +0 -177
- package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
- package/dist/infra/ace/file-bullet-content-store.js +0 -89
- package/dist/infra/ace/file-delta-store.d.ts +0 -9
- package/dist/infra/ace/file-delta-store.js +0 -26
- package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
- package/dist/infra/ace/file-executor-output-store.js +0 -26
- package/dist/infra/ace/file-playbook-store.d.ts +0 -29
- package/dist/infra/ace/file-playbook-store.js +0 -107
- package/dist/infra/ace/file-reflection-store.d.ts +0 -10
- package/dist/infra/ace/file-reflection-store.js +0 -55
- package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
- package/dist/infra/playbook/file-playbook-service.js +0 -132
- /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
- /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
- /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
- /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
- /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
- /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
- /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenRouter Content Generator.
|
|
3
|
+
*
|
|
4
|
+
* Implements IContentGenerator using OpenRouter API (OpenAI-compatible).
|
|
5
|
+
* Supports various models available through OpenRouter.
|
|
6
|
+
*/
|
|
7
|
+
import { OpenAI } from 'openai';
|
|
8
|
+
import { OpenRouterMessageFormatter } from '../formatters/openrouter-formatter.js';
|
|
9
|
+
import { OpenRouterTokenizer } from '../tokenizers/openrouter-tokenizer.js';
|
|
10
|
+
/**
|
|
11
|
+
* OpenRouter Content Generator.
|
|
12
|
+
*
|
|
13
|
+
* Wraps OpenAI client configured for OpenRouter and implements IContentGenerator.
|
|
14
|
+
* Provides:
|
|
15
|
+
* - Non-streaming content generation
|
|
16
|
+
* - Streaming content generation (true streaming via OpenAI SDK)
|
|
17
|
+
* - Token estimation
|
|
18
|
+
*/
|
|
19
|
+
export class OpenRouterContentGenerator {
|
|
20
|
+
client;
|
|
21
|
+
config;
|
|
22
|
+
formatter;
|
|
23
|
+
tokenizer;
|
|
24
|
+
/**
|
|
25
|
+
* Create a new OpenRouter Content Generator.
|
|
26
|
+
*
|
|
27
|
+
* @param config - Generator configuration
|
|
28
|
+
*/
|
|
29
|
+
constructor(config) {
|
|
30
|
+
this.config = {
|
|
31
|
+
maxTokens: config.maxTokens ?? 8192,
|
|
32
|
+
model: config.model ?? 'anthropic/claude-haiku-4.5',
|
|
33
|
+
temperature: config.temperature ?? 0.7,
|
|
34
|
+
};
|
|
35
|
+
// Initialize OpenAI client with OpenRouter base URL
|
|
36
|
+
this.client = new OpenAI({
|
|
37
|
+
apiKey: config.apiKey,
|
|
38
|
+
baseURL: config.baseUrl ?? 'https://openrouter.ai/api/v1',
|
|
39
|
+
defaultHeaders: {
|
|
40
|
+
...(config.httpReferer && { 'HTTP-Referer': config.httpReferer }),
|
|
41
|
+
...(config.siteName && { 'X-Title': config.siteName }),
|
|
42
|
+
},
|
|
43
|
+
timeout: config.timeout,
|
|
44
|
+
});
|
|
45
|
+
// Initialize formatter and tokenizer
|
|
46
|
+
this.formatter = new OpenRouterMessageFormatter();
|
|
47
|
+
this.tokenizer = new OpenRouterTokenizer();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Estimate tokens synchronously using character-based approximation.
|
|
51
|
+
*
|
|
52
|
+
* @param content - Text to estimate tokens for
|
|
53
|
+
* @returns Estimated token count
|
|
54
|
+
*/
|
|
55
|
+
estimateTokensSync(content) {
|
|
56
|
+
return this.tokenizer.countTokens(content);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generate content (non-streaming).
|
|
60
|
+
*
|
|
61
|
+
* @param request - Generation request
|
|
62
|
+
* @returns Generated content response
|
|
63
|
+
*/
|
|
64
|
+
async generateContent(request) {
|
|
65
|
+
// Format messages for OpenAI/OpenRouter
|
|
66
|
+
const formattedMessages = this.formatter.format(request.contents);
|
|
67
|
+
// Build tools array
|
|
68
|
+
const tools = this.buildTools(request.tools ?? {});
|
|
69
|
+
// Build messages with system prompt
|
|
70
|
+
const messages = request.systemPrompt
|
|
71
|
+
? [{ content: request.systemPrompt, role: 'system' }, ...formattedMessages]
|
|
72
|
+
: formattedMessages;
|
|
73
|
+
// Call OpenRouter API
|
|
74
|
+
const rawResponse = await this.client.chat.completions.create({
|
|
75
|
+
// eslint-disable-next-line camelcase
|
|
76
|
+
max_tokens: request.config.maxTokens ?? this.config.maxTokens,
|
|
77
|
+
messages,
|
|
78
|
+
model: request.model ?? this.config.model,
|
|
79
|
+
temperature: request.config.temperature ?? this.config.temperature,
|
|
80
|
+
...(tools.length > 0 && { tools: tools }),
|
|
81
|
+
});
|
|
82
|
+
// Parse response to internal format
|
|
83
|
+
const parsedMessages = this.formatter.parseResponse(rawResponse);
|
|
84
|
+
const lastMessage = parsedMessages.at(-1);
|
|
85
|
+
if (!lastMessage) {
|
|
86
|
+
return {
|
|
87
|
+
content: '',
|
|
88
|
+
finishReason: 'error',
|
|
89
|
+
rawResponse,
|
|
90
|
+
toolCalls: [],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Extract content and tool calls
|
|
94
|
+
const content = this.extractTextContent(lastMessage);
|
|
95
|
+
const toolCalls = lastMessage.toolCalls ?? [];
|
|
96
|
+
// Determine finish reason
|
|
97
|
+
let finishReason = 'stop';
|
|
98
|
+
if (toolCalls.length > 0) {
|
|
99
|
+
finishReason = 'tool_calls';
|
|
100
|
+
}
|
|
101
|
+
else if (rawResponse.choices[0]?.finish_reason === 'length') {
|
|
102
|
+
finishReason = 'max_tokens';
|
|
103
|
+
}
|
|
104
|
+
// Extract usage if available
|
|
105
|
+
const usage = rawResponse.usage
|
|
106
|
+
? {
|
|
107
|
+
completionTokens: rawResponse.usage.completion_tokens,
|
|
108
|
+
promptTokens: rawResponse.usage.prompt_tokens,
|
|
109
|
+
totalTokens: rawResponse.usage.total_tokens,
|
|
110
|
+
}
|
|
111
|
+
: undefined;
|
|
112
|
+
return {
|
|
113
|
+
content,
|
|
114
|
+
finishReason,
|
|
115
|
+
rawResponse,
|
|
116
|
+
toolCalls,
|
|
117
|
+
usage,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Generate content with streaming.
|
|
122
|
+
*
|
|
123
|
+
* Uses OpenAI SDK's native streaming support for real-time content generation.
|
|
124
|
+
*
|
|
125
|
+
* @param request - Generation request
|
|
126
|
+
* @yields Content chunks as they are generated
|
|
127
|
+
* @returns Async generator yielding content chunks
|
|
128
|
+
*/
|
|
129
|
+
async *generateContentStream(request) {
|
|
130
|
+
// Format messages for OpenAI/OpenRouter
|
|
131
|
+
const formattedMessages = this.formatter.format(request.contents);
|
|
132
|
+
// Build tools array
|
|
133
|
+
const tools = this.buildTools(request.tools ?? {});
|
|
134
|
+
// Build messages with system prompt
|
|
135
|
+
const messages = request.systemPrompt
|
|
136
|
+
? [{ content: request.systemPrompt, role: 'system' }, ...formattedMessages]
|
|
137
|
+
: formattedMessages;
|
|
138
|
+
// Call OpenRouter API with streaming
|
|
139
|
+
const stream = await this.client.chat.completions.create({
|
|
140
|
+
// eslint-disable-next-line camelcase
|
|
141
|
+
max_tokens: request.config.maxTokens ?? this.config.maxTokens,
|
|
142
|
+
messages,
|
|
143
|
+
model: request.model ?? this.config.model,
|
|
144
|
+
stream: true,
|
|
145
|
+
temperature: request.config.temperature ?? this.config.temperature,
|
|
146
|
+
...(tools.length > 0 && { tools: tools }),
|
|
147
|
+
});
|
|
148
|
+
// Accumulate tool calls across chunks
|
|
149
|
+
const accumulatedToolCalls = new Map();
|
|
150
|
+
// Stream chunks
|
|
151
|
+
for await (const chunk of stream) {
|
|
152
|
+
const choice = chunk.choices[0];
|
|
153
|
+
if (!choice)
|
|
154
|
+
continue;
|
|
155
|
+
const { delta } = choice;
|
|
156
|
+
// Handle tool call deltas
|
|
157
|
+
if (delta.tool_calls) {
|
|
158
|
+
this.processToolCallDeltas(delta.tool_calls, accumulatedToolCalls);
|
|
159
|
+
}
|
|
160
|
+
// Yield content chunk
|
|
161
|
+
const isComplete = choice.finish_reason !== null;
|
|
162
|
+
const finishReason = this.determineFinishReason(choice.finish_reason, isComplete);
|
|
163
|
+
const toolCalls = this.buildToolCallsArray(accumulatedToolCalls, isComplete);
|
|
164
|
+
yield {
|
|
165
|
+
content: delta.content ?? undefined,
|
|
166
|
+
finishReason,
|
|
167
|
+
isComplete,
|
|
168
|
+
toolCalls,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Build tool calls array from accumulated tool calls.
|
|
174
|
+
*/
|
|
175
|
+
buildToolCallsArray(accumulatedToolCalls, isComplete) {
|
|
176
|
+
if (!isComplete || accumulatedToolCalls.size === 0) {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
return [...accumulatedToolCalls.values()].map((tc) => ({
|
|
180
|
+
function: {
|
|
181
|
+
arguments: tc.arguments,
|
|
182
|
+
name: tc.name,
|
|
183
|
+
},
|
|
184
|
+
id: tc.id,
|
|
185
|
+
type: 'function',
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Build tools array from ToolSet.
|
|
190
|
+
*/
|
|
191
|
+
buildTools(tools) {
|
|
192
|
+
return Object.entries(tools).map(([name, schema]) => ({
|
|
193
|
+
function: {
|
|
194
|
+
description: schema.description ?? '',
|
|
195
|
+
name,
|
|
196
|
+
parameters: schema.parameters,
|
|
197
|
+
},
|
|
198
|
+
type: 'function',
|
|
199
|
+
}));
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Determine finish reason from OpenAI finish reason.
|
|
203
|
+
*/
|
|
204
|
+
determineFinishReason(finishReason, isComplete) {
|
|
205
|
+
if (!isComplete) {
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
if (finishReason === 'tool_calls') {
|
|
209
|
+
return 'tool_calls';
|
|
210
|
+
}
|
|
211
|
+
if (finishReason === 'length') {
|
|
212
|
+
return 'max_tokens';
|
|
213
|
+
}
|
|
214
|
+
return 'stop';
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Extract text content from an internal message.
|
|
218
|
+
*/
|
|
219
|
+
extractTextContent(message) {
|
|
220
|
+
if (typeof message.content === 'string') {
|
|
221
|
+
return message.content;
|
|
222
|
+
}
|
|
223
|
+
if (Array.isArray(message.content)) {
|
|
224
|
+
return message.content
|
|
225
|
+
.filter((part) => part.type === 'text')
|
|
226
|
+
.map((part) => (part.type === 'text' ? part.text : ''))
|
|
227
|
+
.join('');
|
|
228
|
+
}
|
|
229
|
+
return '';
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Process tool call deltas and accumulate them.
|
|
233
|
+
*/
|
|
234
|
+
processToolCallDeltas(toolCallDeltas, accumulatedToolCalls) {
|
|
235
|
+
for (const toolCallDelta of toolCallDeltas) {
|
|
236
|
+
const { function: func, id, index } = toolCallDelta;
|
|
237
|
+
const existing = accumulatedToolCalls.get(index);
|
|
238
|
+
if (existing) {
|
|
239
|
+
// Append to existing tool call
|
|
240
|
+
if (func?.arguments) {
|
|
241
|
+
existing.arguments += func.arguments;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
// Start new tool call
|
|
246
|
+
accumulatedToolCalls.set(index, {
|
|
247
|
+
arguments: func?.arguments ?? '',
|
|
248
|
+
id: id ?? `tool_${index}`,
|
|
249
|
+
name: func?.name ?? '',
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retryable Content Generator Decorator.
|
|
3
|
+
*
|
|
4
|
+
* Wraps any IContentGenerator to add retry capabilities with exponential backoff.
|
|
5
|
+
* Handles transient errors like rate limits, timeouts, and server errors.
|
|
6
|
+
*/
|
|
7
|
+
import type { GenerateContentChunk, GenerateContentRequest, GenerateContentResponse, IContentGenerator } from '../../../../core/interfaces/cipher/i-content-generator.js';
|
|
8
|
+
import type { SessionEventBus } from '../../events/event-emitter.js';
|
|
9
|
+
import { type RetryPolicy } from '../retry/retry-policy.js';
|
|
10
|
+
/**
|
|
11
|
+
* Options for the RetryableContentGenerator.
|
|
12
|
+
*/
|
|
13
|
+
export interface RetryableOptions {
|
|
14
|
+
/** Event bus for emitting retry events */
|
|
15
|
+
eventBus?: SessionEventBus;
|
|
16
|
+
/** Retry policy configuration */
|
|
17
|
+
policy?: RetryPolicy;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Retryable Content Generator.
|
|
21
|
+
*
|
|
22
|
+
* Decorator that wraps any IContentGenerator to add retry capabilities.
|
|
23
|
+
* Uses exponential backoff with jitter to handle transient failures gracefully.
|
|
24
|
+
*
|
|
25
|
+
* Features:
|
|
26
|
+
* - Configurable retry policy
|
|
27
|
+
* - Exponential backoff with jitter
|
|
28
|
+
* - Retries on rate limits, timeouts, and server errors
|
|
29
|
+
* - Event emission for retry attempts
|
|
30
|
+
* - Streaming support with full request retry
|
|
31
|
+
*/
|
|
32
|
+
export declare class RetryableContentGenerator implements IContentGenerator {
|
|
33
|
+
private readonly eventBus?;
|
|
34
|
+
private readonly inner;
|
|
35
|
+
private readonly policy;
|
|
36
|
+
/**
|
|
37
|
+
* Create a new Retryable Content Generator.
|
|
38
|
+
*
|
|
39
|
+
* @param inner - The wrapped content generator
|
|
40
|
+
* @param options - Retry options
|
|
41
|
+
*/
|
|
42
|
+
constructor(inner: IContentGenerator, options?: RetryableOptions);
|
|
43
|
+
/**
|
|
44
|
+
* Estimate tokens (delegates to inner generator).
|
|
45
|
+
*
|
|
46
|
+
* @param content - Text to estimate tokens for
|
|
47
|
+
* @returns Estimated token count
|
|
48
|
+
*/
|
|
49
|
+
estimateTokensSync(content: string): number;
|
|
50
|
+
/**
|
|
51
|
+
* Generate content with retry.
|
|
52
|
+
*
|
|
53
|
+
* @param request - Generation request
|
|
54
|
+
* @returns Generated content response
|
|
55
|
+
*/
|
|
56
|
+
generateContent(request: GenerateContentRequest): Promise<GenerateContentResponse>;
|
|
57
|
+
/**
|
|
58
|
+
* Generate content with streaming and retry.
|
|
59
|
+
*
|
|
60
|
+
* Note: For streaming, we retry the entire request if an error occurs.
|
|
61
|
+
* This is because partial streams cannot be resumed mid-way.
|
|
62
|
+
*
|
|
63
|
+
* @param request - Generation request
|
|
64
|
+
* @yields Content chunks as they are generated
|
|
65
|
+
* @returns Async generator yielding content chunks
|
|
66
|
+
*/
|
|
67
|
+
generateContentStream(request: GenerateContentRequest): AsyncGenerator<GenerateContentChunk>;
|
|
68
|
+
/**
|
|
69
|
+
* Attempt to generate content with retry logic.
|
|
70
|
+
*/
|
|
71
|
+
private attemptGenerateContent;
|
|
72
|
+
/**
|
|
73
|
+
* Attempt to generate content stream with retry logic.
|
|
74
|
+
*
|
|
75
|
+
* @yields Content chunks as they are generated
|
|
76
|
+
*/
|
|
77
|
+
private attemptGenerateContentStream;
|
|
78
|
+
/**
|
|
79
|
+
* Emit an exhausted event when all retries are used.
|
|
80
|
+
*/
|
|
81
|
+
private emitExhausted;
|
|
82
|
+
/**
|
|
83
|
+
* Emit a retry event via warning.
|
|
84
|
+
*/
|
|
85
|
+
private emitRetry;
|
|
86
|
+
/**
|
|
87
|
+
* Sleep for a specified duration.
|
|
88
|
+
*/
|
|
89
|
+
private sleep;
|
|
90
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retryable Content Generator Decorator.
|
|
3
|
+
*
|
|
4
|
+
* Wraps any IContentGenerator to add retry capabilities with exponential backoff.
|
|
5
|
+
* Handles transient errors like rate limits, timeouts, and server errors.
|
|
6
|
+
*/
|
|
7
|
+
import { calculateRetryDelay, DEFAULT_RETRY_POLICY, isRetryableError, } from '../retry/retry-policy.js';
|
|
8
|
+
/**
|
|
9
|
+
* Retryable Content Generator.
|
|
10
|
+
*
|
|
11
|
+
* Decorator that wraps any IContentGenerator to add retry capabilities.
|
|
12
|
+
* Uses exponential backoff with jitter to handle transient failures gracefully.
|
|
13
|
+
*
|
|
14
|
+
* Features:
|
|
15
|
+
* - Configurable retry policy
|
|
16
|
+
* - Exponential backoff with jitter
|
|
17
|
+
* - Retries on rate limits, timeouts, and server errors
|
|
18
|
+
* - Event emission for retry attempts
|
|
19
|
+
* - Streaming support with full request retry
|
|
20
|
+
*/
|
|
21
|
+
export class RetryableContentGenerator {
|
|
22
|
+
eventBus;
|
|
23
|
+
inner;
|
|
24
|
+
policy;
|
|
25
|
+
/**
|
|
26
|
+
* Create a new Retryable Content Generator.
|
|
27
|
+
*
|
|
28
|
+
* @param inner - The wrapped content generator
|
|
29
|
+
* @param options - Retry options
|
|
30
|
+
*/
|
|
31
|
+
constructor(inner, options = {}) {
|
|
32
|
+
this.inner = inner;
|
|
33
|
+
this.policy = options.policy ?? DEFAULT_RETRY_POLICY;
|
|
34
|
+
this.eventBus = options.eventBus;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Estimate tokens (delegates to inner generator).
|
|
38
|
+
*
|
|
39
|
+
* @param content - Text to estimate tokens for
|
|
40
|
+
* @returns Estimated token count
|
|
41
|
+
*/
|
|
42
|
+
estimateTokensSync(content) {
|
|
43
|
+
return this.inner.estimateTokensSync(content);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Generate content with retry.
|
|
47
|
+
*
|
|
48
|
+
* @param request - Generation request
|
|
49
|
+
* @returns Generated content response
|
|
50
|
+
*/
|
|
51
|
+
async generateContent(request) {
|
|
52
|
+
const maxAttempts = this.policy.maxRetries + 1;
|
|
53
|
+
return this.attemptGenerateContent(request, 1, maxAttempts);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Generate content with streaming and retry.
|
|
57
|
+
*
|
|
58
|
+
* Note: For streaming, we retry the entire request if an error occurs.
|
|
59
|
+
* This is because partial streams cannot be resumed mid-way.
|
|
60
|
+
*
|
|
61
|
+
* @param request - Generation request
|
|
62
|
+
* @yields Content chunks as they are generated
|
|
63
|
+
* @returns Async generator yielding content chunks
|
|
64
|
+
*/
|
|
65
|
+
async *generateContentStream(request) {
|
|
66
|
+
const maxAttempts = this.policy.maxRetries + 1;
|
|
67
|
+
yield* this.attemptGenerateContentStream(request, 1, maxAttempts);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Attempt to generate content with retry logic.
|
|
71
|
+
*/
|
|
72
|
+
async attemptGenerateContent(request, attempt, maxAttempts) {
|
|
73
|
+
try {
|
|
74
|
+
return await this.inner.generateContent(request);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
// Check if this is the last attempt
|
|
78
|
+
if (attempt >= maxAttempts) {
|
|
79
|
+
this.emitExhausted(attempt, error);
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
// Check if error is retryable
|
|
83
|
+
if (!isRetryableError(error, this.policy)) {
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
// Calculate delay and emit retry event
|
|
87
|
+
const delayMs = calculateRetryDelay(attempt, this.policy);
|
|
88
|
+
this.emitRetry(attempt, maxAttempts, error, delayMs);
|
|
89
|
+
// Wait before retrying
|
|
90
|
+
await this.sleep(delayMs);
|
|
91
|
+
// Recursively attempt again
|
|
92
|
+
return this.attemptGenerateContent(request, attempt + 1, maxAttempts);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Attempt to generate content stream with retry logic.
|
|
97
|
+
*
|
|
98
|
+
* @yields Content chunks as they are generated
|
|
99
|
+
*/
|
|
100
|
+
async *attemptGenerateContentStream(request, attempt, maxAttempts) {
|
|
101
|
+
try {
|
|
102
|
+
// Yield all chunks from the inner generator
|
|
103
|
+
for await (const chunk of this.inner.generateContentStream(request)) {
|
|
104
|
+
yield chunk;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
// Check if this is the last attempt
|
|
109
|
+
if (attempt >= maxAttempts) {
|
|
110
|
+
this.emitExhausted(attempt, error);
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
// Check if error is retryable
|
|
114
|
+
if (!isRetryableError(error, this.policy)) {
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
// Calculate delay and emit retry event
|
|
118
|
+
const delayMs = calculateRetryDelay(attempt, this.policy);
|
|
119
|
+
this.emitRetry(attempt, maxAttempts, error, delayMs);
|
|
120
|
+
// Wait before retrying
|
|
121
|
+
await this.sleep(delayMs);
|
|
122
|
+
// Recursively attempt again
|
|
123
|
+
yield* this.attemptGenerateContentStream(request, attempt + 1, maxAttempts);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Emit an exhausted event when all retries are used.
|
|
128
|
+
*/
|
|
129
|
+
emitExhausted(attempts, error) {
|
|
130
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
131
|
+
console.error(`[Retry] All ${attempts} attempts exhausted. Final error: ${errorMessage}`);
|
|
132
|
+
this.eventBus?.emit('llmservice:error', {
|
|
133
|
+
error: `All ${attempts} retry attempts exhausted: ${errorMessage}`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Emit a retry event via warning.
|
|
138
|
+
*/
|
|
139
|
+
emitRetry(attempt, maxAttempts, error, delayMs) {
|
|
140
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
141
|
+
console.warn(`[Retry] Attempt ${attempt}/${maxAttempts} failed: ${errorMessage}. ` +
|
|
142
|
+
`Retrying in ${delayMs}ms...`);
|
|
143
|
+
this.eventBus?.emit('llmservice:warning', {
|
|
144
|
+
message: `Retry attempt ${attempt}/${maxAttempts} after ${delayMs}ms: ${errorMessage}`,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Sleep for a specified duration.
|
|
149
|
+
*/
|
|
150
|
+
sleep(ms) {
|
|
151
|
+
return new Promise((resolve) => {
|
|
152
|
+
setTimeout(() => {
|
|
153
|
+
resolve();
|
|
154
|
+
}, ms);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { LlmError, LlmGenerationError, LlmMaxIterationsError, LlmMissingToolExecutorError, LlmResponseParsingError, } from '../../../core/domain/cipher/errors/llm-error.js';
|
|
2
|
+
export type { ILLMService } from '../../../core/interfaces/cipher/i-llm-service.js';
|
|
3
|
+
export { ContextManager, type FileData, type ImageData } from './context/context-manager.js';
|
|
4
|
+
export { GeminiMessageFormatter } from './formatters/gemini-formatter.js';
|
|
5
|
+
export { OpenRouterMessageFormatter } from './formatters/openrouter-formatter.js';
|
|
6
|
+
export { ByteRoverLLMService, type ByteRoverLLMServiceConfig, type LLMServiceConfig } from './internal-llm-service.js';
|
|
7
|
+
export { OpenRouterLLMService, type OpenRouterServiceConfig } from './openrouter-llm-service.js';
|
|
8
|
+
export { GeminiTokenizer } from './tokenizers/gemini-tokenizer.js';
|
|
9
|
+
export { OpenRouterTokenizer } from './tokenizers/openrouter-tokenizer.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// LLM errors
|
|
2
|
+
export { LlmError, LlmGenerationError, LlmMaxIterationsError, LlmMissingToolExecutorError, LlmResponseParsingError, } from '../../../core/domain/cipher/errors/llm-error.js';
|
|
3
|
+
// Context manager
|
|
4
|
+
export { ContextManager } from './context/context-manager.js';
|
|
5
|
+
// Message formatters
|
|
6
|
+
export { GeminiMessageFormatter } from './formatters/gemini-formatter.js';
|
|
7
|
+
export { OpenRouterMessageFormatter } from './formatters/openrouter-formatter.js';
|
|
8
|
+
// LLM services
|
|
9
|
+
export { ByteRoverLLMService } from './internal-llm-service.js';
|
|
10
|
+
export { OpenRouterLLMService } from './openrouter-llm-service.js';
|
|
11
|
+
// Tokenizers
|
|
12
|
+
export { GeminiTokenizer } from './tokenizers/gemini-tokenizer.js';
|
|
13
|
+
export { OpenRouterTokenizer } from './tokenizers/openrouter-tokenizer.js';
|