byterover-cli 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +48 -3
- package/dist/commands/init.js +242 -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,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message formatter for Google Gemini API.
|
|
3
|
+
*
|
|
4
|
+
* Converts the internal message format to Gemini's specific structure:
|
|
5
|
+
* - Maps 'assistant' role to 'model' (Gemini's terminology)
|
|
6
|
+
* - System prompts are injected as user messages (Gemini doesn't have system role)
|
|
7
|
+
* - Tool calls use functionCall parts
|
|
8
|
+
* - Tool results use functionResponse parts in user messages
|
|
9
|
+
*/
|
|
10
|
+
export class GeminiMessageFormatter {
|
|
11
|
+
/**
|
|
12
|
+
* Formats internal messages into Gemini's API format.
|
|
13
|
+
*
|
|
14
|
+
* @param history Array of internal messages to format
|
|
15
|
+
* @param systemPrompt Optional system prompt to include at the beginning
|
|
16
|
+
* @returns Array of Content objects formatted for Gemini's API
|
|
17
|
+
*/
|
|
18
|
+
format(history, systemPrompt) {
|
|
19
|
+
const contents = [];
|
|
20
|
+
// Add system prompt as a user message if provided
|
|
21
|
+
// Gemini doesn't have a separate system role
|
|
22
|
+
if (systemPrompt) {
|
|
23
|
+
contents.push({
|
|
24
|
+
parts: [{ text: `System: ${systemPrompt}` }],
|
|
25
|
+
role: 'user',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// Accumulator for consecutive tool results
|
|
29
|
+
let toolGroup = [];
|
|
30
|
+
for (const msg of history) {
|
|
31
|
+
if (msg.role === 'tool') {
|
|
32
|
+
// Accumulate tool results
|
|
33
|
+
toolGroup.push(msg);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Flush accumulated tool results before processing non-tool message
|
|
37
|
+
if (toolGroup.length > 0) {
|
|
38
|
+
contents.push(this.combineToolResults(toolGroup));
|
|
39
|
+
toolGroup = [];
|
|
40
|
+
}
|
|
41
|
+
// Format non-tool message
|
|
42
|
+
contents.push(this.formatNonToolMessage(msg));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Flush any remaining tool results
|
|
46
|
+
if (toolGroup.length > 0) {
|
|
47
|
+
contents.push(this.combineToolResults(toolGroup));
|
|
48
|
+
}
|
|
49
|
+
return contents;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parses Gemini API response into internal message objects.
|
|
53
|
+
*
|
|
54
|
+
* @param response The raw response from Gemini API
|
|
55
|
+
* @returns Array of internal messages (typically one assistant message)
|
|
56
|
+
*/
|
|
57
|
+
parseResponse(response) {
|
|
58
|
+
const typedResponse = response;
|
|
59
|
+
if (!typedResponse.candidates || typedResponse.candidates.length === 0) {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
const candidate = typedResponse.candidates[0];
|
|
63
|
+
if (!candidate?.content?.parts) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
const textParts = [];
|
|
67
|
+
const functionCalls = [];
|
|
68
|
+
// Extract text and function calls from response parts
|
|
69
|
+
for (const part of candidate.content.parts) {
|
|
70
|
+
if ('text' in part && part.text) {
|
|
71
|
+
textParts.push(part.text);
|
|
72
|
+
}
|
|
73
|
+
if ('functionCall' in part && part.functionCall) {
|
|
74
|
+
functionCalls.push(part.functionCall);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Convert to internal message format
|
|
78
|
+
const toolCalls = functionCalls.length > 0
|
|
79
|
+
? functionCalls.map((fc) => ({
|
|
80
|
+
function: {
|
|
81
|
+
arguments: JSON.stringify(fc.args ?? {}),
|
|
82
|
+
name: fc.name ?? '',
|
|
83
|
+
},
|
|
84
|
+
id: this.generateToolCallId(fc.name ?? ''),
|
|
85
|
+
type: 'function',
|
|
86
|
+
}))
|
|
87
|
+
: undefined;
|
|
88
|
+
return [
|
|
89
|
+
{
|
|
90
|
+
content: textParts.join('') || null,
|
|
91
|
+
role: 'assistant',
|
|
92
|
+
toolCalls,
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Combines multiple tool results into a single Gemini user message.
|
|
98
|
+
* Required by Gemini API when assistant made multiple tool calls.
|
|
99
|
+
*/
|
|
100
|
+
combineToolResults(toolMessages) {
|
|
101
|
+
return {
|
|
102
|
+
parts: toolMessages.map((msg) => this.formatToolResultPart(msg)),
|
|
103
|
+
role: 'user',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Formats assistant message to Gemini's Content format.
|
|
108
|
+
* Maps 'assistant' role to 'model' and includes both text and tool calls.
|
|
109
|
+
*/
|
|
110
|
+
formatAssistantMessage(msg) {
|
|
111
|
+
const parts = [];
|
|
112
|
+
// Add text content if present
|
|
113
|
+
if (msg.content) {
|
|
114
|
+
parts.push({ text: String(msg.content) });
|
|
115
|
+
}
|
|
116
|
+
// Add tool calls if present
|
|
117
|
+
if (msg.toolCalls) {
|
|
118
|
+
for (const tc of msg.toolCalls) {
|
|
119
|
+
parts.push({
|
|
120
|
+
functionCall: {
|
|
121
|
+
args: JSON.parse(tc.function.arguments),
|
|
122
|
+
name: tc.function.name,
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
parts,
|
|
129
|
+
role: 'model', // Gemini uses 'model' instead of 'assistant'
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Formats a single non-tool message to Gemini Content.
|
|
134
|
+
*/
|
|
135
|
+
formatNonToolMessage(msg) {
|
|
136
|
+
switch (msg.role) {
|
|
137
|
+
case 'assistant': {
|
|
138
|
+
return this.formatAssistantMessage(msg);
|
|
139
|
+
}
|
|
140
|
+
case 'system': {
|
|
141
|
+
return {
|
|
142
|
+
parts: [{ text: `System: ${String(msg.content || '')}` }],
|
|
143
|
+
role: 'user',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
case 'user': {
|
|
147
|
+
return this.formatUserMessage(msg);
|
|
148
|
+
}
|
|
149
|
+
default: {
|
|
150
|
+
return {
|
|
151
|
+
parts: [{ text: String(msg.content || '') }],
|
|
152
|
+
role: 'user',
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Formats a single tool result message to a Gemini functionResponse Part.
|
|
159
|
+
* Multiple tool results are combined into a single user message by format().
|
|
160
|
+
*
|
|
161
|
+
* Note: msg.content is a JSON string from ToolOutputProcessor.
|
|
162
|
+
* We need to parse it back to an object for Gemini's API.
|
|
163
|
+
*/
|
|
164
|
+
formatToolResultPart(msg) {
|
|
165
|
+
// msg.content is a JSON string from ToolOutputProcessor
|
|
166
|
+
// Parse it back to object for Gemini's API
|
|
167
|
+
let responseObject;
|
|
168
|
+
try {
|
|
169
|
+
// Try to parse as JSON
|
|
170
|
+
if (typeof msg.content === 'string') {
|
|
171
|
+
responseObject = JSON.parse(msg.content);
|
|
172
|
+
}
|
|
173
|
+
else if (msg.content === null) {
|
|
174
|
+
responseObject = { result: null };
|
|
175
|
+
}
|
|
176
|
+
else if (Array.isArray(msg.content)) {
|
|
177
|
+
// Array content (e.g., MessagePart[]) - wrap in result
|
|
178
|
+
responseObject = { result: msg.content };
|
|
179
|
+
}
|
|
180
|
+
else if (typeof msg.content === 'object') {
|
|
181
|
+
// Already an object (shouldn't happen with current implementation, but handle it)
|
|
182
|
+
responseObject = msg.content;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// Primitive types - wrap them
|
|
186
|
+
responseObject = { result: msg.content };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// If parsing fails, wrap the string as-is
|
|
191
|
+
responseObject = { result: msg.content };
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
functionResponse: {
|
|
195
|
+
name: msg.name ?? '',
|
|
196
|
+
response: responseObject,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Formats a single user content part.
|
|
202
|
+
* Currently supports text parts, with placeholders for image/file support.
|
|
203
|
+
*/
|
|
204
|
+
formatUserContentPart(part) {
|
|
205
|
+
if (part.type === 'text') {
|
|
206
|
+
return { text: part.text };
|
|
207
|
+
}
|
|
208
|
+
if (part.type === 'image') {
|
|
209
|
+
// Image support not yet implemented for Gemini
|
|
210
|
+
// Gemini supports inline images via inlineData or fileData
|
|
211
|
+
return { text: '[Image not yet supported]' };
|
|
212
|
+
}
|
|
213
|
+
if (part.type === 'file') {
|
|
214
|
+
// File support not yet implemented for Gemini
|
|
215
|
+
return { text: '[File not yet supported]' };
|
|
216
|
+
}
|
|
217
|
+
return { text: '[Unknown content type]' };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Formats user message to Gemini's Content format.
|
|
221
|
+
* Handles both simple string content and multimodal content parts.
|
|
222
|
+
*/
|
|
223
|
+
formatUserMessage(msg) {
|
|
224
|
+
const parts = [];
|
|
225
|
+
if (typeof msg.content === 'string') {
|
|
226
|
+
// Simple text message
|
|
227
|
+
parts.push({ text: msg.content });
|
|
228
|
+
}
|
|
229
|
+
else if (Array.isArray(msg.content)) {
|
|
230
|
+
// Multimodal content (text, images, files)
|
|
231
|
+
for (const part of msg.content) {
|
|
232
|
+
parts.push(this.formatUserContentPart(part));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
parts,
|
|
237
|
+
role: 'user',
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Generates a unique tool call ID.
|
|
242
|
+
* Gemini doesn't provide tool call IDs, so we generate them.
|
|
243
|
+
*
|
|
244
|
+
* @param toolName The name of the tool being called
|
|
245
|
+
* @returns A unique identifier for the tool call
|
|
246
|
+
*/
|
|
247
|
+
generateToolCallId(toolName) {
|
|
248
|
+
// Simple ID generation: timestamp + random + tool name
|
|
249
|
+
const timestamp = Date.now();
|
|
250
|
+
const random = Math.random().toString(36).slice(2, 9);
|
|
251
|
+
return `call_${timestamp}_${random}_${toolName}`;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { ChatCompletionMessageParam } from 'openai/resources';
|
|
2
|
+
import type { IMessageFormatter } from '../../../../core/interfaces/cipher/i-message-formatter.js';
|
|
3
|
+
import type { InternalMessage } from '../../../../core/interfaces/cipher/message-types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Message formatter for OpenRouter API.
|
|
6
|
+
*
|
|
7
|
+
* OpenRouter uses OpenAI-compatible API format:
|
|
8
|
+
* - System prompts are included in the messages array
|
|
9
|
+
* - Tool calls use the tool_calls property
|
|
10
|
+
* - Tool results use the 'tool' role with tool_call_id
|
|
11
|
+
* - Supports multimodal content (text, images, files)
|
|
12
|
+
*/
|
|
13
|
+
export declare class OpenRouterMessageFormatter implements IMessageFormatter<ChatCompletionMessageParam> {
|
|
14
|
+
/**
|
|
15
|
+
* Formats internal messages into OpenRouter's API format (OpenAI-compatible).
|
|
16
|
+
*
|
|
17
|
+
* @param history Array of internal messages to format
|
|
18
|
+
* @param systemPrompt Optional system prompt to include at the beginning
|
|
19
|
+
* @returns Array of messages formatted for OpenRouter's API
|
|
20
|
+
*/
|
|
21
|
+
format(history: Readonly<InternalMessage[]>, systemPrompt?: null | string): ChatCompletionMessageParam[];
|
|
22
|
+
/**
|
|
23
|
+
* Parses OpenRouter API response into internal message objects.
|
|
24
|
+
*
|
|
25
|
+
* @param response The raw response from OpenRouter API
|
|
26
|
+
* @returns Array of internal messages (typically one assistant message)
|
|
27
|
+
*/
|
|
28
|
+
parseResponse(response: unknown): InternalMessage[];
|
|
29
|
+
/**
|
|
30
|
+
* Formats tool result content to text string.
|
|
31
|
+
* OpenRouter only supports text content for tool messages.
|
|
32
|
+
*/
|
|
33
|
+
private formatToolContent;
|
|
34
|
+
/**
|
|
35
|
+
* Formats user message content into OpenRouter's format.
|
|
36
|
+
* Handles both simple string content and multimodal content parts (text, images, files).
|
|
37
|
+
*/
|
|
38
|
+
private formatUserContent;
|
|
39
|
+
/**
|
|
40
|
+
* Formats a single user content part (text, image, or file).
|
|
41
|
+
*/
|
|
42
|
+
private formatUserContentPart;
|
|
43
|
+
/**
|
|
44
|
+
* Extracts image data as base64 string or URL.
|
|
45
|
+
*/
|
|
46
|
+
private getImageData;
|
|
47
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message formatter for OpenRouter API.
|
|
3
|
+
*
|
|
4
|
+
* OpenRouter uses OpenAI-compatible API format:
|
|
5
|
+
* - System prompts are included in the messages array
|
|
6
|
+
* - Tool calls use the tool_calls property
|
|
7
|
+
* - Tool results use the 'tool' role with tool_call_id
|
|
8
|
+
* - Supports multimodal content (text, images, files)
|
|
9
|
+
*/
|
|
10
|
+
export class OpenRouterMessageFormatter {
|
|
11
|
+
/**
|
|
12
|
+
* Formats internal messages into OpenRouter's API format (OpenAI-compatible).
|
|
13
|
+
*
|
|
14
|
+
* @param history Array of internal messages to format
|
|
15
|
+
* @param systemPrompt Optional system prompt to include at the beginning
|
|
16
|
+
* @returns Array of messages formatted for OpenRouter's API
|
|
17
|
+
*/
|
|
18
|
+
format(history, systemPrompt) {
|
|
19
|
+
const formatted = [];
|
|
20
|
+
// Add system message if provided
|
|
21
|
+
if (systemPrompt) {
|
|
22
|
+
formatted.push({
|
|
23
|
+
content: systemPrompt,
|
|
24
|
+
role: 'system',
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// Track pending tool calls to detect orphans (tool calls without results)
|
|
28
|
+
const pendingToolCallIds = new Set();
|
|
29
|
+
for (const msg of history) {
|
|
30
|
+
switch (msg.role) {
|
|
31
|
+
case 'assistant': {
|
|
32
|
+
// Assistant messages may or may not have tool calls
|
|
33
|
+
if (msg.toolCalls && msg.toolCalls.length > 0) {
|
|
34
|
+
formatted.push({
|
|
35
|
+
content: String(msg.content || ''),
|
|
36
|
+
role: 'assistant',
|
|
37
|
+
// eslint-disable-next-line camelcase
|
|
38
|
+
tool_calls: msg.toolCalls,
|
|
39
|
+
});
|
|
40
|
+
// Track these tool call IDs as pending
|
|
41
|
+
for (const toolCall of msg.toolCalls) {
|
|
42
|
+
pendingToolCallIds.add(toolCall.id);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
formatted.push({
|
|
47
|
+
content: String(msg.content || ''),
|
|
48
|
+
role: 'assistant',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
case 'system': {
|
|
54
|
+
// Additional system messages in history
|
|
55
|
+
formatted.push({
|
|
56
|
+
content: String(msg.content || ''),
|
|
57
|
+
role: 'system',
|
|
58
|
+
});
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case 'tool': {
|
|
62
|
+
// Tool results for OpenRouter — only text field is supported.
|
|
63
|
+
// Only add if we've seen the corresponding tool call
|
|
64
|
+
if (msg.toolCallId && pendingToolCallIds.has(msg.toolCallId)) {
|
|
65
|
+
formatted.push({
|
|
66
|
+
content: this.formatToolContent(msg.content),
|
|
67
|
+
role: 'tool',
|
|
68
|
+
// eslint-disable-next-line camelcase
|
|
69
|
+
tool_call_id: msg.toolCallId,
|
|
70
|
+
});
|
|
71
|
+
// Remove from pending since we found its result
|
|
72
|
+
pendingToolCallIds.delete(msg.toolCallId);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// Orphaned tool result (result without matching call)
|
|
76
|
+
// Skip it to prevent API errors
|
|
77
|
+
console.warn(`Skipping orphaned tool result ${msg.toolCallId} (no matching tool call found)`);
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case 'user': {
|
|
82
|
+
formatted.push({
|
|
83
|
+
content: this.formatUserContent(msg.content),
|
|
84
|
+
role: 'user',
|
|
85
|
+
});
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Add synthetic error results for any orphaned tool calls
|
|
91
|
+
// This can happen when the agent crashes/interrupts before tool execution completes
|
|
92
|
+
if (pendingToolCallIds.size > 0) {
|
|
93
|
+
for (const toolCallId of pendingToolCallIds) {
|
|
94
|
+
formatted.push({
|
|
95
|
+
content: 'Error: Tool execution was interrupted (session crashed or cancelled before completion)',
|
|
96
|
+
role: 'tool',
|
|
97
|
+
// eslint-disable-next-line camelcase
|
|
98
|
+
tool_call_id: toolCallId,
|
|
99
|
+
});
|
|
100
|
+
console.warn(`Tool call ${toolCallId} had no matching tool result - added synthetic error result`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return formatted;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Parses OpenRouter API response into internal message objects.
|
|
107
|
+
*
|
|
108
|
+
* @param response The raw response from OpenRouter API
|
|
109
|
+
* @returns Array of internal messages (typically one assistant message)
|
|
110
|
+
*/
|
|
111
|
+
parseResponse(response) {
|
|
112
|
+
const internal = [];
|
|
113
|
+
const typedResponse = response;
|
|
114
|
+
if (!typedResponse.choices || !Array.isArray(typedResponse.choices)) {
|
|
115
|
+
return internal;
|
|
116
|
+
}
|
|
117
|
+
for (const choice of typedResponse.choices) {
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
119
|
+
const msg = choice.message;
|
|
120
|
+
if (!msg || !msg.role)
|
|
121
|
+
continue;
|
|
122
|
+
const role = msg.role;
|
|
123
|
+
switch (role) {
|
|
124
|
+
case 'assistant': {
|
|
125
|
+
const content = msg.content ?? null;
|
|
126
|
+
// Handle tool calls if present
|
|
127
|
+
if (msg.tool_calls && Array.isArray(msg.tool_calls) && msg.tool_calls.length > 0) {
|
|
128
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
129
|
+
const calls = msg.tool_calls.map((call) => ({
|
|
130
|
+
function: {
|
|
131
|
+
arguments: call.function.arguments,
|
|
132
|
+
name: call.function.name,
|
|
133
|
+
},
|
|
134
|
+
id: call.id,
|
|
135
|
+
type: 'function',
|
|
136
|
+
}));
|
|
137
|
+
internal.push({ content, role: 'assistant', toolCalls: calls });
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
internal.push({ content, role: 'assistant' });
|
|
141
|
+
}
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
case 'system':
|
|
145
|
+
case 'user': {
|
|
146
|
+
if (msg.content) {
|
|
147
|
+
internal.push({ content: msg.content, role });
|
|
148
|
+
}
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case 'tool': {
|
|
152
|
+
internal.push({
|
|
153
|
+
content: msg.content,
|
|
154
|
+
name: msg.name,
|
|
155
|
+
role: 'tool',
|
|
156
|
+
toolCallId: msg.tool_call_id,
|
|
157
|
+
});
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return internal;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Formats tool result content to text string.
|
|
166
|
+
* OpenRouter only supports text content for tool messages.
|
|
167
|
+
*/
|
|
168
|
+
formatToolContent(content) {
|
|
169
|
+
if (typeof content === 'string') {
|
|
170
|
+
return content;
|
|
171
|
+
}
|
|
172
|
+
if (Array.isArray(content)) {
|
|
173
|
+
// Extract text from multimodal content
|
|
174
|
+
return content
|
|
175
|
+
.filter((part) => part.type === 'text')
|
|
176
|
+
.map((part) => part.text)
|
|
177
|
+
.join('\n');
|
|
178
|
+
}
|
|
179
|
+
return String(content || '');
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Formats user message content into OpenRouter's format.
|
|
183
|
+
* Handles both simple string content and multimodal content parts (text, images, files).
|
|
184
|
+
*/
|
|
185
|
+
formatUserContent(content) {
|
|
186
|
+
if (!Array.isArray(content)) {
|
|
187
|
+
return String(content || '');
|
|
188
|
+
}
|
|
189
|
+
const parts = content
|
|
190
|
+
.map((part) => this.formatUserContentPart(part))
|
|
191
|
+
.filter((part) => part !== null);
|
|
192
|
+
return parts;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Formats a single user content part (text, image, or file).
|
|
196
|
+
*/
|
|
197
|
+
formatUserContentPart(part) {
|
|
198
|
+
if (part.type === 'text') {
|
|
199
|
+
return { text: part.text, type: 'text' };
|
|
200
|
+
}
|
|
201
|
+
if (part.type === 'image') {
|
|
202
|
+
// Convert image to data URL or use existing URL
|
|
203
|
+
const imageData = this.getImageData(part.image);
|
|
204
|
+
const url = imageData.startsWith('http://') ||
|
|
205
|
+
imageData.startsWith('https://') ||
|
|
206
|
+
imageData.startsWith('data:')
|
|
207
|
+
? imageData
|
|
208
|
+
: `data:${part.mimeType || 'application/octet-stream'};base64,${imageData}`;
|
|
209
|
+
// eslint-disable-next-line camelcase
|
|
210
|
+
return { image_url: { url }, type: 'image_url' };
|
|
211
|
+
}
|
|
212
|
+
if (part.type === 'file') {
|
|
213
|
+
// File support: convert to text representation
|
|
214
|
+
// OpenRouter may support files differently depending on the model
|
|
215
|
+
return { text: `[File: ${part.filename || 'unknown'}]`, type: 'text' };
|
|
216
|
+
}
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Extracts image data as base64 string or URL.
|
|
221
|
+
*/
|
|
222
|
+
getImageData(image) {
|
|
223
|
+
if (typeof image === 'string') {
|
|
224
|
+
return image;
|
|
225
|
+
}
|
|
226
|
+
if (image instanceof URL) {
|
|
227
|
+
return image.toString();
|
|
228
|
+
}
|
|
229
|
+
if (image instanceof Buffer) {
|
|
230
|
+
return image.toString('base64');
|
|
231
|
+
}
|
|
232
|
+
if (image instanceof Uint8Array || image instanceof ArrayBuffer) {
|
|
233
|
+
const buffer = image instanceof ArrayBuffer ? new Uint8Array(image) : image;
|
|
234
|
+
return Buffer.from(buffer).toString('base64');
|
|
235
|
+
}
|
|
236
|
+
return '';
|
|
237
|
+
}
|
|
238
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ByteRover Content Generator.
|
|
3
|
+
*
|
|
4
|
+
* Implements IContentGenerator using ByteRover gRPC service.
|
|
5
|
+
* Supports both Claude and Gemini models through the unified gRPC interface.
|
|
6
|
+
*/
|
|
7
|
+
import type { GenerateContentChunk, GenerateContentRequest, GenerateContentResponse, IContentGenerator } from '../../../../core/interfaces/cipher/i-content-generator.js';
|
|
8
|
+
import type { ByteRoverLlmGrpcService } from '../../grpc/internal-llm-grpc-service.js';
|
|
9
|
+
import { type ThinkingConfig } from '../thought-parser.js';
|
|
10
|
+
/**
|
|
11
|
+
* Configuration for ByteRover Content Generator.
|
|
12
|
+
*/
|
|
13
|
+
export interface ByteRoverContentGeneratorConfig {
|
|
14
|
+
/** Maximum tokens in the response */
|
|
15
|
+
maxTokens?: number;
|
|
16
|
+
/** Model identifier */
|
|
17
|
+
model: string;
|
|
18
|
+
/** Temperature for randomness */
|
|
19
|
+
temperature?: number;
|
|
20
|
+
/** Thinking configuration for Gemini models */
|
|
21
|
+
thinkingConfig?: ThinkingConfig;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* ByteRover Content Generator.
|
|
25
|
+
*
|
|
26
|
+
* Wraps ByteRoverLlmGrpcService and implements IContentGenerator.
|
|
27
|
+
* Handles:
|
|
28
|
+
* - Provider detection (Claude vs Gemini)
|
|
29
|
+
* - Message formatting via provider-specific formatters
|
|
30
|
+
* - Token estimation via provider-specific tokenizers
|
|
31
|
+
* - Response parsing to unified format
|
|
32
|
+
*/
|
|
33
|
+
export declare class ByteRoverContentGenerator implements IContentGenerator {
|
|
34
|
+
private readonly config;
|
|
35
|
+
private readonly formatter;
|
|
36
|
+
private readonly grpcService;
|
|
37
|
+
private readonly providerType;
|
|
38
|
+
private readonly tokenizer;
|
|
39
|
+
/**
|
|
40
|
+
* Create a new ByteRover Content Generator.
|
|
41
|
+
*
|
|
42
|
+
* @param grpcService - Configured gRPC service for LLM API calls
|
|
43
|
+
* @param config - Generator configuration
|
|
44
|
+
*/
|
|
45
|
+
constructor(grpcService: ByteRoverLlmGrpcService, config: ByteRoverContentGeneratorConfig);
|
|
46
|
+
/**
|
|
47
|
+
* Estimate tokens synchronously using character-based approximation.
|
|
48
|
+
*
|
|
49
|
+
* @param content - Text to estimate tokens for
|
|
50
|
+
* @returns Estimated token count
|
|
51
|
+
*/
|
|
52
|
+
estimateTokensSync(content: string): number;
|
|
53
|
+
/**
|
|
54
|
+
* Generate content (non-streaming).
|
|
55
|
+
*
|
|
56
|
+
* @param request - Generation request
|
|
57
|
+
* @returns Generated content response
|
|
58
|
+
*/
|
|
59
|
+
generateContent(request: GenerateContentRequest): Promise<GenerateContentResponse>;
|
|
60
|
+
/**
|
|
61
|
+
* Generate content with streaming.
|
|
62
|
+
*
|
|
63
|
+
* Note: The current gRPC service collects all chunks before returning.
|
|
64
|
+
* This implementation yields the complete response as a single chunk.
|
|
65
|
+
* True streaming can be implemented when the gRPC service exposes the stream.
|
|
66
|
+
*
|
|
67
|
+
* @param request - Generation request
|
|
68
|
+
* @yields Content chunks as they are generated
|
|
69
|
+
* @returns Async generator yielding content chunks
|
|
70
|
+
*/
|
|
71
|
+
generateContentStream(request: GenerateContentRequest): AsyncGenerator<GenerateContentChunk>;
|
|
72
|
+
/**
|
|
73
|
+
* Build Claude-specific generation configuration.
|
|
74
|
+
*/
|
|
75
|
+
private buildClaudeConfig;
|
|
76
|
+
/**
|
|
77
|
+
* Build Gemini-specific generation configuration.
|
|
78
|
+
*/
|
|
79
|
+
private buildGeminiConfig;
|
|
80
|
+
/**
|
|
81
|
+
* Build generation config for the appropriate provider.
|
|
82
|
+
*/
|
|
83
|
+
private buildGenerationConfig;
|
|
84
|
+
/**
|
|
85
|
+
* Detect provider type from model name.
|
|
86
|
+
*/
|
|
87
|
+
private detectProviderType;
|
|
88
|
+
/**
|
|
89
|
+
* Extract text content from an internal message.
|
|
90
|
+
*/
|
|
91
|
+
private extractTextContent;
|
|
92
|
+
}
|