byterover-cli 0.4.1 → 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/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/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 +8 -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 +71 -262
- package/dist/infra/usecase/init-use-case.js +3 -2
- package/dist/infra/usecase/query-use-case.d.ts +18 -45
- package/dist/infra/usecase/query-use-case.js +250 -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} +3 -3
- 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,21 +1,17 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import {
|
|
3
|
-
import { PROJECT } from '../../constants.js';
|
|
2
|
+
import { ConnectionError, ConnectionFailedError, InstanceCrashedError, NoInstanceRunningError, } from '../../core/domain/errors/connection-error.js';
|
|
4
3
|
import { formatError } from '../../utils/error-handler.js';
|
|
5
|
-
import {
|
|
6
|
-
import { CipherAgent } from '../cipher/
|
|
7
|
-
import {
|
|
8
|
-
import { WorkspaceNotInitializedError } from '../cipher/validation/workspace-validator.js';
|
|
4
|
+
import { getSandboxEnvironmentName, isSandboxEnvironment, isSandboxNetworkError } from '../../utils/sandbox-detector.js';
|
|
5
|
+
import { CipherAgent } from '../cipher/agent/index.js';
|
|
6
|
+
import { createTransportClientFactory } from '../transport/transport-client-factory.js';
|
|
9
7
|
export class QueryUseCase {
|
|
10
|
-
projectConfigStore;
|
|
11
8
|
terminal;
|
|
12
|
-
tokenStore;
|
|
13
9
|
trackingService;
|
|
10
|
+
transportClientFactoryCreator;
|
|
14
11
|
constructor(options) {
|
|
15
|
-
this.projectConfigStore = options.projectConfigStore;
|
|
16
12
|
this.terminal = options.terminal;
|
|
17
|
-
this.tokenStore = options.tokenStore;
|
|
18
13
|
this.trackingService = options.trackingService;
|
|
14
|
+
this.transportClientFactoryCreator = options.transportClientFactoryCreator ?? createTransportClientFactory;
|
|
19
15
|
}
|
|
20
16
|
/**
|
|
21
17
|
* Create CipherAgent instance. Protected to allow test overrides.
|
|
@@ -33,370 +29,298 @@ export class QueryUseCase {
|
|
|
33
29
|
}
|
|
34
30
|
async run(options) {
|
|
35
31
|
await this.trackingService.track('mem:query', { status: 'started' });
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
if (!options.query.trim()) {
|
|
33
|
+
this.terminal.log('Query argument is required.');
|
|
34
|
+
this.terminal.log('Usage: brv query "your question here"');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const verbose = options.verbose || false;
|
|
38
|
+
// Connect to running instance
|
|
39
|
+
let client;
|
|
39
40
|
try {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
this.terminal.log('Authentication required. Please run "/login" first.');
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
// Load project config
|
|
47
|
-
const brvConfig = await this.projectConfigStore.read();
|
|
48
|
-
// Validate workspace is initialized
|
|
49
|
-
if (!brvConfig) {
|
|
50
|
-
throw new WorkspaceNotInitializedError('Project not initialized. Please run "/init" to select your team and workspace.', '.brv');
|
|
41
|
+
const transportClientFactory = this.transportClientFactoryCreator();
|
|
42
|
+
if (verbose) {
|
|
43
|
+
this.terminal.log('Discovering running instance...');
|
|
51
44
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const envConfig = getCurrentConfig();
|
|
57
|
-
const llmConfig = {
|
|
58
|
-
accessToken: token.accessToken,
|
|
59
|
-
apiBaseUrl: envConfig.llmApiBaseUrl,
|
|
60
|
-
fileSystemConfig: { workingDirectory: process.cwd() },
|
|
61
|
-
maxIterations: 5,
|
|
62
|
-
maxTokens: 2048,
|
|
63
|
-
model,
|
|
64
|
-
openRouterApiKey: options.apiKey,
|
|
65
|
-
projectId: PROJECT,
|
|
66
|
-
sessionKey: token.sessionKey,
|
|
67
|
-
temperature: 0.7,
|
|
68
|
-
topK: 10,
|
|
69
|
-
topP: 0.95,
|
|
70
|
-
verbose: options.verbose ?? false,
|
|
71
|
-
};
|
|
72
|
-
// Create and start CipherAgent
|
|
73
|
-
const agent = this.createCipherAgent(llmConfig, brvConfig);
|
|
74
|
-
this.terminal.log('Querying context tree...');
|
|
75
|
-
await agent.start();
|
|
76
|
-
try {
|
|
77
|
-
const sessionId = this.generateSessionId();
|
|
78
|
-
// Setup event listeners (display + tool call tracking)
|
|
79
|
-
this.setupEventListeners(agent, options.verbose ?? false);
|
|
80
|
-
this.setupToolCallTracking(agent, executionId);
|
|
81
|
-
// Execute with autonomous mode and query commandType
|
|
82
|
-
const prompt = `Search the context tree for: ${options.query}`;
|
|
83
|
-
const response = await agent.execute(prompt, sessionId, {
|
|
84
|
-
executionContext: { commandType: 'query' },
|
|
85
|
-
mode: 'autonomous',
|
|
86
|
-
});
|
|
87
|
-
// Mark execution as completed
|
|
88
|
-
storage.updateExecutionStatus(executionId, 'completed', response);
|
|
89
|
-
this.terminal.log('\nQuery Results:');
|
|
90
|
-
this.terminal.log(response);
|
|
91
|
-
await this.trackingService.track('mem:query', { status: 'finished' });
|
|
45
|
+
const { client: connectedClient } = await transportClientFactory.connect();
|
|
46
|
+
client = connectedClient;
|
|
47
|
+
if (verbose) {
|
|
48
|
+
this.terminal.log(`Connected to instance (clientId: ${client.getClientId()})`);
|
|
92
49
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
50
|
+
// Generate taskId in UseCase (Application layer owns task creation)
|
|
51
|
+
const taskId = randomUUID();
|
|
52
|
+
// Send task:create request
|
|
53
|
+
await client.request('task:create', {
|
|
54
|
+
content: options.query,
|
|
55
|
+
taskId,
|
|
56
|
+
type: 'query',
|
|
57
|
+
});
|
|
58
|
+
// Note: response.taskId confirms what we sent (no longer extracting)
|
|
59
|
+
if (verbose) {
|
|
60
|
+
this.terminal.log(`Task created: ${taskId}`);
|
|
96
61
|
}
|
|
62
|
+
// Wait for task completion with streaming
|
|
63
|
+
await this.streamTaskResults(client, taskId, verbose);
|
|
64
|
+
await this.trackingService.track('mem:query', { status: 'finished' });
|
|
97
65
|
}
|
|
98
66
|
catch (error) {
|
|
99
|
-
|
|
100
|
-
if (executionId) {
|
|
101
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
102
|
-
storage.updateExecutionStatus(executionId, 'failed', undefined, errorMessage);
|
|
103
|
-
}
|
|
104
|
-
if (error instanceof WorkspaceNotInitializedError) {
|
|
105
|
-
this.handleWorkspaceError(error);
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
// Display context on one line, error on separate line
|
|
109
|
-
process.stderr.write('Failed to query context tree:\n');
|
|
67
|
+
this.handleConnectionError(error);
|
|
110
68
|
await this.trackingService.track('mem:query', { message: formatError(error), status: 'error' });
|
|
111
|
-
this.terminal.log(formatError(error));
|
|
112
69
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
createResultSummary(result) {
|
|
118
|
-
const lines = result.split('\n').length;
|
|
119
|
-
const chars = result.length;
|
|
120
|
-
return `${lines} lines, ${chars} chars`;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Extract summary from curate tool result
|
|
124
|
-
*/
|
|
125
|
-
extractCurateSummary(result) {
|
|
126
|
-
if (typeof result === 'string') {
|
|
127
|
-
try {
|
|
128
|
-
const parsed = JSON.parse(result);
|
|
129
|
-
return parsed.summary ?? null;
|
|
70
|
+
finally {
|
|
71
|
+
// Cleanup
|
|
72
|
+
if (client) {
|
|
73
|
+
await client.disconnect();
|
|
130
74
|
}
|
|
131
|
-
catch {
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
if (typeof result === 'object' && result !== null) {
|
|
136
|
-
const resultObj = result;
|
|
137
|
-
return resultObj.summary ?? null;
|
|
138
75
|
}
|
|
139
|
-
return null;
|
|
140
76
|
}
|
|
141
77
|
/**
|
|
142
|
-
* Format
|
|
78
|
+
* Format a parsed object result into a concise summary.
|
|
143
79
|
*/
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (
|
|
147
|
-
return
|
|
80
|
+
formatParsedResult(obj) {
|
|
81
|
+
// Check for common patterns
|
|
82
|
+
if ('topics' in obj && Array.isArray(obj.topics)) {
|
|
83
|
+
return `${obj.topics.length} topics found`;
|
|
148
84
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (added > 0)
|
|
152
|
-
parts.push(`${added} added`);
|
|
153
|
-
if (updated > 0)
|
|
154
|
-
parts.push(`${updated} updated`);
|
|
155
|
-
if (merged > 0)
|
|
156
|
-
parts.push(`${merged} merged`);
|
|
157
|
-
if (deleted > 0)
|
|
158
|
-
parts.push(`${deleted} deleted`);
|
|
159
|
-
if (failed > 0)
|
|
160
|
-
parts.push(`${failed} failed`);
|
|
161
|
-
return parts.length > 0 ? parts.join(', ') : 'No operations';
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Format items count from list_directory result
|
|
165
|
-
*/
|
|
166
|
-
formatItemsCount(result) {
|
|
167
|
-
if (typeof result === 'string') {
|
|
168
|
-
const lines = result.split('\n').filter((line) => line.trim());
|
|
169
|
-
return `${lines.length} items`;
|
|
85
|
+
if ('results' in obj && Array.isArray(obj.results)) {
|
|
86
|
+
return `${obj.results.length} matches`;
|
|
170
87
|
}
|
|
171
|
-
if (Array.isArray(
|
|
172
|
-
return `${
|
|
88
|
+
if ('matches' in obj && Array.isArray(obj.matches)) {
|
|
89
|
+
return `${obj.matches.length} matches`;
|
|
173
90
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
*/
|
|
179
|
-
formatMatchesCount(result) {
|
|
180
|
-
if (typeof result === 'string') {
|
|
181
|
-
const lines = result.split('\n').filter((line) => line.trim());
|
|
182
|
-
return `${lines.length} matches found`;
|
|
91
|
+
if ('filesSearched' in obj) {
|
|
92
|
+
const files = obj.filesSearched;
|
|
93
|
+
const matches = Array.isArray(obj.matches) ? obj.matches.length : 0;
|
|
94
|
+
return `${files} files searched, ${matches} matches`;
|
|
183
95
|
}
|
|
184
|
-
|
|
185
|
-
|
|
96
|
+
// glob_files returns {files: [...]}
|
|
97
|
+
if ('files' in obj && Array.isArray(obj.files)) {
|
|
98
|
+
return `${obj.files.length} files`;
|
|
186
99
|
}
|
|
187
|
-
|
|
100
|
+
// list_directory returns {entries: [...]}
|
|
101
|
+
if ('entries' in obj && Array.isArray(obj.entries)) {
|
|
102
|
+
return `${obj.entries.length} entries`;
|
|
103
|
+
}
|
|
104
|
+
// read_file returns {content: string, ...}
|
|
105
|
+
if ('content' in obj && typeof obj.content === 'string') {
|
|
106
|
+
const content = obj.content;
|
|
107
|
+
const lines = content.split('\n').length;
|
|
108
|
+
return `${lines} lines`;
|
|
109
|
+
}
|
|
110
|
+
if ('count' in obj) {
|
|
111
|
+
return `${obj.count} items`;
|
|
112
|
+
}
|
|
113
|
+
// Check for any array property as fallback
|
|
114
|
+
for (const key of Object.keys(obj)) {
|
|
115
|
+
if (Array.isArray(obj[key])) {
|
|
116
|
+
return `${obj[key].length} ${key}`;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Generic object - just show it worked
|
|
120
|
+
return 'Done';
|
|
188
121
|
}
|
|
189
122
|
/**
|
|
190
|
-
* Format tool
|
|
123
|
+
* Format tool arguments for display.
|
|
124
|
+
* Extract the most meaningful value for human reading.
|
|
191
125
|
*/
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
126
|
+
formatToolArgs(toolName, args) {
|
|
127
|
+
// Extract the most meaningful arg based on tool type
|
|
128
|
+
// Tool names use snake_case (LLM convention)
|
|
129
|
+
/* eslint-disable camelcase */
|
|
130
|
+
const meaningfulKeys = {
|
|
131
|
+
curate: ['operations'],
|
|
132
|
+
find_knowledge_topics: ['topicPattern', 'query'],
|
|
133
|
+
glob_files: ['pattern', 'glob'],
|
|
134
|
+
grep_content: ['pattern', 'query'],
|
|
135
|
+
list_directory: ['path', 'directory'],
|
|
136
|
+
read_file: ['filePath', 'path'],
|
|
137
|
+
read_knowledge_topic: ['topicPath', 'path'],
|
|
138
|
+
};
|
|
139
|
+
/* eslint-enable camelcase */
|
|
140
|
+
const keys = meaningfulKeys[toolName] ?? Object.keys(args);
|
|
141
|
+
for (const key of keys) {
|
|
142
|
+
if (args[key] !== undefined) {
|
|
143
|
+
const value = args[key];
|
|
144
|
+
if (typeof value === 'string') {
|
|
145
|
+
// Clean display - just the value, truncated if needed
|
|
146
|
+
return value.length > 40 ? `${value.slice(0, 37)}...` : value;
|
|
208
147
|
}
|
|
209
|
-
|
|
210
|
-
return
|
|
211
|
-
}
|
|
212
|
-
case 'list_directory': {
|
|
213
|
-
return this.formatItemsCount(result);
|
|
214
|
-
}
|
|
215
|
-
default: {
|
|
216
|
-
return '';
|
|
148
|
+
if (Array.isArray(value)) {
|
|
149
|
+
return `${value.length} items`;
|
|
217
150
|
}
|
|
218
151
|
}
|
|
219
152
|
}
|
|
220
|
-
|
|
221
|
-
return '';
|
|
222
|
-
}
|
|
153
|
+
return '';
|
|
223
154
|
}
|
|
224
155
|
/**
|
|
225
|
-
* Format
|
|
156
|
+
* Format tool result for display.
|
|
157
|
+
* Shows meaningful, concise summary - NEVER shows raw JSON.
|
|
226
158
|
*/
|
|
227
|
-
|
|
228
|
-
if (
|
|
159
|
+
formatToolResult(payload) {
|
|
160
|
+
if (!payload.success) {
|
|
161
|
+
const errMsg = payload.error ?? 'Failed';
|
|
162
|
+
return errMsg.length > 50 ? `${errMsg.slice(0, 47)}...` : errMsg;
|
|
163
|
+
}
|
|
164
|
+
if (!payload.result)
|
|
165
|
+
return 'Done';
|
|
166
|
+
// Handle different result types with concise output
|
|
167
|
+
if (Array.isArray(payload.result)) {
|
|
168
|
+
return `${payload.result.length} results`;
|
|
169
|
+
}
|
|
170
|
+
// Handle string results - might be JSON
|
|
171
|
+
if (typeof payload.result === 'string') {
|
|
172
|
+
// Try to parse as JSON for better formatting
|
|
229
173
|
try {
|
|
230
|
-
const parsed = JSON.parse(result);
|
|
231
|
-
|
|
232
|
-
return `${count} topics retrieved`;
|
|
174
|
+
const parsed = JSON.parse(payload.result);
|
|
175
|
+
return this.formatParsedResult(parsed);
|
|
233
176
|
}
|
|
234
177
|
catch {
|
|
235
|
-
|
|
178
|
+
// Not JSON - show char count for long strings
|
|
179
|
+
if (payload.result.length > 100) {
|
|
180
|
+
return `${payload.result.length} chars`;
|
|
181
|
+
}
|
|
182
|
+
return payload.result.length > 40 ? `${payload.result.slice(0, 37)}...` : payload.result;
|
|
236
183
|
}
|
|
237
184
|
}
|
|
238
|
-
if (typeof result === 'object'
|
|
239
|
-
|
|
240
|
-
if (Array.isArray(resultObj.results)) {
|
|
241
|
-
return `${resultObj.results.length} topics retrieved`;
|
|
242
|
-
}
|
|
243
|
-
if (typeof resultObj.total === 'number') {
|
|
244
|
-
return `${resultObj.total} topics retrieved`;
|
|
245
|
-
}
|
|
246
|
-
if (Array.isArray(result)) {
|
|
247
|
-
return `${result.length} topics retrieved`;
|
|
248
|
-
}
|
|
185
|
+
if (typeof payload.result === 'object') {
|
|
186
|
+
return this.formatParsedResult(payload.result);
|
|
249
187
|
}
|
|
250
|
-
return '';
|
|
188
|
+
return 'Done';
|
|
251
189
|
}
|
|
252
190
|
/**
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
* @param toolName - Name of the tool
|
|
256
|
-
* @param args - Tool arguments
|
|
257
|
-
* @returns User-friendly description
|
|
191
|
+
* Handle connection-related errors with user-friendly messages.
|
|
258
192
|
*/
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
193
|
+
handleConnectionError(error) {
|
|
194
|
+
if (error instanceof NoInstanceRunningError) {
|
|
195
|
+
// Check if running in sandbox environment
|
|
196
|
+
if (isSandboxEnvironment()) {
|
|
197
|
+
const sandboxName = getSandboxEnvironmentName();
|
|
198
|
+
this.terminal.log(`Error: No ByteRover instance is running.\n` +
|
|
199
|
+
`⚠️ Sandbox environment detected (${sandboxName}).\n\n` +
|
|
200
|
+
`Please run 'brv' command in a separate terminal window/tab outside the sandbox first.`);
|
|
264
201
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
return 'Curating context tree...';
|
|
270
|
-
}
|
|
271
|
-
case 'find_knowledge_topics': {
|
|
272
|
-
return 'Querying context tree...';
|
|
273
|
-
}
|
|
274
|
-
case 'grep_content': {
|
|
275
|
-
return 'Searching context tree...';
|
|
276
|
-
}
|
|
277
|
-
case 'list_directory': {
|
|
278
|
-
return 'Listing directory...';
|
|
279
|
-
}
|
|
280
|
-
case 'read_file': {
|
|
281
|
-
return `Reading file...`;
|
|
282
|
-
}
|
|
283
|
-
case 'write_file': {
|
|
284
|
-
return 'Writing file...';
|
|
285
|
-
}
|
|
286
|
-
default: {
|
|
287
|
-
return 'Processing...';
|
|
202
|
+
else {
|
|
203
|
+
this.terminal.log('No ByteRover instance is running.\n\n' +
|
|
204
|
+
'Start a ByteRover instance by running "brv" in a separate terminal window/tab.\n' +
|
|
205
|
+
'The instance will keep running and handle your commands.');
|
|
288
206
|
}
|
|
207
|
+
return;
|
|
289
208
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
*/
|
|
294
|
-
handleWorkspaceError(_error) {
|
|
295
|
-
const message = 'Project not initialized. Please run "brv init" to select your team and workspace.';
|
|
296
|
-
this.terminal.log(message);
|
|
297
|
-
}
|
|
298
|
-
/**
|
|
299
|
-
* Setup event listeners for CipherAgent
|
|
300
|
-
*/
|
|
301
|
-
setupEventListeners(agent, verbose) {
|
|
302
|
-
if (!agent.agentEventBus) {
|
|
303
|
-
throw new Error('Agent event bus not initialized');
|
|
209
|
+
if (error instanceof InstanceCrashedError) {
|
|
210
|
+
this.terminal.log('ByteRover instance has crashed.\n\nPlease restart with: brv');
|
|
211
|
+
return;
|
|
304
212
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
eventBus.on('llmservice:toolResult', (payload) => {
|
|
320
|
-
const resultSummary = formatToolResult(payload.toolName, payload.success, payload.result, payload.error);
|
|
321
|
-
if (payload.success) {
|
|
322
|
-
this.terminal.log(`✓ [Event] Tool Success: ${payload.toolName} → ${resultSummary}`);
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
this.terminal.log(`✗ [Event] Tool Error: ${payload.toolName} → ${resultSummary}`);
|
|
326
|
-
}
|
|
327
|
-
});
|
|
328
|
-
// NOTE: llmservice:error is handled by catch block in the run method
|
|
329
|
-
// which displays error via this.error(). DO NOT display here to avoid duplicate.
|
|
213
|
+
if (error instanceof ConnectionFailedError) {
|
|
214
|
+
// Check if it's specifically a sandbox network restriction error
|
|
215
|
+
const isSandboxError = isSandboxNetworkError(error.originalError ?? error);
|
|
216
|
+
if (isSandboxError) {
|
|
217
|
+
const sandboxName = getSandboxEnvironmentName();
|
|
218
|
+
this.terminal.log(`Error: Failed to connect to ByteRover instance.\n` +
|
|
219
|
+
`Port: ${error.port ?? 'unknown'}\n` +
|
|
220
|
+
`⚠️ Sandbox network restriction detected (${sandboxName}).\n\n` +
|
|
221
|
+
`Please allow network access in the sandbox and retry the command.`);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
this.terminal.log(`Failed to connect to ByteRover instance: ${error.message}`);
|
|
225
|
+
}
|
|
226
|
+
return;
|
|
330
227
|
}
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
// // Clear any spinner on current line before printing (use spaces instead of ANSI codes)
|
|
335
|
-
// const description = this.getToolDescription(payload.toolName, payload.args)
|
|
336
|
-
// this.terminal.log(`🔧 ${payload.toolName} → ${description}`)
|
|
337
|
-
// })
|
|
338
|
-
// eventBus.on('llmservice:toolResult', (payload) => {
|
|
339
|
-
// if (payload.success) {
|
|
340
|
-
// // Show brief success summary for tool completion
|
|
341
|
-
// const summary = this.formatToolResultSummary(payload.toolName, payload.result)
|
|
342
|
-
// const completionText = summary ? `Complete (${summary})` : 'Complete'
|
|
343
|
-
// this.terminal.log(`✅ ${payload.toolName} → ${completionText}`)
|
|
344
|
-
// } else {
|
|
345
|
-
// this.terminal.log(`✗ ${payload.toolName} → Failed: ${payload.error}`)
|
|
346
|
-
// }
|
|
347
|
-
// })
|
|
348
|
-
// NOTE: llmservice:error is handled by catch block in the run method
|
|
349
|
-
// which displays error via this.error(). DO NOT display here to avoid duplicate.
|
|
228
|
+
if (error instanceof ConnectionError) {
|
|
229
|
+
this.terminal.log(`Connection error: ${error.message}`);
|
|
230
|
+
return;
|
|
350
231
|
}
|
|
232
|
+
// Unknown error
|
|
233
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
234
|
+
this.terminal.log(`Unexpected error: ${message}`);
|
|
351
235
|
}
|
|
352
236
|
/**
|
|
353
|
-
*
|
|
237
|
+
* Stream task results from the connected instance.
|
|
354
238
|
*/
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
// Ignore errors - don't break query execution
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
|
-
eventBus.on('llmservice:toolResult', (payload) => {
|
|
377
|
-
try {
|
|
378
|
-
if (!payload.callId)
|
|
379
|
-
return;
|
|
380
|
-
const toolCallId = toolCallMap.get(payload.callId);
|
|
381
|
-
if (toolCallId) {
|
|
382
|
-
// Format result: if error, wrap in {error: "..."} object
|
|
383
|
-
let result;
|
|
384
|
-
if (payload.success) {
|
|
385
|
-
result = typeof payload.result === 'string' ? payload.result : JSON.stringify(payload.result);
|
|
239
|
+
async streamTaskResults(client, taskId, verbose) {
|
|
240
|
+
return new Promise((resolve, reject) => {
|
|
241
|
+
let completed = false;
|
|
242
|
+
let resultPrinted = false; // Track if we've already printed the result
|
|
243
|
+
// Timeout after 5 minutes
|
|
244
|
+
const timeout = setTimeout(() => {
|
|
245
|
+
if (!completed) {
|
|
246
|
+
completed = true;
|
|
247
|
+
cleanup();
|
|
248
|
+
reject(new Error('Task timed out after 5 minutes'));
|
|
249
|
+
}
|
|
250
|
+
}, 5 * 60 * 1000);
|
|
251
|
+
// Setup all event handlers
|
|
252
|
+
const unsubscribers = [
|
|
253
|
+
// task:ack - immediate acknowledgment
|
|
254
|
+
client.on('task:ack', (payload) => {
|
|
255
|
+
if (payload.taskId === taskId && verbose) {
|
|
256
|
+
this.terminal.log('Task acknowledged by server');
|
|
386
257
|
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
258
|
+
}),
|
|
259
|
+
// task:started - task is being processed
|
|
260
|
+
client.on('task:started', (payload) => {
|
|
261
|
+
if (payload.taskId === taskId && verbose) {
|
|
262
|
+
this.terminal.log('Task started processing...');
|
|
390
263
|
}
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
//
|
|
399
|
-
|
|
264
|
+
}),
|
|
265
|
+
// llmservice:chunk - streaming content (for future release)
|
|
266
|
+
// client.on<LlmChunkPayload>('llmservice:chunk', (payload) => {
|
|
267
|
+
// if (payload.taskId === taskId) {
|
|
268
|
+
// if (!hasReceivedChunks) {
|
|
269
|
+
// this.terminal.log('\nResult:')
|
|
270
|
+
// }
|
|
271
|
+
// hasReceivedChunks = true
|
|
272
|
+
// process.stdout.write(payload.content)
|
|
273
|
+
// }
|
|
274
|
+
// }),
|
|
275
|
+
// llmservice:response - final response from LLM (only print once)
|
|
276
|
+
client.on('llmservice:response', (payload) => {
|
|
277
|
+
if (payload.taskId === taskId && payload.content && !resultPrinted) {
|
|
278
|
+
resultPrinted = true;
|
|
279
|
+
this.terminal.log('\nResult:');
|
|
280
|
+
this.terminal.log(payload.content);
|
|
281
|
+
}
|
|
282
|
+
}),
|
|
283
|
+
// llmservice:toolCall - tool invocation (stop showing after response)
|
|
284
|
+
client.on('llmservice:toolCall', (payload) => {
|
|
285
|
+
if (payload.taskId === taskId && !resultPrinted) {
|
|
286
|
+
const detail = payload.args ? this.formatToolArgs(payload.toolName, payload.args) : '';
|
|
287
|
+
const suffix = detail ? `: ${detail}` : '';
|
|
288
|
+
this.terminal.log(`🔧 ${payload.toolName}${suffix}`);
|
|
289
|
+
}
|
|
290
|
+
}),
|
|
291
|
+
// llmservice:toolResult - tool result with summary (stop showing after response)
|
|
292
|
+
client.on('llmservice:toolResult', (payload) => {
|
|
293
|
+
if (payload.taskId === taskId && !resultPrinted) {
|
|
294
|
+
const status = payload.success ? '✓' : '✗';
|
|
295
|
+
const resultSummary = this.formatToolResult(payload);
|
|
296
|
+
this.terminal.log(` ${status} ${resultSummary}`);
|
|
297
|
+
}
|
|
298
|
+
}),
|
|
299
|
+
// task:completed - task finished (chunks already streamed, just resolve)
|
|
300
|
+
client.on('task:completed', (payload) => {
|
|
301
|
+
if (payload.taskId === taskId && !completed) {
|
|
302
|
+
completed = true;
|
|
303
|
+
cleanup();
|
|
304
|
+
// Note: Don't log result here - chunks already streamed it
|
|
305
|
+
this.terminal.log(''); // Final newline for clean output
|
|
306
|
+
resolve();
|
|
307
|
+
}
|
|
308
|
+
}),
|
|
309
|
+
// task:error - task failed
|
|
310
|
+
client.on('task:error', (payload) => {
|
|
311
|
+
if (payload.taskId === taskId && !completed) {
|
|
312
|
+
completed = true;
|
|
313
|
+
cleanup();
|
|
314
|
+
reject(new Error(payload.error.message));
|
|
315
|
+
}
|
|
316
|
+
}),
|
|
317
|
+
// Clear timeout when done
|
|
318
|
+
() => clearTimeout(timeout),
|
|
319
|
+
];
|
|
320
|
+
const cleanup = () => {
|
|
321
|
+
for (const unsub of unsubscribers)
|
|
322
|
+
unsub();
|
|
323
|
+
};
|
|
400
324
|
});
|
|
401
325
|
}
|
|
402
326
|
}
|
|
@@ -84,7 +84,7 @@ export class StatusUseCase {
|
|
|
84
84
|
].sort((a, b) => a.path.localeCompare(b.path));
|
|
85
85
|
this.terminal.log('Context Tree Changes:');
|
|
86
86
|
for (const change of allChanges) {
|
|
87
|
-
this.terminal.log(
|
|
87
|
+
this.terminal.log(` ${change.color(`${change.status.padEnd(10)} ${formatPath(change.path)}`)}`);
|
|
88
88
|
}
|
|
89
89
|
// Track status
|
|
90
90
|
await this.trackingService.track('mem:status');
|