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,546 @@
|
|
|
1
|
+
import { setMaxListeners } from 'node:events';
|
|
2
|
+
import { STREAMING_EVENT_NAMES } from '../../../core/domain/cipher/streaming/types.js';
|
|
3
|
+
import { AgentEventBus } from '../events/event-emitter.js';
|
|
4
|
+
import { SessionManager } from '../session/session-manager.js';
|
|
5
|
+
import { AgentError } from './agent-error.js';
|
|
6
|
+
import { BaseAgent } from './base-agent.js';
|
|
7
|
+
import { createCipherAgentServices } from './service-initializer.js';
|
|
8
|
+
/**
|
|
9
|
+
* CipherAgent - Main agent implementation extending BaseAgent.
|
|
10
|
+
*
|
|
11
|
+
* Inherits from BaseAgent:
|
|
12
|
+
* - Two-phase initialization (constructor + start)
|
|
13
|
+
* - Lifecycle management (start, stop, restart)
|
|
14
|
+
* - State management with session overrides
|
|
15
|
+
* - Typed error handling
|
|
16
|
+
* - Configuration validation (Zod)
|
|
17
|
+
*
|
|
18
|
+
* Architecture (DextoAgent pattern):
|
|
19
|
+
* - Agent creates AgentEventBus in constructor (available before start)
|
|
20
|
+
* - Agent creates and owns shared services (ToolManager, SystemPromptManager, etc.)
|
|
21
|
+
* - SessionManager creates session-specific services (LLM, SessionEventBus)
|
|
22
|
+
* - Agent delegates execution to sessions via session.run()
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* - execute(input) uses default session automatically
|
|
26
|
+
* - execute(input, sessionId) for multi-session support
|
|
27
|
+
*/
|
|
28
|
+
export class CipherAgent extends BaseAgent {
|
|
29
|
+
// Private state (must come before methods)
|
|
30
|
+
_agentEventBus;
|
|
31
|
+
_brvConfig;
|
|
32
|
+
/**
|
|
33
|
+
* Session ID - created once during start().
|
|
34
|
+
* Each agent has exactly 1 session (Single-Session pattern).
|
|
35
|
+
*/
|
|
36
|
+
_sessionId;
|
|
37
|
+
activeStreamControllers = new Map();
|
|
38
|
+
sessionManager;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a new CipherAgent instance.
|
|
41
|
+
* Does NOT initialize services - call start() for async initialization.
|
|
42
|
+
*
|
|
43
|
+
* @param config - Agent configuration (Zod-validated AgentConfig)
|
|
44
|
+
* @param brvConfig - Optional ByteRover config for spaceId/teamId
|
|
45
|
+
*/
|
|
46
|
+
constructor(config, brvConfig) {
|
|
47
|
+
// Call parent constructor (validates with Zod)
|
|
48
|
+
super(config);
|
|
49
|
+
// Create event bus early (DextoAgent pattern - available before start)
|
|
50
|
+
this._agentEventBus = new AgentEventBus();
|
|
51
|
+
this._brvConfig = brvConfig;
|
|
52
|
+
}
|
|
53
|
+
// === Public Getters (expose services for backward compatibility) ===
|
|
54
|
+
get agentEventBus() {
|
|
55
|
+
return this.services?.agentEventBus;
|
|
56
|
+
}
|
|
57
|
+
get fileSystemService() {
|
|
58
|
+
return this.services?.fileSystemService;
|
|
59
|
+
}
|
|
60
|
+
get historyStorage() {
|
|
61
|
+
return this.services?.historyStorage;
|
|
62
|
+
}
|
|
63
|
+
get memoryManager() {
|
|
64
|
+
return this.services?.memoryManager;
|
|
65
|
+
}
|
|
66
|
+
get processService() {
|
|
67
|
+
return this.services?.processService;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get the session ID (created during start()).
|
|
71
|
+
* Each agent has exactly 1 session (Single-Session pattern).
|
|
72
|
+
*/
|
|
73
|
+
get sessionId() {
|
|
74
|
+
return this._sessionId;
|
|
75
|
+
}
|
|
76
|
+
get systemPromptManager() {
|
|
77
|
+
return this.services?.systemPromptManager;
|
|
78
|
+
}
|
|
79
|
+
get toolManager() {
|
|
80
|
+
return this.services?.toolManager;
|
|
81
|
+
}
|
|
82
|
+
get toolProvider() {
|
|
83
|
+
return this.services?.toolProvider;
|
|
84
|
+
}
|
|
85
|
+
// === Public Methods (alphabetical order) ===
|
|
86
|
+
/**
|
|
87
|
+
* Cancels the currently running turn for the agent's default session.
|
|
88
|
+
* Safe to call even if no run is in progress.
|
|
89
|
+
*
|
|
90
|
+
* @returns true if a run was in progress and was signaled to abort; false otherwise
|
|
91
|
+
*/
|
|
92
|
+
async cancel() {
|
|
93
|
+
this.ensureStarted();
|
|
94
|
+
const sessionId = this.getSessionIdInternal();
|
|
95
|
+
// Abort the stream iterator first (so consumer's for-await loop exits cleanly)
|
|
96
|
+
const streamController = this.activeStreamControllers.get(sessionId);
|
|
97
|
+
if (streamController) {
|
|
98
|
+
streamController.abort();
|
|
99
|
+
this.activeStreamControllers.delete(sessionId);
|
|
100
|
+
}
|
|
101
|
+
// Then cancel the session's LLM/tool execution
|
|
102
|
+
const session = this.getSessionManagerInternal().getSession(sessionId);
|
|
103
|
+
if (session) {
|
|
104
|
+
session.cancel();
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
// If no session found but stream was aborted, still return true
|
|
108
|
+
return Boolean(streamController);
|
|
109
|
+
}
|
|
110
|
+
async cleanupServices() {
|
|
111
|
+
// Abort all active streams and clear controllers
|
|
112
|
+
for (const controller of this.activeStreamControllers.values()) {
|
|
113
|
+
controller.abort();
|
|
114
|
+
}
|
|
115
|
+
this.activeStreamControllers.clear();
|
|
116
|
+
// Dispose session manager
|
|
117
|
+
if (this.sessionManager) {
|
|
118
|
+
this.sessionManager.dispose();
|
|
119
|
+
this.sessionManager = undefined;
|
|
120
|
+
}
|
|
121
|
+
// Reset execution state (only if state manager exists - may not during early cleanup)
|
|
122
|
+
if (this.stateManager) {
|
|
123
|
+
this.stateManager.reset();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Create a new session.
|
|
128
|
+
*/
|
|
129
|
+
async createSession(sessionId) {
|
|
130
|
+
this.ensureStarted();
|
|
131
|
+
return this.getSessionManagerInternal().createSession(sessionId);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Delete a session completely (memory + history).
|
|
135
|
+
*/
|
|
136
|
+
async deleteSession(sessionId) {
|
|
137
|
+
this.ensureStarted();
|
|
138
|
+
// Clear session config overrides
|
|
139
|
+
if (this.stateManager) {
|
|
140
|
+
this.stateManager.clearSessionOverride(sessionId);
|
|
141
|
+
}
|
|
142
|
+
return this.getSessionManagerInternal().deleteSession(sessionId);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Execute the agent with user input.
|
|
146
|
+
* Uses the agent's default session (created during start()).
|
|
147
|
+
* Internally uses generate() for single code path maintainability.
|
|
148
|
+
*
|
|
149
|
+
* @param input - User message
|
|
150
|
+
* @param options - Optional execution options
|
|
151
|
+
* @param options.executionContext - Optional execution context
|
|
152
|
+
* @param options.taskId - Optional task ID for concurrent task isolation
|
|
153
|
+
*/
|
|
154
|
+
async execute(input, options) {
|
|
155
|
+
this.ensureStarted();
|
|
156
|
+
// Use generate() internally for single code path
|
|
157
|
+
const response = await this.generate(input, {
|
|
158
|
+
executionContext: options?.executionContext,
|
|
159
|
+
taskId: options?.taskId,
|
|
160
|
+
});
|
|
161
|
+
return response.content;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Generate a complete response (waits for full completion).
|
|
165
|
+
* Wrapper around stream() that collects all events and returns final result.
|
|
166
|
+
* Uses the agent's default session (created during start()).
|
|
167
|
+
*
|
|
168
|
+
* @param input - User message
|
|
169
|
+
* @param options - Optional configuration (signal for cancellation, taskId for billing)
|
|
170
|
+
* @returns Complete response with content, usage, and tool calls
|
|
171
|
+
*/
|
|
172
|
+
async generate(input, options) {
|
|
173
|
+
const sessionId = this.getSessionIdInternal();
|
|
174
|
+
// Collect all events from stream
|
|
175
|
+
const events = [];
|
|
176
|
+
for await (const event of await this.stream(input, options)) {
|
|
177
|
+
events.push(event);
|
|
178
|
+
}
|
|
179
|
+
// Check for non-recoverable error events
|
|
180
|
+
const fatalErrorEvent = events.find((e) => e.name === 'llmservice:error' && e.recoverable !== true);
|
|
181
|
+
if (fatalErrorEvent) {
|
|
182
|
+
throw new Error(fatalErrorEvent.error);
|
|
183
|
+
}
|
|
184
|
+
// Find the final response event
|
|
185
|
+
const responseEvent = events.find((e) => e.name === 'llmservice:response');
|
|
186
|
+
if (!responseEvent || responseEvent.name !== 'llmservice:response') {
|
|
187
|
+
throw new Error('Stream did not complete successfully - no response received');
|
|
188
|
+
}
|
|
189
|
+
// Collect tool calls
|
|
190
|
+
const toolCallEvents = events.filter((e) => e.name === 'llmservice:toolCall');
|
|
191
|
+
const toolResultEvents = events.filter((e) => e.name === 'llmservice:toolResult');
|
|
192
|
+
const toolCalls = toolCallEvents.map((tc) => {
|
|
193
|
+
const toolResult = toolResultEvents.find((tr) => tr.callId === tc.callId);
|
|
194
|
+
return {
|
|
195
|
+
args: tc.args,
|
|
196
|
+
callId: tc.callId ?? `tool_${Date.now()}`,
|
|
197
|
+
result: toolResult ? { data: toolResult.result, success: toolResult.success } : undefined,
|
|
198
|
+
toolName: tc.toolName,
|
|
199
|
+
};
|
|
200
|
+
});
|
|
201
|
+
const defaultUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
|
|
202
|
+
return {
|
|
203
|
+
content: responseEvent.content,
|
|
204
|
+
reasoning: responseEvent.reasoning,
|
|
205
|
+
sessionId,
|
|
206
|
+
toolCalls,
|
|
207
|
+
usage: responseEvent.tokenUsage ?? defaultUsage,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get an existing session or create a new one.
|
|
212
|
+
*/
|
|
213
|
+
async getOrCreateSession(sessionId) {
|
|
214
|
+
this.ensureStarted();
|
|
215
|
+
const sessionMgr = this.getSessionManagerInternal();
|
|
216
|
+
const existingSession = sessionMgr.getSession(sessionId);
|
|
217
|
+
return existingSession ?? sessionMgr.createSession(sessionId);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Get a session by ID.
|
|
221
|
+
*/
|
|
222
|
+
getSession(sessionId) {
|
|
223
|
+
this.ensureStarted();
|
|
224
|
+
return this.getSessionManagerInternal().getSession(sessionId);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get session metadata without loading full history.
|
|
228
|
+
*/
|
|
229
|
+
async getSessionMetadata(sessionId) {
|
|
230
|
+
this.ensureStarted();
|
|
231
|
+
return this.getHistoryStorageInternal().getSessionMetadata(sessionId);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get current agent state.
|
|
235
|
+
* Returns default state if agent is not yet started.
|
|
236
|
+
*/
|
|
237
|
+
getState() {
|
|
238
|
+
// Return default state if not started yet (for backward compatibility)
|
|
239
|
+
if (!this.stateManager) {
|
|
240
|
+
return {
|
|
241
|
+
currentIteration: 0,
|
|
242
|
+
executionHistory: [],
|
|
243
|
+
executionState: 'idle',
|
|
244
|
+
toolCallsExecuted: 0,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
return this.stateManager.getExecutionState();
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get the current system prompt.
|
|
251
|
+
*/
|
|
252
|
+
async getSystemPrompt() {
|
|
253
|
+
this.ensureStarted();
|
|
254
|
+
return this.getSystemPromptManagerInternal().build({});
|
|
255
|
+
}
|
|
256
|
+
async initializeServices() {
|
|
257
|
+
// Pass pre-created event bus to service initializer (DextoAgent pattern)
|
|
258
|
+
return createCipherAgentServices(this.config, this._agentEventBus);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* List all persisted session IDs from history storage.
|
|
262
|
+
*/
|
|
263
|
+
async listPersistedSessions() {
|
|
264
|
+
this.ensureStarted();
|
|
265
|
+
return this.getHistoryStorageInternal().listSessions();
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* List all session IDs (in-memory only).
|
|
269
|
+
*/
|
|
270
|
+
listSessions() {
|
|
271
|
+
this.ensureStarted();
|
|
272
|
+
return this.getSessionManagerInternal().listSessions();
|
|
273
|
+
}
|
|
274
|
+
// === Protected Methods (implement abstract from BaseAgent) ===
|
|
275
|
+
/**
|
|
276
|
+
* Reset the agent to initial state.
|
|
277
|
+
* Resets execution state only. To reset sessions, use resetSession(sessionId).
|
|
278
|
+
*/
|
|
279
|
+
reset() {
|
|
280
|
+
// Reset execution state (only if state manager exists - may not if not started)
|
|
281
|
+
if (this.stateManager) {
|
|
282
|
+
this.stateManager.reset();
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Reset a specific session's conversation history.
|
|
287
|
+
* @param sessionId - The session ID to reset
|
|
288
|
+
*/
|
|
289
|
+
resetSession(sessionId) {
|
|
290
|
+
const session = this.getSessionManagerInternal().getSession(sessionId);
|
|
291
|
+
if (session) {
|
|
292
|
+
session.reset();
|
|
293
|
+
}
|
|
294
|
+
// Emit conversation reset event (only if agent is started)
|
|
295
|
+
if (this._isStarted && this.services?.agentEventBus) {
|
|
296
|
+
this.services.agentEventBus.emit('cipher:conversationReset', { sessionId });
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Start the agent - initializes all services asynchronously.
|
|
301
|
+
* Must be called before execute().
|
|
302
|
+
*/
|
|
303
|
+
async start() {
|
|
304
|
+
// Call parent start (creates services)
|
|
305
|
+
await super.start();
|
|
306
|
+
// Create SessionManager with shared services
|
|
307
|
+
const services = this.getServices();
|
|
308
|
+
// Extract HTTP config
|
|
309
|
+
const httpConfig = {
|
|
310
|
+
accessToken: this.config.accessToken,
|
|
311
|
+
apiBaseUrl: this.config.apiBaseUrl,
|
|
312
|
+
projectId: this.config.projectId,
|
|
313
|
+
region: this.config.region,
|
|
314
|
+
sessionKey: this.config.sessionKey,
|
|
315
|
+
spaceId: this.config.spaceId ?? this._brvConfig?.spaceId ?? '',
|
|
316
|
+
teamId: this.config.teamId ?? this._brvConfig?.teamId ?? '',
|
|
317
|
+
};
|
|
318
|
+
// Extract LLM config for sessions
|
|
319
|
+
const sessionLLMConfig = {
|
|
320
|
+
httpReferer: this.config.httpReferer,
|
|
321
|
+
maxIterations: this.config.llm.maxIterations,
|
|
322
|
+
maxTokens: this.config.llm.maxTokens,
|
|
323
|
+
model: this.config.model,
|
|
324
|
+
openRouterApiKey: this.config.openRouterApiKey,
|
|
325
|
+
siteName: this.config.siteName,
|
|
326
|
+
temperature: this.config.llm.temperature,
|
|
327
|
+
verbose: this.config.llm.verbose,
|
|
328
|
+
};
|
|
329
|
+
// Create SessionManager
|
|
330
|
+
this.sessionManager = new SessionManager(services, httpConfig, sessionLLMConfig, {
|
|
331
|
+
config: {
|
|
332
|
+
maxSessions: this.config.sessions.maxSessions,
|
|
333
|
+
sessionTTL: this.config.sessions.sessionTTL,
|
|
334
|
+
},
|
|
335
|
+
});
|
|
336
|
+
// Create default session (Single-Session pattern)
|
|
337
|
+
// Each agent has exactly 1 session created at start time
|
|
338
|
+
const defaultSession = await this.sessionManager.createSession();
|
|
339
|
+
this._sessionId = defaultSession.id;
|
|
340
|
+
// Update ToolProvider with SessionManager getter for TaskTool
|
|
341
|
+
// This must happen after SessionManager is created since TaskTool needs it for subagent delegation
|
|
342
|
+
const { sessionManager } = this;
|
|
343
|
+
services.toolProvider.updateServices({
|
|
344
|
+
getSessionManager: () => sessionManager,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Stream a response with real-time event emission.
|
|
349
|
+
* Uses the agent's default session (created during start()).
|
|
350
|
+
*
|
|
351
|
+
* @param input - User message
|
|
352
|
+
* @param options - Optional configuration (signal for cancellation, taskId for billing)
|
|
353
|
+
* @returns AsyncIterator that yields StreamingEvent objects
|
|
354
|
+
*/
|
|
355
|
+
async stream(input, options) {
|
|
356
|
+
this.ensureStarted();
|
|
357
|
+
const sessionId = this.getSessionIdInternal();
|
|
358
|
+
const signal = options?.signal;
|
|
359
|
+
// Event queue for aggregation
|
|
360
|
+
const eventQueue = [];
|
|
361
|
+
let completed = false;
|
|
362
|
+
// Create AbortController for cleanup
|
|
363
|
+
const controller = new AbortController();
|
|
364
|
+
const cleanupSignal = controller.signal;
|
|
365
|
+
// Store controller so cancel() can abort this stream (keyed by sessionId)
|
|
366
|
+
this.activeStreamControllers.set(sessionId, controller);
|
|
367
|
+
// Increase listener limit - stream() registers many event listeners
|
|
368
|
+
setMaxListeners(30, cleanupSignal);
|
|
369
|
+
// Track listener references for manual cleanup
|
|
370
|
+
const listeners = [];
|
|
371
|
+
// Get the agent event bus
|
|
372
|
+
const agentEventBus = this.services?.agentEventBus;
|
|
373
|
+
if (!agentEventBus) {
|
|
374
|
+
throw AgentError.serviceNotInitialized('AgentEventBus');
|
|
375
|
+
}
|
|
376
|
+
// Cleanup function to remove all listeners and stream controller
|
|
377
|
+
const cleanupListeners = () => {
|
|
378
|
+
if (listeners.length === 0) {
|
|
379
|
+
return; // Already cleaned up
|
|
380
|
+
}
|
|
381
|
+
for (const { event, listener } of listeners) {
|
|
382
|
+
agentEventBus.off(event, listener);
|
|
383
|
+
}
|
|
384
|
+
listeners.length = 0;
|
|
385
|
+
// Remove from active controllers map
|
|
386
|
+
this.activeStreamControllers.delete(sessionId);
|
|
387
|
+
};
|
|
388
|
+
// Wire external signal to trigger cleanup
|
|
389
|
+
if (signal) {
|
|
390
|
+
const abortHandler = () => {
|
|
391
|
+
cleanupListeners();
|
|
392
|
+
controller.abort();
|
|
393
|
+
};
|
|
394
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
395
|
+
}
|
|
396
|
+
// Subscribe to streaming events (filter by sessionId - ChatSession.id)
|
|
397
|
+
for (const eventName of STREAMING_EVENT_NAMES) {
|
|
398
|
+
const listener = (payload) => {
|
|
399
|
+
const data = payload;
|
|
400
|
+
if (data.sessionId !== sessionId)
|
|
401
|
+
return;
|
|
402
|
+
// Add event to queue with name discriminant
|
|
403
|
+
eventQueue.push({ name: eventName, ...data });
|
|
404
|
+
// Close iterator on run:complete
|
|
405
|
+
if (eventName === 'run:complete') {
|
|
406
|
+
completed = true;
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
agentEventBus.on(eventName, listener, { signal: cleanupSignal });
|
|
410
|
+
listeners.push({ event: eventName, listener });
|
|
411
|
+
}
|
|
412
|
+
// Start streaming in background (fire-and-forget)
|
|
413
|
+
;
|
|
414
|
+
(async () => {
|
|
415
|
+
try {
|
|
416
|
+
// Get or create session using the provided sessionId
|
|
417
|
+
// ChatSession maintains conversation history
|
|
418
|
+
const sessionMgr = this.getSessionManagerInternal();
|
|
419
|
+
const existingSession = sessionMgr.getSession(sessionId);
|
|
420
|
+
const session = existingSession ?? (await sessionMgr.createSession(sessionId));
|
|
421
|
+
// Increment iteration counter
|
|
422
|
+
this.getStateManager().incrementIteration();
|
|
423
|
+
// Call session.streamRun() which emits events and run:complete
|
|
424
|
+
// Pass taskId for concurrent task isolation (included in all emitted events)
|
|
425
|
+
await session.streamRun(input, {
|
|
426
|
+
executionContext: options?.executionContext,
|
|
427
|
+
signal,
|
|
428
|
+
taskId: options?.taskId,
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
catch (error_) {
|
|
432
|
+
// Emit error event if something goes wrong
|
|
433
|
+
completed = true;
|
|
434
|
+
const error = error_ instanceof Error ? error_ : new Error(String(error_));
|
|
435
|
+
eventQueue.push({
|
|
436
|
+
code: undefined,
|
|
437
|
+
error: error.message,
|
|
438
|
+
name: 'llmservice:error',
|
|
439
|
+
recoverable: false,
|
|
440
|
+
sessionId,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
})();
|
|
444
|
+
// Resolve function for waiting - will be called when new events arrive
|
|
445
|
+
let notifyNewEvent = null;
|
|
446
|
+
// Wrap the original listener to also notify waiters
|
|
447
|
+
const originalListeners = [...listeners];
|
|
448
|
+
listeners.length = 0;
|
|
449
|
+
for (const { event, listener: originalListener } of originalListeners) {
|
|
450
|
+
const wrappedListener = (payload) => {
|
|
451
|
+
originalListener(payload);
|
|
452
|
+
// Notify any waiting next() call
|
|
453
|
+
if (notifyNewEvent) {
|
|
454
|
+
notifyNewEvent();
|
|
455
|
+
notifyNewEvent = null;
|
|
456
|
+
}
|
|
457
|
+
};
|
|
458
|
+
agentEventBus.off(event, originalListener);
|
|
459
|
+
agentEventBus.on(event, wrappedListener, { signal: cleanupSignal });
|
|
460
|
+
listeners.push({ event, listener: wrappedListener });
|
|
461
|
+
}
|
|
462
|
+
// Return async iterable iterator
|
|
463
|
+
const iterator = {
|
|
464
|
+
async next() {
|
|
465
|
+
// If we already have events, return immediately
|
|
466
|
+
if (eventQueue.length > 0) {
|
|
467
|
+
return { done: false, value: eventQueue.shift() };
|
|
468
|
+
}
|
|
469
|
+
// If already completed, cleanup and return
|
|
470
|
+
if (completed) {
|
|
471
|
+
cleanupListeners();
|
|
472
|
+
return { done: true, value: undefined };
|
|
473
|
+
}
|
|
474
|
+
// Check for abort
|
|
475
|
+
if (signal?.aborted || cleanupSignal.aborted) {
|
|
476
|
+
cleanupListeners();
|
|
477
|
+
return { done: true, value: undefined };
|
|
478
|
+
}
|
|
479
|
+
// Wait for new events
|
|
480
|
+
await new Promise((resolve) => {
|
|
481
|
+
notifyNewEvent = resolve;
|
|
482
|
+
// Also resolve on abort
|
|
483
|
+
const abortHandler = () => {
|
|
484
|
+
notifyNewEvent = null;
|
|
485
|
+
resolve();
|
|
486
|
+
};
|
|
487
|
+
cleanupSignal.addEventListener('abort', abortHandler, { once: true });
|
|
488
|
+
if (signal) {
|
|
489
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
// After waiting, check state again
|
|
493
|
+
if (signal?.aborted || cleanupSignal.aborted) {
|
|
494
|
+
cleanupListeners();
|
|
495
|
+
return { done: true, value: undefined };
|
|
496
|
+
}
|
|
497
|
+
if (eventQueue.length > 0) {
|
|
498
|
+
return { done: false, value: eventQueue.shift() };
|
|
499
|
+
}
|
|
500
|
+
if (completed) {
|
|
501
|
+
cleanupListeners();
|
|
502
|
+
return { done: true, value: undefined };
|
|
503
|
+
}
|
|
504
|
+
// Recursive call to handle edge cases
|
|
505
|
+
return iterator.next();
|
|
506
|
+
},
|
|
507
|
+
async return() {
|
|
508
|
+
// Called when consumer breaks out early or explicitly calls return()
|
|
509
|
+
cleanupListeners();
|
|
510
|
+
controller.abort();
|
|
511
|
+
return { done: true, value: undefined };
|
|
512
|
+
},
|
|
513
|
+
[Symbol.asyncIterator]() {
|
|
514
|
+
return iterator;
|
|
515
|
+
},
|
|
516
|
+
};
|
|
517
|
+
return iterator;
|
|
518
|
+
}
|
|
519
|
+
// === Private Helpers (alphabetical order) ===
|
|
520
|
+
getHistoryStorageInternal() {
|
|
521
|
+
const storage = this.services?.historyStorage;
|
|
522
|
+
if (!storage) {
|
|
523
|
+
throw AgentError.serviceNotInitialized('HistoryStorage');
|
|
524
|
+
}
|
|
525
|
+
return storage;
|
|
526
|
+
}
|
|
527
|
+
getSessionIdInternal() {
|
|
528
|
+
if (!this._sessionId) {
|
|
529
|
+
throw AgentError.serviceNotInitialized('Session (call start() first)');
|
|
530
|
+
}
|
|
531
|
+
return this._sessionId;
|
|
532
|
+
}
|
|
533
|
+
getSessionManagerInternal() {
|
|
534
|
+
if (!this.sessionManager) {
|
|
535
|
+
throw AgentError.serviceNotInitialized('SessionManager');
|
|
536
|
+
}
|
|
537
|
+
return this.sessionManager;
|
|
538
|
+
}
|
|
539
|
+
getSystemPromptManagerInternal() {
|
|
540
|
+
const manager = this.services?.systemPromptManager;
|
|
541
|
+
if (!manager) {
|
|
542
|
+
throw AgentError.serviceNotInitialized('SystemPromptManager');
|
|
543
|
+
}
|
|
544
|
+
return manager;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent module - Complete cipher agent implementation following DextoAgent patterns
|
|
3
|
+
*
|
|
4
|
+
* This module provides the full agent architecture with:
|
|
5
|
+
* - CipherAgent: Main agent class for LLM interactions
|
|
6
|
+
* - BaseAgent: Abstract class with lifecycle management (start/stop/restart)
|
|
7
|
+
* - Service initialization: Centralized service wiring
|
|
8
|
+
* - AgentStateManager: Runtime config with session-specific overrides
|
|
9
|
+
* - AgentError: Typed error factory with error codes
|
|
10
|
+
* - Zod schemas: Configuration validation with defaults
|
|
11
|
+
*/
|
|
12
|
+
export { AgentErrorCode } from './agent-error-codes.js';
|
|
13
|
+
export { AgentError } from './agent-error.js';
|
|
14
|
+
export { AgentConfigSchema, BlobStorageConfigSchema, FileSystemConfigSchema, LLMConfigSchema, LLMUpdatesSchema, safeValidateAgentConfig, SessionConfigSchema, validateAgentConfig, } from './agent-schemas.js';
|
|
15
|
+
export { AgentStateManager } from './agent-state-manager.js';
|
|
16
|
+
export type { SessionOverride } from './agent-state-manager.js';
|
|
17
|
+
export { BaseAgent } from './base-agent.js';
|
|
18
|
+
export { CipherAgent } from './cipher-agent.js';
|
|
19
|
+
export { createCipherAgentServices, createSessionServices } from './service-initializer.js';
|
|
20
|
+
export type { ByteRoverHttpConfig, SessionLLMConfig } from './service-initializer.js';
|
|
21
|
+
export type { CipherAgentServices, SessionManagerConfig, SessionServices } from './service-initializer.js';
|
|
22
|
+
export type { AgentConfig, AgentEventSubscriber, AgentExecutionContext, BlobStorageConfig, FileSystemConfig, LLMConfig, LLMUpdates, SessionConfig, TerminationReason, ValidatedAgentConfig, ValidatedBlobStorageConfig, ValidatedFileSystemConfig, ValidatedLLMConfig, ValidatedSessionConfig, } from './types.js';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent module - Complete cipher agent implementation following DextoAgent patterns
|
|
3
|
+
*
|
|
4
|
+
* This module provides the full agent architecture with:
|
|
5
|
+
* - CipherAgent: Main agent class for LLM interactions
|
|
6
|
+
* - BaseAgent: Abstract class with lifecycle management (start/stop/restart)
|
|
7
|
+
* - Service initialization: Centralized service wiring
|
|
8
|
+
* - AgentStateManager: Runtime config with session-specific overrides
|
|
9
|
+
* - AgentError: Typed error factory with error codes
|
|
10
|
+
* - Zod schemas: Configuration validation with defaults
|
|
11
|
+
*/
|
|
12
|
+
// Error handling
|
|
13
|
+
export { AgentErrorCode } from './agent-error-codes.js';
|
|
14
|
+
export { AgentError } from './agent-error.js';
|
|
15
|
+
// Schemas
|
|
16
|
+
export { AgentConfigSchema, BlobStorageConfigSchema, FileSystemConfigSchema, LLMConfigSchema, LLMUpdatesSchema, safeValidateAgentConfig, SessionConfigSchema, validateAgentConfig, } from './agent-schemas.js';
|
|
17
|
+
// State management
|
|
18
|
+
export { AgentStateManager } from './agent-state-manager.js';
|
|
19
|
+
// Base agent class
|
|
20
|
+
export { BaseAgent } from './base-agent.js';
|
|
21
|
+
// Main agent class
|
|
22
|
+
export { CipherAgent } from './cipher-agent.js';
|
|
23
|
+
// Service initialization
|
|
24
|
+
export { createCipherAgentServices, createSessionServices } from './service-initializer.js';
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Initializer: Centralized Wiring for Cipher Agent Services
|
|
3
|
+
*
|
|
4
|
+
* This module is responsible for initializing and wiring together all core agent services.
|
|
5
|
+
* It provides a single entry point for constructing the service graph.
|
|
6
|
+
*
|
|
7
|
+
* Following DextoAgent pattern:
|
|
8
|
+
* - Config file is source of truth (ValidatedAgentConfig)
|
|
9
|
+
* - Centralized function (not factory class) for service creation
|
|
10
|
+
* - Explicit dependency order with numbered steps
|
|
11
|
+
* - Event bus passed in as parameter (created in agent constructor)
|
|
12
|
+
*/
|
|
13
|
+
import type { CipherAgentServices, SessionServices } from '../../../core/interfaces/cipher/cipher-services.js';
|
|
14
|
+
import type { ValidatedAgentConfig } from './agent-schemas.js';
|
|
15
|
+
import { AgentEventBus } from '../events/event-emitter.js';
|
|
16
|
+
/**
|
|
17
|
+
* HTTP configuration for ByteRover LLM service.
|
|
18
|
+
*/
|
|
19
|
+
export interface ByteRoverHttpConfig {
|
|
20
|
+
accessToken: string;
|
|
21
|
+
apiBaseUrl: string;
|
|
22
|
+
projectId: string;
|
|
23
|
+
region?: string;
|
|
24
|
+
sessionKey: string;
|
|
25
|
+
spaceId: string;
|
|
26
|
+
teamId: string;
|
|
27
|
+
timeout?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* LLM configuration for per-session services.
|
|
31
|
+
*/
|
|
32
|
+
export interface SessionLLMConfig {
|
|
33
|
+
httpReferer?: string;
|
|
34
|
+
maxIterations?: number;
|
|
35
|
+
maxTokens?: number;
|
|
36
|
+
model: string;
|
|
37
|
+
openRouterApiKey?: string;
|
|
38
|
+
siteName?: string;
|
|
39
|
+
temperature?: number;
|
|
40
|
+
verbose?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export type { CipherAgentServices, SessionManagerConfig, SessionServices } from '../../../core/interfaces/cipher/cipher-services.js';
|
|
43
|
+
/**
|
|
44
|
+
* Creates shared services for CipherAgent.
|
|
45
|
+
* These services are singletons shared across all sessions.
|
|
46
|
+
*
|
|
47
|
+
* Initialization order follows DextoAgent pattern (explicit numbered steps):
|
|
48
|
+
* 1. Logger (uses provided event bus)
|
|
49
|
+
* 2. File system service (no dependencies)
|
|
50
|
+
* 3. Process service (no dependencies)
|
|
51
|
+
* 4. Blob storage (no dependencies)
|
|
52
|
+
* 5. Memory system (depends on BlobStorage, Logger)
|
|
53
|
+
* 6. System prompt manager (no dependencies)
|
|
54
|
+
* 7. Tool provider (depends on FileSystemService, ProcessService, MemoryManager)
|
|
55
|
+
* 8. Policy engine (no dependencies)
|
|
56
|
+
* 9. Tool scheduler (depends on ToolProvider, PolicyEngine)
|
|
57
|
+
* 10. Tool manager (depends on ToolProvider, ToolScheduler)
|
|
58
|
+
* 11. History storage (depends on BlobStorage)
|
|
59
|
+
* 12. Return all services
|
|
60
|
+
*
|
|
61
|
+
* @param config - Validated agent configuration (Zod-validated)
|
|
62
|
+
* @param agentEventBus - Pre-created event bus from agent constructor (DextoAgent pattern)
|
|
63
|
+
* @returns Initialized shared services
|
|
64
|
+
*/
|
|
65
|
+
export declare function createCipherAgentServices(config: ValidatedAgentConfig, agentEventBus: AgentEventBus): Promise<CipherAgentServices>;
|
|
66
|
+
/**
|
|
67
|
+
* Creates session-specific services for a ChatSession.
|
|
68
|
+
* Generator composition order (innermost to outermost):
|
|
69
|
+
* 1. Base generator (ByteRoverContentGenerator or OpenRouterContentGenerator)
|
|
70
|
+
* 2. RetryableContentGenerator - handles transient errors with backoff
|
|
71
|
+
* 3. LoggingContentGenerator - debug logging (if verbose enabled)
|
|
72
|
+
*
|
|
73
|
+
* @param sessionId - Unique session identifier
|
|
74
|
+
* @param sharedServices - Shared services from agent
|
|
75
|
+
* @param httpConfig - HTTP configuration
|
|
76
|
+
* @param llmConfig - LLM service configuration
|
|
77
|
+
* @returns Initialized session services
|
|
78
|
+
*/
|
|
79
|
+
export declare function createSessionServices(sessionId: string, sharedServices: CipherAgentServices, httpConfig: ByteRoverHttpConfig, llmConfig: SessionLLMConfig): SessionServices;
|