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
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport Handlers - Message routing in Transport Process.
|
|
3
|
+
*
|
|
4
|
+
* Architecture v0.5.0:
|
|
5
|
+
* - Routes messages between clients (TUI, external CLIs) and Agent
|
|
6
|
+
* - Agent is a special client that registers via 'agent:register'
|
|
7
|
+
* - Client UseCase generates taskId, Transport validates and routes
|
|
8
|
+
* - NO TaskProcessor, NO business logic (just routing)
|
|
9
|
+
*
|
|
10
|
+
* Event naming convention:
|
|
11
|
+
* - task:* events are Transport-generated (ack, created, started, completed, error)
|
|
12
|
+
* - llmservice:* events are forwarded from Agent with ORIGINAL names
|
|
13
|
+
*
|
|
14
|
+
* Message flows:
|
|
15
|
+
* 1. Client → Transport: task:create {taskId, type, content}
|
|
16
|
+
* Transport → Agent: task:execute {taskId, type, content, clientId}
|
|
17
|
+
* Transport → Client: task:ack {taskId}
|
|
18
|
+
* Transport → broadcast-room: task:created {taskId, type, content, files?}
|
|
19
|
+
*
|
|
20
|
+
* 2. Agent → Transport: llmservice:response {taskId, content}
|
|
21
|
+
* Transport → Client (direct): llmservice:response
|
|
22
|
+
* Transport → broadcast-room: llmservice:response (for TUI monitoring)
|
|
23
|
+
*
|
|
24
|
+
* 3. Agent → Transport: task:completed {taskId}
|
|
25
|
+
* Transport → Client (direct): task:completed
|
|
26
|
+
* Transport → broadcast-room: task:completed (for TUI monitoring)
|
|
27
|
+
*
|
|
28
|
+
* Special events:
|
|
29
|
+
* - agent:register: Agent identifies itself
|
|
30
|
+
* - agent:connected / agent:disconnected: Broadcast to all clients
|
|
31
|
+
* - broadcast-room: TUI joins this room to monitor all events
|
|
32
|
+
*/
|
|
33
|
+
import { AgentDisconnectedError, AgentNotAvailableError, serializeTaskError, } from '../../core/domain/errors/task-error.js';
|
|
34
|
+
import { LlmEventNames, TransportAgentEventNames, TransportLlmEventList, TransportTaskEventNames, } from '../../core/domain/transport/schemas.js';
|
|
35
|
+
import { eventLog, transportLog } from '../../utils/process-logger.js';
|
|
36
|
+
// All message types are imported from core/domain/transport/schemas.ts
|
|
37
|
+
// - TaskExecute: Transport → Agent (command)
|
|
38
|
+
// - TaskStartedEvent, TaskCompletedEvent, TaskErrorEvent: Agent → Transport (task lifecycle events)
|
|
39
|
+
// - LlmThinkingEvent, LlmChunkEvent, LlmResponseEvent, etc: Agent → Transport (LLM events)
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// Transport Handlers
|
|
42
|
+
// ============================================================================
|
|
43
|
+
/**
|
|
44
|
+
* TransportHandlers - Routes messages between clients and Agent.
|
|
45
|
+
*
|
|
46
|
+
* This class is the "brain" of the Transport Process.
|
|
47
|
+
* It knows which client is the Agent and routes messages accordingly.
|
|
48
|
+
*/
|
|
49
|
+
export class TransportHandlers {
|
|
50
|
+
/** The Agent's client ID (set when Agent registers) */
|
|
51
|
+
agentClientId;
|
|
52
|
+
/** Track active tasks */
|
|
53
|
+
tasks = new Map();
|
|
54
|
+
/** Transport server reference */
|
|
55
|
+
transport;
|
|
56
|
+
constructor(transport) {
|
|
57
|
+
this.transport = transport;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Cleanup handlers.
|
|
61
|
+
*/
|
|
62
|
+
cleanup() {
|
|
63
|
+
this.tasks.clear();
|
|
64
|
+
this.agentClientId = undefined;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Setup all message handlers.
|
|
68
|
+
*/
|
|
69
|
+
setup() {
|
|
70
|
+
this.setupConnectionHandlers();
|
|
71
|
+
this.setupAgentHandlers();
|
|
72
|
+
this.setupClientHandlers();
|
|
73
|
+
this.setupAgentControlHandlers();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Handle Agent registration.
|
|
77
|
+
* Agent connects as Socket.IO client and sends 'agent:register'.
|
|
78
|
+
*/
|
|
79
|
+
handleAgentRegister(clientId) {
|
|
80
|
+
transportLog(`Agent registered: ${clientId}`);
|
|
81
|
+
this.agentClientId = clientId;
|
|
82
|
+
// Broadcast to all clients that Agent is online
|
|
83
|
+
this.transport.broadcast(TransportAgentEventNames.CONNECTED, {});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Handle task:cancel request from client.
|
|
87
|
+
* Returns success:false if task not found or Agent not available.
|
|
88
|
+
* Emits task:cancelled terminal event when cancelled locally (no Agent).
|
|
89
|
+
*/
|
|
90
|
+
handleTaskCancel(data, _clientId) {
|
|
91
|
+
const { taskId } = data;
|
|
92
|
+
transportLog(`Task cancel requested: ${taskId}`);
|
|
93
|
+
// Check if task exists
|
|
94
|
+
const task = this.tasks.get(taskId);
|
|
95
|
+
if (!task) {
|
|
96
|
+
return { error: 'Task not found', success: false };
|
|
97
|
+
}
|
|
98
|
+
// If Agent connected, forward cancel request
|
|
99
|
+
if (this.agentClientId) {
|
|
100
|
+
this.transport.sendTo(this.agentClientId, TransportTaskEventNames.CANCEL, { taskId });
|
|
101
|
+
return { success: true };
|
|
102
|
+
}
|
|
103
|
+
// No Agent - cancel task locally and emit terminal event
|
|
104
|
+
transportLog(`No Agent connected, cancelling task locally: ${taskId}`);
|
|
105
|
+
this.transport.sendTo(task.clientId, TransportTaskEventNames.CANCELLED, { taskId });
|
|
106
|
+
this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.CANCELLED, { taskId });
|
|
107
|
+
this.tasks.delete(taskId);
|
|
108
|
+
return { success: true };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Handle task:cancelled from Agent.
|
|
112
|
+
* Terminal event: task was cancelled before completion.
|
|
113
|
+
* Route to task owner + broadcast-room, then cleanup.
|
|
114
|
+
*/
|
|
115
|
+
handleTaskCancelled(data) {
|
|
116
|
+
const { taskId } = data;
|
|
117
|
+
const task = this.tasks.get(taskId);
|
|
118
|
+
transportLog(`Task cancelled: ${taskId}`);
|
|
119
|
+
if (task) {
|
|
120
|
+
this.transport.sendTo(task.clientId, TransportTaskEventNames.CANCELLED, { taskId });
|
|
121
|
+
}
|
|
122
|
+
this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.CANCELLED, { taskId });
|
|
123
|
+
this.tasks.delete(taskId);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Handle task:completed from Agent.
|
|
127
|
+
* Route directly to task owner + broadcast-room for monitoring.
|
|
128
|
+
*/
|
|
129
|
+
handleTaskCompleted(data) {
|
|
130
|
+
const { result, taskId } = data;
|
|
131
|
+
const task = this.tasks.get(taskId);
|
|
132
|
+
transportLog(`Task completed: ${taskId}`);
|
|
133
|
+
if (task) {
|
|
134
|
+
this.transport.sendTo(task.clientId, TransportTaskEventNames.COMPLETED, { result, taskId });
|
|
135
|
+
}
|
|
136
|
+
this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.COMPLETED, { result, taskId });
|
|
137
|
+
this.tasks.delete(taskId);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Handle task:create request from client.
|
|
141
|
+
* Validate taskId from client, add to tracking, forward to Agent.
|
|
142
|
+
*/
|
|
143
|
+
handleTaskCreate(data, clientId) {
|
|
144
|
+
const { taskId } = data;
|
|
145
|
+
// Duplicate check - reject if taskId already exists
|
|
146
|
+
if (this.tasks.has(taskId)) {
|
|
147
|
+
throw new Error(`Task ${taskId} already exists`);
|
|
148
|
+
}
|
|
149
|
+
transportLog(`Task accepted: ${taskId} (type=${data.type}, client=${clientId})`);
|
|
150
|
+
// Track task (clientId used for direct messaging)
|
|
151
|
+
this.tasks.set(taskId, {
|
|
152
|
+
clientId,
|
|
153
|
+
content: data.content,
|
|
154
|
+
createdAt: Date.now(),
|
|
155
|
+
...(data.files?.length ? { files: data.files } : {}),
|
|
156
|
+
taskId,
|
|
157
|
+
type: data.type,
|
|
158
|
+
});
|
|
159
|
+
// Send ack immediately (fast feedback)
|
|
160
|
+
this.transport.sendTo(clientId, TransportTaskEventNames.ACK, { taskId });
|
|
161
|
+
// Broadcast task:created to broadcast-room for TUI monitoring
|
|
162
|
+
this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.CREATED, {
|
|
163
|
+
content: data.content,
|
|
164
|
+
...(data.files?.length ? { files: data.files } : {}),
|
|
165
|
+
taskId,
|
|
166
|
+
type: data.type,
|
|
167
|
+
});
|
|
168
|
+
// Forward to Agent
|
|
169
|
+
if (this.agentClientId) {
|
|
170
|
+
const executeMsg = {
|
|
171
|
+
clientId,
|
|
172
|
+
content: data.content,
|
|
173
|
+
...(data.files?.length ? { files: data.files } : {}),
|
|
174
|
+
taskId,
|
|
175
|
+
type: data.type,
|
|
176
|
+
};
|
|
177
|
+
this.transport.sendTo(this.agentClientId, TransportTaskEventNames.EXECUTE, executeMsg);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
// No Agent connected - send error immediately to client AND broadcast-room, then cleanup
|
|
181
|
+
transportLog(`No Agent connected, cannot process task ${taskId}`);
|
|
182
|
+
const error = serializeTaskError(new AgentNotAvailableError());
|
|
183
|
+
this.transport.sendTo(clientId, TransportTaskEventNames.ERROR, { error, taskId });
|
|
184
|
+
this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.ERROR, { error, taskId });
|
|
185
|
+
this.tasks.delete(taskId);
|
|
186
|
+
}
|
|
187
|
+
return { taskId };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Handle task:error from Agent.
|
|
191
|
+
* Route directly to task owner + broadcast-room for monitoring.
|
|
192
|
+
*/
|
|
193
|
+
handleTaskError(data) {
|
|
194
|
+
const { error, taskId } = data;
|
|
195
|
+
const task = this.tasks.get(taskId);
|
|
196
|
+
transportLog(`Task error: ${taskId} - [${error.code}] ${error.message}`);
|
|
197
|
+
if (task) {
|
|
198
|
+
this.transport.sendTo(task.clientId, TransportTaskEventNames.ERROR, { error, taskId });
|
|
199
|
+
}
|
|
200
|
+
this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.ERROR, { error, taskId });
|
|
201
|
+
this.tasks.delete(taskId);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Handle task:started from Agent.
|
|
205
|
+
* Route directly to task owner + broadcast-room for monitoring.
|
|
206
|
+
*/
|
|
207
|
+
handleTaskStarted(data) {
|
|
208
|
+
const { taskId } = data;
|
|
209
|
+
const task = this.tasks.get(taskId);
|
|
210
|
+
if (task) {
|
|
211
|
+
this.transport.sendTo(task.clientId, TransportTaskEventNames.STARTED, { taskId });
|
|
212
|
+
// Broadcast with task info for monitoring
|
|
213
|
+
// Note: fileReferenceInstructions is generated by UseCase during execution,
|
|
214
|
+
// so it's not available at task:started time. It's saved to DB instead.
|
|
215
|
+
this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.STARTED, {
|
|
216
|
+
content: task.content,
|
|
217
|
+
...(task.files?.length ? { files: task.files } : {}),
|
|
218
|
+
taskId,
|
|
219
|
+
type: task.type,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
// Fallback if task not found
|
|
224
|
+
this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.STARTED, { taskId });
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
registerLlmEvent(eventName) {
|
|
228
|
+
this.transport.onRequest(eventName, (data) => {
|
|
229
|
+
this.routeLlmEvent(eventName, data);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Generic handler for routing LLM events from Agent to clients.
|
|
234
|
+
* Routes directly to task owner + broadcast-room for monitoring.
|
|
235
|
+
*
|
|
236
|
+
* All llmservice:* events follow the same routing pattern:
|
|
237
|
+
* 1. Extract taskId from payload
|
|
238
|
+
* 2. Check if task is still active (not completed/cancelled/errored)
|
|
239
|
+
* 3. Send to task owner + broadcast-room if active
|
|
240
|
+
* 4. Drop silently if task already ended (prevents events-after-terminal)
|
|
241
|
+
*/
|
|
242
|
+
routeLlmEvent(eventName, data) {
|
|
243
|
+
const { taskId, ...rest } = data;
|
|
244
|
+
const task = this.tasks.get(taskId);
|
|
245
|
+
// Guard: Drop events for tasks that have already ended (terminal state reached)
|
|
246
|
+
// This prevents "ghost events" arriving after task:completed/cancelled/error
|
|
247
|
+
if (!task) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
this.transport.sendTo(task.clientId, eventName, { taskId, ...rest });
|
|
251
|
+
this.transport.broadcastTo('broadcast-room', eventName, { taskId, ...rest });
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Setup agent control handlers.
|
|
255
|
+
* These handle commands to control the Agent process (restart, etc.)
|
|
256
|
+
*/
|
|
257
|
+
setupAgentControlHandlers() {
|
|
258
|
+
// agent:restart - Client requests Agent to reinitialize
|
|
259
|
+
this.transport.onRequest(TransportAgentEventNames.RESTART, (data, clientId) => {
|
|
260
|
+
transportLog(`Agent restart requested by ${clientId}: ${data.reason ?? 'no reason'}`);
|
|
261
|
+
if (!this.agentClientId) {
|
|
262
|
+
return { error: 'Agent not connected', success: false };
|
|
263
|
+
}
|
|
264
|
+
// Forward restart command to Agent
|
|
265
|
+
this.transport.sendTo(this.agentClientId, TransportAgentEventNames.RESTART, { reason: data.reason });
|
|
266
|
+
// Broadcast and log event
|
|
267
|
+
eventLog('agent:restarting', { reason: data.reason });
|
|
268
|
+
this.transport.broadcast(TransportAgentEventNames.RESTARTING, { reason: data.reason });
|
|
269
|
+
return { success: true };
|
|
270
|
+
});
|
|
271
|
+
// agent:restarted - Agent reports restart result
|
|
272
|
+
this.transport.onRequest(TransportAgentEventNames.RESTARTED, (data) => {
|
|
273
|
+
if (data.success) {
|
|
274
|
+
transportLog('Agent restarted successfully');
|
|
275
|
+
eventLog('agent:restarted', { success: true });
|
|
276
|
+
this.transport.broadcast(TransportAgentEventNames.RESTARTED, { success: true });
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
transportLog(`Agent restart failed: ${data.error}`);
|
|
280
|
+
eventLog('agent:restarted', { error: data.error, success: false });
|
|
281
|
+
this.transport.broadcast(TransportAgentEventNames.RESTARTED, { error: data.error, success: false });
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Setup Agent-related handlers.
|
|
287
|
+
* These handle events FROM the Agent.
|
|
288
|
+
*/
|
|
289
|
+
setupAgentHandlers() {
|
|
290
|
+
// Agent registration
|
|
291
|
+
this.transport.onRequest(TransportAgentEventNames.REGISTER, (_data, clientId) => {
|
|
292
|
+
this.handleAgentRegister(clientId);
|
|
293
|
+
return { success: true };
|
|
294
|
+
});
|
|
295
|
+
// Task lifecycle events (Transport-generated names)
|
|
296
|
+
this.transport.onRequest(TransportTaskEventNames.STARTED, (data) => {
|
|
297
|
+
this.handleTaskStarted(data);
|
|
298
|
+
});
|
|
299
|
+
this.transport.onRequest(TransportTaskEventNames.COMPLETED, (data) => {
|
|
300
|
+
this.handleTaskCompleted(data);
|
|
301
|
+
});
|
|
302
|
+
this.transport.onRequest(TransportTaskEventNames.ERROR, (data) => {
|
|
303
|
+
this.handleTaskError(data);
|
|
304
|
+
});
|
|
305
|
+
this.transport.onRequest(TransportTaskEventNames.CANCELLED, (data) => {
|
|
306
|
+
this.handleTaskCancelled(data);
|
|
307
|
+
});
|
|
308
|
+
// LLM events - explicit list + typed payload map
|
|
309
|
+
for (const eventName of TransportLlmEventList) {
|
|
310
|
+
this.registerLlmEvent(eventName);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Setup client-related handlers.
|
|
315
|
+
* These handle events FROM clients (TUI, external CLIs).
|
|
316
|
+
*/
|
|
317
|
+
setupClientHandlers() {
|
|
318
|
+
// Task creation from clients
|
|
319
|
+
this.transport.onRequest(TransportTaskEventNames.CREATE, (data, clientId) => this.handleTaskCreate(data, clientId));
|
|
320
|
+
// Task cancellation from clients
|
|
321
|
+
this.transport.onRequest(TransportTaskEventNames.CANCEL, (data, clientId) => this.handleTaskCancel(data, clientId));
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Setup connection event handlers.
|
|
325
|
+
*/
|
|
326
|
+
setupConnectionHandlers() {
|
|
327
|
+
this.transport.onConnection((clientId) => {
|
|
328
|
+
transportLog(`Client connected: ${clientId}`);
|
|
329
|
+
});
|
|
330
|
+
this.transport.onDisconnection((clientId) => {
|
|
331
|
+
transportLog(`Client disconnected: ${clientId}`);
|
|
332
|
+
// Check if Agent disconnected
|
|
333
|
+
if (clientId === this.agentClientId) {
|
|
334
|
+
transportLog('Agent disconnected!');
|
|
335
|
+
this.agentClientId = undefined;
|
|
336
|
+
// Broadcast to all clients
|
|
337
|
+
this.transport.broadcast(TransportAgentEventNames.DISCONNECTED, {});
|
|
338
|
+
// Fail all pending tasks - send to client AND broadcast-room for TUI monitoring
|
|
339
|
+
const error = serializeTaskError(new AgentDisconnectedError());
|
|
340
|
+
for (const [taskId, task] of this.tasks) {
|
|
341
|
+
this.transport.sendTo(task.clientId, TransportTaskEventNames.ERROR, { error, taskId });
|
|
342
|
+
this.transport.broadcastTo('broadcast-room', TransportTaskEventNames.ERROR, { error, taskId });
|
|
343
|
+
}
|
|
344
|
+
this.tasks.clear();
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport Worker - Entry point for Transport Process.
|
|
3
|
+
*
|
|
4
|
+
* Architecture v0.5.0:
|
|
5
|
+
* - ONLY runs Socket.IO server (message hub)
|
|
6
|
+
* - Routes messages between clients (TUI, external CLIs) and Agent
|
|
7
|
+
* - NO TaskProcessor, NO CipherAgent, NO UseCases
|
|
8
|
+
* - Detects Agent connect/disconnect → broadcasts to clients
|
|
9
|
+
*
|
|
10
|
+
* IPC messages:
|
|
11
|
+
* - Receives: 'ping', 'shutdown'
|
|
12
|
+
* - Sends: 'ready' (with port), 'pong', 'stopped', 'error'
|
|
13
|
+
*
|
|
14
|
+
* Socket.IO events:
|
|
15
|
+
* - Client → Transport: task:create, task:cancel, session:*
|
|
16
|
+
* - Transport → Agent: task:create, task:cancel, shutdown
|
|
17
|
+
* - Agent → Transport: task:started, task:chunk, task:completed, task:error, task:toolCall, task:toolResult
|
|
18
|
+
* - Transport → Client: task:ack, task:started, task:chunk, task:completed, task:error, agent:connected, agent:disconnected
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport Worker - Entry point for Transport Process.
|
|
3
|
+
*
|
|
4
|
+
* Architecture v0.5.0:
|
|
5
|
+
* - ONLY runs Socket.IO server (message hub)
|
|
6
|
+
* - Routes messages between clients (TUI, external CLIs) and Agent
|
|
7
|
+
* - NO TaskProcessor, NO CipherAgent, NO UseCases
|
|
8
|
+
* - Detects Agent connect/disconnect → broadcasts to clients
|
|
9
|
+
*
|
|
10
|
+
* IPC messages:
|
|
11
|
+
* - Receives: 'ping', 'shutdown'
|
|
12
|
+
* - Sends: 'ready' (with port), 'pong', 'stopped', 'error'
|
|
13
|
+
*
|
|
14
|
+
* Socket.IO events:
|
|
15
|
+
* - Client → Transport: task:create, task:cancel, session:*
|
|
16
|
+
* - Transport → Agent: task:create, task:cancel, shutdown
|
|
17
|
+
* - Agent → Transport: task:started, task:chunk, task:completed, task:error, task:toolCall, task:toolResult
|
|
18
|
+
* - Transport → Client: task:ack, task:started, task:chunk, task:completed, task:error, agent:connected, agent:disconnected
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync } from 'node:fs';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { BRV_DIR, INSTANCE_FILE } from '../../constants.js';
|
|
23
|
+
import { transportLog } from '../../utils/process-logger.js';
|
|
24
|
+
import { FileInstanceManager } from '../instance/file-instance-manager.js';
|
|
25
|
+
import { findAvailablePort } from '../transport/port-utils.js';
|
|
26
|
+
import { createTransportServer } from '../transport/transport-factory.js';
|
|
27
|
+
import { TransportHandlers } from './transport-handlers.js';
|
|
28
|
+
// IPC types imported from ./ipc-types.ts
|
|
29
|
+
function sendToParent(message) {
|
|
30
|
+
process.send?.(message);
|
|
31
|
+
}
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Transport Process
|
|
34
|
+
// ============================================================================
|
|
35
|
+
let transportServer;
|
|
36
|
+
let transportHandlers;
|
|
37
|
+
let instancePollingInterval;
|
|
38
|
+
const instanceManager = new FileInstanceManager();
|
|
39
|
+
/** Polling interval in milliseconds */
|
|
40
|
+
const INSTANCE_POLLING_INTERVAL_MS = 2000;
|
|
41
|
+
/**
|
|
42
|
+
* Setup polling to detect instance.json deletion and recreate it.
|
|
43
|
+
*
|
|
44
|
+
* Why polling instead of fs.watch()?
|
|
45
|
+
* - fs.watch() on .brv/ directory silently stops when the directory is deleted
|
|
46
|
+
* - /init deletes entire .brv/ folder, causing watcher to become a dead listener
|
|
47
|
+
* - Polling is more reliable for this self-healing use case
|
|
48
|
+
*/
|
|
49
|
+
function setupInstancePolling(projectRoot, port) {
|
|
50
|
+
const instancePath = join(projectRoot, BRV_DIR, INSTANCE_FILE);
|
|
51
|
+
instancePollingInterval = setInterval(async () => {
|
|
52
|
+
// Check if instance.json exists
|
|
53
|
+
if (!existsSync(instancePath)) {
|
|
54
|
+
// Check if .brv directory exists (init might have recreated it)
|
|
55
|
+
const brvDir = join(projectRoot, BRV_DIR);
|
|
56
|
+
if (existsSync(brvDir)) {
|
|
57
|
+
// .brv exists but instance.json doesn't - recreate it
|
|
58
|
+
try {
|
|
59
|
+
const result = await instanceManager.acquire(projectRoot, port);
|
|
60
|
+
if (result.acquired) {
|
|
61
|
+
transportLog('instance.json was deleted - recreated successfully');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
transportLog(`Could not recreate instance.json: ${error}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// If .brv doesn't exist, wait for /init to create it
|
|
69
|
+
}
|
|
70
|
+
}, INSTANCE_POLLING_INTERVAL_MS);
|
|
71
|
+
transportLog('Instance self-healing polling started');
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Stop the instance polling.
|
|
75
|
+
*/
|
|
76
|
+
function stopInstancePolling() {
|
|
77
|
+
if (instancePollingInterval) {
|
|
78
|
+
clearInterval(instancePollingInterval);
|
|
79
|
+
instancePollingInterval = undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function startTransport() {
|
|
83
|
+
// Create Socket.IO server
|
|
84
|
+
transportServer = createTransportServer();
|
|
85
|
+
// Find available port
|
|
86
|
+
const port = await findAvailablePort();
|
|
87
|
+
// Start server
|
|
88
|
+
await transportServer.start(port);
|
|
89
|
+
// Write instance.json for discovery by clients (TUI, external CLIs)
|
|
90
|
+
const projectRoot = process.cwd();
|
|
91
|
+
const acquireResult = await instanceManager.acquire(projectRoot, port);
|
|
92
|
+
if (!acquireResult.acquired) {
|
|
93
|
+
throw new Error('brv is already running in this directory. ' +
|
|
94
|
+
'Please close the other instance first, or use a different terminal.');
|
|
95
|
+
}
|
|
96
|
+
// Setup message handlers (routing between clients and Agent)
|
|
97
|
+
transportHandlers = new TransportHandlers(transportServer);
|
|
98
|
+
transportHandlers.setup();
|
|
99
|
+
// Setup polling to recreate instance.json if deleted
|
|
100
|
+
setupInstancePolling(projectRoot, port);
|
|
101
|
+
transportLog(`Socket.IO server started on port ${port}`);
|
|
102
|
+
transportLog(`Instance registered at ${projectRoot}/.brv/instance.json`);
|
|
103
|
+
return port;
|
|
104
|
+
}
|
|
105
|
+
async function stopTransport() {
|
|
106
|
+
// Stop instance polling first
|
|
107
|
+
stopInstancePolling();
|
|
108
|
+
// Release instance.json
|
|
109
|
+
const projectRoot = process.cwd();
|
|
110
|
+
await instanceManager.release(projectRoot);
|
|
111
|
+
if (transportHandlers) {
|
|
112
|
+
transportHandlers.cleanup();
|
|
113
|
+
transportHandlers = undefined;
|
|
114
|
+
}
|
|
115
|
+
if (transportServer) {
|
|
116
|
+
await transportServer.stop();
|
|
117
|
+
transportServer = undefined;
|
|
118
|
+
}
|
|
119
|
+
transportLog('Socket.IO server stopped');
|
|
120
|
+
}
|
|
121
|
+
// ============================================================================
|
|
122
|
+
// Worker Entry Point
|
|
123
|
+
// ============================================================================
|
|
124
|
+
async function runWorker() {
|
|
125
|
+
try {
|
|
126
|
+
const port = await startTransport();
|
|
127
|
+
sendToParent({ port, type: 'ready' });
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
131
|
+
transportLog(`Failed to start: ${message}`);
|
|
132
|
+
sendToParent({ error: message, type: 'error' });
|
|
133
|
+
// eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
// IPC message handler
|
|
137
|
+
process.on('message', async (msg) => {
|
|
138
|
+
if (msg.type === 'ping') {
|
|
139
|
+
sendToParent({ type: 'pong' });
|
|
140
|
+
}
|
|
141
|
+
else if (msg.type === 'shutdown') {
|
|
142
|
+
await stopTransport();
|
|
143
|
+
sendToParent({ type: 'stopped' });
|
|
144
|
+
// eslint-disable-next-line n/no-process-exit
|
|
145
|
+
process.exit(0);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
// Signal handlers
|
|
149
|
+
const cleanup = async () => {
|
|
150
|
+
await stopTransport();
|
|
151
|
+
// eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit
|
|
152
|
+
process.exit(0);
|
|
153
|
+
};
|
|
154
|
+
process.once('SIGTERM', cleanup);
|
|
155
|
+
process.once('SIGINT', cleanup);
|
|
156
|
+
process.once('disconnect', cleanup);
|
|
157
|
+
}
|
|
158
|
+
// ============================================================================
|
|
159
|
+
// Run
|
|
160
|
+
// ============================================================================
|
|
161
|
+
try {
|
|
162
|
+
await runWorker();
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
transportLog(`Fatal error: ${error}`);
|
|
166
|
+
// eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
2
|
import { isDevelopment } from '../../../config/environment.js';
|
|
3
3
|
import { CommandKind } from '../../../tui/types.js';
|
|
4
|
-
import { ProjectConfigStore } from '../../config/file-config-store.js';
|
|
5
4
|
import { FileGlobalConfigStore } from "../../storage/file-global-config-store.js";
|
|
6
5
|
import { KeychainTokenStore } from '../../storage/keychain-token-store.js';
|
|
7
6
|
import { ReplTerminal } from '../../terminal/repl-terminal.js';
|
|
@@ -42,17 +41,13 @@ export const curateCommand = {
|
|
|
42
41
|
const tokenStore = new KeychainTokenStore();
|
|
43
42
|
const globalConfigStore = new FileGlobalConfigStore();
|
|
44
43
|
const useCase = new CurateUseCase({
|
|
45
|
-
projectConfigStore: new ProjectConfigStore(),
|
|
46
44
|
terminal,
|
|
47
|
-
tokenStore,
|
|
48
45
|
trackingService: new MixpanelTrackingService({ globalConfigStore, tokenStore }),
|
|
49
46
|
});
|
|
50
47
|
// Run the use case - mode determined by whether context is provided
|
|
51
48
|
await useCase.run({
|
|
52
|
-
apiKey: flags.apiKey,
|
|
53
49
|
context: contextText,
|
|
54
50
|
files: files.length > 0 ? files : undefined,
|
|
55
|
-
model: flags.model,
|
|
56
51
|
verbose: flags.verbose,
|
|
57
52
|
});
|
|
58
53
|
onMessage({
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { isDevelopment } from '../../../config/environment.js';
|
|
2
2
|
import { CommandKind } from '../../../tui/types.js';
|
|
3
|
-
import { ProjectConfigStore } from '../../config/file-config-store.js';
|
|
4
3
|
import { FileGlobalConfigStore } from "../../storage/file-global-config-store.js";
|
|
5
4
|
import { KeychainTokenStore } from '../../storage/keychain-token-store.js';
|
|
6
5
|
import { ReplTerminal } from '../../terminal/repl-terminal.js';
|
|
@@ -35,9 +34,7 @@ export const queryCommand = {
|
|
|
35
34
|
const tokenStore = new KeychainTokenStore();
|
|
36
35
|
const globalConfigStore = new FileGlobalConfigStore();
|
|
37
36
|
const useCase = new QueryUseCase({
|
|
38
|
-
projectConfigStore: new ProjectConfigStore(),
|
|
39
37
|
terminal,
|
|
40
|
-
tokenStore,
|
|
41
38
|
trackingService: new MixpanelTrackingService({ globalConfigStore, tokenStore }),
|
|
42
39
|
});
|
|
43
40
|
await useCase.run({
|
|
@@ -4,6 +4,10 @@ import type { ITokenStore } from '../../core/interfaces/i-token-store.js';
|
|
|
4
4
|
import type { ITrackingService } from '../../core/interfaces/i-tracking-service.js';
|
|
5
5
|
/**
|
|
6
6
|
* Options for starting the REPL
|
|
7
|
+
*
|
|
8
|
+
* Architecture v0.5.0:
|
|
9
|
+
* - TUI discovers Transport via TransportClientFactory (same as external CLIs)
|
|
10
|
+
* - TUI is a Socket.IO client, Transport is the only server
|
|
7
11
|
*/
|
|
8
12
|
export interface ReplOptions {
|
|
9
13
|
onboardingPreferenceStore: IOnboardingPreferenceStore;
|
|
@@ -3,11 +3,16 @@ import { render } from 'ink';
|
|
|
3
3
|
import { App } from '../../tui/app.js';
|
|
4
4
|
import { AppProviders } from '../../tui/providers/app-providers.js';
|
|
5
5
|
import { stopQueuePollingService } from '../cipher/consumer/queue-polling-service.js';
|
|
6
|
+
import { connectTransportClient, disconnectTransportClient } from './transport-client-helper.js';
|
|
7
|
+
/** Broadcast client - joins broadcast-room to monitor all events */
|
|
8
|
+
let transportBroadcastClient = null;
|
|
6
9
|
/**
|
|
7
10
|
* Start the ByteRover REPL
|
|
8
11
|
*/
|
|
9
12
|
export async function startRepl(options) {
|
|
10
13
|
const { onboardingPreferenceStore, projectConfigStore, tokenStore, trackingService, version } = options;
|
|
14
|
+
// Connect broadcast client to monitor all events
|
|
15
|
+
transportBroadcastClient = await connectTransportClient();
|
|
11
16
|
// Check initial auth state
|
|
12
17
|
const authToken = await tokenStore.load();
|
|
13
18
|
const isAuthorized = authToken !== undefined && authToken.isValid();
|
|
@@ -20,9 +25,11 @@ export async function startRepl(options) {
|
|
|
20
25
|
}
|
|
21
26
|
}
|
|
22
27
|
await trackingService.track('repl', { status: 'started' });
|
|
23
|
-
// Render the App with providers
|
|
24
28
|
const { waitUntilExit } = render(_jsx(AppProviders, { initialAuthToken: isAuthorized ? authToken : undefined, initialBrvConfig: brvConfig, onboardingPreferenceStore: onboardingPreferenceStore, projectConfigStore: projectConfigStore, tokenStore: tokenStore, trackingService: trackingService, version: version, children: _jsx(App, {}) }));
|
|
25
29
|
await waitUntilExit();
|
|
30
|
+
// Cleanup
|
|
31
|
+
await disconnectTransportClient(transportBroadcastClient);
|
|
32
|
+
transportBroadcastClient = null;
|
|
26
33
|
stopQueuePollingService();
|
|
27
34
|
await trackingService.track('repl', { status: 'finished' });
|
|
28
35
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ITransportClient } from '../../core/interfaces/transport/i-transport-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Connect to Transport and join TUI room for event monitoring.
|
|
4
|
+
*/
|
|
5
|
+
export declare function connectTransportClient(): Promise<ITransportClient | null>;
|
|
6
|
+
/**
|
|
7
|
+
* Disconnect transport client.
|
|
8
|
+
*/
|
|
9
|
+
export declare function disconnectTransportClient(client: ITransportClient | null): Promise<void>;
|