byterover-cli 0.2.0 → 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 +53 -2
- package/dist/commands/init.js +279 -66
- package/dist/commands/login.js +9 -4
- package/dist/commands/logout.d.ts +16 -0
- package/dist/commands/logout.js +61 -0
- 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 +4 -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/i-rule-template-service.d.ts +0 -4
- package/dist/core/interfaces/i-rule-template-service.js +1 -4
- 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/rule/constants.d.ts +4 -0
- package/dist/infra/rule/constants.js +4 -0
- package/dist/infra/rule/rule-template-service.js +1 -1
- package/dist/infra/rule/rule-writer-service.js +1 -5
- 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 -93
- 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 +422 -142
- package/package.json +29 -10
- 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,349 @@
|
|
|
1
|
+
import { Args, Command, Flags } from '@oclif/core';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { getCurrentConfig, isDevelopment } from '../config/environment.js';
|
|
4
|
+
import { PROJECT } from '../constants.js';
|
|
5
|
+
import { CipherAgent } from '../infra/cipher/cipher-agent.js';
|
|
6
|
+
import { ExitCode, ExitError, exitWithCode } from '../infra/cipher/exit-codes.js';
|
|
7
|
+
import { WorkspaceNotInitializedError } from '../infra/cipher/validation/workspace-validator.js';
|
|
8
|
+
import { ProjectConfigStore } from '../infra/config/file-config-store.js';
|
|
9
|
+
import { KeychainTokenStore } from '../infra/storage/keychain-token-store.js';
|
|
10
|
+
import { MixpanelTrackingService } from '../infra/tracking/mixpanel-tracking-service.js';
|
|
11
|
+
import { formatError } from '../utils/error-handler.js';
|
|
12
|
+
import { formatToolCall, formatToolResult } from '../utils/tool-display-formatter.js';
|
|
13
|
+
export default class Query extends Command {
|
|
14
|
+
static args = {
|
|
15
|
+
query: Args.string({
|
|
16
|
+
description: 'Natural language question about your codebase or project knowledge',
|
|
17
|
+
required: true,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
static description = `Query and retrieve information from the context tree
|
|
21
|
+
Good:
|
|
22
|
+
- "How is user authentication implemented?"
|
|
23
|
+
- "What are the API rate limits and where are they enforced?"
|
|
24
|
+
Bad:
|
|
25
|
+
- "auth" or "authentication" (too vague, not a question)
|
|
26
|
+
- "show me code" (not specific about what information is needed)`;
|
|
27
|
+
static examples = [
|
|
28
|
+
'# Ask questions about patterns, decisions, or implementation details',
|
|
29
|
+
'<%= config.bin %> <%= command.id %> What are the coding standards?',
|
|
30
|
+
'<%= config.bin %> <%= command.id %> How is authentication implemented?',
|
|
31
|
+
'',
|
|
32
|
+
...(isDevelopment()
|
|
33
|
+
? [
|
|
34
|
+
'# Query with OpenRouter (development only)',
|
|
35
|
+
'<%= config.bin %> <%= command.id %> -k YOUR_API_KEY Show me all API endpoints',
|
|
36
|
+
'',
|
|
37
|
+
'# Query with custom model (development only)',
|
|
38
|
+
'<%= config.bin %> <%= command.id %> -k YOUR_API_KEY -m anthropic/claude-sonnet-4 Explain the database schema',
|
|
39
|
+
'',
|
|
40
|
+
'# Query with verbose output (development only)',
|
|
41
|
+
'<%= config.bin %> <%= command.id %> -v What testing strategies are used?',
|
|
42
|
+
]
|
|
43
|
+
: []),
|
|
44
|
+
];
|
|
45
|
+
static flags = {
|
|
46
|
+
...(isDevelopment()
|
|
47
|
+
? {
|
|
48
|
+
apiKey: Flags.string({
|
|
49
|
+
char: 'k',
|
|
50
|
+
description: 'OpenRouter API key (use OpenRouter instead of internal gRPC backend) [Development only]',
|
|
51
|
+
env: 'OPENROUTER_API_KEY',
|
|
52
|
+
}),
|
|
53
|
+
model: Flags.string({
|
|
54
|
+
char: 'm',
|
|
55
|
+
description: 'Model to use (default: google/gemini-2.5-pro for OpenRouter, gemini-2.5-pro for gRPC) [Development only]',
|
|
56
|
+
}),
|
|
57
|
+
verbose: Flags.boolean({
|
|
58
|
+
char: 'v',
|
|
59
|
+
default: false,
|
|
60
|
+
description: 'Enable verbose debug output [Development only]',
|
|
61
|
+
}),
|
|
62
|
+
}
|
|
63
|
+
: {}),
|
|
64
|
+
};
|
|
65
|
+
static strict = false;
|
|
66
|
+
// Override catch to prevent oclif from logging errors that were already displayed
|
|
67
|
+
async catch(error) {
|
|
68
|
+
// Check if error is ExitError (message already displayed by exitWithCode)
|
|
69
|
+
if (error instanceof ExitError) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Backwards compatibility: also check oclif.exit property
|
|
73
|
+
if (error.oclif?.exit !== undefined) {
|
|
74
|
+
// Error already displayed by exitWithCode, silently exit
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// For other errors, re-throw to let oclif handle them
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
createServices() {
|
|
81
|
+
return {
|
|
82
|
+
projectConfigStore: new ProjectConfigStore(),
|
|
83
|
+
trackingService: new MixpanelTrackingService(new KeychainTokenStore()),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Generate a unique session ID for the query agent.
|
|
88
|
+
* Uses crypto.randomUUID() for guaranteed uniqueness (122 bits of entropy).
|
|
89
|
+
*/
|
|
90
|
+
generateSessionId() {
|
|
91
|
+
return randomUUID();
|
|
92
|
+
}
|
|
93
|
+
async run() {
|
|
94
|
+
const { argv, flags } = await this.parse(Query);
|
|
95
|
+
const { projectConfigStore, trackingService } = this.createServices();
|
|
96
|
+
try {
|
|
97
|
+
// Get authentication token
|
|
98
|
+
const tokenStore = new KeychainTokenStore();
|
|
99
|
+
const token = await tokenStore.load();
|
|
100
|
+
if (!token) {
|
|
101
|
+
exitWithCode(ExitCode.CONFIG_ERROR, 'Authentication required. Please run "brv login" first.');
|
|
102
|
+
}
|
|
103
|
+
// Load project config
|
|
104
|
+
const brvConfig = await projectConfigStore.read();
|
|
105
|
+
// Validate workspace is initialized
|
|
106
|
+
if (!brvConfig) {
|
|
107
|
+
throw new WorkspaceNotInitializedError('Project not initialized. Please run "brv init" to select your team and workspace.', '.brv');
|
|
108
|
+
}
|
|
109
|
+
// Create LLM config
|
|
110
|
+
const model = flags.model ?? (flags.apiKey ? 'google/gemini-2.5-pro' : 'gemini-2.5-pro');
|
|
111
|
+
const envConfig = getCurrentConfig();
|
|
112
|
+
const llmConfig = {
|
|
113
|
+
accessToken: token.accessToken,
|
|
114
|
+
fileSystemConfig: { workingDirectory: process.cwd() },
|
|
115
|
+
grpcEndpoint: envConfig.llmGrpcEndpoint,
|
|
116
|
+
maxIterations: 5,
|
|
117
|
+
maxTokens: 2048,
|
|
118
|
+
model,
|
|
119
|
+
openRouterApiKey: flags.apiKey,
|
|
120
|
+
projectId: PROJECT,
|
|
121
|
+
sessionKey: token.sessionKey,
|
|
122
|
+
temperature: 0.7,
|
|
123
|
+
topK: 10,
|
|
124
|
+
topP: 0.95,
|
|
125
|
+
verbose: flags.verbose ?? false,
|
|
126
|
+
};
|
|
127
|
+
// Create and start CipherAgent
|
|
128
|
+
const agent = new CipherAgent(llmConfig, brvConfig);
|
|
129
|
+
this.log('Querying context tree...');
|
|
130
|
+
await agent.start();
|
|
131
|
+
try {
|
|
132
|
+
const sessionId = this.generateSessionId();
|
|
133
|
+
// Setup event listeners
|
|
134
|
+
this.setupEventListeners(agent, flags.verbose ?? false);
|
|
135
|
+
// Combine all query terms from argv (everything after flags)
|
|
136
|
+
const queryTerms = argv.join(' ');
|
|
137
|
+
// Execute with autonomous mode and query commandType
|
|
138
|
+
const prompt = `Search the context tree for: ${queryTerms}`;
|
|
139
|
+
const response = await agent.execute(prompt, sessionId, {
|
|
140
|
+
executionContext: { commandType: 'query' },
|
|
141
|
+
mode: 'autonomous',
|
|
142
|
+
});
|
|
143
|
+
this.log('\nQuery Results:');
|
|
144
|
+
this.log(response);
|
|
145
|
+
await trackingService.track('ace:query');
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
// console.log('Logic for agent stopping and resource cleanup may go here!')
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
if (error instanceof WorkspaceNotInitializedError) {
|
|
153
|
+
this.handleWorkspaceError(error);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// Display context on one line, error on separate line
|
|
157
|
+
process.stderr.write('Failed to query context tree:\n');
|
|
158
|
+
exitWithCode(ExitCode.RUNTIME_ERROR, formatError(error));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Format items count from list_directory result
|
|
163
|
+
*/
|
|
164
|
+
formatItemsCount(result) {
|
|
165
|
+
if (typeof result === 'string') {
|
|
166
|
+
const lines = result.split('\n').filter((line) => line.trim());
|
|
167
|
+
return `${lines.length} items`;
|
|
168
|
+
}
|
|
169
|
+
if (Array.isArray(result)) {
|
|
170
|
+
return `${result.length} items`;
|
|
171
|
+
}
|
|
172
|
+
return '';
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Format matches count from grep_content result
|
|
176
|
+
*/
|
|
177
|
+
formatMatchesCount(result) {
|
|
178
|
+
if (typeof result === 'string') {
|
|
179
|
+
const lines = result.split('\n').filter((line) => line.trim());
|
|
180
|
+
return `${lines.length} matches found`;
|
|
181
|
+
}
|
|
182
|
+
if (Array.isArray(result)) {
|
|
183
|
+
return `${result.length} matches found`;
|
|
184
|
+
}
|
|
185
|
+
return '';
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Format tool result summary for display
|
|
189
|
+
*/
|
|
190
|
+
formatToolResultSummary(toolName, result) {
|
|
191
|
+
try {
|
|
192
|
+
switch (toolName) {
|
|
193
|
+
case 'bash_exec':
|
|
194
|
+
case 'create_knowledge_topic':
|
|
195
|
+
case 'delete_knowledge_topic':
|
|
196
|
+
case 'detect_domains':
|
|
197
|
+
case 'read_file':
|
|
198
|
+
case 'update_knowledge_topic':
|
|
199
|
+
case 'write_file': {
|
|
200
|
+
return '';
|
|
201
|
+
}
|
|
202
|
+
case 'find_knowledge_topics': {
|
|
203
|
+
return this.formatTopicsCount(result);
|
|
204
|
+
}
|
|
205
|
+
case 'grep_content': {
|
|
206
|
+
return this.formatMatchesCount(result);
|
|
207
|
+
}
|
|
208
|
+
case 'list_directory': {
|
|
209
|
+
return this.formatItemsCount(result);
|
|
210
|
+
}
|
|
211
|
+
default: {
|
|
212
|
+
return '';
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return '';
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Format topics count from find_knowledge_topics result
|
|
222
|
+
*/
|
|
223
|
+
formatTopicsCount(result) {
|
|
224
|
+
if (typeof result === 'string') {
|
|
225
|
+
try {
|
|
226
|
+
const parsed = JSON.parse(result);
|
|
227
|
+
const count = Array.isArray(parsed) ? parsed.length : Object.keys(parsed).length;
|
|
228
|
+
return `${count} topics retrieved`;
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return '';
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (typeof result === 'object' && result !== null) {
|
|
235
|
+
const resultObj = result;
|
|
236
|
+
if (Array.isArray(resultObj.results)) {
|
|
237
|
+
return `${resultObj.results.length} topics retrieved`;
|
|
238
|
+
}
|
|
239
|
+
if (typeof resultObj.total === 'number') {
|
|
240
|
+
return `${resultObj.total} topics retrieved`;
|
|
241
|
+
}
|
|
242
|
+
if (Array.isArray(result)) {
|
|
243
|
+
return `${result.length} topics retrieved`;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return '';
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get user-friendly description for a tool
|
|
250
|
+
*
|
|
251
|
+
* @param toolName - Name of the tool
|
|
252
|
+
* @param args - Tool arguments
|
|
253
|
+
* @returns User-friendly description
|
|
254
|
+
*/
|
|
255
|
+
getToolDescription(toolName, args) {
|
|
256
|
+
switch (toolName) {
|
|
257
|
+
case 'bash_exec': {
|
|
258
|
+
const cmd = String(args.command ?? '');
|
|
259
|
+
return cmd.length > 60 ? `Running command...` : `Running: ${cmd}`;
|
|
260
|
+
}
|
|
261
|
+
case 'create_knowledge_topic': {
|
|
262
|
+
return 'Creating knowledge topic...';
|
|
263
|
+
}
|
|
264
|
+
case 'find_knowledge_topics': {
|
|
265
|
+
return 'Querying knowledge base...';
|
|
266
|
+
}
|
|
267
|
+
case 'grep_content': {
|
|
268
|
+
return 'Searching context tree...';
|
|
269
|
+
}
|
|
270
|
+
case 'list_directory': {
|
|
271
|
+
return 'Listing directory...';
|
|
272
|
+
}
|
|
273
|
+
case 'read_file': {
|
|
274
|
+
return `Reading file...`;
|
|
275
|
+
}
|
|
276
|
+
case 'update_knowledge_topic': {
|
|
277
|
+
return 'Updating knowledge topic...';
|
|
278
|
+
}
|
|
279
|
+
case 'write_file': {
|
|
280
|
+
return 'Writing file...';
|
|
281
|
+
}
|
|
282
|
+
default: {
|
|
283
|
+
return 'Processing...';
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Handle workspace not initialized error
|
|
289
|
+
*/
|
|
290
|
+
handleWorkspaceError(_error) {
|
|
291
|
+
const message = 'Project not initialized. Please run "brv init" to select your team and workspace.';
|
|
292
|
+
exitWithCode(ExitCode.VALIDATION_ERROR, message);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Setup event listeners for CipherAgent
|
|
296
|
+
*/
|
|
297
|
+
setupEventListeners(agent, verbose) {
|
|
298
|
+
if (!agent.agentEventBus) {
|
|
299
|
+
throw new Error('Agent event bus not initialized');
|
|
300
|
+
}
|
|
301
|
+
const eventBus = agent.agentEventBus;
|
|
302
|
+
if (verbose) {
|
|
303
|
+
// Verbose mode: show detailed events
|
|
304
|
+
eventBus.on('llmservice:thinking', () => {
|
|
305
|
+
this.log('🤔 [Event] LLM is thinking...');
|
|
306
|
+
});
|
|
307
|
+
eventBus.on('llmservice:response', (payload) => {
|
|
308
|
+
this.log(`✅ [Event] LLM Response (${payload.provider}/${payload.model})`);
|
|
309
|
+
});
|
|
310
|
+
eventBus.on('llmservice:toolCall', (payload) => {
|
|
311
|
+
// Clear any spinner on current line before printing (use spaces instead of ANSI codes)
|
|
312
|
+
const formattedCall = formatToolCall(payload.toolName, payload.args);
|
|
313
|
+
this.log(`🔧 [Event] Tool Call: ${formattedCall}`);
|
|
314
|
+
});
|
|
315
|
+
eventBus.on('llmservice:toolResult', (payload) => {
|
|
316
|
+
const resultSummary = formatToolResult(payload.toolName, payload.success, payload.result, payload.error);
|
|
317
|
+
if (payload.success) {
|
|
318
|
+
this.log(`✓ [Event] Tool Success: ${payload.toolName} → ${resultSummary}`);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
this.log(`✗ [Event] Tool Error: ${payload.toolName} → ${resultSummary}`);
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
// NOTE: llmservice:error is handled by catch block in the run method
|
|
325
|
+
// which displays error via this.error(). DO NOT display here to avoid duplicate.
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
// Non-verbose mode: show concise tool progress with descriptions
|
|
329
|
+
eventBus.on('llmservice:toolCall', (payload) => {
|
|
330
|
+
// Clear any spinner on current line before printing (use spaces instead of ANSI codes)
|
|
331
|
+
const description = this.getToolDescription(payload.toolName, payload.args);
|
|
332
|
+
this.log(`🔧 ${payload.toolName} → ${description}`);
|
|
333
|
+
});
|
|
334
|
+
eventBus.on('llmservice:toolResult', (payload) => {
|
|
335
|
+
if (payload.success) {
|
|
336
|
+
// Show brief success summary for tool completion
|
|
337
|
+
const summary = this.formatToolResultSummary(payload.toolName, payload.result);
|
|
338
|
+
const completionText = summary ? `Complete (${summary})` : 'Complete';
|
|
339
|
+
this.log(`✅ ${payload.toolName} → ${completionText}`);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
this.log(`✗ ${payload.toolName} → Failed: ${payload.error}`);
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
// NOTE: llmservice:error is handled by catch block in the run method
|
|
346
|
+
// which displays error via this.error(). DO NOT display here to avoid duplicate.
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
@@ -2,7 +2,6 @@ import { Command } from '@oclif/core';
|
|
|
2
2
|
import type { IProjectConfigStore } from '../../core/interfaces/i-project-config-store.js';
|
|
3
3
|
import type { ISpaceService } from '../../core/interfaces/i-space-service.js';
|
|
4
4
|
import type { ITokenStore } from '../../core/interfaces/i-token-store.js';
|
|
5
|
-
import { AuthToken } from '../../core/domain/entities/auth-token.js';
|
|
6
5
|
export default class SpaceList extends Command {
|
|
7
6
|
static description: string;
|
|
8
7
|
static examples: string[];
|
|
@@ -12,11 +11,15 @@ export default class SpaceList extends Command {
|
|
|
12
11
|
limit: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
12
|
offset: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
13
|
};
|
|
14
|
+
catch(error: Error & {
|
|
15
|
+
oclif?: {
|
|
16
|
+
exit: number;
|
|
17
|
+
};
|
|
18
|
+
}): Promise<void>;
|
|
15
19
|
protected createServices(): {
|
|
16
20
|
projectConfigStore: IProjectConfigStore;
|
|
17
21
|
spaceService: ISpaceService;
|
|
18
22
|
tokenStore: ITokenStore;
|
|
19
23
|
};
|
|
20
24
|
run(): Promise<void>;
|
|
21
|
-
protected validateAuth(tokenStore: ITokenStore): Promise<AuthToken>;
|
|
22
25
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Command, Flags, ux } from '@oclif/core';
|
|
2
2
|
import { getCurrentConfig } from '../../config/environment.js';
|
|
3
|
+
import { ExitCode, ExitError, exitWithCode } from '../../infra/cipher/exit-codes.js';
|
|
3
4
|
import { ProjectConfigStore } from '../../infra/config/file-config-store.js';
|
|
4
5
|
import { HttpSpaceService } from '../../infra/space/http-space-service.js';
|
|
5
6
|
import { KeychainTokenStore } from '../../infra/storage/keychain-token-store.js';
|
|
@@ -36,6 +37,18 @@ export default class SpaceList extends Command {
|
|
|
36
37
|
description: 'Number of spaces to skip',
|
|
37
38
|
}),
|
|
38
39
|
};
|
|
40
|
+
async catch(error) {
|
|
41
|
+
// Check if error is ExitError (message already displayed)
|
|
42
|
+
if (error instanceof ExitError) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Backwards compatibility: also check oclif.exit property
|
|
46
|
+
if (error.oclif?.exit !== undefined) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// For unexpected errors, show the message
|
|
50
|
+
this.error(error instanceof Error ? error.message : 'Failed to list spaces');
|
|
51
|
+
}
|
|
39
52
|
createServices() {
|
|
40
53
|
const envConfig = getCurrentConfig();
|
|
41
54
|
return {
|
|
@@ -45,66 +58,57 @@ export default class SpaceList extends Command {
|
|
|
45
58
|
};
|
|
46
59
|
}
|
|
47
60
|
async run() {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.error('Project not initialized. Run "brv init" first.');
|
|
55
|
-
}
|
|
56
|
-
const token = await this.validateAuth(tokenStore);
|
|
57
|
-
// Fetch spaces for the team from project config
|
|
58
|
-
ux.action.start(`Fetching spaces for ${projectConfig.teamName}`);
|
|
59
|
-
let result;
|
|
60
|
-
try {
|
|
61
|
-
result = await spaceService.getSpaces(token.accessToken, token.sessionKey, projectConfig.teamId, flags.all ? { fetchAll: true } : { limit: flags.limit, offset: flags.offset });
|
|
62
|
-
}
|
|
63
|
-
finally {
|
|
64
|
-
ux.action.stop();
|
|
65
|
-
}
|
|
66
|
-
// Handle empty results
|
|
67
|
-
if (result.spaces.length === 0) {
|
|
68
|
-
this.log(`No spaces found in team "${projectConfig.teamName}".`);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
// Display results based on format
|
|
72
|
-
if (flags.json) {
|
|
73
|
-
this.log(JSON.stringify({
|
|
74
|
-
showing: result.spaces.length,
|
|
75
|
-
spaces: result.spaces.map((s) => s.toJson()),
|
|
76
|
-
team: { id: projectConfig.teamId, name: projectConfig.teamName },
|
|
77
|
-
total: result.total,
|
|
78
|
-
}, null, 2));
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
// Human-readable format
|
|
82
|
-
this.log(`\nSpaces in team "${projectConfig.teamName}":\n`);
|
|
83
|
-
this.log(`Found ${result.spaces.length} space(s):\n`);
|
|
84
|
-
for (const [index, space] of result.spaces.entries()) {
|
|
85
|
-
this.log(` ${index + 1}. ${space.getDisplayName()}`);
|
|
86
|
-
}
|
|
87
|
-
// Pagination warning
|
|
88
|
-
if (!flags.all && result.spaces.length < result.total) {
|
|
89
|
-
const remaining = result.total - result.spaces.length - flags.offset;
|
|
90
|
-
this.log(`\nShowing ${result.spaces.length} of ${result.total} spaces.`);
|
|
91
|
-
if (remaining > 0) {
|
|
92
|
-
this.log('Use --all to fetch all spaces, or use --limit and --offset for pagination.');
|
|
93
|
-
}
|
|
94
|
-
}
|
|
61
|
+
const { flags } = await this.parse(SpaceList);
|
|
62
|
+
const { projectConfigStore, spaceService, tokenStore } = this.createServices();
|
|
63
|
+
// Check project initialization
|
|
64
|
+
const projectConfig = await projectConfigStore.read();
|
|
65
|
+
if (!projectConfig) {
|
|
66
|
+
exitWithCode(ExitCode.VALIDATION_ERROR, 'Project not initialized. Please run "brv init" first.');
|
|
95
67
|
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
this.error(error instanceof Error ? error.message : 'Failed to list spaces');
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
async validateAuth(tokenStore) {
|
|
101
68
|
const token = await tokenStore.load();
|
|
102
|
-
if (token
|
|
103
|
-
|
|
69
|
+
if (!token) {
|
|
70
|
+
exitWithCode(ExitCode.VALIDATION_ERROR, 'Not authenticated. Please run "brv login" first.');
|
|
104
71
|
}
|
|
105
72
|
if (!token.isValid()) {
|
|
106
|
-
|
|
73
|
+
exitWithCode(ExitCode.VALIDATION_ERROR, 'Authentication token expired. Please run "brv login" again.');
|
|
74
|
+
}
|
|
75
|
+
// Fetch spaces for the team from project config
|
|
76
|
+
ux.action.start(`Fetching spaces for ${projectConfig.teamName}`);
|
|
77
|
+
let result;
|
|
78
|
+
try {
|
|
79
|
+
result = await spaceService.getSpaces(token.accessToken, token.sessionKey, projectConfig.teamId, flags.all ? { fetchAll: true } : { limit: flags.limit, offset: flags.offset });
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
ux.action.stop();
|
|
83
|
+
}
|
|
84
|
+
// Handle empty results
|
|
85
|
+
if (result.spaces.length === 0) {
|
|
86
|
+
this.log(`No spaces found in team "${projectConfig.teamName}".`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Display results based on format
|
|
90
|
+
if (flags.json) {
|
|
91
|
+
this.log(JSON.stringify({
|
|
92
|
+
showing: result.spaces.length,
|
|
93
|
+
spaces: result.spaces.map((s) => s.toJson()),
|
|
94
|
+
team: { id: projectConfig.teamId, name: projectConfig.teamName },
|
|
95
|
+
total: result.total,
|
|
96
|
+
}, null, 2));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Human-readable format
|
|
100
|
+
this.log(`\nSpaces in team "${projectConfig.teamName}":\n`);
|
|
101
|
+
this.log(`Found ${result.spaces.length} space(s):\n`);
|
|
102
|
+
for (const [index, space] of result.spaces.entries()) {
|
|
103
|
+
this.log(` ${index + 1}. ${space.getDisplayName()}`);
|
|
104
|
+
}
|
|
105
|
+
// Pagination warning
|
|
106
|
+
if (!flags.all && result.spaces.length < result.total) {
|
|
107
|
+
const remaining = result.total - result.spaces.length - flags.offset;
|
|
108
|
+
this.log(`\nShowing ${result.spaces.length} of ${result.total} spaces.`);
|
|
109
|
+
if (remaining > 0) {
|
|
110
|
+
this.log('Use --all to fetch all spaces, or use --limit and --offset for pagination.');
|
|
111
|
+
}
|
|
107
112
|
}
|
|
108
|
-
return token;
|
|
109
113
|
}
|
|
110
114
|
}
|
|
@@ -5,15 +5,31 @@ import type { IProjectConfigStore } from '../../core/interfaces/i-project-config
|
|
|
5
5
|
import type { ISpaceService } from '../../core/interfaces/i-space-service.js';
|
|
6
6
|
import type { ITeamService } from '../../core/interfaces/i-team-service.js';
|
|
7
7
|
import type { ITokenStore } from '../../core/interfaces/i-token-store.js';
|
|
8
|
+
import { Agent } from '../../core/domain/entities/agent.js';
|
|
8
9
|
export default class SpaceSwitch extends Command {
|
|
9
10
|
static description: string;
|
|
10
11
|
static examples: string[];
|
|
12
|
+
catch(error: Error & {
|
|
13
|
+
oclif?: {
|
|
14
|
+
exit: number;
|
|
15
|
+
};
|
|
16
|
+
}): Promise<void>;
|
|
11
17
|
protected createServices(): {
|
|
12
18
|
projectConfigStore: IProjectConfigStore;
|
|
13
19
|
spaceService: ISpaceService;
|
|
14
20
|
teamService: ITeamService;
|
|
15
21
|
tokenStore: ITokenStore;
|
|
16
22
|
};
|
|
23
|
+
protected detectWorkspacesForAgent(agent: Agent): {
|
|
24
|
+
chatLogPath: string;
|
|
25
|
+
cwd: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Prompts the user to select an agent.
|
|
29
|
+
* This method is protected to allow test overrides.
|
|
30
|
+
* @returns The selected agent
|
|
31
|
+
*/
|
|
32
|
+
protected promptForAgentSelection(): Promise<Agent>;
|
|
17
33
|
protected promptForSpaceSelection(spaces: Space[]): Promise<Space>;
|
|
18
34
|
protected promptForTeamSelection(teams: Team[]): Promise<Team>;
|
|
19
35
|
run(): Promise<void>;
|