byterover-cli 0.4.0 → 1.0.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 +1 -9
- package/dist/commands/curate.d.ts +1 -3
- package/dist/commands/curate.js +14 -51
- package/dist/commands/main.d.ts +8 -0
- package/dist/commands/main.js +29 -8
- package/dist/commands/query.d.ts +1 -3
- package/dist/commands/query.js +8 -35
- package/dist/config/context-tree-domains.d.ts +5 -0
- package/dist/config/context-tree-domains.js +6 -1
- package/dist/config/environment.js +9 -9
- package/dist/constants.d.ts +14 -0
- package/dist/constants.js +18 -0
- package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
- package/dist/core/domain/cipher/agent/agent-info.js +143 -0
- package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
- package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
- package/dist/core/domain/cipher/agent/index.d.ts +4 -1
- package/dist/core/domain/cipher/agent/index.js +7 -1
- package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
- package/dist/core/domain/cipher/agent-events/types.js +11 -0
- package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
- package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
- package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
- package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
- package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
- package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
- package/dist/core/domain/cipher/llm/error-codes.js +51 -0
- package/dist/core/domain/cipher/llm/index.d.ts +9 -0
- package/dist/core/domain/cipher/llm/index.js +13 -0
- package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
- package/dist/core/domain/cipher/llm/registry.js +244 -0
- package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
- package/dist/core/domain/cipher/llm/schemas.js +151 -0
- package/dist/core/domain/cipher/llm/types.d.ts +121 -0
- package/dist/core/domain/cipher/llm/types.js +60 -0
- package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
- package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
- package/dist/core/domain/cipher/streaming/types.js +16 -0
- package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
- package/dist/core/domain/cipher/todos/types.d.ts +34 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
- package/dist/core/domain/cipher/tools/constants.js +5 -2
- package/dist/core/domain/cipher/tools/types.d.ts +31 -0
- package/dist/core/domain/entities/event.d.ts +1 -1
- package/dist/core/domain/entities/event.js +3 -1
- package/dist/core/domain/errors/connection-error.d.ts +33 -0
- package/dist/core/domain/errors/connection-error.js +54 -0
- package/dist/core/domain/errors/core-process-error.d.ts +27 -0
- package/dist/core/domain/errors/core-process-error.js +43 -0
- package/dist/core/domain/errors/task-error.d.ts +64 -0
- package/dist/core/domain/errors/task-error.js +116 -0
- package/dist/core/domain/errors/transport-error.d.ts +72 -0
- package/dist/core/domain/errors/transport-error.js +114 -0
- package/dist/core/domain/instance/index.d.ts +1 -0
- package/dist/core/domain/instance/index.js +1 -0
- package/dist/core/domain/instance/types.d.ts +57 -0
- package/dist/core/domain/instance/types.js +72 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
- package/dist/core/domain/knowledge/directory-manager.js +31 -0
- package/dist/core/domain/transport/index.d.ts +2 -0
- package/dist/core/domain/transport/index.js +2 -0
- package/dist/core/domain/transport/schemas.d.ts +1149 -0
- package/dist/core/domain/transport/schemas.js +554 -0
- package/dist/core/domain/transport/types.d.ts +67 -0
- package/dist/core/domain/transport/types.js +7 -0
- package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
- package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
- package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
- package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
- package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
- package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
- package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
- package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
- package/dist/core/interfaces/cipher/index.d.ts +35 -0
- package/dist/core/interfaces/cipher/index.js +11 -0
- package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
- package/dist/core/interfaces/cipher/message-factory.js +252 -0
- package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
- package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
- package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
- package/dist/core/interfaces/cipher/message-types.js +6 -0
- package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
- package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
- package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
- package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
- package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
- package/dist/core/interfaces/executor/i-query-executor.js +1 -0
- package/dist/core/interfaces/executor/index.d.ts +2 -0
- package/dist/core/interfaces/executor/index.js +2 -0
- package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
- package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
- package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
- package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
- package/dist/core/interfaces/instance/index.d.ts +2 -0
- package/dist/core/interfaces/instance/index.js +2 -0
- package/dist/core/interfaces/noop-implementations.d.ts +53 -0
- package/dist/core/interfaces/noop-implementations.js +62 -0
- package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
- package/dist/core/interfaces/transport/i-transport-client.js +1 -0
- package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
- package/dist/core/interfaces/transport/i-transport-server.js +1 -0
- package/dist/core/interfaces/transport/index.d.ts +2 -0
- package/dist/core/interfaces/transport/index.js +2 -0
- package/dist/hooks/init/welcome.js +9 -24
- package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
- package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
- package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
- package/dist/infra/cipher/agent/agent-error.js +79 -0
- package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
- package/dist/infra/cipher/agent/agent-schemas.js +97 -0
- package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
- package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
- package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
- package/dist/infra/cipher/agent/base-agent.js +240 -0
- package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
- package/dist/infra/cipher/agent/cipher-agent.js +546 -0
- package/dist/infra/cipher/agent/index.d.ts +22 -0
- package/dist/infra/cipher/agent/index.js +24 -0
- package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
- package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
- package/dist/infra/cipher/agent/types.d.ts +35 -0
- package/dist/infra/cipher/agent/types.js +1 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
- package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
- package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
- package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
- package/dist/infra/cipher/consumer/consumer-service.js +1 -0
- package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
- package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
- package/dist/infra/cipher/consumer/index.d.ts +1 -1
- package/dist/infra/cipher/consumer/index.js +2 -1
- package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
- package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
- package/dist/infra/cipher/file-system/binary-utils.js +164 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
- package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
- package/dist/infra/cipher/file-system/file-system-service.js +327 -36
- package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
- package/dist/infra/cipher/file-system/path-validator.js +111 -6
- package/dist/infra/cipher/interactive-loop.js +41 -33
- package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
- package/dist/infra/cipher/llm/capability-cache.js +125 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
- package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
- package/dist/infra/cipher/llm/context/compression/index.js +6 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
- package/dist/infra/cipher/llm/context/context-manager.js +129 -0
- package/dist/infra/cipher/llm/context/utils.js +17 -4
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
- package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
- package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
- package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
- package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
- package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
- package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
- package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
- package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
- package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
- package/dist/infra/cipher/llm/sanitization/index.js +13 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
- package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
- package/dist/infra/cipher/llm/stream-processor.js +276 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
- package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
- package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
- package/dist/infra/cipher/process/command-validator.d.ts +23 -0
- package/dist/infra/cipher/process/command-validator.js +75 -0
- package/dist/infra/cipher/process/path-utils.d.ts +66 -0
- package/dist/infra/cipher/process/path-utils.js +94 -0
- package/dist/infra/cipher/process/process-service.d.ts +32 -0
- package/dist/infra/cipher/process/process-service.js +98 -17
- package/dist/infra/cipher/session/chat-session.d.ts +56 -7
- package/dist/infra/cipher/session/chat-session.js +163 -13
- package/dist/infra/cipher/session/index.d.ts +1 -0
- package/dist/infra/cipher/session/index.js +2 -0
- package/dist/infra/cipher/session/message-queue.d.ts +65 -0
- package/dist/infra/cipher/session/message-queue.js +90 -0
- package/dist/infra/cipher/session/session-manager.d.ts +106 -5
- package/dist/infra/cipher/session/session-manager.js +254 -7
- package/dist/infra/cipher/session/session-status.d.ts +137 -0
- package/dist/infra/cipher/session/session-status.js +184 -0
- package/dist/infra/cipher/session/title-generator.d.ts +8 -0
- package/dist/infra/cipher/session/title-generator.js +31 -0
- package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
- package/dist/infra/cipher/storage/message-storage-service.js +300 -54
- package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
- package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
- package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
- package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
- package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
- package/dist/infra/cipher/system-prompt/schemas.js +94 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
- package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
- package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
- package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
- package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
- package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
- package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
- package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
- package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
- package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
- package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
- package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
- package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
- package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
- package/dist/infra/cipher/tools/index.d.ts +1 -1
- package/dist/infra/cipher/tools/index.js +1 -1
- package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
- package/dist/infra/cipher/tools/plugins/index.js +2 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
- package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
- package/dist/infra/cipher/tools/streaming/index.js +1 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
- package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
- package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
- package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
- package/dist/infra/cipher/tools/tool-manager.js +107 -11
- package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
- package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
- package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
- package/dist/infra/cipher/tools/tool-provider.js +81 -25
- package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
- package/dist/infra/cipher/tools/tool-registry.js +58 -16
- package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
- package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
- package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
- package/dist/infra/context-tree/path-utils.d.ts +7 -0
- package/dist/infra/context-tree/path-utils.js +7 -0
- package/dist/infra/core/executors/curate-executor.d.ts +35 -0
- package/dist/infra/core/executors/curate-executor.js +123 -0
- package/dist/infra/core/executors/index.d.ts +2 -0
- package/dist/infra/core/executors/index.js +2 -0
- package/dist/infra/core/executors/query-executor.d.ts +23 -0
- package/dist/infra/core/executors/query-executor.js +51 -0
- package/dist/infra/core/task-processor.d.ts +81 -0
- package/dist/infra/core/task-processor.js +115 -0
- package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
- package/dist/infra/instance/file-instance-discovery.js +84 -0
- package/dist/infra/instance/file-instance-manager.d.ts +46 -0
- package/dist/infra/instance/file-instance-manager.js +123 -0
- package/dist/infra/instance/index.d.ts +3 -0
- package/dist/infra/instance/index.js +3 -0
- package/dist/infra/instance/process-utils.d.ts +14 -0
- package/dist/infra/instance/process-utils.js +39 -0
- package/dist/infra/process/agent-worker.d.ts +20 -0
- package/dist/infra/process/agent-worker.js +602 -0
- package/dist/infra/process/index.d.ts +12 -0
- package/dist/infra/process/index.js +11 -0
- package/dist/infra/process/ipc-types.d.ts +55 -0
- package/dist/infra/process/ipc-types.js +12 -0
- package/dist/infra/process/process-manager.d.ts +154 -0
- package/dist/infra/process/process-manager.js +471 -0
- package/dist/infra/process/task-queue-manager.d.ts +123 -0
- package/dist/infra/process/task-queue-manager.js +226 -0
- package/dist/infra/process/transport-handlers.d.ts +124 -0
- package/dist/infra/process/transport-handlers.js +348 -0
- package/dist/infra/process/transport-worker.d.ts +20 -0
- package/dist/infra/process/transport-worker.js +168 -0
- package/dist/infra/repl/commands/curate-command.js +0 -5
- package/dist/infra/repl/commands/query-command.js +0 -3
- package/dist/infra/repl/repl-startup.d.ts +4 -0
- package/dist/infra/repl/repl-startup.js +10 -1
- package/dist/infra/repl/transport-client-helper.d.ts +9 -0
- package/dist/infra/repl/transport-client-helper.js +96 -0
- package/dist/infra/transport/index.d.ts +4 -0
- package/dist/infra/transport/index.js +4 -0
- package/dist/infra/transport/port-utils.d.ts +42 -0
- package/dist/infra/transport/port-utils.js +84 -0
- package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
- package/dist/infra/transport/socket-io-transport-client.js +270 -0
- package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
- package/dist/infra/transport/socket-io-transport-server.js +207 -0
- package/dist/infra/transport/transport-client-factory.d.ts +76 -0
- package/dist/infra/transport/transport-client-factory.js +168 -0
- package/dist/infra/transport/transport-factory.d.ts +33 -0
- package/dist/infra/transport/transport-factory.js +59 -0
- package/dist/infra/usecase/curate-use-case.d.ts +8 -55
- package/dist/infra/usecase/curate-use-case.js +73 -259
- package/dist/infra/usecase/init-use-case.js +19 -8
- package/dist/infra/usecase/login-use-case.js +9 -3
- package/dist/infra/usecase/query-use-case.d.ts +18 -45
- package/dist/infra/usecase/query-use-case.js +251 -326
- package/dist/infra/usecase/status-use-case.js +1 -1
- package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
- package/dist/resources/prompts/explore.yml +78 -0
- package/dist/resources/prompts/plan.yml +114 -0
- package/dist/resources/prompts/reflection.yml +1 -1
- package/dist/resources/prompts/system-prompt.yml +15 -8
- package/dist/resources/prompts/tool-outputs.yml +0 -5
- package/dist/resources/tools/bash_exec.txt +98 -0
- package/dist/resources/tools/bash_output.txt +40 -0
- package/dist/resources/tools/batch.txt +28 -0
- package/dist/resources/tools/create_knowledge_topic.txt +23 -0
- package/dist/resources/tools/curate.txt +22 -0
- package/dist/resources/tools/delete_memory.txt +1 -0
- package/dist/resources/tools/detect_domains.txt +11 -0
- package/dist/resources/tools/edit_file.txt +1 -0
- package/dist/resources/tools/edit_memory.txt +1 -0
- package/dist/resources/tools/glob_files.txt +20 -0
- package/dist/resources/tools/grep_content.txt +18 -0
- package/dist/resources/tools/kill_process.txt +16 -0
- package/dist/resources/tools/list_directory.txt +16 -0
- package/dist/resources/tools/list_memories.txt +1 -0
- package/dist/resources/tools/read_file.txt +31 -0
- package/dist/resources/tools/read_memory.txt +1 -0
- package/dist/resources/tools/read_todos.txt +17 -0
- package/dist/resources/tools/search_history.txt +1 -0
- package/dist/resources/tools/task.txt +23 -0
- package/dist/resources/tools/write_file.txt +1 -0
- package/dist/resources/tools/write_memory.txt +1 -0
- package/dist/resources/tools/write_todos.txt +29 -0
- package/dist/tui/app.js +9 -13
- package/dist/tui/components/command-details.d.ts +14 -0
- package/dist/tui/components/command-details.js +35 -0
- package/dist/tui/components/execution/execution-changes.d.ts +5 -0
- package/dist/tui/components/execution/execution-changes.js +19 -4
- package/dist/tui/components/execution/execution-content.d.ts +4 -2
- package/dist/tui/components/execution/execution-content.js +26 -13
- package/dist/tui/components/execution/execution-input.js +3 -3
- package/dist/tui/components/execution/execution-progress.d.ts +2 -2
- package/dist/tui/components/execution/execution-progress.js +8 -6
- package/dist/tui/components/execution/log-item.d.ts +3 -4
- package/dist/tui/components/execution/log-item.js +2 -5
- package/dist/tui/components/footer.js +9 -4
- package/dist/tui/components/header.d.ts +3 -3
- package/dist/tui/components/header.js +5 -3
- package/dist/tui/components/index.d.ts +1 -0
- package/dist/tui/components/index.js +1 -0
- package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
- package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
- package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
- package/dist/tui/components/scrollable-list.js +12 -10
- package/dist/tui/components/suggestions.js +39 -41
- package/dist/tui/components/tab-bar.d.ts +2 -1
- package/dist/tui/components/tab-bar.js +3 -4
- package/dist/tui/constants.d.ts +0 -5
- package/dist/tui/constants.js +0 -5
- package/dist/tui/contexts/auth-context.js +9 -2
- package/dist/tui/contexts/{use-commands.js → commands-context.js} +6 -5
- package/dist/tui/contexts/index.d.ts +6 -1
- package/dist/tui/contexts/index.js +6 -1
- package/dist/tui/contexts/onboarding-context.d.ts +1 -1
- package/dist/tui/contexts/onboarding-context.js +9 -9
- package/dist/tui/contexts/tasks-context.d.ts +84 -0
- package/dist/tui/contexts/tasks-context.js +218 -0
- package/dist/tui/contexts/transport-context.d.ts +29 -0
- package/dist/tui/contexts/transport-context.js +82 -0
- package/dist/tui/hooks/index.d.ts +10 -6
- package/dist/tui/hooks/index.js +7 -6
- package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
- package/dist/tui/hooks/use-activity-logs.js +87 -34
- package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
- package/dist/tui/hooks/use-auth-polling.js +104 -0
- package/dist/tui/hooks/use-slash-command-processor.js +0 -1
- package/dist/tui/hooks/use-slash-completion.js +1 -1
- package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
- package/dist/tui/hooks/use-tab-navigation.js +16 -7
- package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
- package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
- package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
- package/dist/tui/hooks/use-ui-heights.js +88 -0
- package/dist/tui/providers/app-providers.js +2 -6
- package/dist/tui/types/commands.d.ts +0 -26
- package/dist/tui/types/index.d.ts +1 -1
- package/dist/tui/types/ui.d.ts +9 -4
- package/dist/tui/utils/line.d.ts +11 -0
- package/dist/tui/utils/line.js +16 -0
- package/dist/tui/utils/log.d.ts +27 -0
- package/dist/tui/utils/log.js +114 -0
- package/dist/tui/views/command-view.d.ts +7 -0
- package/dist/tui/views/command-view.js +103 -80
- package/dist/tui/views/login-view.js +7 -4
- package/dist/tui/views/logs-view.d.ts +13 -0
- package/dist/tui/views/logs-view.js +27 -52
- package/dist/utils/connection-error-handler.d.ts +16 -0
- package/dist/utils/connection-error-handler.js +49 -0
- package/dist/utils/crash-log.d.ts +14 -0
- package/dist/utils/crash-log.js +19 -0
- package/dist/utils/file-helpers.d.ts +14 -0
- package/dist/utils/file-helpers.js +21 -0
- package/dist/utils/global-logs-path.d.ts +11 -0
- package/dist/utils/global-logs-path.js +37 -0
- package/dist/utils/process-logger.d.ts +53 -0
- package/dist/utils/process-logger.js +253 -0
- package/dist/utils/sandbox-detector.d.ts +31 -0
- package/dist/utils/sandbox-detector.js +122 -0
- package/oclif.manifest.json +10 -198
- package/package.json +5 -1
- package/dist/commands/cipher-agent/run.d.ts +0 -142
- package/dist/commands/cipher-agent/run.js +0 -555
- package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
- package/dist/commands/cipher-agent/set-prompt.js +0 -58
- package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
- package/dist/commands/cipher-agent/show-prompt.js +0 -53
- package/dist/commands/foo.d.ts +0 -14
- package/dist/commands/foo.js +0 -66
- package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
- package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
- package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
- package/dist/infra/cipher/cipher-agent.d.ts +0 -182
- package/dist/infra/cipher/cipher-agent.js +0 -317
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
- package/dist/resources/prompts/modes/autonomous.yml +0 -9
- package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
- package/dist/tui/contexts/consumer.d.ts +0 -31
- package/dist/tui/contexts/consumer.js +0 -56
- package/dist/tui/hooks/use-consumer.d.ts +0 -12
- package/dist/tui/hooks/use-consumer.js +0 -50
- package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
- package/dist/tui/hooks/use-queue-polling.js +0 -90
- /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
- /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
|
@@ -1,283 +1,97 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import { BRV_DIR, CONTEXT_FILE, CONTEXT_TREE_DIR } from '../../constants.js';
|
|
7
|
-
import { validateFileForCurate } from '../../utils/file-validator.js';
|
|
8
|
-
import { getAgentStorage } from '../cipher/storage/agent-storage.js';
|
|
9
|
-
import { WorkspaceNotInitializedError } from '../cipher/validation/workspace-validator.js';
|
|
10
|
-
// Full path to context tree
|
|
11
|
-
const CONTEXT_TREE_PATH = path.join(BRV_DIR, CONTEXT_TREE_DIR);
|
|
2
|
+
import { ConnectionError, ConnectionFailedError, InstanceCrashedError, NoInstanceRunningError } from '../../core/domain/errors/connection-error.js';
|
|
3
|
+
import { formatError } from '../../utils/error-handler.js';
|
|
4
|
+
import { getSandboxEnvironmentName, isSandboxEnvironment, isSandboxNetworkError } from '../../utils/sandbox-detector.js';
|
|
5
|
+
import { createTransportClientFactory } from '../transport/transport-client-factory.js';
|
|
12
6
|
export class CurateUseCase {
|
|
13
|
-
projectConfigStore;
|
|
14
7
|
terminal;
|
|
15
|
-
tokenStore;
|
|
16
8
|
trackingService;
|
|
9
|
+
transportClientFactoryCreator;
|
|
17
10
|
constructor(options) {
|
|
18
|
-
this.projectConfigStore = options.projectConfigStore;
|
|
19
11
|
this.terminal = options.terminal;
|
|
20
|
-
this.tokenStore = options.tokenStore;
|
|
21
12
|
this.trackingService = options.trackingService;
|
|
13
|
+
this.transportClientFactoryCreator = options.transportClientFactoryCreator ?? createTransportClientFactory;
|
|
22
14
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const initialContent = `# ${topicName}\n\n<!-- Add your context here -->\n`;
|
|
36
|
-
fs.writeFileSync(contextFilePath, initialContent, 'utf8');
|
|
37
|
-
return contextFilePath;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Generate a unique session ID for the autonomous agent.
|
|
41
|
-
* Uses crypto.randomUUID() for guaranteed uniqueness (122 bits of entropy).
|
|
42
|
-
*/
|
|
43
|
-
generateSessionId() {
|
|
44
|
-
return randomUUID();
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Navigate through the context tree using file selector
|
|
48
|
-
* Returns the selected path relative to context-tree root
|
|
49
|
-
*/
|
|
50
|
-
async navigateContextTree() {
|
|
51
|
-
const contextTreePath = path.resolve(process.cwd(), CONTEXT_TREE_PATH);
|
|
52
|
-
// Ensure context tree directory exists
|
|
53
|
-
if (!fs.existsSync(contextTreePath)) {
|
|
54
|
-
fs.mkdirSync(contextTreePath, { recursive: true });
|
|
55
|
-
}
|
|
56
|
-
// Ensure predefined domains exist as directories
|
|
57
|
-
for (const domain of CONTEXT_TREE_DOMAINS) {
|
|
58
|
-
const domainPath = path.join(contextTreePath, domain.name);
|
|
59
|
-
if (!fs.existsSync(domainPath)) {
|
|
60
|
-
fs.mkdirSync(domainPath, { recursive: true });
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
while (true) {
|
|
64
|
-
try {
|
|
65
|
-
// eslint-disable-next-line no-await-in-loop
|
|
66
|
-
const selectedItem = await this.terminal.fileSelector({
|
|
67
|
-
allowCancel: true,
|
|
68
|
-
basePath: contextTreePath,
|
|
69
|
-
filter: (item) => item.isDirectory,
|
|
70
|
-
message: 'Target context location:',
|
|
71
|
-
pageSize: 15,
|
|
72
|
-
theme: {
|
|
73
|
-
labels: {
|
|
74
|
-
messages: {
|
|
75
|
-
cancel: 'Selection cancelled.',
|
|
76
|
-
empty: 'No sub-folders. Press Enter to add content here.',
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
type: 'directory',
|
|
81
|
-
});
|
|
82
|
-
// User cancelled
|
|
83
|
-
if (!selectedItem) {
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
// Restrict navigation to stay within the context tree
|
|
87
|
-
const normalizedItemPath = path.resolve(selectedItem.path);
|
|
88
|
-
const isValid = normalizedItemPath.startsWith(contextTreePath);
|
|
89
|
-
if (isValid) {
|
|
90
|
-
// Valid selection - proceed
|
|
91
|
-
return selectedItem.path;
|
|
92
|
-
}
|
|
93
|
-
// Invalid selection - retry
|
|
94
|
-
this.terminal.log('Invalid selection. Please choose a valid location within the context tree.');
|
|
15
|
+
async run({ context, files, verbose = false }) {
|
|
16
|
+
await this.trackingService.track('mem:curate', { status: 'started' });
|
|
17
|
+
if (!context) {
|
|
18
|
+
this.terminal.log('Context argument is required.');
|
|
19
|
+
this.terminal.log('Usage: brv curate "your context here"');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
let client;
|
|
23
|
+
try {
|
|
24
|
+
const transportClientFactory = this.transportClientFactoryCreator();
|
|
25
|
+
if (verbose) {
|
|
26
|
+
this.terminal.log('Discovering running instance...');
|
|
95
27
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
28
|
+
const { client: connectedClient } = await transportClientFactory.connect();
|
|
29
|
+
client = connectedClient;
|
|
30
|
+
if (verbose) {
|
|
31
|
+
this.terminal.log(`Connected to instance (clientId: ${client.getClientId()})`);
|
|
99
32
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Prompt user to enter topic name with validation
|
|
111
|
-
* @param targetPath - The path where the topic folder will be created
|
|
112
|
-
* @returns The topic name or null if cancelled
|
|
113
|
-
*/
|
|
114
|
-
async promptForTopicName(targetPath) {
|
|
115
|
-
try {
|
|
116
|
-
const topicName = await this.terminal.input({
|
|
117
|
-
message: 'New topic name:',
|
|
118
|
-
validate: (value) => this.validateTopicName(value, targetPath),
|
|
33
|
+
// Generate taskId in UseCase (Application layer owns task creation)
|
|
34
|
+
const taskId = randomUUID();
|
|
35
|
+
// Send task:create - Transport routes to Agent, UseCase handles logic
|
|
36
|
+
await client.request('task:create', {
|
|
37
|
+
content: context,
|
|
38
|
+
...(files?.length ? { files } : {}),
|
|
39
|
+
taskId,
|
|
40
|
+
type: 'curate',
|
|
119
41
|
});
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
catch {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
async run(options) {
|
|
127
|
-
// Determine mode: autonomous if context is provided
|
|
128
|
-
return options.context ? this.runAutonomous(options.context, options) : this.runInteractive();
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Handle workspace not initialized error
|
|
132
|
-
*/
|
|
133
|
-
handleWorkspaceError(_error) {
|
|
134
|
-
const message = 'Project not initialized. Please run "brv init" to select your team and workspace.';
|
|
135
|
-
this.terminal.log(message);
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Process file paths from --files flag
|
|
139
|
-
* @param filePaths - Array of file paths (relative or absolute)
|
|
140
|
-
* @returns Formatted instructions for the agent to read the specified files, or undefined if validation fails
|
|
141
|
-
*/
|
|
142
|
-
processFileReferences(filePaths) {
|
|
143
|
-
const MAX_FILES = 5;
|
|
144
|
-
if (!filePaths || filePaths.length === 0) {
|
|
145
|
-
return '';
|
|
42
|
+
this.terminal.log('✓ Context queued for processing.');
|
|
43
|
+
await this.trackingService.track('mem:curate', { status: 'finished' });
|
|
146
44
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
this.terminal.log(`\n⚠️ Only the first ${MAX_FILES} files will be processed. Ignoring: ${ignored.join(', ')}\n`);
|
|
151
|
-
filePaths = filePaths.slice(0, MAX_FILES);
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.handleConnectionError(error);
|
|
47
|
+
await this.trackingService.track('mem:curate', { message: formatError(error), status: 'error' });
|
|
152
48
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const validPaths = [];
|
|
157
|
-
const errors = [];
|
|
158
|
-
for (const filePath of filePaths) {
|
|
159
|
-
const result = validateFileForCurate(filePath, projectRoot);
|
|
160
|
-
if (result.valid && result.normalizedPath) {
|
|
161
|
-
validPaths.push(result.normalizedPath);
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
errors.push(` ✗ ${result.error}`);
|
|
49
|
+
finally {
|
|
50
|
+
if (client) {
|
|
51
|
+
await client.disconnect();
|
|
165
52
|
}
|
|
166
53
|
}
|
|
167
|
-
// If there are any validation errors, show them and return undefined
|
|
168
|
-
if (errors.length > 0) {
|
|
169
|
-
this.terminal.log('\n❌ File validation failed:\n');
|
|
170
|
-
this.terminal.log(errors.join('\n'));
|
|
171
|
-
this.terminal.log('');
|
|
172
|
-
this.terminal.log('Invalid files provided. Please fix the errors above and try again.');
|
|
173
|
-
return undefined;
|
|
174
|
-
}
|
|
175
|
-
// Format instructions for the agent
|
|
176
|
-
const instructions = [
|
|
177
|
-
'\n## IMPORTANT: Critical Files to Read (--files flag)',
|
|
178
|
-
'',
|
|
179
|
-
'The user has explicitly specified these files as critical context that MUST be read before creating knowledge topics:',
|
|
180
|
-
'',
|
|
181
|
-
...validPaths.map((p) => `- ${p}`),
|
|
182
|
-
'',
|
|
183
|
-
'**MANDATORY INSTRUCTIONS:**',
|
|
184
|
-
'- You MUST use the `read_file` tool to read ALL of these files IN PARALLEL (in a single iteration) before proceeding to create knowledge topics',
|
|
185
|
-
'- These files contain essential context that will help you create comprehensive and accurate knowledge topics',
|
|
186
|
-
'- Read them in parallel to maximize efficiency - they do not depend on each other',
|
|
187
|
-
'- After reading all files, proceed with the normal workflow: detect domains, find existing knowledge, and create/update topics',
|
|
188
|
-
'',
|
|
189
|
-
];
|
|
190
|
-
return instructions.join('\n');
|
|
191
54
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
this.terminal.log('Authentication required. Please run "brv login" first.');
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
// Load project config
|
|
204
|
-
const brvConfig = await this.projectConfigStore.read();
|
|
205
|
-
// Validate workspace is initialized
|
|
206
|
-
if (!brvConfig) {
|
|
207
|
-
throw new WorkspaceNotInitializedError('Project not initialized. Please run "brv init" to select your team and workspace.', '.brv');
|
|
208
|
-
}
|
|
209
|
-
// Process file references if provided (validates and creates instructions)
|
|
210
|
-
const fileReferenceInstructions = this.processFileReferences(options.files ?? []);
|
|
211
|
-
if (fileReferenceInstructions === undefined) {
|
|
212
|
-
// Validation failed, error already displayed
|
|
213
|
-
return;
|
|
55
|
+
handleConnectionError(error) {
|
|
56
|
+
if (error instanceof NoInstanceRunningError) {
|
|
57
|
+
// Check if running in sandbox environment
|
|
58
|
+
if (isSandboxEnvironment()) {
|
|
59
|
+
const sandboxName = getSandboxEnvironmentName();
|
|
60
|
+
this.terminal.log(`Error: No ByteRover instance is running.\n` +
|
|
61
|
+
`⚠️ Sandbox environment detected (${sandboxName}).\n\n` +
|
|
62
|
+
`Please run 'brv' command in a separate terminal window/tab outside the sandbox first.`);
|
|
214
63
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
content,
|
|
220
|
-
fileReferenceInstructions,
|
|
221
|
-
flags: { apiKey: options.apiKey, model: options.model, verbose: options.verbose },
|
|
222
|
-
}));
|
|
223
|
-
// Simple output for agents - just confirm saved
|
|
224
|
-
this.terminal.log('✓ Context queued for processing.');
|
|
225
|
-
// Track the event
|
|
226
|
-
await this.trackingService.track('mem:curate');
|
|
227
|
-
}
|
|
228
|
-
catch (error) {
|
|
229
|
-
if (error instanceof WorkspaceNotInitializedError) {
|
|
230
|
-
this.handleWorkspaceError(error);
|
|
231
|
-
return;
|
|
64
|
+
else {
|
|
65
|
+
this.terminal.log('No ByteRover instance is running.\n\n' +
|
|
66
|
+
'Start a ByteRover instance by running "brv" in a separate terminal window/tab.\n' +
|
|
67
|
+
'The instance will keep running and handle your commands.');
|
|
232
68
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (error instanceof InstanceCrashedError) {
|
|
72
|
+
this.terminal.log('ByteRover instance has crashed.\n\nPlease restart with: brv');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (error instanceof ConnectionFailedError) {
|
|
76
|
+
// Check if it's specifically a sandbox network restriction error
|
|
77
|
+
const isSandboxError = isSandboxNetworkError(error.originalError ?? error);
|
|
78
|
+
if (isSandboxError) {
|
|
79
|
+
const sandboxName = getSandboxEnvironmentName();
|
|
80
|
+
this.terminal.log(`Error: Failed to connect to ByteRover instance.\n` +
|
|
81
|
+
`Port: ${error.port ?? 'unknown'}\n` +
|
|
82
|
+
`⚠️ Sandbox network restriction detected (${sandboxName}).\n\n` +
|
|
83
|
+
`Please allow network access in the sandbox and retry the command.`);
|
|
247
84
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
if (!topicName) {
|
|
251
|
-
this.terminal.log('\nOperation cancelled.');
|
|
252
|
-
return;
|
|
85
|
+
else {
|
|
86
|
+
this.terminal.log(`Failed to connect to ByteRover instance: ${error.message}`);
|
|
253
87
|
}
|
|
254
|
-
|
|
255
|
-
const contextFilePath = this.createTopicWithContextFile(targetPath, topicName);
|
|
256
|
-
this.terminal.log(`\nCreated: ${path.relative(process.cwd(), contextFilePath)}`);
|
|
257
|
-
// Track the event
|
|
258
|
-
this.trackingService.track('mem:curate');
|
|
259
|
-
// Auto-open context.md in default editor
|
|
260
|
-
this.terminal.log('Opening context.md for editing...');
|
|
261
|
-
await this.openFile(contextFilePath);
|
|
262
|
-
}
|
|
263
|
-
catch (error) {
|
|
264
|
-
this.terminal.error(error instanceof Error ? error.message : 'Unexpected error occurred');
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
validateTopicName(value, targetPath) {
|
|
268
|
-
const trimmed = value.trim();
|
|
269
|
-
if (!trimmed) {
|
|
270
|
-
return 'Topic name cannot be empty';
|
|
271
|
-
}
|
|
272
|
-
// Only allow letters, numbers, and hyphens
|
|
273
|
-
if (!/^[a-zA-Z0-9-]+$/.test(trimmed)) {
|
|
274
|
-
return 'Topic name can only contain letters (a-z, A-Z), numbers (0-9), and hyphens (-)';
|
|
88
|
+
return;
|
|
275
89
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
return `Topic "${trimmed}" already exists at this location`;
|
|
90
|
+
if (error instanceof ConnectionError) {
|
|
91
|
+
this.terminal.log(`Connection error: ${error.message}`);
|
|
92
|
+
return;
|
|
280
93
|
}
|
|
281
|
-
|
|
94
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
95
|
+
this.terminal.log(`Unexpected error: ${message}`);
|
|
282
96
|
}
|
|
283
97
|
}
|
|
@@ -58,7 +58,9 @@ export class InitUseCase {
|
|
|
58
58
|
}
|
|
59
59
|
catch (error) {
|
|
60
60
|
this.terminal.actionStop('✗');
|
|
61
|
-
|
|
61
|
+
const brvDirRemovalErr = `Failed to remove ${BRV_DIR}/: ${error instanceof Error ? error.message : 'Unknown error'}`;
|
|
62
|
+
await this.trackingService.track('init', { message: brvDirRemovalErr, status: 'error' });
|
|
63
|
+
throw new Error(brvDirRemovalErr);
|
|
62
64
|
}
|
|
63
65
|
}
|
|
64
66
|
async confirmReInitialization(config) {
|
|
@@ -93,17 +95,17 @@ export class InitUseCase {
|
|
|
93
95
|
async ensureAuthenticated() {
|
|
94
96
|
const token = await this.tokenStore.load();
|
|
95
97
|
if (token === undefined) {
|
|
96
|
-
this.terminal.log('Not authenticated. Please run "
|
|
98
|
+
this.terminal.log('Not authenticated. Please run "/login" first.');
|
|
97
99
|
return undefined;
|
|
98
100
|
}
|
|
99
101
|
if (!token.isValid()) {
|
|
100
|
-
this.terminal.log('Authentication token expired. Please run "
|
|
102
|
+
this.terminal.log('Authentication token expired. Please run "/login" again.');
|
|
101
103
|
return undefined;
|
|
102
104
|
}
|
|
103
105
|
return token;
|
|
104
106
|
}
|
|
105
107
|
async fetchAndSelectSpace(token, team) {
|
|
106
|
-
this.terminal.actionStart('
|
|
108
|
+
this.terminal.actionStart('Fetching all spaces');
|
|
107
109
|
const { spaces } = await this.spaceService.getSpaces(token.accessToken, token.sessionKey, team.id, { fetchAll: true });
|
|
108
110
|
this.terminal.actionStop();
|
|
109
111
|
if (spaces.length === 0) {
|
|
@@ -205,7 +207,9 @@ export class InitUseCase {
|
|
|
205
207
|
try {
|
|
206
208
|
const projectConfig = await this.projectConfigStore.read();
|
|
207
209
|
if (projectConfig === undefined) {
|
|
208
|
-
|
|
210
|
+
const corruptedConfigFileErr = 'Configuration file exists but cannot be read. Please check .brv/config.json';
|
|
211
|
+
this.trackingService.track('init', { message: corruptedConfigFileErr, status: 'error' });
|
|
212
|
+
throw new Error(corruptedConfigFileErr);
|
|
209
213
|
}
|
|
210
214
|
return projectConfig;
|
|
211
215
|
}
|
|
@@ -362,6 +366,7 @@ export class InitUseCase {
|
|
|
362
366
|
}
|
|
363
367
|
async run(options) {
|
|
364
368
|
try {
|
|
369
|
+
await this.trackingService.track('init', { status: 'started' });
|
|
365
370
|
const authToken = await this.ensureAuthenticated();
|
|
366
371
|
if (!authToken)
|
|
367
372
|
return;
|
|
@@ -416,16 +421,19 @@ export class InitUseCase {
|
|
|
416
421
|
await this.trackingService.track('rule:generate');
|
|
417
422
|
await this.trackingService.track('space:init');
|
|
418
423
|
this.logSuccess(selectedSpace);
|
|
424
|
+
await this.trackingService.track('init', { status: 'finished' });
|
|
419
425
|
}
|
|
420
426
|
catch (error) {
|
|
421
427
|
// Stop action if it's in progress
|
|
422
428
|
this.terminal.actionStop();
|
|
423
|
-
|
|
429
|
+
const initErr = `Initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`;
|
|
430
|
+
await this.trackingService.track('init', { message: initErr, status: 'error' });
|
|
431
|
+
this.terminal.error(initErr);
|
|
424
432
|
}
|
|
425
433
|
}
|
|
426
434
|
async syncFromRemoteOrInitialize(params) {
|
|
427
435
|
// Pull from remote - fail if network/API error
|
|
428
|
-
this.terminal.
|
|
436
|
+
this.terminal.actionStart('Syncing from ByteRover...');
|
|
429
437
|
try {
|
|
430
438
|
const coGitSnapshot = await this.cogitPullService.pull({
|
|
431
439
|
accessToken: params.token.accessToken,
|
|
@@ -452,8 +460,11 @@ export class InitUseCase {
|
|
|
452
460
|
}
|
|
453
461
|
}
|
|
454
462
|
catch (error) {
|
|
455
|
-
|
|
463
|
+
const syncFailureErr = `Failed to sync from ByteRover: ${error instanceof Error ? error.message : 'Unknown error'}. Please try again.`;
|
|
464
|
+
await this.trackingService.track('init', { message: syncFailureErr, status: 'error' });
|
|
465
|
+
throw new Error(syncFailureErr);
|
|
456
466
|
}
|
|
467
|
+
this.terminal.actionStop();
|
|
457
468
|
}
|
|
458
469
|
/**
|
|
459
470
|
* Appends ByteRover rules to a file that has no ByteRover content.
|
|
@@ -19,13 +19,16 @@ export class LoginUseCase {
|
|
|
19
19
|
}
|
|
20
20
|
async run() {
|
|
21
21
|
try {
|
|
22
|
+
await this.trackingService.track('auth:sign_in', { status: 'started' });
|
|
22
23
|
this.terminal.log('Starting authentication process...');
|
|
23
24
|
// Start callback server
|
|
24
25
|
await this.callbackHandler.start();
|
|
25
26
|
// Get port and build redirect URI
|
|
26
27
|
const port = this.callbackHandler.getPort();
|
|
27
28
|
if (!port) {
|
|
28
|
-
|
|
29
|
+
const getPortFailedErr = 'Failed to get callback server port';
|
|
30
|
+
await this.trackingService.track('auth:sign_in', { message: getPortFailedErr, status: 'error' });
|
|
31
|
+
throw new Error(getPortFailedErr);
|
|
29
32
|
}
|
|
30
33
|
const redirectUri = `http://localhost:${port}/callback`;
|
|
31
34
|
// Initiate authorization (generates PKCE parameters and state internally)
|
|
@@ -38,6 +41,7 @@ export class LoginUseCase {
|
|
|
38
41
|
}
|
|
39
42
|
catch {
|
|
40
43
|
// Browser launch failed, will return URL to user
|
|
44
|
+
await this.trackingService.track('auth:sign_in', { message: 'browser launch failed', status: 'error' });
|
|
41
45
|
}
|
|
42
46
|
// If browser failed to open, display the URL for manual copy
|
|
43
47
|
if (!browserOpened) {
|
|
@@ -60,13 +64,13 @@ export class LoginUseCase {
|
|
|
60
64
|
userId: user.id,
|
|
61
65
|
});
|
|
62
66
|
await this.tokenStore.save(authToken);
|
|
63
|
-
|
|
64
|
-
await this.trackingService.track('auth:signed_in');
|
|
67
|
+
await this.trackingService.track('auth:sign_in', { status: 'finished' });
|
|
65
68
|
this.terminal.log(`Logged in as ${user.email}`);
|
|
66
69
|
}
|
|
67
70
|
catch (error) {
|
|
68
71
|
// Throw error to let oclif handle display
|
|
69
72
|
const errorMessage = error instanceof Error ? error.message : 'Authentication failed';
|
|
73
|
+
await this.trackingService.track('auth:sign_in', { message: errorMessage, status: 'error' });
|
|
70
74
|
this.terminal.error(errorMessage);
|
|
71
75
|
}
|
|
72
76
|
}
|
|
@@ -74,10 +78,12 @@ export class LoginUseCase {
|
|
|
74
78
|
if (error instanceof DiscoveryError) {
|
|
75
79
|
const errorMessage = `Failed to configure authentication: ${error.message}\n` +
|
|
76
80
|
'Please check your network connection and try again.';
|
|
81
|
+
await this.trackingService.track('auth:sign_in', { message: errorMessage, status: 'error' });
|
|
77
82
|
this.terminal.error(errorMessage);
|
|
78
83
|
}
|
|
79
84
|
// Throw error to let oclif handle display
|
|
80
85
|
const errorMessage = error instanceof Error ? error.message : 'Authentication failed';
|
|
86
|
+
await this.trackingService.track('auth:sign_in', { message: errorMessage, status: 'error' });
|
|
81
87
|
this.terminal.error(errorMessage);
|
|
82
88
|
}
|
|
83
89
|
finally {
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
import type { BrvConfig } from '../../core/domain/entities/brv-config.js';
|
|
2
|
-
import type { IProjectConfigStore } from '../../core/interfaces/i-project-config-store.js';
|
|
3
2
|
import type { ITerminal } from '../../core/interfaces/i-terminal.js';
|
|
4
|
-
import type { ITokenStore } from '../../core/interfaces/i-token-store.js';
|
|
5
3
|
import type { ITrackingService } from '../../core/interfaces/i-tracking-service.js';
|
|
6
4
|
import type { IQueryUseCase, QueryUseCaseRunOptions } from '../../core/interfaces/usecase/i-query-use-case.js';
|
|
7
|
-
import { CipherAgent } from '../cipher/
|
|
5
|
+
import { CipherAgent } from '../cipher/agent/index.js';
|
|
6
|
+
import { type TransportClientFactory } from '../transport/transport-client-factory.js';
|
|
7
|
+
export type TransportClientFactoryCreator = () => TransportClientFactory;
|
|
8
8
|
export interface QueryUseCaseOptions {
|
|
9
|
-
projectConfigStore: IProjectConfigStore;
|
|
10
9
|
terminal: ITerminal;
|
|
11
|
-
tokenStore: ITokenStore;
|
|
12
10
|
trackingService: ITrackingService;
|
|
11
|
+
/** Optional factory creator for dependency injection (defaults to createTransportClientFactory) */
|
|
12
|
+
transportClientFactoryCreator?: TransportClientFactoryCreator;
|
|
13
13
|
}
|
|
14
14
|
export declare class QueryUseCase implements IQueryUseCase {
|
|
15
|
-
private readonly projectConfigStore;
|
|
16
15
|
private readonly terminal;
|
|
17
|
-
private readonly tokenStore;
|
|
18
16
|
private readonly trackingService;
|
|
17
|
+
private readonly transportClientFactoryCreator;
|
|
19
18
|
constructor(options: QueryUseCaseOptions);
|
|
20
19
|
/**
|
|
21
20
|
* Create CipherAgent instance. Protected to allow test overrides.
|
|
@@ -28,51 +27,25 @@ export declare class QueryUseCase implements IQueryUseCase {
|
|
|
28
27
|
protected generateSessionId(): string;
|
|
29
28
|
run(options: QueryUseCaseRunOptions): Promise<void>;
|
|
30
29
|
/**
|
|
31
|
-
*
|
|
30
|
+
* Format a parsed object result into a concise summary.
|
|
32
31
|
*/
|
|
33
|
-
private
|
|
32
|
+
private formatParsedResult;
|
|
34
33
|
/**
|
|
35
|
-
*
|
|
34
|
+
* Format tool arguments for display.
|
|
35
|
+
* Extract the most meaningful value for human reading.
|
|
36
36
|
*/
|
|
37
|
-
private
|
|
37
|
+
private formatToolArgs;
|
|
38
38
|
/**
|
|
39
|
-
* Format
|
|
39
|
+
* Format tool result for display.
|
|
40
|
+
* Shows meaningful, concise summary - NEVER shows raw JSON.
|
|
40
41
|
*/
|
|
41
|
-
private
|
|
42
|
+
private formatToolResult;
|
|
42
43
|
/**
|
|
43
|
-
*
|
|
44
|
+
* Handle connection-related errors with user-friendly messages.
|
|
44
45
|
*/
|
|
45
|
-
private
|
|
46
|
+
private handleConnectionError;
|
|
46
47
|
/**
|
|
47
|
-
*
|
|
48
|
+
* Stream task results from the connected instance.
|
|
48
49
|
*/
|
|
49
|
-
private
|
|
50
|
-
/**
|
|
51
|
-
* Format tool result summary for display
|
|
52
|
-
*/
|
|
53
|
-
private formatToolResultSummary;
|
|
54
|
-
/**
|
|
55
|
-
* Format topics count from find_knowledge_topics result
|
|
56
|
-
*/
|
|
57
|
-
private formatTopicsCount;
|
|
58
|
-
/**
|
|
59
|
-
* Get user-friendly description for a tool
|
|
60
|
-
*
|
|
61
|
-
* @param toolName - Name of the tool
|
|
62
|
-
* @param args - Tool arguments
|
|
63
|
-
* @returns User-friendly description
|
|
64
|
-
*/
|
|
65
|
-
private getToolDescription;
|
|
66
|
-
/**
|
|
67
|
-
* Handle workspace not initialized error
|
|
68
|
-
*/
|
|
69
|
-
private handleWorkspaceError;
|
|
70
|
-
/**
|
|
71
|
-
* Setup event listeners for CipherAgent
|
|
72
|
-
*/
|
|
73
|
-
private setupEventListeners;
|
|
74
|
-
/**
|
|
75
|
-
* Setup tool call tracking to persist in database
|
|
76
|
-
*/
|
|
77
|
-
private setupToolCallTracking;
|
|
50
|
+
private streamTaskResults;
|
|
78
51
|
}
|