byterover-cli 0.4.1 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { instrument } from '@socket.io/admin-ui';
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { Server } from 'socket.io';
|
|
4
|
+
import { isDevelopment } from '../../config/environment.js';
|
|
5
|
+
import { TRANSPORT_PING_INTERVAL_MS, TRANSPORT_PING_TIMEOUT_MS } from '../../constants.js';
|
|
6
|
+
import { TransportPortInUseError, TransportServerAlreadyRunningError, TransportServerNotStartedError, } from '../../core/domain/errors/transport-error.js';
|
|
7
|
+
import { transportLog } from '../../utils/process-logger.js';
|
|
8
|
+
/**
|
|
9
|
+
* Internal protocol constants for request/response pattern.
|
|
10
|
+
*/
|
|
11
|
+
const RESPONSE_EVENT_SUFFIX = ':response';
|
|
12
|
+
const ERROR_EVENT_SUFFIX = ':error';
|
|
13
|
+
/**
|
|
14
|
+
* Socket.IO implementation of ITransportServer.
|
|
15
|
+
*
|
|
16
|
+
* Architecture notes:
|
|
17
|
+
* - Uses an HTTP server internally for Socket.IO
|
|
18
|
+
* - Request/response pattern: client emits "event", server emits "event:response" or "event:error"
|
|
19
|
+
* - Rooms are used for targeted broadcasts (e.g., per-task events)
|
|
20
|
+
*/
|
|
21
|
+
export class SocketIOTransportServer {
|
|
22
|
+
config;
|
|
23
|
+
connectionHandlers = [];
|
|
24
|
+
disconnectionHandlers = [];
|
|
25
|
+
httpServer;
|
|
26
|
+
io;
|
|
27
|
+
port;
|
|
28
|
+
requestHandlers = new Map();
|
|
29
|
+
running = false;
|
|
30
|
+
sockets = new Map();
|
|
31
|
+
constructor(config) {
|
|
32
|
+
this.config = {
|
|
33
|
+
corsOrigin: config?.corsOrigin ?? '*',
|
|
34
|
+
pingIntervalMs: config?.pingIntervalMs ?? TRANSPORT_PING_INTERVAL_MS,
|
|
35
|
+
pingTimeoutMs: config?.pingTimeoutMs ?? TRANSPORT_PING_TIMEOUT_MS,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
addToRoom(clientId, room) {
|
|
39
|
+
const socket = this.sockets.get(clientId);
|
|
40
|
+
if (socket) {
|
|
41
|
+
socket.join(room);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
broadcast(event, data) {
|
|
45
|
+
const { io } = this;
|
|
46
|
+
if (!io) {
|
|
47
|
+
throw new TransportServerNotStartedError('broadcast');
|
|
48
|
+
}
|
|
49
|
+
io.emit(event, data);
|
|
50
|
+
}
|
|
51
|
+
broadcastTo(room, event, data) {
|
|
52
|
+
const { io } = this;
|
|
53
|
+
if (!io) {
|
|
54
|
+
throw new TransportServerNotStartedError('broadcastTo');
|
|
55
|
+
}
|
|
56
|
+
io.to(room).emit(event, data);
|
|
57
|
+
}
|
|
58
|
+
getPort() {
|
|
59
|
+
return this.port;
|
|
60
|
+
}
|
|
61
|
+
isRunning() {
|
|
62
|
+
return this.running;
|
|
63
|
+
}
|
|
64
|
+
onConnection(handler) {
|
|
65
|
+
this.connectionHandlers.push(handler);
|
|
66
|
+
}
|
|
67
|
+
onDisconnection(handler) {
|
|
68
|
+
this.disconnectionHandlers.push(handler);
|
|
69
|
+
}
|
|
70
|
+
onRequest(event, handler) {
|
|
71
|
+
const { io } = this;
|
|
72
|
+
if (!io) {
|
|
73
|
+
throw new TransportServerNotStartedError('onRequest');
|
|
74
|
+
}
|
|
75
|
+
// Store handler wrapped to accept unknown types (avoids type assertion)
|
|
76
|
+
const wrappedHandler = (data, clientId) => handler(data, clientId);
|
|
77
|
+
this.requestHandlers.set(event, wrappedHandler);
|
|
78
|
+
// Apply handler to all existing sockets
|
|
79
|
+
for (const socket of this.sockets.values()) {
|
|
80
|
+
this.registerEventHandler(socket, event, wrappedHandler);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
removeFromRoom(clientId, room) {
|
|
84
|
+
const socket = this.sockets.get(clientId);
|
|
85
|
+
if (socket) {
|
|
86
|
+
socket.leave(room);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
sendTo(clientId, event, data) {
|
|
90
|
+
const socket = this.sockets.get(clientId);
|
|
91
|
+
if (socket) {
|
|
92
|
+
socket.emit(event, data);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async start(port) {
|
|
96
|
+
if (this.running) {
|
|
97
|
+
throw new TransportServerAlreadyRunningError(this.port ?? port);
|
|
98
|
+
}
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
this.httpServer = createServer();
|
|
101
|
+
// In development mode, allow admin.socket.io for debugging
|
|
102
|
+
const corsOrigin = isDevelopment() ? [this.config.corsOrigin, 'https://admin.socket.io'] : this.config.corsOrigin;
|
|
103
|
+
this.io = new Server(this.httpServer, {
|
|
104
|
+
cors: {
|
|
105
|
+
credentials: isDevelopment(), // Required for admin UI authentication
|
|
106
|
+
origin: corsOrigin,
|
|
107
|
+
},
|
|
108
|
+
// Aggressive ping for faster disconnect detection (real-time)
|
|
109
|
+
pingInterval: this.config.pingIntervalMs,
|
|
110
|
+
pingTimeout: this.config.pingTimeoutMs,
|
|
111
|
+
});
|
|
112
|
+
// Enable Socket.IO Admin UI in development mode only
|
|
113
|
+
if (isDevelopment()) {
|
|
114
|
+
instrument(this.io, {
|
|
115
|
+
auth: false, // No authentication for local dev
|
|
116
|
+
mode: 'development',
|
|
117
|
+
});
|
|
118
|
+
transportLog('Socket.IO Admin UI enabled - connect at https://admin.socket.io');
|
|
119
|
+
}
|
|
120
|
+
this.io.on('connection', (socket) => {
|
|
121
|
+
const clientId = socket.id;
|
|
122
|
+
this.sockets.set(clientId, socket);
|
|
123
|
+
// Apply all registered request handlers to new socket
|
|
124
|
+
for (const [event, handler] of this.requestHandlers) {
|
|
125
|
+
this.registerEventHandler(socket, event, handler);
|
|
126
|
+
}
|
|
127
|
+
// Notify connection handlers
|
|
128
|
+
for (const handler of this.connectionHandlers) {
|
|
129
|
+
handler(clientId);
|
|
130
|
+
}
|
|
131
|
+
socket.on('disconnect', () => {
|
|
132
|
+
this.sockets.delete(clientId);
|
|
133
|
+
// Notify disconnection handlers
|
|
134
|
+
for (const handler of this.disconnectionHandlers) {
|
|
135
|
+
handler(clientId);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
// Handle room join requests
|
|
139
|
+
socket.on('room:join', (room, callback) => {
|
|
140
|
+
socket.join(room);
|
|
141
|
+
callback?.({ success: true });
|
|
142
|
+
});
|
|
143
|
+
// Handle room leave requests
|
|
144
|
+
socket.on('room:leave', (room, callback) => {
|
|
145
|
+
socket.leave(room);
|
|
146
|
+
callback?.({ success: true });
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
this.httpServer.on('error', (err) => {
|
|
150
|
+
if (err.code === 'EADDRINUSE') {
|
|
151
|
+
reject(new TransportPortInUseError(port));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
reject(err);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
this.httpServer.listen(port, () => {
|
|
158
|
+
this.port = port;
|
|
159
|
+
this.running = true;
|
|
160
|
+
resolve();
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async stop() {
|
|
165
|
+
const { httpServer, io } = this;
|
|
166
|
+
if (!this.running || !io || !httpServer) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
return new Promise((resolve) => {
|
|
170
|
+
// Disconnect all sockets
|
|
171
|
+
io.disconnectSockets(true);
|
|
172
|
+
// Close Socket.IO server
|
|
173
|
+
io.close(() => {
|
|
174
|
+
// Close HTTP server
|
|
175
|
+
httpServer.close(() => {
|
|
176
|
+
this.running = false;
|
|
177
|
+
this.port = undefined;
|
|
178
|
+
this.sockets.clear();
|
|
179
|
+
resolve();
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
registerEventHandler(socket, event, handler) {
|
|
185
|
+
socket.on(event, async (data, callback) => {
|
|
186
|
+
try {
|
|
187
|
+
const result = await handler(data, socket.id);
|
|
188
|
+
// Support both callback style and event-based response
|
|
189
|
+
if (callback) {
|
|
190
|
+
callback({ data: result, success: true });
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
socket.emit(`${event}${RESPONSE_EVENT_SUFFIX}`, { data: result, success: true });
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
198
|
+
if (callback) {
|
|
199
|
+
callback({ error: errorMessage, success: false });
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
socket.emit(`${event}${ERROR_EVENT_SUFFIX}`, { error: errorMessage, success: false });
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { ILogger } from '../../core/interfaces/cipher/i-logger.js';
|
|
2
|
+
import type { IInstanceDiscovery } from '../../core/interfaces/instance/i-instance-discovery.js';
|
|
3
|
+
import type { ITransportClient } from '../../core/interfaces/transport/i-transport-client.js';
|
|
4
|
+
/**
|
|
5
|
+
* Result of connection attempt.
|
|
6
|
+
*/
|
|
7
|
+
export type ConnectionResult = {
|
|
8
|
+
/** The connected transport client */
|
|
9
|
+
client: ITransportClient;
|
|
10
|
+
/** Project root where instance was found */
|
|
11
|
+
projectRoot: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Configuration for TransportClientFactory.
|
|
15
|
+
*/
|
|
16
|
+
export type TransportClientFactoryConfig = {
|
|
17
|
+
/** Instance discovery service */
|
|
18
|
+
discovery?: IInstanceDiscovery;
|
|
19
|
+
/** Logger instance */
|
|
20
|
+
logger?: ILogger;
|
|
21
|
+
/** Maximum retry attempts (default: 8 for sandbox environments) */
|
|
22
|
+
maxRetries?: number;
|
|
23
|
+
/** Delay between retries in ms (default: 150 for faster sandbox warm-up) */
|
|
24
|
+
retryDelayMs?: number;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Factory for creating connected transport clients.
|
|
28
|
+
*
|
|
29
|
+
* Handles:
|
|
30
|
+
* - Instance discovery (walk-up directory tree)
|
|
31
|
+
* - Connection establishment
|
|
32
|
+
* - Retry logic
|
|
33
|
+
* - Error translation to user-friendly messages
|
|
34
|
+
*/
|
|
35
|
+
export declare class TransportClientFactory {
|
|
36
|
+
private readonly discovery;
|
|
37
|
+
private readonly logger;
|
|
38
|
+
private readonly maxRetries;
|
|
39
|
+
private readonly retryDelayMs;
|
|
40
|
+
constructor(config?: TransportClientFactoryConfig);
|
|
41
|
+
/**
|
|
42
|
+
* Discovers a running instance and connects to it.
|
|
43
|
+
*
|
|
44
|
+
* @param fromDir - Directory to start discovery from (default: cwd)
|
|
45
|
+
* @returns Connected client and project root
|
|
46
|
+
* @throws NoInstanceRunningError - No .brv directory found
|
|
47
|
+
* @throws InstanceCrashedError - Instance found but process dead
|
|
48
|
+
* @throws ConnectionFailedError - Instance found but connection failed
|
|
49
|
+
*/
|
|
50
|
+
connect(fromDir?: string): Promise<ConnectionResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Connects to the instance with retry logic.
|
|
53
|
+
* Includes HTTP warm-up to trigger sandbox permission requests.
|
|
54
|
+
*
|
|
55
|
+
* Sandbox environments (like Cursor IDE terminals) block network access initially.
|
|
56
|
+
* The first connection attempt triggers the permission request, subsequent attempts succeed.
|
|
57
|
+
*/
|
|
58
|
+
private connectWithRetry;
|
|
59
|
+
/**
|
|
60
|
+
* Delay helper.
|
|
61
|
+
*/
|
|
62
|
+
private delay;
|
|
63
|
+
/**
|
|
64
|
+
* Attempts an HTTP warm-up request to trigger sandbox network permission.
|
|
65
|
+
* This uses native fetch() which might be handled differently by sandboxes than WebSocket.
|
|
66
|
+
*/
|
|
67
|
+
private httpWarmUp;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Gets or creates the singleton factory.
|
|
71
|
+
*/
|
|
72
|
+
export declare function getTransportClientFactory(config?: TransportClientFactoryConfig): TransportClientFactory;
|
|
73
|
+
/**
|
|
74
|
+
* Creates a new factory instance.
|
|
75
|
+
*/
|
|
76
|
+
export declare function createTransportClientFactory(config?: TransportClientFactoryConfig): TransportClientFactory;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { ConnectionFailedError, InstanceCrashedError, NoInstanceRunningError, } from '../../core/domain/errors/connection-error.js';
|
|
2
|
+
import { NoOpLogger } from '../../core/interfaces/cipher/i-logger.js';
|
|
3
|
+
import { FileInstanceDiscovery } from '../instance/file-instance-discovery.js';
|
|
4
|
+
import { SocketIOTransportClient } from './socket-io-transport-client.js';
|
|
5
|
+
/**
|
|
6
|
+
* Factory for creating connected transport clients.
|
|
7
|
+
*
|
|
8
|
+
* Handles:
|
|
9
|
+
* - Instance discovery (walk-up directory tree)
|
|
10
|
+
* - Connection establishment
|
|
11
|
+
* - Retry logic
|
|
12
|
+
* - Error translation to user-friendly messages
|
|
13
|
+
*/
|
|
14
|
+
export class TransportClientFactory {
|
|
15
|
+
discovery;
|
|
16
|
+
logger;
|
|
17
|
+
maxRetries;
|
|
18
|
+
retryDelayMs;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.discovery = config?.discovery ?? new FileInstanceDiscovery();
|
|
21
|
+
this.logger = config?.logger ?? new NoOpLogger();
|
|
22
|
+
// Increased retries for sandbox warm-up scenarios (IDE terminals like Cursor)
|
|
23
|
+
// First connection often fails, subsequent ones succeed after sandbox "warms up"
|
|
24
|
+
this.maxRetries = config?.maxRetries ?? 8;
|
|
25
|
+
// Shorter delay to retry faster after sandbox warm-up
|
|
26
|
+
this.retryDelayMs = config?.retryDelayMs ?? 150;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Discovers a running instance and connects to it.
|
|
30
|
+
*
|
|
31
|
+
* @param fromDir - Directory to start discovery from (default: cwd)
|
|
32
|
+
* @returns Connected client and project root
|
|
33
|
+
* @throws NoInstanceRunningError - No .brv directory found
|
|
34
|
+
* @throws InstanceCrashedError - Instance found but process dead
|
|
35
|
+
* @throws ConnectionFailedError - Instance found but connection failed
|
|
36
|
+
*/
|
|
37
|
+
async connect(fromDir = process.cwd()) {
|
|
38
|
+
// Discover running instance
|
|
39
|
+
this.logger.debug('Discovering instance', { fromDir });
|
|
40
|
+
const result = await this.discovery.discover(fromDir);
|
|
41
|
+
if (!result.found) {
|
|
42
|
+
if (result.reason === 'instance_crashed') {
|
|
43
|
+
throw new InstanceCrashedError();
|
|
44
|
+
}
|
|
45
|
+
throw new NoInstanceRunningError();
|
|
46
|
+
}
|
|
47
|
+
const { instance, projectRoot } = result;
|
|
48
|
+
const url = instance.getTransportUrl();
|
|
49
|
+
this.logger.info('Instance discovered', { pid: instance.pid, port: instance.port, projectRoot });
|
|
50
|
+
// Connect with retry
|
|
51
|
+
const client = await this.connectWithRetry(url, instance.port);
|
|
52
|
+
return { client, projectRoot };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Connects to the instance with retry logic.
|
|
56
|
+
* Includes HTTP warm-up to trigger sandbox permission requests.
|
|
57
|
+
*
|
|
58
|
+
* Sandbox environments (like Cursor IDE terminals) block network access initially.
|
|
59
|
+
* The first connection attempt triggers the permission request, subsequent attempts succeed.
|
|
60
|
+
*/
|
|
61
|
+
async connectWithRetry(url, port) {
|
|
62
|
+
let lastError;
|
|
63
|
+
// HTTP warm-up: Try a simple HTTP request first to trigger sandbox permission
|
|
64
|
+
// This is simpler than WebSocket and might trigger sandbox permission differently
|
|
65
|
+
this.logger.debug('Attempting HTTP warm-up', { url });
|
|
66
|
+
await this.httpWarmUp(url);
|
|
67
|
+
// Small delay after HTTP warm-up
|
|
68
|
+
await this.delay(100);
|
|
69
|
+
// Now retry with proper connection attempts
|
|
70
|
+
for (let attempt = 1; attempt <= this.maxRetries; attempt++) {
|
|
71
|
+
const client = new SocketIOTransportClient();
|
|
72
|
+
try {
|
|
73
|
+
this.logger.debug('Connection attempt', { attempt, maxRetries: this.maxRetries, url });
|
|
74
|
+
// eslint-disable-next-line no-await-in-loop
|
|
75
|
+
await client.connect(url);
|
|
76
|
+
this.logger.info('Connected to instance', { clientId: client.getClientId(), url });
|
|
77
|
+
return client;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// Safety cleanup: ensure client is disconnected even if connect() throws
|
|
81
|
+
// for reasons other than connect_error (edge cases).
|
|
82
|
+
// Note: SocketIOTransportClient.connect() now handles cleanup on connect_error,
|
|
83
|
+
// but this provides defense-in-depth for unexpected exceptions.
|
|
84
|
+
try {
|
|
85
|
+
// eslint-disable-next-line no-await-in-loop
|
|
86
|
+
await client.disconnect();
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Ignore disconnect errors during cleanup
|
|
90
|
+
}
|
|
91
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
92
|
+
const errorMessage = lastError.message.toLowerCase();
|
|
93
|
+
const isSandboxError = errorMessage.includes('websocket error') ||
|
|
94
|
+
errorMessage.includes('network') ||
|
|
95
|
+
errorMessage.includes('connection failed') ||
|
|
96
|
+
errorMessage.includes('econnrefused');
|
|
97
|
+
this.logger.warn('Connection attempt failed', {
|
|
98
|
+
attempt,
|
|
99
|
+
error: lastError.message,
|
|
100
|
+
isSandboxError,
|
|
101
|
+
});
|
|
102
|
+
// Don't retry on the last attempt
|
|
103
|
+
if (attempt < this.maxRetries) {
|
|
104
|
+
// For sandbox errors, use longer delays to allow network permissions to be granted
|
|
105
|
+
// First retry: 300ms (if sandbox), 150ms (otherwise)
|
|
106
|
+
// Second retry: 600ms (if sandbox), 300ms (otherwise)
|
|
107
|
+
const baseDelay = isSandboxError ? 300 : this.retryDelayMs;
|
|
108
|
+
const delayMs = baseDelay * attempt;
|
|
109
|
+
// eslint-disable-next-line no-await-in-loop
|
|
110
|
+
await this.delay(delayMs);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
throw new ConnectionFailedError(port, lastError);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Delay helper.
|
|
118
|
+
*/
|
|
119
|
+
delay(ms) {
|
|
120
|
+
return new Promise((resolve) => {
|
|
121
|
+
setTimeout(resolve, ms);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Attempts an HTTP warm-up request to trigger sandbox network permission.
|
|
126
|
+
* This uses native fetch() which might be handled differently by sandboxes than WebSocket.
|
|
127
|
+
*/
|
|
128
|
+
async httpWarmUp(url) {
|
|
129
|
+
try {
|
|
130
|
+
// Try to hit the Socket.IO endpoint with a simple HTTP GET
|
|
131
|
+
// This might trigger sandbox permission without the WebSocket complexity
|
|
132
|
+
const controller = new AbortController();
|
|
133
|
+
const timeoutId = setTimeout(() => controller.abort(), 1000);
|
|
134
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins -- fetch available in Node 18+
|
|
135
|
+
await fetch(`${url}/socket.io/?EIO=4&transport=polling`, {
|
|
136
|
+
method: 'GET',
|
|
137
|
+
signal: controller.signal,
|
|
138
|
+
}).catch(() => {
|
|
139
|
+
// Ignore errors - we just want to trigger the network request
|
|
140
|
+
});
|
|
141
|
+
clearTimeout(timeoutId);
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// HTTP warm-up failed - not critical, continue with WebSocket
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Singleton factory instance for convenience.
|
|
152
|
+
*/
|
|
153
|
+
let factoryInstance;
|
|
154
|
+
/**
|
|
155
|
+
* Gets or creates the singleton factory.
|
|
156
|
+
*/
|
|
157
|
+
export function getTransportClientFactory(config) {
|
|
158
|
+
if (!factoryInstance) {
|
|
159
|
+
factoryInstance = new TransportClientFactory(config);
|
|
160
|
+
}
|
|
161
|
+
return factoryInstance;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Creates a new factory instance.
|
|
165
|
+
*/
|
|
166
|
+
export function createTransportClientFactory(config) {
|
|
167
|
+
return new TransportClientFactory(config);
|
|
168
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { TransportClientConfig, TransportServerConfig } from '../../core/domain/transport/types.js';
|
|
2
|
+
import type { ITransportClient } from '../../core/interfaces/transport/i-transport-client.js';
|
|
3
|
+
import type { ITransportServer } from '../../core/interfaces/transport/i-transport-server.js';
|
|
4
|
+
/**
|
|
5
|
+
* Creates a transport server instance.
|
|
6
|
+
*
|
|
7
|
+
* @param config - Optional server configuration, defaults to constants
|
|
8
|
+
* @returns Transport server implementation
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // Use defaults
|
|
12
|
+
* const server = createTransportServer();
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Custom config
|
|
16
|
+
* const server = createTransportServer({ pingIntervalMs: 2000 });
|
|
17
|
+
*/
|
|
18
|
+
export declare function createTransportServer(config?: TransportServerConfig): ITransportServer;
|
|
19
|
+
/**
|
|
20
|
+
* Creates a transport client instance.
|
|
21
|
+
*
|
|
22
|
+
* @param config - Optional client configuration, defaults to constants
|
|
23
|
+
* @returns Transport client implementation
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // Use defaults
|
|
27
|
+
* const client = createTransportClient();
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* // Custom config for tests
|
|
31
|
+
* const client = createTransportClient({ connectTimeoutMs: 1000 });
|
|
32
|
+
*/
|
|
33
|
+
export declare function createTransportClient(config?: TransportClientConfig): ITransportClient;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { TRANSPORT_CONNECT_TIMEOUT_MS, TRANSPORT_DEFAULT_TRANSPORTS, TRANSPORT_PING_INTERVAL_MS, TRANSPORT_PING_TIMEOUT_MS, TRANSPORT_RECONNECTION_ATTEMPTS, TRANSPORT_RECONNECTION_DELAY_MAX_MS, TRANSPORT_RECONNECTION_DELAY_MS, TRANSPORT_REQUEST_TIMEOUT_MS, TRANSPORT_ROOM_TIMEOUT_MS, } from '../../constants.js';
|
|
2
|
+
import { SocketIOTransportClient } from './socket-io-transport-client.js';
|
|
3
|
+
import { SocketIOTransportServer } from './socket-io-transport-server.js';
|
|
4
|
+
/**
|
|
5
|
+
* Default server configuration using constants.
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_SERVER_CONFIG = {
|
|
8
|
+
corsOrigin: '*',
|
|
9
|
+
pingIntervalMs: TRANSPORT_PING_INTERVAL_MS,
|
|
10
|
+
pingTimeoutMs: TRANSPORT_PING_TIMEOUT_MS,
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Default client configuration using constants.
|
|
14
|
+
*/
|
|
15
|
+
const DEFAULT_CLIENT_CONFIG = {
|
|
16
|
+
connectTimeoutMs: TRANSPORT_CONNECT_TIMEOUT_MS,
|
|
17
|
+
reconnectionAttempts: TRANSPORT_RECONNECTION_ATTEMPTS,
|
|
18
|
+
reconnectionDelayMaxMs: TRANSPORT_RECONNECTION_DELAY_MAX_MS,
|
|
19
|
+
reconnectionDelayMs: TRANSPORT_RECONNECTION_DELAY_MS,
|
|
20
|
+
requestTimeoutMs: TRANSPORT_REQUEST_TIMEOUT_MS,
|
|
21
|
+
roomTimeoutMs: TRANSPORT_ROOM_TIMEOUT_MS,
|
|
22
|
+
transports: TRANSPORT_DEFAULT_TRANSPORTS,
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Creates a transport server instance.
|
|
26
|
+
*
|
|
27
|
+
* @param config - Optional server configuration, defaults to constants
|
|
28
|
+
* @returns Transport server implementation
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* // Use defaults
|
|
32
|
+
* const server = createTransportServer();
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* // Custom config
|
|
36
|
+
* const server = createTransportServer({ pingIntervalMs: 2000 });
|
|
37
|
+
*/
|
|
38
|
+
export function createTransportServer(config) {
|
|
39
|
+
const mergedConfig = { ...DEFAULT_SERVER_CONFIG, ...config };
|
|
40
|
+
return new SocketIOTransportServer(mergedConfig);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Creates a transport client instance.
|
|
44
|
+
*
|
|
45
|
+
* @param config - Optional client configuration, defaults to constants
|
|
46
|
+
* @returns Transport client implementation
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* // Use defaults
|
|
50
|
+
* const client = createTransportClient();
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* // Custom config for tests
|
|
54
|
+
* const client = createTransportClient({ connectTimeoutMs: 1000 });
|
|
55
|
+
*/
|
|
56
|
+
export function createTransportClient(config) {
|
|
57
|
+
const mergedConfig = { ...DEFAULT_CLIENT_CONFIG, ...config };
|
|
58
|
+
return new SocketIOTransportClient(mergedConfig);
|
|
59
|
+
}
|
|
@@ -1,66 +1,19 @@
|
|
|
1
|
-
import type { IProjectConfigStore } from '../../core/interfaces/i-project-config-store.js';
|
|
2
1
|
import type { ITerminal } from '../../core/interfaces/i-terminal.js';
|
|
3
|
-
import type { ITokenStore } from '../../core/interfaces/i-token-store.js';
|
|
4
|
-
import type { ITrackingService } from '../../core/interfaces/i-tracking-service.js';
|
|
5
2
|
import type { CurateUseCaseRunOptions, ICurateUseCase } from '../../core/interfaces/usecase/i-curate-use-case.js';
|
|
3
|
+
import { ITrackingService } from '../../core/interfaces/i-tracking-service.js';
|
|
4
|
+
import { type TransportClientFactory } from '../transport/transport-client-factory.js';
|
|
5
|
+
export type TransportClientFactoryCreator = () => TransportClientFactory;
|
|
6
6
|
export interface CurateUseCaseOptions {
|
|
7
|
-
projectConfigStore: IProjectConfigStore;
|
|
8
7
|
terminal: ITerminal;
|
|
9
|
-
tokenStore: ITokenStore;
|
|
10
8
|
trackingService: ITrackingService;
|
|
9
|
+
/** Optional factory creator for dependency injection (defaults to createTransportClientFactory) */
|
|
10
|
+
transportClientFactoryCreator?: TransportClientFactoryCreator;
|
|
11
11
|
}
|
|
12
12
|
export declare class CurateUseCase implements ICurateUseCase {
|
|
13
|
-
private readonly projectConfigStore;
|
|
14
13
|
private readonly terminal;
|
|
15
|
-
private readonly tokenStore;
|
|
16
14
|
private readonly trackingService;
|
|
15
|
+
private readonly transportClientFactoryCreator;
|
|
17
16
|
constructor(options: CurateUseCaseOptions);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
* @param targetPath - The parent path where the topic folder will be created
|
|
21
|
-
* @param topicName - The name of the topic folder to create
|
|
22
|
-
* @returns The path to the created context.md file
|
|
23
|
-
*/
|
|
24
|
-
protected createTopicWithContextFile(targetPath: string, topicName: string): string;
|
|
25
|
-
/**
|
|
26
|
-
* Generate a unique session ID for the autonomous agent.
|
|
27
|
-
* Uses crypto.randomUUID() for guaranteed uniqueness (122 bits of entropy).
|
|
28
|
-
*/
|
|
29
|
-
protected generateSessionId(): string;
|
|
30
|
-
/**
|
|
31
|
-
* Navigate through the context tree using file selector
|
|
32
|
-
* Returns the selected path relative to context-tree root
|
|
33
|
-
*/
|
|
34
|
-
protected navigateContextTree(): Promise<null | string>;
|
|
35
|
-
/**
|
|
36
|
-
* Open a file in the default editor
|
|
37
|
-
* @param filePath - The path to the file to open
|
|
38
|
-
*/
|
|
39
|
-
protected openFile(filePath: string): Promise<void>;
|
|
40
|
-
/**
|
|
41
|
-
* Prompt user to enter topic name with validation
|
|
42
|
-
* @param targetPath - The path where the topic folder will be created
|
|
43
|
-
* @returns The topic name or null if cancelled
|
|
44
|
-
*/
|
|
45
|
-
protected promptForTopicName(targetPath: string): Promise<null | string>;
|
|
46
|
-
run(options: CurateUseCaseRunOptions): Promise<void>;
|
|
47
|
-
/**
|
|
48
|
-
* Handle workspace not initialized error
|
|
49
|
-
*/
|
|
50
|
-
private handleWorkspaceError;
|
|
51
|
-
/**
|
|
52
|
-
* Process file paths from --files flag
|
|
53
|
-
* @param filePaths - Array of file paths (relative or absolute)
|
|
54
|
-
* @returns Formatted instructions for the agent to read the specified files, or undefined if validation fails
|
|
55
|
-
*/
|
|
56
|
-
private processFileReferences;
|
|
57
|
-
/**
|
|
58
|
-
* Run in autonomous mode - push to queue for background processing
|
|
59
|
-
*/
|
|
60
|
-
private runAutonomous;
|
|
61
|
-
/**
|
|
62
|
-
* Run in interactive mode with manual prompts
|
|
63
|
-
*/
|
|
64
|
-
private runInteractive;
|
|
65
|
-
private validateTopicName;
|
|
17
|
+
run({ context, files, verbose }: CurateUseCaseRunOptions): Promise<void>;
|
|
18
|
+
private handleConnectionError;
|
|
66
19
|
}
|