byterover-cli 0.3.5 → 0.4.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 +119 -63
- package/bin/dev.js +8 -1
- package/bin/run.js +7 -0
- package/dist/commands/cipher-agent/run.d.ts +30 -0
- package/dist/commands/cipher-agent/run.js +123 -61
- package/dist/commands/cipher-agent/set-prompt.d.ts +2 -0
- package/dist/commands/cipher-agent/set-prompt.js +13 -8
- package/dist/commands/cipher-agent/show-prompt.d.ts +2 -0
- package/dist/commands/cipher-agent/show-prompt.js +17 -12
- package/dist/commands/curate.d.ts +3 -60
- package/dist/commands/curate.js +45 -341
- package/dist/commands/foo.d.ts +4 -2
- package/dist/commands/foo.js +21 -16
- package/dist/commands/main.d.ts +9 -0
- package/dist/commands/main.js +34 -0
- package/dist/commands/query.d.ts +2 -48
- package/dist/commands/query.js +19 -287
- package/dist/commands/status.d.ts +2 -13
- package/dist/commands/status.js +12 -91
- package/dist/commands/watch.d.ts +2 -0
- package/dist/commands/watch.js +23 -19
- package/dist/config/environment.d.ts +1 -1
- package/dist/config/environment.js +2 -2
- package/dist/constants.d.ts +4 -5
- package/dist/constants.js +5 -5
- package/dist/core/domain/cipher/errors/storage-error.d.ts +89 -0
- package/dist/core/domain/cipher/errors/storage-error.js +130 -0
- package/dist/core/domain/cipher/queue/types.d.ts +71 -0
- package/dist/core/domain/cipher/queue/types.js +9 -0
- package/dist/core/domain/cipher/storage/message-storage-types.d.ts +218 -0
- package/dist/core/domain/cipher/storage/message-storage-types.js +18 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +1 -0
- package/dist/core/domain/cipher/tools/constants.js +1 -0
- package/dist/core/domain/entities/event.d.ts +1 -1
- package/dist/core/domain/entities/event.js +8 -1
- package/dist/core/domain/entities/global-config.d.ts +36 -0
- package/dist/core/domain/entities/global-config.js +66 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +10 -0
- package/dist/core/domain/knowledge/directory-manager.js +18 -0
- package/dist/core/domain/knowledge/markdown-writer.d.ts +9 -0
- package/dist/core/domain/knowledge/markdown-writer.js +51 -1
- package/dist/core/interfaces/cipher/i-agent-storage.d.ts +152 -0
- package/dist/core/interfaces/cipher/i-agent-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +2 -0
- package/dist/core/interfaces/cipher/i-key-storage.d.ts +91 -0
- package/dist/core/interfaces/cipher/i-key-storage.js +1 -0
- package/dist/core/interfaces/i-global-config-store.d.ts +34 -0
- package/dist/core/interfaces/i-global-config-store.js +1 -0
- package/dist/core/interfaces/i-onboarding-preference-store.d.ts +20 -0
- package/dist/core/interfaces/i-onboarding-preference-store.js +1 -0
- package/dist/core/interfaces/i-terminal.d.ts +146 -0
- package/dist/core/interfaces/i-terminal.js +1 -0
- package/dist/core/interfaces/i-workspace-detector-service.d.ts +8 -0
- package/dist/core/interfaces/i-workspace-detector-service.js +1 -0
- package/dist/core/interfaces/usecase/i-clear-use-case.d.ts +6 -0
- package/dist/core/interfaces/usecase/i-clear-use-case.js +1 -0
- package/dist/core/interfaces/usecase/i-curate-use-case.d.ts +10 -0
- package/dist/core/interfaces/usecase/i-curate-use-case.js +1 -0
- package/dist/core/interfaces/usecase/i-generate-rules-use-case.d.ts +3 -0
- package/dist/core/interfaces/usecase/i-generate-rules-use-case.js +1 -0
- package/dist/core/interfaces/usecase/i-init-use-case.d.ts +5 -0
- package/dist/core/interfaces/usecase/i-init-use-case.js +1 -0
- package/dist/core/interfaces/usecase/i-login-use-case.d.ts +3 -0
- package/dist/core/interfaces/usecase/i-login-use-case.js +1 -0
- package/dist/core/interfaces/usecase/i-logout-use-case.d.ts +5 -0
- package/dist/core/interfaces/usecase/i-logout-use-case.js +1 -0
- package/dist/core/interfaces/usecase/i-pull-use-case.d.ts +5 -0
- package/dist/core/interfaces/usecase/i-pull-use-case.js +1 -0
- package/dist/core/interfaces/usecase/i-push-use-case.d.ts +6 -0
- package/dist/core/interfaces/usecase/i-push-use-case.js +1 -0
- package/dist/core/interfaces/usecase/i-query-use-case.d.ts +9 -0
- package/dist/core/interfaces/usecase/i-query-use-case.js +1 -0
- package/dist/core/interfaces/usecase/i-space-list-use-case.d.ts +3 -0
- package/dist/core/interfaces/usecase/i-space-list-use-case.js +1 -0
- package/dist/core/interfaces/usecase/i-space-switch-use-case.d.ts +3 -0
- package/dist/core/interfaces/usecase/i-space-switch-use-case.js +1 -0
- package/dist/core/interfaces/usecase/i-status-use-case.d.ts +5 -0
- package/dist/core/interfaces/usecase/i-status-use-case.js +1 -0
- package/dist/hooks/init/welcome.js +10 -26
- package/dist/infra/cipher/agent-service-factory.d.ts +13 -6
- package/dist/infra/cipher/agent-service-factory.js +40 -16
- package/dist/infra/cipher/cipher-agent.js +4 -4
- package/dist/infra/cipher/consumer/consumer-lock.d.ts +20 -0
- package/dist/infra/cipher/consumer/consumer-lock.js +40 -0
- package/dist/infra/cipher/consumer/consumer-service.d.ts +99 -0
- package/dist/infra/cipher/consumer/consumer-service.js +165 -0
- package/dist/infra/cipher/consumer/execution-consumer.d.ts +121 -0
- package/dist/infra/cipher/consumer/execution-consumer.js +523 -0
- package/dist/infra/cipher/consumer/index.d.ts +33 -0
- package/dist/infra/cipher/consumer/index.js +33 -0
- package/dist/infra/cipher/consumer/queue-polling-service.d.ts +120 -0
- package/dist/infra/cipher/consumer/queue-polling-service.js +248 -0
- package/dist/infra/cipher/http/internal-llm-http-service.d.ts +94 -0
- package/dist/infra/cipher/http/internal-llm-http-service.js +118 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +106 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.js +132 -0
- package/dist/infra/cipher/llm/context/compaction/index.d.ts +9 -0
- package/dist/infra/cipher/llm/context/compaction/index.js +9 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +46 -2
- package/dist/infra/cipher/llm/context/context-manager.js +68 -4
- package/dist/infra/cipher/llm/context/rw-lock.d.ts +72 -0
- package/dist/infra/cipher/llm/context/rw-lock.js +145 -0
- package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +7 -7
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +8 -8
- package/dist/infra/cipher/llm/internal-llm-service.js +2 -0
- package/dist/infra/cipher/session/session-manager.d.ts +4 -4
- package/dist/infra/cipher/session/session-manager.js +5 -5
- package/dist/infra/cipher/storage/agent-storage.d.ts +246 -0
- package/dist/infra/cipher/storage/agent-storage.js +956 -0
- package/dist/infra/cipher/storage/dual-format-history-storage.d.ts +77 -0
- package/dist/infra/cipher/storage/dual-format-history-storage.js +149 -0
- package/dist/infra/cipher/storage/granular-history-storage.d.ts +65 -0
- package/dist/infra/cipher/storage/granular-history-storage.js +118 -0
- package/dist/infra/cipher/storage/message-storage-service.d.ts +108 -0
- package/dist/infra/cipher/storage/message-storage-service.js +529 -0
- package/dist/infra/cipher/storage/process-utils.d.ts +16 -0
- package/dist/infra/cipher/storage/process-utils.js +43 -0
- package/dist/infra/cipher/storage/sqlite-key-storage.d.ts +105 -0
- package/dist/infra/cipher/storage/sqlite-key-storage.js +404 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +1 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +7 -0
- package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
- package/dist/infra/cipher/tools/implementations/curate-tool.d.ts +10 -0
- package/dist/infra/cipher/tools/implementations/curate-tool.js +371 -0
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +11 -8
- package/dist/infra/cipher/tools/tool-manager.d.ts +8 -2
- package/dist/infra/cipher/tools/tool-manager.js +29 -2
- package/dist/infra/cipher/tools/tool-registry.js +7 -0
- package/dist/infra/http/authenticated-http-client.d.ts +21 -0
- package/dist/infra/http/authenticated-http-client.js +38 -0
- package/dist/infra/repl/commands/arg-parser.d.ts +97 -0
- package/dist/infra/repl/commands/arg-parser.js +129 -0
- package/dist/infra/repl/commands/clear-command.d.ts +5 -0
- package/dist/infra/repl/commands/clear-command.js +61 -0
- package/dist/infra/repl/commands/curate-command.d.ts +9 -0
- package/dist/infra/repl/commands/curate-command.js +88 -0
- package/dist/infra/repl/commands/gen-rules-command.d.ts +7 -0
- package/dist/infra/repl/commands/gen-rules-command.js +38 -0
- package/dist/infra/repl/commands/index.d.ts +8 -0
- package/dist/infra/repl/commands/index.js +36 -0
- package/dist/infra/repl/commands/init-command.d.ts +7 -0
- package/dist/infra/repl/commands/init-command.js +83 -0
- package/dist/infra/repl/commands/login-command.d.ts +7 -0
- package/dist/infra/repl/commands/login-command.js +50 -0
- package/dist/infra/repl/commands/logout-command.d.ts +5 -0
- package/dist/infra/repl/commands/logout-command.js +48 -0
- package/dist/infra/repl/commands/pull-command.d.ts +5 -0
- package/dist/infra/repl/commands/pull-command.js +61 -0
- package/dist/infra/repl/commands/push-command.d.ts +5 -0
- package/dist/infra/repl/commands/push-command.js +66 -0
- package/dist/infra/repl/commands/query-command.d.ts +5 -0
- package/dist/infra/repl/commands/query-command.js +66 -0
- package/dist/infra/repl/commands/space/index.d.ts +5 -0
- package/dist/infra/repl/commands/space/index.js +14 -0
- package/dist/infra/repl/commands/space/list-command.d.ts +5 -0
- package/dist/infra/repl/commands/space/list-command.js +70 -0
- package/dist/infra/repl/commands/space/switch-command.d.ts +5 -0
- package/dist/infra/repl/commands/space/switch-command.js +37 -0
- package/dist/infra/repl/commands/status-command.d.ts +5 -0
- package/dist/infra/repl/commands/status-command.js +39 -0
- package/dist/infra/repl/repl-startup.d.ts +18 -0
- package/dist/infra/repl/repl-startup.js +28 -0
- package/dist/infra/storage/file-global-config-store.d.ts +22 -0
- package/dist/infra/storage/file-global-config-store.js +65 -0
- package/dist/infra/storage/file-onboarding-preference-store.d.ts +10 -0
- package/dist/infra/storage/file-onboarding-preference-store.js +46 -0
- package/dist/infra/terminal/oclif-terminal.d.ts +19 -0
- package/dist/infra/terminal/oclif-terminal.js +60 -0
- package/dist/infra/terminal/repl-terminal.d.ts +31 -0
- package/dist/infra/terminal/repl-terminal.js +116 -0
- package/dist/infra/tracking/mixpanel-tracking-service.d.ts +11 -1
- package/dist/infra/tracking/mixpanel-tracking-service.js +18 -13
- package/dist/infra/usecase/clear-use-case.d.ts +20 -0
- package/dist/infra/usecase/clear-use-case.js +58 -0
- package/dist/infra/usecase/curate-use-case.d.ts +66 -0
- package/dist/infra/usecase/curate-use-case.js +288 -0
- package/dist/{commands/gen-rules.d.ts → infra/usecase/generate-rules-use-case.d.ts} +14 -20
- package/dist/{commands/gen-rules.js → infra/usecase/generate-rules-use-case.js} +59 -78
- package/dist/infra/usecase/init-use-case.d.ts +139 -0
- package/dist/{commands/init.js → infra/usecase/init-use-case.js} +197 -233
- package/dist/infra/usecase/login-use-case.d.ts +28 -0
- package/dist/infra/usecase/login-use-case.js +94 -0
- package/dist/infra/usecase/logout-use-case.d.ts +22 -0
- package/dist/infra/usecase/logout-use-case.js +51 -0
- package/dist/infra/usecase/pull-use-case.d.ts +35 -0
- package/dist/infra/usecase/pull-use-case.js +89 -0
- package/dist/infra/usecase/push-use-case.d.ts +37 -0
- package/dist/infra/usecase/push-use-case.js +124 -0
- package/dist/infra/usecase/query-use-case.d.ts +78 -0
- package/dist/infra/usecase/query-use-case.js +402 -0
- package/dist/infra/usecase/space-list-use-case.d.ts +27 -0
- package/dist/infra/usecase/space-list-use-case.js +64 -0
- package/dist/infra/usecase/space-switch-use-case.d.ts +36 -0
- package/dist/infra/usecase/space-switch-use-case.js +140 -0
- package/dist/infra/usecase/status-use-case.d.ts +27 -0
- package/dist/infra/usecase/status-use-case.js +97 -0
- package/dist/infra/workspace/workspace-detector-service.d.ts +3 -6
- package/dist/resources/prompts/curate-context-tree-curation.yml +23 -11
- package/dist/resources/prompts/query-context-tree-retrieval.yml +3 -4
- package/dist/resources/prompts/system-prompt.yml +1 -1
- package/dist/resources/prompts/tool-outputs.yml +4 -3
- package/dist/templates/sections/command-reference.md +12 -0
- package/dist/templates/sections/workflow.md +10 -1
- package/dist/tui/app.d.ts +9 -0
- package/dist/tui/app.js +26 -0
- package/dist/tui/components/enter-prompt.d.ts +13 -0
- package/dist/tui/components/enter-prompt.js +15 -0
- package/dist/tui/components/execution/execution-changes.d.ts +14 -0
- package/dist/tui/components/execution/execution-changes.js +15 -0
- package/dist/tui/components/execution/execution-content.d.ts +25 -0
- package/dist/tui/components/execution/execution-content.js +67 -0
- package/dist/tui/components/execution/execution-input.d.ts +12 -0
- package/dist/tui/components/execution/execution-input.js +16 -0
- package/dist/tui/components/execution/execution-progress.d.ts +21 -0
- package/dist/tui/components/execution/execution-progress.js +21 -0
- package/dist/tui/components/execution/execution-status.d.ts +13 -0
- package/dist/tui/components/execution/execution-status.js +19 -0
- package/dist/tui/components/execution/index.d.ts +11 -0
- package/dist/tui/components/execution/index.js +11 -0
- package/dist/tui/components/execution/log-item.d.ts +17 -0
- package/dist/tui/components/execution/log-item.js +25 -0
- package/dist/tui/components/footer.d.ts +5 -0
- package/dist/tui/components/footer.js +12 -0
- package/dist/tui/components/header.d.ts +18 -0
- package/dist/tui/components/header.js +18 -0
- package/dist/tui/components/index.d.ts +17 -0
- package/dist/tui/components/index.js +14 -0
- package/dist/tui/components/inline-prompts/index.d.ts +15 -0
- package/dist/tui/components/inline-prompts/index.js +10 -0
- package/dist/tui/components/inline-prompts/inline-confirm.d.ts +17 -0
- package/dist/tui/components/inline-prompts/inline-confirm.js +32 -0
- package/dist/tui/components/inline-prompts/inline-file-selector.d.ts +43 -0
- package/dist/tui/components/inline-prompts/inline-file-selector.js +185 -0
- package/dist/tui/components/inline-prompts/inline-input.d.ts +19 -0
- package/dist/tui/components/inline-prompts/inline-input.js +32 -0
- package/dist/tui/components/inline-prompts/inline-search.d.ts +20 -0
- package/dist/tui/components/inline-prompts/inline-search.js +50 -0
- package/dist/tui/components/inline-prompts/inline-select.d.ts +20 -0
- package/dist/tui/components/inline-prompts/inline-select.js +34 -0
- package/dist/tui/components/logo.d.ts +43 -0
- package/dist/tui/components/logo.js +103 -0
- package/dist/tui/components/message-item.d.ts +12 -0
- package/dist/tui/components/message-item.js +12 -0
- package/dist/tui/components/onboarding/copyable-prompt.d.ts +15 -0
- package/dist/tui/components/onboarding/copyable-prompt.js +65 -0
- package/dist/tui/components/onboarding/index.d.ts +7 -0
- package/dist/tui/components/onboarding/index.js +6 -0
- package/dist/tui/components/onboarding/onboarding-flow.d.ts +13 -0
- package/dist/tui/components/onboarding/onboarding-flow.js +304 -0
- package/dist/tui/components/onboarding/onboarding-step.d.ts +23 -0
- package/dist/tui/components/onboarding/onboarding-step.js +12 -0
- package/dist/tui/components/output-log.d.ts +14 -0
- package/dist/tui/components/output-log.js +13 -0
- package/dist/tui/components/scrollable-list.d.ts +30 -0
- package/dist/tui/components/scrollable-list.js +121 -0
- package/dist/tui/components/suggestions.d.ts +16 -0
- package/dist/tui/components/suggestions.js +162 -0
- package/dist/tui/components/tab-bar.d.ts +10 -0
- package/dist/tui/components/tab-bar.js +12 -0
- package/dist/tui/constants.d.ts +11 -0
- package/dist/tui/constants.js +13 -0
- package/dist/tui/contexts/auth-context.d.ts +30 -0
- package/dist/tui/contexts/auth-context.js +153 -0
- package/dist/tui/contexts/consumer.d.ts +31 -0
- package/dist/tui/contexts/consumer.js +56 -0
- package/dist/tui/contexts/index.d.ts +6 -0
- package/dist/tui/contexts/index.js +6 -0
- package/dist/tui/contexts/onboarding-context.d.ts +43 -0
- package/dist/tui/contexts/onboarding-context.js +181 -0
- package/dist/tui/contexts/services-context.d.ts +29 -0
- package/dist/tui/contexts/services-context.js +20 -0
- package/dist/tui/contexts/use-commands.d.ts +29 -0
- package/dist/tui/contexts/use-commands.js +54 -0
- package/dist/tui/contexts/use-mode.d.ts +43 -0
- package/dist/tui/contexts/use-mode.js +76 -0
- package/dist/tui/contexts/use-theme.d.ts +53 -0
- package/dist/tui/contexts/use-theme.js +60 -0
- package/dist/tui/hooks/index.d.ts +17 -0
- package/dist/tui/hooks/index.js +14 -0
- package/dist/tui/hooks/use-activity-logs.d.ts +26 -0
- package/dist/tui/hooks/use-activity-logs.js +90 -0
- package/dist/tui/hooks/use-consumer.d.ts +12 -0
- package/dist/tui/hooks/use-consumer.js +50 -0
- package/dist/tui/hooks/use-onboarding.d.ts +7 -0
- package/dist/tui/hooks/use-onboarding.js +6 -0
- package/dist/tui/hooks/use-queue-polling.d.ts +31 -0
- package/dist/tui/hooks/use-queue-polling.js +90 -0
- package/dist/tui/hooks/use-slash-command-processor.d.ts +16 -0
- package/dist/tui/hooks/use-slash-command-processor.js +132 -0
- package/dist/tui/hooks/use-slash-completion.d.ts +30 -0
- package/dist/tui/hooks/use-slash-completion.js +230 -0
- package/dist/tui/hooks/use-tab-navigation.d.ts +10 -0
- package/dist/tui/hooks/use-tab-navigation.js +35 -0
- package/dist/tui/hooks/use-visible-window.d.ts +22 -0
- package/dist/tui/hooks/use-visible-window.js +37 -0
- package/dist/tui/index.d.ts +1 -0
- package/dist/tui/index.js +1 -0
- package/dist/tui/providers/app-providers.d.ts +25 -0
- package/dist/tui/providers/app-providers.js +9 -0
- package/dist/tui/types/commands.d.ts +252 -0
- package/dist/tui/types/commands.js +16 -0
- package/dist/tui/types/dialogs.d.ts +37 -0
- package/dist/tui/types/dialogs.js +4 -0
- package/dist/tui/types/index.d.ts +11 -0
- package/dist/tui/types/index.js +7 -0
- package/dist/tui/types/messages.d.ts +55 -0
- package/dist/tui/types/messages.js +4 -0
- package/dist/tui/types/prompts.d.ts +100 -0
- package/dist/tui/types/prompts.js +4 -0
- package/dist/tui/types/ui.d.ts +14 -0
- package/dist/tui/types/ui.js +4 -0
- package/dist/tui/types.d.ts +1 -0
- package/dist/tui/types.js +1 -0
- package/dist/tui/views/command-view.d.ts +12 -0
- package/dist/tui/views/command-view.js +451 -0
- package/dist/tui/views/index.d.ts +6 -0
- package/dist/tui/views/index.js +6 -0
- package/dist/tui/views/login-view.d.ts +10 -0
- package/dist/tui/views/login-view.js +30 -0
- package/dist/tui/views/logs-view.d.ts +11 -0
- package/dist/tui/views/logs-view.js +73 -0
- package/dist/utils/file-validator.d.ts +16 -0
- package/dist/utils/file-validator.js +81 -0
- package/dist/utils/global-config-path.d.ts +15 -0
- package/dist/utils/global-config-path.js +38 -0
- package/oclif.manifest.json +29 -315
- package/package.json +11 -4
- package/dist/commands/clear.d.ts +0 -19
- package/dist/commands/clear.js +0 -78
- package/dist/commands/init.d.ts +0 -130
- package/dist/commands/login.d.ts +0 -22
- package/dist/commands/login.js +0 -108
- package/dist/commands/logout.d.ts +0 -16
- package/dist/commands/logout.js +0 -61
- package/dist/commands/pull.d.ts +0 -33
- package/dist/commands/pull.js +0 -115
- package/dist/commands/push.d.ts +0 -35
- package/dist/commands/push.js +0 -160
- package/dist/commands/space/list.d.ts +0 -25
- package/dist/commands/space/list.js +0 -114
- package/dist/commands/space/switch.d.ts +0 -36
- package/dist/commands/space/switch.js +0 -160
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +0 -149
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +0 -364
- package/dist/infra/cipher/grpc/internal-llm-grpc.proto +0 -94
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
import * as grpc from '@grpc/grpc-js';
|
|
2
|
-
import * as protoLoader from '@grpc/proto-loader';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { fileURLToPath } from 'node:url';
|
|
5
|
-
/**
|
|
6
|
-
* ByteRover gRPC LLM API client.
|
|
7
|
-
*
|
|
8
|
-
* Simple wrapper around ByteRover gRPC LLM service.
|
|
9
|
-
* Delegates prompt building and formatting to service layer.
|
|
10
|
-
*
|
|
11
|
-
* Responsibilities:
|
|
12
|
-
* - Call the remote gRPC service
|
|
13
|
-
* - Stream and collect responses
|
|
14
|
-
* - Convert to GenerateContentResponse format
|
|
15
|
-
*
|
|
16
|
-
* Does NOT:
|
|
17
|
-
* - Build prompts or format inputs
|
|
18
|
-
* - Parse or manipulate response content
|
|
19
|
-
* - Handle tool call parsing from text
|
|
20
|
-
*/
|
|
21
|
-
export class ByteRoverLlmGrpcService {
|
|
22
|
-
client = null;
|
|
23
|
-
config;
|
|
24
|
-
credentials;
|
|
25
|
-
/**
|
|
26
|
-
* Initialize a new ByteRover gRPC LLM service client.
|
|
27
|
-
*
|
|
28
|
-
* Sets up configuration with sensible defaults:
|
|
29
|
-
* - projectId defaults to 'byterover'
|
|
30
|
-
* - region defaults to 'us-east1' (can be overridden per request)
|
|
31
|
-
* - timeout defaults to 30 seconds
|
|
32
|
-
*
|
|
33
|
-
* Determines whether to use secure (TLS) or insecure connections based on
|
|
34
|
-
* the endpoint hostname. The actual gRPC client is lazily initialized on first use.
|
|
35
|
-
*
|
|
36
|
-
* @param config - gRPC client configuration (accessToken, grpcEndpoint, sessionKey, optional: projectId, region, timeout)
|
|
37
|
-
*/
|
|
38
|
-
constructor(config) {
|
|
39
|
-
this.config = {
|
|
40
|
-
accessToken: config.accessToken,
|
|
41
|
-
grpcEndpoint: config.grpcEndpoint,
|
|
42
|
-
projectId: config.projectId ?? 'byterover',
|
|
43
|
-
region: config.region ?? 'us-east1',
|
|
44
|
-
sessionKey: config.sessionKey,
|
|
45
|
-
spaceId: config.spaceId,
|
|
46
|
-
teamId: config.teamId,
|
|
47
|
-
timeout: config.timeout ?? 60_000,
|
|
48
|
-
};
|
|
49
|
-
// Determine if using secure (TLS) or insecure connection based on endpoint
|
|
50
|
-
const isLocalhost = config.grpcEndpoint.includes('localhost') || config.grpcEndpoint.includes('127.0.0.1');
|
|
51
|
-
this.credentials = isLocalhost ? grpc.credentials.createInsecure() : grpc.credentials.createSsl();
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Close the gRPC connection and cleanup resources.
|
|
55
|
-
*
|
|
56
|
-
* Safely closes the underlying gRPC client connection if it exists.
|
|
57
|
-
* Can be called multiple times without error.
|
|
58
|
-
*/
|
|
59
|
-
close() {
|
|
60
|
-
if (this.client) {
|
|
61
|
-
this.client.close();
|
|
62
|
-
this.client = null;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Call ByteRover gRPC LLM service to generate content.
|
|
67
|
-
*
|
|
68
|
-
* Simple forward to remote gRPC service - delegates all formatting to backend.
|
|
69
|
-
* Supports both Gemini and Claude formats - the correct format is determined
|
|
70
|
-
* automatically based on the model name.
|
|
71
|
-
*
|
|
72
|
-
* Parameter structure differs by provider:
|
|
73
|
-
* - Gemini: contents = Content[], config = GenerateContentConfig
|
|
74
|
-
* - Claude: contents = MessageCreateParamsNonStreaming (complete body), config = RequestOptions (HTTP options)
|
|
75
|
-
*
|
|
76
|
-
* @param contents - For Gemini: Content[]. For Claude: MessageCreateParamsNonStreaming (complete body)
|
|
77
|
-
* @param config - For Gemini: GenerateContentConfig. For Claude: RequestOptions (optional HTTP options)
|
|
78
|
-
* @param model - Model to use (detects provider from model name)
|
|
79
|
-
* @param executionMetadata - Optional execution metadata (mode, executionContext)
|
|
80
|
-
* @returns Response in GenerateContentResponse format
|
|
81
|
-
*/
|
|
82
|
-
async generateContent(contents, config, model, executionMetadata) {
|
|
83
|
-
await this.initializeClient();
|
|
84
|
-
const request = {
|
|
85
|
-
executionMetadata: JSON.stringify(executionMetadata ?? {}),
|
|
86
|
-
params: {
|
|
87
|
-
config: JSON.stringify(config),
|
|
88
|
-
contents: JSON.stringify(contents),
|
|
89
|
-
model,
|
|
90
|
-
},
|
|
91
|
-
project_id: this.config.projectId,
|
|
92
|
-
provider: this.detectProviderFromModel(model),
|
|
93
|
-
region: this.detectRegionFromModel(model),
|
|
94
|
-
spaceId: this.config.spaceId,
|
|
95
|
-
teamId: this.config.teamId,
|
|
96
|
-
};
|
|
97
|
-
return this.callGrpcGenerate(request);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Call the ByteRover gRPC Generate endpoint and collect streaming response.
|
|
101
|
-
*
|
|
102
|
-
* Handles authentication headers, streaming response collection, timeouts,
|
|
103
|
-
* and error handling. Uses a timeout mechanism to prevent hanging when the
|
|
104
|
-
* server closes the connection without proper cleanup.
|
|
105
|
-
*
|
|
106
|
-
* @param request - The gRPC generate request with model, provider, region, and params
|
|
107
|
-
* @returns Promise resolving to the complete LLM response
|
|
108
|
-
* @throws Error if client is not initialized, timeout occurs, or stream error happens
|
|
109
|
-
*/
|
|
110
|
-
callGrpcGenerate(request) {
|
|
111
|
-
return new Promise((resolve, reject) => {
|
|
112
|
-
if (!this.client) {
|
|
113
|
-
reject(new Error('gRPC client not initialized'));
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
// Log gRPC request
|
|
117
|
-
// console.log('[gRPC] Request:', request)
|
|
118
|
-
// Create metadata with authentication headers
|
|
119
|
-
const metadata = new grpc.Metadata();
|
|
120
|
-
metadata.add('authorization', `Bearer ${this.config.accessToken}`);
|
|
121
|
-
metadata.add('x-byterover-session-id', this.config.sessionKey);
|
|
122
|
-
// Call the gRPC Generate method
|
|
123
|
-
// eslint-disable-next-line new-cap
|
|
124
|
-
const call = this.client.Generate(request, metadata);
|
|
125
|
-
let content = null;
|
|
126
|
-
let settled = false;
|
|
127
|
-
// Timeout to prevent hanging when server destroys stream without proper cleanup
|
|
128
|
-
const timeoutHandle = setTimeout(() => {
|
|
129
|
-
if (!settled) {
|
|
130
|
-
settled = true;
|
|
131
|
-
call.cancel();
|
|
132
|
-
reject(new Error('gRPC call timeout: server did not respond within 30 seconds'));
|
|
133
|
-
}
|
|
134
|
-
}, this.config.timeout);
|
|
135
|
-
// Cleanup function
|
|
136
|
-
const cleanup = () => {
|
|
137
|
-
clearTimeout(timeoutHandle);
|
|
138
|
-
};
|
|
139
|
-
// Collect streaming responses
|
|
140
|
-
call.on('data', (data) => {
|
|
141
|
-
const response = data;
|
|
142
|
-
if (response.data) {
|
|
143
|
-
try {
|
|
144
|
-
content = JSON.parse(response.data);
|
|
145
|
-
if (!settled) {
|
|
146
|
-
settled = true;
|
|
147
|
-
cleanup();
|
|
148
|
-
resolve(content);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
catch (error) {
|
|
152
|
-
console.error(`[gRPC Provider] Failed to parse response chunk:`, error);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
console.warn(`[gRPC Provider] Response data is empty or undefined:`, response);
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
call.on('end', () => {
|
|
160
|
-
if (settled) {
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
settled = true;
|
|
164
|
-
cleanup();
|
|
165
|
-
if (content === null) {
|
|
166
|
-
reject(new Error('gRPC call ended without receiving valid response data'));
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
resolve(content);
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
call.on('error', (error) => {
|
|
173
|
-
if (settled) {
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
settled = true;
|
|
177
|
-
cleanup();
|
|
178
|
-
// Parse gRPC error to extract user-friendly message
|
|
179
|
-
const userMessage = this.parseGrpcError(error);
|
|
180
|
-
reject(new Error(userMessage));
|
|
181
|
-
});
|
|
182
|
-
// Handle gRPC status codes (server-sent errors)
|
|
183
|
-
call.on('status', (status) => {
|
|
184
|
-
if (status.code !== grpc.status.OK && !settled) {
|
|
185
|
-
settled = true;
|
|
186
|
-
cleanup();
|
|
187
|
-
// Parse status error to extract user-friendly message
|
|
188
|
-
const userMessage = this.parseGrpcStatusError(status);
|
|
189
|
-
reject(new Error(userMessage));
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Check if error message contains any of the given keywords
|
|
196
|
-
*/
|
|
197
|
-
containsAny(message, keywords) {
|
|
198
|
-
return keywords.some((keyword) => message.includes(keyword));
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Detect LLM provider from model identifier.
|
|
202
|
-
*
|
|
203
|
-
* Determines which provider (Claude or Gemini) to use based on the model name.
|
|
204
|
-
* Defaults to Gemini if the model doesn't match Claude patterns.
|
|
205
|
-
*
|
|
206
|
-
* @param model - Model identifier (e.g., 'claude-3-5-sonnet', 'gemini-2.5-flash')
|
|
207
|
-
* @returns Provider name: 'claude' or 'gemini'
|
|
208
|
-
*/
|
|
209
|
-
detectProviderFromModel(model) {
|
|
210
|
-
return model.toLowerCase().startsWith('claude') ? 'claude' : 'gemini';
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Detect appropriate GCP region from model identifier.
|
|
214
|
-
*
|
|
215
|
-
* Routes Claude models to us-east5 and Gemini models to us-east1.
|
|
216
|
-
* This ensures compatibility with the provider's available regions on Vertex AI.
|
|
217
|
-
*
|
|
218
|
-
* @param model - Model identifier (e.g., 'claude-3-5-sonnet', 'gemini-2.5-flash')
|
|
219
|
-
* @returns GCP region identifier ('us-east5' or 'us-east1')
|
|
220
|
-
*/
|
|
221
|
-
detectRegionFromModel(model) {
|
|
222
|
-
// return model.toLowerCase().startsWith('claude') ? 'us-east5' : 'us-central1'
|
|
223
|
-
return model.toLowerCase().startsWith('claude') ? 'us-east5' : 'global';
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Initialize the gRPC client on first use (lazy loading).
|
|
227
|
-
*
|
|
228
|
-
* Loads the protobuf definition, constructs the gRPC service client,
|
|
229
|
-
* and caches it for reuse. Only called once - subsequent calls return immediately.
|
|
230
|
-
*
|
|
231
|
-
* Uses the proto file at runtime to support dynamic loading and avoid bundling
|
|
232
|
-
* proto files into the compiled JavaScript.
|
|
233
|
-
*
|
|
234
|
-
* @throws Error if proto file cannot be found or parsed
|
|
235
|
-
*/
|
|
236
|
-
async initializeClient() {
|
|
237
|
-
if (this.client) {
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
const filename = fileURLToPath(import.meta.url);
|
|
241
|
-
const dirname = path.dirname(filename);
|
|
242
|
-
const protoPath = path.resolve(dirname, '../grpc/internal-llm-grpc.proto');
|
|
243
|
-
const packageDefinition = await protoLoader.load(protoPath, {
|
|
244
|
-
defaults: true,
|
|
245
|
-
enums: String,
|
|
246
|
-
keepCase: true,
|
|
247
|
-
longs: String,
|
|
248
|
-
oneofs: true,
|
|
249
|
-
});
|
|
250
|
-
const proto = grpc.loadPackageDefinition(packageDefinition);
|
|
251
|
-
const { LLMService } = proto.byterover.llm.v1;
|
|
252
|
-
this.client = new LLMService(this.config.grpcEndpoint, this.credentials);
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Parse gRPC error to extract user-friendly error message.
|
|
256
|
-
*
|
|
257
|
-
* Handles common gRPC error patterns and extracts meaningful messages:
|
|
258
|
-
* - RESOURCE_EXHAUSTED: Billing/quota issues
|
|
259
|
-
* - UNAUTHENTICATED: Authentication failures
|
|
260
|
-
* - PERMISSION_DENIED: Authorization issues
|
|
261
|
-
* - UNAVAILABLE: Service unavailability
|
|
262
|
-
* - Other errors: Generic failure message
|
|
263
|
-
*
|
|
264
|
-
* @param error - gRPC error object
|
|
265
|
-
* @returns User-friendly error message
|
|
266
|
-
*/
|
|
267
|
-
parseGrpcError(error) {
|
|
268
|
-
const errorMessage = error.message || String(error);
|
|
269
|
-
// Check resource exhausted errors
|
|
270
|
-
const resourceError = this.parseResourceExhaustedError(errorMessage);
|
|
271
|
-
if (resourceError)
|
|
272
|
-
return resourceError;
|
|
273
|
-
// Check authentication errors
|
|
274
|
-
if (this.containsAny(errorMessage, ['UNAUTHENTICATED', 'authentication'])) {
|
|
275
|
-
return '❌ Authentication failed: Your session may have expired. Please run "brv login" to re-authenticate.';
|
|
276
|
-
}
|
|
277
|
-
// Check permission errors
|
|
278
|
-
if (this.containsAny(errorMessage, ['PERMISSION_DENIED', 'permission'])) {
|
|
279
|
-
return '❌ Permission denied: You do not have access to this resource. Please check your team/space permissions.';
|
|
280
|
-
}
|
|
281
|
-
// Check network/connection errors
|
|
282
|
-
if (this.containsAny(errorMessage, [
|
|
283
|
-
'ECONNREFUSED',
|
|
284
|
-
'ENOTFOUND',
|
|
285
|
-
'ETIMEDOUT',
|
|
286
|
-
'connection refused',
|
|
287
|
-
'network',
|
|
288
|
-
'dns',
|
|
289
|
-
'getaddrinfo',
|
|
290
|
-
])) {
|
|
291
|
-
return '❌ Network error: Unable to connect to ByteRover servers. Please check your internet connection and try again.';
|
|
292
|
-
}
|
|
293
|
-
// Check service availability errors
|
|
294
|
-
if (this.containsAny(errorMessage, ['UNAVAILABLE', 'unavailable'])) {
|
|
295
|
-
return '❌ Service unavailable: ByteRover API is temporarily unavailable. Please try again later.';
|
|
296
|
-
}
|
|
297
|
-
// Generic error with cleaned message
|
|
298
|
-
return `❌ API error: ${errorMessage.split(':').pop()?.trim() || 'Unknown error occurred'}`;
|
|
299
|
-
}
|
|
300
|
-
/**
|
|
301
|
-
* Parse gRPC status error to extract user-friendly error message.
|
|
302
|
-
*
|
|
303
|
-
* @param status - gRPC status object
|
|
304
|
-
* @returns User-friendly error message
|
|
305
|
-
*/
|
|
306
|
-
parseGrpcStatusError(status) {
|
|
307
|
-
const statusName = grpc.status[status.code];
|
|
308
|
-
const details = status.details || 'No details provided';
|
|
309
|
-
// Map common status codes to user-friendly messages
|
|
310
|
-
switch (status.code) {
|
|
311
|
-
case grpc.status.DEADLINE_EXCEEDED: {
|
|
312
|
-
return '❌ Request timeout: The API request took too long. Please try again.';
|
|
313
|
-
}
|
|
314
|
-
case grpc.status.INVALID_ARGUMENT: {
|
|
315
|
-
return `❌ Invalid request: ${details}`;
|
|
316
|
-
}
|
|
317
|
-
case grpc.status.NOT_FOUND: {
|
|
318
|
-
return '❌ Resource not found: The requested resource does not exist.';
|
|
319
|
-
}
|
|
320
|
-
case grpc.status.PERMISSION_DENIED: {
|
|
321
|
-
return '❌ Permission denied: You do not have access to this resource.';
|
|
322
|
-
}
|
|
323
|
-
case grpc.status.RESOURCE_EXHAUSTED: {
|
|
324
|
-
if (details.includes('Billing') || details.includes('credentials')) {
|
|
325
|
-
return '❌ Billing error: Your ByteRover account may not have sufficient credits or valid payment method.';
|
|
326
|
-
}
|
|
327
|
-
return '❌ Resource exhausted: API quota or billing limit reached.';
|
|
328
|
-
}
|
|
329
|
-
case grpc.status.UNAUTHENTICATED: {
|
|
330
|
-
return '❌ Authentication failed: Your session may have expired. Please run "brv login" to re-authenticate.';
|
|
331
|
-
}
|
|
332
|
-
case grpc.status.UNAVAILABLE: {
|
|
333
|
-
// Check if it's a network error (user's connection) vs server unavailable
|
|
334
|
-
const detailsLower = details.toLowerCase();
|
|
335
|
-
if (detailsLower.includes('enotfound') ||
|
|
336
|
-
detailsLower.includes('econnrefused') ||
|
|
337
|
-
detailsLower.includes('etimedout') ||
|
|
338
|
-
detailsLower.includes('network') ||
|
|
339
|
-
detailsLower.includes('dns') ||
|
|
340
|
-
detailsLower.includes('getaddrinfo')) {
|
|
341
|
-
return '❌ Network error: Unable to connect to ByteRover servers. Please check your internet connection and try again.';
|
|
342
|
-
}
|
|
343
|
-
return '❌ Service unavailable: ByteRover API is temporarily unavailable. Please try again later.';
|
|
344
|
-
}
|
|
345
|
-
default: {
|
|
346
|
-
return `❌ API error [${statusName}]: ${details}`;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* Parse resource exhausted errors (billing/quota)
|
|
352
|
-
*/
|
|
353
|
-
parseResourceExhaustedError(errorMessage) {
|
|
354
|
-
if (!errorMessage.includes('RESOURCE_EXHAUSTED'))
|
|
355
|
-
return null;
|
|
356
|
-
if (this.containsAny(errorMessage, ['Billing service error', 'Invalid credentials'])) {
|
|
357
|
-
return '❌ Billing error: Your ByteRover account may not have sufficient credits or valid payment method. Please check your account settings.';
|
|
358
|
-
}
|
|
359
|
-
if (this.containsAny(errorMessage, ['quota', 'rate limit'])) {
|
|
360
|
-
return '❌ Rate limit exceeded: You have reached your API quota. Please wait or upgrade your plan.';
|
|
361
|
-
}
|
|
362
|
-
return '❌ Resource exhausted: API quota or billing limit reached. Please check your ByteRover account.';
|
|
363
|
-
}
|
|
364
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
syntax = "proto3";
|
|
2
|
-
|
|
3
|
-
package byterover.llm.v1;
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* LLM Service for ByteRover unified LLM operations
|
|
7
|
-
*
|
|
8
|
-
* Provides a unified, type-safe interface for multiple LLM providers:
|
|
9
|
-
* - Gemini: Google Cloud Vertex AI Gemini models
|
|
10
|
-
* - Claude: Anthropic Claude models via Vertex AI
|
|
11
|
-
*
|
|
12
|
-
* Architecture: Type-safe pass-through wrapper
|
|
13
|
-
* - Accepts provider-specific typed parameters
|
|
14
|
-
* - Forwards all parameters directly to the provider SDK
|
|
15
|
-
* - SDK validates and calls the LLM API
|
|
16
|
-
* - Responses are streamed incrementally for better performance
|
|
17
|
-
*
|
|
18
|
-
* All parameters are forwarded directly to the provider SDKs without modification.
|
|
19
|
-
* Parameter validation occurs at the SDK level.
|
|
20
|
-
*/
|
|
21
|
-
service LLMService {
|
|
22
|
-
/**
|
|
23
|
-
* Generate content with streaming support
|
|
24
|
-
*
|
|
25
|
-
* Makes a single API call to the chosen LLM provider and streams response chunks.
|
|
26
|
-
* All parameters in the request are forwarded directly to the provider SDK.
|
|
27
|
-
*
|
|
28
|
-
* Request:
|
|
29
|
-
* - provider: "gemini" or "claude"
|
|
30
|
-
* - project_id: GCP Project ID
|
|
31
|
-
* - region: GCP Region (default: us-central1)
|
|
32
|
-
* - params: Provider-specific parameters (all forwarded as-is to SDK)
|
|
33
|
-
*
|
|
34
|
-
* Response: Server streams response chunks incrementally
|
|
35
|
-
* - Each chunk contains either text content or tool calls
|
|
36
|
-
* - Final chunk includes finish_reason and token counts
|
|
37
|
-
*/
|
|
38
|
-
rpc Generate(GenerateRequest) returns (stream GenerateResponse);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Request for content generation
|
|
43
|
-
*/
|
|
44
|
-
message GenerateRequest {
|
|
45
|
-
// Generation parameters
|
|
46
|
-
GenerateParams params = 1;
|
|
47
|
-
|
|
48
|
-
// Project ID for the request
|
|
49
|
-
string project_id = 2;
|
|
50
|
-
|
|
51
|
-
// LLM provider (e.g., "claude", "gemini")
|
|
52
|
-
string provider = 3;
|
|
53
|
-
|
|
54
|
-
// Region for the request (e.g., "us-east1", "us-east5")
|
|
55
|
-
string region = 4;
|
|
56
|
-
|
|
57
|
-
// Current user teamID for the request
|
|
58
|
-
string teamId = 5;
|
|
59
|
-
|
|
60
|
-
// Current user spaceID for the request
|
|
61
|
-
string spaceId = 6;
|
|
62
|
-
|
|
63
|
-
// Current user executionMetadata for the request
|
|
64
|
-
string executionMetadata = 7;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
message GenerateParams {
|
|
68
|
-
// Required: Content messages as JSON string
|
|
69
|
-
// Parse on server: const contents = JSON.parse(params.contents)
|
|
70
|
-
// Gemini: JSON array of Content[] from @google-cloud/vertexai
|
|
71
|
-
// Claude: JSON array of MessageParam[] from @anthropic-ai/sdk
|
|
72
|
-
string contents = 1;
|
|
73
|
-
|
|
74
|
-
// Required: Generation configuration as JSON string
|
|
75
|
-
// Parse on server: const config = JSON.parse(params.config)
|
|
76
|
-
// Gemini: JSON object with generationConfig, systemInstruction, tools, etc.
|
|
77
|
-
// Claude: JSON object with system, temperature, max_tokens, tools, etc.
|
|
78
|
-
string config = 2;
|
|
79
|
-
|
|
80
|
-
// Required: Model identifier
|
|
81
|
-
// Examples: 'gemini-2.5-flash', 'claude-3-5-sonnet-20241022'
|
|
82
|
-
string model = 3;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Response chunk from the LLM
|
|
87
|
-
*
|
|
88
|
-
* Streamed incrementally for better performance.
|
|
89
|
-
* Each chunk contains either text content or a tool call.
|
|
90
|
-
*/
|
|
91
|
-
message GenerateResponse {
|
|
92
|
-
// Complete response as JSON string (for full response in single chunk)
|
|
93
|
-
string data = 1;
|
|
94
|
-
}
|