byterover-cli 0.2.1 → 0.3.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 +56 -56
- package/bin/dev.js +1 -1
- package/dist/commands/cipher-agent/run.d.ts +111 -0
- package/dist/commands/cipher-agent/run.js +493 -0
- package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
- package/dist/commands/cipher-agent/set-prompt.js +53 -0
- package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
- package/dist/commands/cipher-agent/show-prompt.js +48 -0
- package/dist/commands/clear.d.ts +6 -0
- package/dist/commands/clear.js +36 -15
- package/dist/commands/curate.d.ts +74 -0
- package/dist/commands/curate.js +396 -0
- package/dist/commands/foo.d.ts +12 -0
- package/dist/commands/foo.js +61 -0
- package/dist/commands/gen-rules.d.ts +3 -0
- package/dist/commands/gen-rules.js +39 -20
- package/dist/commands/init.d.ts +63 -3
- package/dist/commands/init.js +285 -70
- package/dist/commands/login.js +9 -4
- package/dist/commands/pull.d.ts +33 -0
- package/dist/commands/pull.js +115 -0
- package/dist/commands/push.d.ts +13 -13
- package/dist/commands/push.js +81 -101
- package/dist/commands/query.d.ts +63 -0
- package/dist/commands/query.js +349 -0
- package/dist/commands/space/list.d.ts +5 -2
- package/dist/commands/space/list.js +60 -56
- package/dist/commands/space/switch.d.ts +16 -0
- package/dist/commands/space/switch.js +102 -53
- package/dist/commands/status.d.ts +5 -2
- package/dist/commands/status.js +43 -33
- package/dist/commands/watch.d.ts +23 -0
- package/dist/commands/watch.js +171 -0
- package/dist/config/auth.config.js +14 -2
- package/dist/config/context-tree-domains.d.ts +12 -0
- package/dist/config/context-tree-domains.js +29 -0
- package/dist/config/environment.d.ts +6 -0
- package/dist/config/environment.js +9 -2
- package/dist/constants.d.ts +5 -0
- package/dist/constants.js +6 -0
- package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
- package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
- package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
- package/dist/core/domain/cipher/agent/agent-state.js +59 -0
- package/dist/core/domain/cipher/agent/index.d.ts +7 -0
- package/dist/core/domain/cipher/agent/index.js +7 -0
- package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
- package/dist/core/domain/cipher/agent-events/index.js +7 -0
- package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
- package/dist/core/domain/cipher/agent-events/types.js +42 -0
- package/dist/core/domain/cipher/blob/types.d.ts +108 -0
- package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
- package/dist/core/domain/cipher/errors/blob-error.js +68 -0
- package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
- package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
- package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
- package/dist/core/domain/cipher/errors/llm-error.js +161 -0
- package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
- package/dist/core/domain/cipher/errors/memory-error.js +62 -0
- package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
- package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
- package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
- package/dist/core/domain/cipher/errors/process-error.js +173 -0
- package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
- package/dist/core/domain/cipher/errors/session-error.js +74 -0
- package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
- package/dist/core/domain/cipher/errors/tool-error.js +81 -0
- package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
- package/dist/core/domain/cipher/memory/types.d.ts +102 -0
- package/dist/core/domain/cipher/memory/types.js +4 -0
- package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
- package/dist/core/domain/cipher/parsed-interaction.js +25 -0
- package/dist/core/domain/cipher/process/types.d.ts +286 -0
- package/dist/core/domain/cipher/session/types.d.ts +54 -0
- package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
- package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
- package/dist/core/domain/cipher/todos/index.d.ts +4 -0
- package/dist/core/domain/cipher/todos/index.js +4 -0
- package/dist/core/domain/cipher/todos/types.d.ts +57 -0
- package/dist/core/domain/cipher/todos/types.js +5 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
- package/dist/core/domain/cipher/tools/constants.js +24 -0
- package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
- package/dist/core/domain/cipher/tools/tool-error.js +246 -0
- package/dist/core/domain/cipher/tools/types.d.ts +145 -0
- package/dist/core/domain/entities/brv-config.d.ts +42 -6
- package/dist/core/domain/entities/brv-config.js +115 -17
- package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
- package/dist/core/domain/entities/cogit-push-context.js +91 -0
- package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
- package/dist/core/domain/entities/cogit-push-response.js +31 -0
- package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
- package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
- package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
- package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
- package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
- package/dist/core/domain/entities/cogit-snapshot.js +58 -0
- package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
- package/dist/core/domain/entities/context-tree-index.js +27 -0
- package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
- package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
- package/dist/core/domain/entities/event.d.ts +1 -1
- package/dist/core/domain/entities/event.js +3 -1
- package/dist/core/domain/entities/parser.d.ts +567 -0
- package/dist/core/domain/entities/parser.js +10 -0
- package/dist/core/domain/entities/playbook.d.ts +2 -23
- package/dist/core/domain/entities/playbook.js +2 -70
- package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
- package/dist/core/domain/errors/brv-config-version-error.js +21 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
- package/dist/core/domain/knowledge/directory-manager.js +145 -0
- package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
- package/dist/core/domain/knowledge/markdown-writer.js +18 -0
- package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
- package/dist/core/domain/knowledge/relation-parser.js +131 -0
- package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
- package/dist/core/interfaces/cipher/cipher-services.js +1 -0
- package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
- package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
- package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
- package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
- package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
- package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
- package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
- package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
- package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
- package/dist/core/interfaces/cipher/i-file-system.js +1 -0
- package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
- package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
- package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
- package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
- package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
- package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
- package/dist/core/interfaces/cipher/i-logger.js +28 -0
- package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
- package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
- package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
- package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
- package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
- package/dist/core/interfaces/cipher/i-process-service.js +1 -0
- package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
- package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
- package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
- package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
- package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
- package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
- package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
- package/dist/core/interfaces/cipher/llm-types.js +5 -0
- package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
- package/dist/core/interfaces/cipher/message-types.js +5 -0
- package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
- package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
- package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
- package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
- package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
- package/dist/core/interfaces/i-cogit-push-service.js +1 -0
- package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
- package/dist/core/interfaces/i-context-file-reader.js +1 -0
- package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
- package/dist/core/interfaces/i-context-tree-service.js +1 -0
- package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
- package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
- package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
- package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
- package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
- package/dist/core/interfaces/i-file-watcher-service.js +1 -0
- package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
- package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
- package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
- package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
- package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
- package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
- package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
- package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
- package/dist/hooks/error/clean-errors.d.ts +7 -0
- package/dist/hooks/error/clean-errors.js +50 -0
- package/dist/hooks/init/welcome.js +72 -1
- package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
- package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
- package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
- package/dist/infra/cipher/agent-service-factory.js +212 -0
- package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
- package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
- package/dist/infra/cipher/blob/index.d.ts +10 -0
- package/dist/infra/cipher/blob/index.js +12 -0
- package/dist/infra/cipher/blob/migrations.d.ts +63 -0
- package/dist/infra/cipher/blob/migrations.js +148 -0
- package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
- package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
- package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
- package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
- package/dist/infra/cipher/cipher-agent.d.ts +182 -0
- package/dist/infra/cipher/cipher-agent.js +317 -0
- package/dist/infra/cipher/command-parser.d.ts +23 -0
- package/dist/infra/cipher/command-parser.js +85 -0
- package/dist/infra/cipher/display/todo-display.d.ts +23 -0
- package/dist/infra/cipher/display/todo-display.js +129 -0
- package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
- package/dist/infra/cipher/events/event-emitter.js +158 -0
- package/dist/infra/cipher/exit-codes.d.ts +44 -0
- package/dist/infra/cipher/exit-codes.js +58 -0
- package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
- package/dist/infra/cipher/file-system/file-system-service.js +641 -0
- package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
- package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
- package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
- package/dist/infra/cipher/file-system/glob-utils.js +120 -0
- package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
- package/dist/infra/cipher/file-system/path-validator.js +184 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
- package/dist/infra/cipher/interactive-commands.d.ts +16 -0
- package/dist/infra/cipher/interactive-commands.js +198 -0
- package/dist/infra/cipher/interactive-loop.d.ts +24 -0
- package/dist/infra/cipher/interactive-loop.js +352 -0
- package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
- package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
- package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
- package/dist/infra/cipher/llm/context/compression/index.js +5 -0
- package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
- package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
- package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
- package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
- package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
- package/dist/infra/cipher/llm/context/compression/types.js +1 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
- package/dist/infra/cipher/llm/context/context-manager.js +419 -0
- package/dist/infra/cipher/llm/context/index.d.ts +2 -0
- package/dist/infra/cipher/llm/context/index.js +2 -0
- package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
- package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
- package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
- package/dist/infra/cipher/llm/context/utils.js +89 -0
- package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
- package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
- package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
- package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
- package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
- package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
- package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
- package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
- package/dist/infra/cipher/llm/generators/index.js +13 -0
- package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
- package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
- package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
- package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
- package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
- package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
- package/dist/infra/cipher/llm/index.d.ts +9 -0
- package/dist/infra/cipher/llm/index.js +13 -0
- package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
- package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
- package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
- package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
- package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
- package/dist/infra/cipher/llm/response-validator.js +157 -0
- package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
- package/dist/infra/cipher/llm/retry/index.js +10 -0
- package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
- package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
- package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
- package/dist/infra/cipher/llm/thought-parser.js +190 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
- package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
- package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
- package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
- package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
- package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
- package/dist/infra/cipher/logger/console-logger.js +63 -0
- package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
- package/dist/infra/cipher/logger/event-based-logger.js +92 -0
- package/dist/infra/cipher/memory/index.d.ts +6 -0
- package/dist/infra/cipher/memory/index.js +7 -0
- package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
- package/dist/infra/cipher/memory/memory-manager.js +523 -0
- package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
- package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
- package/dist/infra/cipher/process/command-validator.d.ts +59 -0
- package/dist/infra/cipher/process/command-validator.js +266 -0
- package/dist/infra/cipher/process/index.d.ts +8 -0
- package/dist/infra/cipher/process/index.js +8 -0
- package/dist/infra/cipher/process/process-service.d.ts +95 -0
- package/dist/infra/cipher/process/process-service.js +439 -0
- package/dist/infra/cipher/session/chat-session.d.ts +80 -0
- package/dist/infra/cipher/session/chat-session.js +165 -0
- package/dist/infra/cipher/session/index.d.ts +6 -0
- package/dist/infra/cipher/session/index.js +5 -0
- package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
- package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
- package/dist/infra/cipher/session/session-manager.d.ts +109 -0
- package/dist/infra/cipher/session/session-manager.js +172 -0
- package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
- package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
- package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
- package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
- package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
- package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
- package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
- package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
- package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
- package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
- package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
- package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
- package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
- package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
- package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
- package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
- package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
- package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
- package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
- package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
- package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
- package/dist/infra/cipher/tools/index.d.ts +18 -0
- package/dist/infra/cipher/tools/index.js +19 -0
- package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
- package/dist/infra/cipher/tools/policy-engine.js +110 -0
- package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
- package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
- package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
- package/dist/infra/cipher/tools/tool-invocation.js +294 -0
- package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
- package/dist/infra/cipher/tools/tool-manager.js +209 -0
- package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
- package/dist/infra/cipher/tools/tool-markers.js +49 -0
- package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
- package/dist/infra/cipher/tools/tool-provider.js +196 -0
- package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
- package/dist/infra/cipher/tools/tool-registry.js +144 -0
- package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
- package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
- package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
- package/dist/infra/cipher/validation/workspace-validator.js +37 -0
- package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
- package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
- package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
- package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
- package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
- package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
- package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
- package/dist/infra/cogit/http-cogit-push-service.js +104 -0
- package/dist/infra/config/file-config-store.js +9 -3
- package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
- package/dist/infra/context-tree/file-context-file-reader.js +46 -0
- package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
- package/dist/infra/context-tree/file-context-tree-service.js +46 -0
- package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
- package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
- package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
- package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
- package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
- package/dist/infra/memory/http-memory-storage-service.js +4 -3
- package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
- package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
- package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
- package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
- package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
- package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
- package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
- package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
- package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
- package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
- package/dist/infra/parsers/clean/shared.d.ts +84 -0
- package/dist/infra/parsers/clean/shared.js +273 -0
- package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
- package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
- package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
- package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
- package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
- package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
- package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
- package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
- package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
- package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
- package/dist/infra/space/http-space-service.js +2 -1
- package/dist/infra/team/http-team-service.js +2 -1
- package/dist/infra/user/http-user-service.js +2 -1
- package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
- package/dist/infra/watcher/file-watcher-service.js +81 -0
- package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
- package/dist/infra/workspace/workspace-detector-service.js +165 -0
- package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
- package/dist/resources/prompts/modes/autonomous.yml +9 -0
- package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
- package/dist/resources/prompts/reflection.yml +27 -0
- package/dist/resources/prompts/system-prompt.yml +82 -0
- package/dist/resources/prompts/tool-outputs.yml +30 -0
- package/dist/templates/README.md +6 -7
- package/dist/templates/sections/command-reference.md +40 -111
- package/dist/templates/sections/workflow.md +3 -30
- package/dist/utils/emoji-helpers.d.ts +38 -0
- package/dist/utils/emoji-helpers.js +42 -0
- package/dist/utils/error-handler.d.ts +51 -0
- package/dist/utils/error-handler.js +169 -0
- package/dist/utils/error-helpers.d.ts +30 -0
- package/dist/utils/error-helpers.js +47 -0
- package/dist/utils/file-helpers.d.ts +15 -0
- package/dist/utils/file-helpers.js +44 -0
- package/dist/utils/oclif-error-helpers.d.ts +40 -0
- package/dist/utils/oclif-error-helpers.js +46 -0
- package/dist/utils/tool-display-formatter.d.ts +53 -0
- package/dist/utils/tool-display-formatter.js +257 -0
- package/oclif.manifest.json +381 -141
- package/package.json +27 -6
- package/dist/commands/add.d.ts +0 -49
- package/dist/commands/add.js +0 -192
- package/dist/commands/complete.d.ts +0 -108
- package/dist/commands/complete.js +0 -340
- package/dist/commands/retrieve.d.ts +0 -26
- package/dist/commands/retrieve.js +0 -101
- package/dist/core/domain/entities/curator-output.d.ts +0 -14
- package/dist/core/domain/entities/curator-output.js +0 -23
- package/dist/core/domain/entities/delta-batch.d.ts +0 -30
- package/dist/core/domain/entities/delta-batch.js +0 -52
- package/dist/core/domain/entities/delta-operation.d.ts +0 -31
- package/dist/core/domain/entities/delta-operation.js +0 -50
- package/dist/core/domain/entities/executor-output.d.ts +0 -27
- package/dist/core/domain/entities/executor-output.js +0 -33
- package/dist/core/domain/entities/reflector-output.d.ts +0 -38
- package/dist/core/domain/entities/reflector-output.js +0 -44
- package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
- package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
- package/dist/core/interfaces/i-delta-store.d.ts +0 -15
- package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
- package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
- package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
- package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
- package/dist/infra/ace/ace-file-utils.d.ts +0 -46
- package/dist/infra/ace/ace-file-utils.js +0 -83
- package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
- package/dist/infra/ace/ace-prompt-templates.js +0 -177
- package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
- package/dist/infra/ace/file-bullet-content-store.js +0 -89
- package/dist/infra/ace/file-delta-store.d.ts +0 -9
- package/dist/infra/ace/file-delta-store.js +0 -26
- package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
- package/dist/infra/ace/file-executor-output-store.js +0 -26
- package/dist/infra/ace/file-playbook-store.d.ts +0 -29
- package/dist/infra/ace/file-playbook-store.js +0 -107
- package/dist/infra/ace/file-reflection-store.d.ts +0 -10
- package/dist/infra/ace/file-reflection-store.js +0 -55
- package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
- package/dist/infra/playbook/file-playbook-service.js +0 -132
- /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
- /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
- /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
- /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
- /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
- /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
- /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AgentEventBus, SessionEventBus } from '../events/event-emitter.js';
|
|
2
|
+
/**
|
|
3
|
+
* Session Event Forwarder
|
|
4
|
+
*
|
|
5
|
+
* Automatically forwards session-level events to the agent-level event bus
|
|
6
|
+
* by adding the sessionId to each event payload.
|
|
7
|
+
*
|
|
8
|
+
* This allows external listeners to subscribe to AgentEventBus and receive
|
|
9
|
+
* all events from all sessions with proper session identification.
|
|
10
|
+
*
|
|
11
|
+
* Pattern mirrors Dexto's event forwarding implementation.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const agentBus = new AgentEventBus();
|
|
16
|
+
* const sessionBus = new SessionEventBus();
|
|
17
|
+
*
|
|
18
|
+
* setupEventForwarding(sessionBus, agentBus, 'session-123');
|
|
19
|
+
*
|
|
20
|
+
* // Session event...
|
|
21
|
+
* sessionBus.emit('llmservice:thinking');
|
|
22
|
+
*
|
|
23
|
+
* // ...is automatically forwarded to agent bus with sessionId:
|
|
24
|
+
* // agentBus receives: { sessionId: 'session-123' }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Setup event forwarding from SessionEventBus to AgentEventBus.
|
|
29
|
+
*
|
|
30
|
+
* Creates listeners on the session bus that automatically forward events
|
|
31
|
+
* to the agent bus with sessionId added to the payload.
|
|
32
|
+
*
|
|
33
|
+
* @param sessionEventBus - Session-scoped event bus to listen to
|
|
34
|
+
* @param agentEventBus - Agent-wide event bus to forward events to
|
|
35
|
+
* @param sessionId - Unique session identifier to add to forwarded events
|
|
36
|
+
*/
|
|
37
|
+
export declare function setupEventForwarding(sessionEventBus: SessionEventBus, agentEventBus: AgentEventBus, sessionId: string): void;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Event Forwarder
|
|
3
|
+
*
|
|
4
|
+
* Automatically forwards session-level events to the agent-level event bus
|
|
5
|
+
* by adding the sessionId to each event payload.
|
|
6
|
+
*
|
|
7
|
+
* This allows external listeners to subscribe to AgentEventBus and receive
|
|
8
|
+
* all events from all sessions with proper session identification.
|
|
9
|
+
*
|
|
10
|
+
* Pattern mirrors Dexto's event forwarding implementation.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const agentBus = new AgentEventBus();
|
|
15
|
+
* const sessionBus = new SessionEventBus();
|
|
16
|
+
*
|
|
17
|
+
* setupEventForwarding(sessionBus, agentBus, 'session-123');
|
|
18
|
+
*
|
|
19
|
+
* // Session event...
|
|
20
|
+
* sessionBus.emit('llmservice:thinking');
|
|
21
|
+
*
|
|
22
|
+
* // ...is automatically forwarded to agent bus with sessionId:
|
|
23
|
+
* // agentBus receives: { sessionId: 'session-123' }
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Setup event forwarding from SessionEventBus to AgentEventBus.
|
|
28
|
+
*
|
|
29
|
+
* Creates listeners on the session bus that automatically forward events
|
|
30
|
+
* to the agent bus with sessionId added to the payload.
|
|
31
|
+
*
|
|
32
|
+
* @param sessionEventBus - Session-scoped event bus to listen to
|
|
33
|
+
* @param agentEventBus - Agent-wide event bus to forward events to
|
|
34
|
+
* @param sessionId - Unique session identifier to add to forwarded events
|
|
35
|
+
*/
|
|
36
|
+
export function setupEventForwarding(sessionEventBus, agentEventBus, sessionId) {
|
|
37
|
+
// Forward llmservice:thinking (void payload)
|
|
38
|
+
sessionEventBus.on('llmservice:thinking', () => {
|
|
39
|
+
agentEventBus.emit('llmservice:thinking', { sessionId });
|
|
40
|
+
});
|
|
41
|
+
// Forward llmservice:chunk
|
|
42
|
+
sessionEventBus.on('llmservice:chunk', (payload) => {
|
|
43
|
+
agentEventBus.emit('llmservice:chunk', {
|
|
44
|
+
...payload,
|
|
45
|
+
sessionId,
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
// Forward llmservice:response
|
|
49
|
+
sessionEventBus.on('llmservice:response', (payload) => {
|
|
50
|
+
agentEventBus.emit('llmservice:response', {
|
|
51
|
+
...payload,
|
|
52
|
+
sessionId,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
// Forward llmservice:toolCall
|
|
56
|
+
sessionEventBus.on('llmservice:toolCall', (payload) => {
|
|
57
|
+
agentEventBus.emit('llmservice:toolCall', {
|
|
58
|
+
...payload,
|
|
59
|
+
sessionId,
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
// Forward llmservice:toolResult
|
|
63
|
+
sessionEventBus.on('llmservice:toolResult', (payload) => {
|
|
64
|
+
agentEventBus.emit('llmservice:toolResult', {
|
|
65
|
+
...payload,
|
|
66
|
+
sessionId,
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
// Forward llmservice:error
|
|
70
|
+
sessionEventBus.on('llmservice:error', (payload) => {
|
|
71
|
+
agentEventBus.emit('llmservice:error', {
|
|
72
|
+
...payload,
|
|
73
|
+
sessionId,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
// Forward llmservice:unsupportedInput
|
|
77
|
+
sessionEventBus.on('llmservice:unsupportedInput', (payload) => {
|
|
78
|
+
agentEventBus.emit('llmservice:unsupportedInput', {
|
|
79
|
+
...payload,
|
|
80
|
+
sessionId,
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { CipherAgentServices, SessionManagerConfig } from '../../../core/interfaces/cipher/cipher-services.js';
|
|
2
|
+
import type { IChatSession } from '../../../core/interfaces/cipher/i-chat-session.js';
|
|
3
|
+
import type { ByteRoverGrpcConfig } from '../agent-service-factory.js';
|
|
4
|
+
/**
|
|
5
|
+
* Options for SessionManager constructor
|
|
6
|
+
*/
|
|
7
|
+
export interface SessionManagerOptions {
|
|
8
|
+
config?: SessionManagerConfig;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Session manager.
|
|
12
|
+
*
|
|
13
|
+
* Manages multiple chat sessions with creation, retrieval, and deletion.
|
|
14
|
+
* Each session gets its own LLM service instance with isolated context.
|
|
15
|
+
*
|
|
16
|
+
* Following Dexto's pattern: SessionManager uses shared services from the agent
|
|
17
|
+
* and creates session-specific services (LLM, EventBus) per conversation.
|
|
18
|
+
*/
|
|
19
|
+
export declare class SessionManager {
|
|
20
|
+
private readonly config;
|
|
21
|
+
private readonly grpcConfig;
|
|
22
|
+
private readonly llmConfig;
|
|
23
|
+
private pendingCreations;
|
|
24
|
+
private readonly sessions;
|
|
25
|
+
private readonly sharedServices;
|
|
26
|
+
/**
|
|
27
|
+
* Creates a new session manager
|
|
28
|
+
*
|
|
29
|
+
* @param sharedServices - Shared services from CipherAgent (ToolManager, SystemPromptManager, etc.)
|
|
30
|
+
* @param grpcConfig - gRPC client configuration
|
|
31
|
+
* @param llmConfig - LLM service configuration
|
|
32
|
+
* @param llmConfig.openRouterApiKey - Optional OpenRouter API key for direct service
|
|
33
|
+
* @param llmConfig.httpReferer - Optional HTTP Referer for OpenRouter rankings
|
|
34
|
+
* @param llmConfig.siteName - Optional site name for OpenRouter rankings
|
|
35
|
+
* @param llmConfig.maxIterations - Maximum iterations for agentic loop
|
|
36
|
+
* @param llmConfig.maxTokens - Maximum output tokens
|
|
37
|
+
* @param llmConfig.model - LLM model identifier
|
|
38
|
+
* @param llmConfig.temperature - Temperature for generation
|
|
39
|
+
* @param options - Optional session manager options
|
|
40
|
+
* @param options.config - Session manager configuration
|
|
41
|
+
*/
|
|
42
|
+
constructor(sharedServices: CipherAgentServices, grpcConfig: ByteRoverGrpcConfig, llmConfig: {
|
|
43
|
+
httpReferer?: string;
|
|
44
|
+
maxIterations?: number;
|
|
45
|
+
maxTokens?: number;
|
|
46
|
+
model: string;
|
|
47
|
+
openRouterApiKey?: string;
|
|
48
|
+
siteName?: string;
|
|
49
|
+
temperature?: number;
|
|
50
|
+
}, options?: SessionManagerOptions);
|
|
51
|
+
/**
|
|
52
|
+
* Create a new chat session.
|
|
53
|
+
*
|
|
54
|
+
* Each session gets its own LLM service instance for isolated conversation context.
|
|
55
|
+
* Following Dexto's pattern with race condition protection via pendingCreations tracker.
|
|
56
|
+
*
|
|
57
|
+
* @param sessionId - Optional session ID (generates UUID if not provided)
|
|
58
|
+
* @returns New or existing chat session instance
|
|
59
|
+
*/
|
|
60
|
+
createSession(sessionId?: string): Promise<IChatSession>;
|
|
61
|
+
/**
|
|
62
|
+
* Delete a session completely (memory + history).
|
|
63
|
+
*
|
|
64
|
+
* @param id - Session ID to delete
|
|
65
|
+
* @returns True if session existed and was deleted
|
|
66
|
+
*/
|
|
67
|
+
deleteSession(id: string): Promise<boolean>;
|
|
68
|
+
/**
|
|
69
|
+
* End a session (remove from memory, preserve history for future restoration).
|
|
70
|
+
* Currently same as deleteSession since we don't have persistent storage yet.
|
|
71
|
+
*
|
|
72
|
+
* @param id - Session ID to end
|
|
73
|
+
* @returns True if session existed and was ended
|
|
74
|
+
*/
|
|
75
|
+
endSession(id: string): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* Get a session by ID.
|
|
78
|
+
*
|
|
79
|
+
* @param id - Session ID
|
|
80
|
+
* @returns Session instance or undefined if not found
|
|
81
|
+
*/
|
|
82
|
+
getSession(id: string): IChatSession | undefined;
|
|
83
|
+
/**
|
|
84
|
+
* Get the number of active sessions.
|
|
85
|
+
*
|
|
86
|
+
* @returns Session count
|
|
87
|
+
*/
|
|
88
|
+
getSessionCount(): number;
|
|
89
|
+
/**
|
|
90
|
+
* Check if a session exists.
|
|
91
|
+
*
|
|
92
|
+
* @param id - Session ID to check
|
|
93
|
+
* @returns True if session exists
|
|
94
|
+
*/
|
|
95
|
+
hasSession(id: string): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* List all session IDs.
|
|
98
|
+
*
|
|
99
|
+
* @returns Array of session IDs
|
|
100
|
+
*/
|
|
101
|
+
listSessions(): string[];
|
|
102
|
+
/**
|
|
103
|
+
* Internal session creation logic.
|
|
104
|
+
*
|
|
105
|
+
* @param id - Session ID
|
|
106
|
+
* @returns New chat session instance
|
|
107
|
+
*/
|
|
108
|
+
private createSessionInternal;
|
|
109
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { createSessionServices } from '../agent-service-factory.js';
|
|
3
|
+
import { ChatSession } from './chat-session.js';
|
|
4
|
+
/**
|
|
5
|
+
* Session manager.
|
|
6
|
+
*
|
|
7
|
+
* Manages multiple chat sessions with creation, retrieval, and deletion.
|
|
8
|
+
* Each session gets its own LLM service instance with isolated context.
|
|
9
|
+
*
|
|
10
|
+
* Following Dexto's pattern: SessionManager uses shared services from the agent
|
|
11
|
+
* and creates session-specific services (LLM, EventBus) per conversation.
|
|
12
|
+
*/
|
|
13
|
+
export class SessionManager {
|
|
14
|
+
config;
|
|
15
|
+
grpcConfig;
|
|
16
|
+
llmConfig;
|
|
17
|
+
pendingCreations = new Map();
|
|
18
|
+
sessions = new Map();
|
|
19
|
+
sharedServices;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a new session manager
|
|
22
|
+
*
|
|
23
|
+
* @param sharedServices - Shared services from CipherAgent (ToolManager, SystemPromptManager, etc.)
|
|
24
|
+
* @param grpcConfig - gRPC client configuration
|
|
25
|
+
* @param llmConfig - LLM service configuration
|
|
26
|
+
* @param llmConfig.openRouterApiKey - Optional OpenRouter API key for direct service
|
|
27
|
+
* @param llmConfig.httpReferer - Optional HTTP Referer for OpenRouter rankings
|
|
28
|
+
* @param llmConfig.siteName - Optional site name for OpenRouter rankings
|
|
29
|
+
* @param llmConfig.maxIterations - Maximum iterations for agentic loop
|
|
30
|
+
* @param llmConfig.maxTokens - Maximum output tokens
|
|
31
|
+
* @param llmConfig.model - LLM model identifier
|
|
32
|
+
* @param llmConfig.temperature - Temperature for generation
|
|
33
|
+
* @param options - Optional session manager options
|
|
34
|
+
* @param options.config - Session manager configuration
|
|
35
|
+
*/
|
|
36
|
+
constructor(sharedServices, grpcConfig, llmConfig, options) {
|
|
37
|
+
this.sharedServices = sharedServices;
|
|
38
|
+
this.grpcConfig = grpcConfig;
|
|
39
|
+
this.llmConfig = llmConfig;
|
|
40
|
+
this.config = {
|
|
41
|
+
maxSessions: options?.config?.maxSessions ?? 100,
|
|
42
|
+
sessionTTL: options?.config?.sessionTTL ?? 3_600_000, // 1 hour
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create a new chat session.
|
|
47
|
+
*
|
|
48
|
+
* Each session gets its own LLM service instance for isolated conversation context.
|
|
49
|
+
* Following Dexto's pattern with race condition protection via pendingCreations tracker.
|
|
50
|
+
*
|
|
51
|
+
* @param sessionId - Optional session ID (generates UUID if not provided)
|
|
52
|
+
* @returns New or existing chat session instance
|
|
53
|
+
*/
|
|
54
|
+
async createSession(sessionId) {
|
|
55
|
+
const id = sessionId ?? randomUUID();
|
|
56
|
+
// Check pending operations (race condition protection)
|
|
57
|
+
if (this.pendingCreations.has(id)) {
|
|
58
|
+
const pending = this.pendingCreations.get(id);
|
|
59
|
+
if (!pending) {
|
|
60
|
+
throw new Error(`Pending session ${id} not found. This is a bug.`);
|
|
61
|
+
}
|
|
62
|
+
return pending;
|
|
63
|
+
}
|
|
64
|
+
// Check in-memory cache
|
|
65
|
+
if (this.sessions.has(id)) {
|
|
66
|
+
const existing = this.sessions.get(id);
|
|
67
|
+
if (!existing) {
|
|
68
|
+
throw new Error(`Session ${id} not found in cache. This is a bug.`);
|
|
69
|
+
}
|
|
70
|
+
return existing;
|
|
71
|
+
}
|
|
72
|
+
// Check max sessions limit
|
|
73
|
+
if (this.sessions.size >= this.config.maxSessions) {
|
|
74
|
+
throw new Error(`Maximum sessions (${this.config.maxSessions}) reached. Delete unused sessions or increase maxSessions limit.`);
|
|
75
|
+
}
|
|
76
|
+
// Create with pending tracker
|
|
77
|
+
const creationPromise = this.createSessionInternal(id);
|
|
78
|
+
this.pendingCreations.set(id, creationPromise);
|
|
79
|
+
try {
|
|
80
|
+
return await creationPromise;
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
this.pendingCreations.delete(id);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Delete a session completely (memory + history).
|
|
88
|
+
*
|
|
89
|
+
* @param id - Session ID to delete
|
|
90
|
+
* @returns True if session existed and was deleted
|
|
91
|
+
*/
|
|
92
|
+
async deleteSession(id) {
|
|
93
|
+
const session = this.sessions.get(id);
|
|
94
|
+
if (!session) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
// Clear session history
|
|
98
|
+
session.reset();
|
|
99
|
+
// Remove from memory
|
|
100
|
+
return this.sessions.delete(id);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* End a session (remove from memory, preserve history for future restoration).
|
|
104
|
+
* Currently same as deleteSession since we don't have persistent storage yet.
|
|
105
|
+
*
|
|
106
|
+
* @param id - Session ID to end
|
|
107
|
+
* @returns True if session existed and was ended
|
|
108
|
+
*/
|
|
109
|
+
async endSession(id) {
|
|
110
|
+
const session = this.sessions.get(id);
|
|
111
|
+
if (!session) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
// In the future, this would preserve history in storage
|
|
115
|
+
// For now, just remove from memory
|
|
116
|
+
return this.sessions.delete(id);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get a session by ID.
|
|
120
|
+
*
|
|
121
|
+
* @param id - Session ID
|
|
122
|
+
* @returns Session instance or undefined if not found
|
|
123
|
+
*/
|
|
124
|
+
getSession(id) {
|
|
125
|
+
return this.sessions.get(id);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the number of active sessions.
|
|
129
|
+
*
|
|
130
|
+
* @returns Session count
|
|
131
|
+
*/
|
|
132
|
+
getSessionCount() {
|
|
133
|
+
return this.sessions.size;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Check if a session exists.
|
|
137
|
+
*
|
|
138
|
+
* @param id - Session ID to check
|
|
139
|
+
* @returns True if session exists
|
|
140
|
+
*/
|
|
141
|
+
hasSession(id) {
|
|
142
|
+
return this.sessions.has(id);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* List all session IDs.
|
|
146
|
+
*
|
|
147
|
+
* @returns Array of session IDs
|
|
148
|
+
*/
|
|
149
|
+
listSessions() {
|
|
150
|
+
return [...this.sessions.keys()];
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Internal session creation logic.
|
|
154
|
+
*
|
|
155
|
+
* @param id - Session ID
|
|
156
|
+
* @returns New chat session instance
|
|
157
|
+
*/
|
|
158
|
+
async createSessionInternal(id) {
|
|
159
|
+
// Create session-specific services using factory
|
|
160
|
+
const sessionServices = createSessionServices(id, this.sharedServices, this.grpcConfig, this.llmConfig);
|
|
161
|
+
// Create session with both shared and session services
|
|
162
|
+
const session = new ChatSession(id, this.sharedServices, sessionServices);
|
|
163
|
+
// Initialize LLM service to load persisted history from blob storage
|
|
164
|
+
// Only call initialize() if the service has the method (ByteRoverLLMService has it, GeminiLLMService doesn't)
|
|
165
|
+
if ('initialize' in sessionServices.llmService && typeof sessionServices.llmService.initialize === 'function') {
|
|
166
|
+
await sessionServices.llmService.initialize();
|
|
167
|
+
// Debug logging removed for cleaner user experience
|
|
168
|
+
}
|
|
169
|
+
this.sessions.set(id, session);
|
|
170
|
+
return session;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { SessionMetadata } from '../../../core/domain/cipher/storage/history-types.js';
|
|
2
|
+
import type { IBlobStorage } from '../../../core/interfaces/cipher/i-blob-storage.js';
|
|
3
|
+
import type { IHistoryStorage } from '../../../core/interfaces/cipher/i-history-storage.js';
|
|
4
|
+
import type { InternalMessage } from '../../../core/interfaces/cipher/message-types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Blob-based implementation of history storage.
|
|
7
|
+
*
|
|
8
|
+
* Stores conversation history as JSON blobs in the file system.
|
|
9
|
+
* Each session gets its own blob file at `.brv/blobs/session-{sessionId}.blob`.
|
|
10
|
+
*
|
|
11
|
+
* Follows the same pattern as MemoryManager for consistency.
|
|
12
|
+
*/
|
|
13
|
+
export declare class BlobHistoryStorage implements IHistoryStorage {
|
|
14
|
+
private readonly blobStorage;
|
|
15
|
+
private static readonly SESSION_KEY_PREFIX;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new blob history storage instance.
|
|
18
|
+
*
|
|
19
|
+
* @param blobStorage - The blob storage backend to use
|
|
20
|
+
*/
|
|
21
|
+
constructor(blobStorage: IBlobStorage);
|
|
22
|
+
/**
|
|
23
|
+
* Delete all history for a specific session.
|
|
24
|
+
*
|
|
25
|
+
* @param sessionId - Unique session identifier
|
|
26
|
+
*/
|
|
27
|
+
deleteHistory(sessionId: string): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Check if history exists for a specific session.
|
|
30
|
+
*
|
|
31
|
+
* @param sessionId - Unique session identifier
|
|
32
|
+
* @returns True if history exists
|
|
33
|
+
*/
|
|
34
|
+
exists(sessionId: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Get metadata for a specific session without loading full history.
|
|
37
|
+
*
|
|
38
|
+
* @param sessionId - Unique session identifier
|
|
39
|
+
* @returns Session metadata or undefined if not found
|
|
40
|
+
*/
|
|
41
|
+
getSessionMetadata(sessionId: string): Promise<SessionMetadata | undefined>;
|
|
42
|
+
/**
|
|
43
|
+
* List all session IDs that have persisted history.
|
|
44
|
+
*
|
|
45
|
+
* @returns Array of session IDs
|
|
46
|
+
*/
|
|
47
|
+
listSessions(): Promise<string[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Load conversation history for a specific session.
|
|
50
|
+
*
|
|
51
|
+
* @param sessionId - Unique session identifier
|
|
52
|
+
* @returns Array of messages, or undefined if session not found
|
|
53
|
+
*/
|
|
54
|
+
loadHistory(sessionId: string): Promise<InternalMessage[] | undefined>;
|
|
55
|
+
/**
|
|
56
|
+
* Save conversation history for a specific session.
|
|
57
|
+
*
|
|
58
|
+
* @param sessionId - Unique session identifier
|
|
59
|
+
* @param messages - Array of messages to persist
|
|
60
|
+
*/
|
|
61
|
+
saveHistory(sessionId: string, messages: InternalMessage[]): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Extract session ID from storage key.
|
|
64
|
+
*
|
|
65
|
+
* @param key - Storage key (e.g., "session-abc123")
|
|
66
|
+
* @returns Session ID (e.g., "abc123") or undefined if invalid key
|
|
67
|
+
*/
|
|
68
|
+
private extractSessionId;
|
|
69
|
+
/**
|
|
70
|
+
* Get storage key for a session.
|
|
71
|
+
*
|
|
72
|
+
* @param sessionId - Unique session identifier
|
|
73
|
+
* @returns Storage key (e.g., "session-abc123")
|
|
74
|
+
*/
|
|
75
|
+
private getSessionKey;
|
|
76
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blob-based implementation of history storage.
|
|
3
|
+
*
|
|
4
|
+
* Stores conversation history as JSON blobs in the file system.
|
|
5
|
+
* Each session gets its own blob file at `.brv/blobs/session-{sessionId}.blob`.
|
|
6
|
+
*
|
|
7
|
+
* Follows the same pattern as MemoryManager for consistency.
|
|
8
|
+
*/
|
|
9
|
+
export class BlobHistoryStorage {
|
|
10
|
+
blobStorage;
|
|
11
|
+
static SESSION_KEY_PREFIX = 'session-';
|
|
12
|
+
/**
|
|
13
|
+
* Creates a new blob history storage instance.
|
|
14
|
+
*
|
|
15
|
+
* @param blobStorage - The blob storage backend to use
|
|
16
|
+
*/
|
|
17
|
+
constructor(blobStorage) {
|
|
18
|
+
this.blobStorage = blobStorage;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Delete all history for a specific session.
|
|
22
|
+
*
|
|
23
|
+
* @param sessionId - Unique session identifier
|
|
24
|
+
*/
|
|
25
|
+
async deleteHistory(sessionId) {
|
|
26
|
+
const key = this.getSessionKey(sessionId);
|
|
27
|
+
try {
|
|
28
|
+
await this.blobStorage.delete(key);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
// Log error but don't throw - graceful degradation
|
|
32
|
+
console.error(`[BlobHistoryStorage] Failed to delete history for session ${sessionId}:`, error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if history exists for a specific session.
|
|
37
|
+
*
|
|
38
|
+
* @param sessionId - Unique session identifier
|
|
39
|
+
* @returns True if history exists
|
|
40
|
+
*/
|
|
41
|
+
async exists(sessionId) {
|
|
42
|
+
const key = this.getSessionKey(sessionId);
|
|
43
|
+
try {
|
|
44
|
+
return await this.blobStorage.exists(key);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error(`[BlobHistoryStorage] Error checking existence for session ${sessionId}:`, error);
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get metadata for a specific session without loading full history.
|
|
53
|
+
*
|
|
54
|
+
* @param sessionId - Unique session identifier
|
|
55
|
+
* @returns Session metadata or undefined if not found
|
|
56
|
+
*/
|
|
57
|
+
async getSessionMetadata(sessionId) {
|
|
58
|
+
const key = this.getSessionKey(sessionId);
|
|
59
|
+
try {
|
|
60
|
+
const blob = await this.blobStorage.retrieve(key);
|
|
61
|
+
if (!blob) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
// Parse JSON content to extract metadata
|
|
65
|
+
const historyData = JSON.parse(blob.content.toString('utf8'));
|
|
66
|
+
return {
|
|
67
|
+
createdAt: historyData.createdAt,
|
|
68
|
+
lastActivity: historyData.updatedAt,
|
|
69
|
+
messageCount: historyData.messageCount,
|
|
70
|
+
sessionId: historyData.sessionId,
|
|
71
|
+
title: historyData.metadata?.title,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error(`[BlobHistoryStorage] Failed to get metadata for session ${sessionId}:`, error);
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* List all session IDs that have persisted history.
|
|
81
|
+
*
|
|
82
|
+
* @returns Array of session IDs
|
|
83
|
+
*/
|
|
84
|
+
async listSessions() {
|
|
85
|
+
try {
|
|
86
|
+
const keys = await this.blobStorage.list(BlobHistoryStorage.SESSION_KEY_PREFIX);
|
|
87
|
+
// Extract session IDs from keys (remove prefix)
|
|
88
|
+
return keys.map(key => this.extractSessionId(key)).filter((id) => id !== undefined);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error('[BlobHistoryStorage] Failed to list sessions:', error);
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Load conversation history for a specific session.
|
|
97
|
+
*
|
|
98
|
+
* @param sessionId - Unique session identifier
|
|
99
|
+
* @returns Array of messages, or undefined if session not found
|
|
100
|
+
*/
|
|
101
|
+
async loadHistory(sessionId) {
|
|
102
|
+
const key = this.getSessionKey(sessionId);
|
|
103
|
+
try {
|
|
104
|
+
const blob = await this.blobStorage.retrieve(key);
|
|
105
|
+
if (!blob) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
// Parse JSON content
|
|
109
|
+
const historyData = JSON.parse(blob.content.toString('utf8'));
|
|
110
|
+
// Removed verbose console.log for cleaner interactive UX
|
|
111
|
+
// console.log(`[BlobHistoryStorage] Loaded ${historyData.messages.length} messages for session ${sessionId}`)
|
|
112
|
+
return historyData.messages;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.error(`[BlobHistoryStorage] Failed to load history for session ${sessionId}:`, error);
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Save conversation history for a specific session.
|
|
121
|
+
*
|
|
122
|
+
* @param sessionId - Unique session identifier
|
|
123
|
+
* @param messages - Array of messages to persist
|
|
124
|
+
*/
|
|
125
|
+
async saveHistory(sessionId, messages) {
|
|
126
|
+
const key = this.getSessionKey(sessionId);
|
|
127
|
+
// Check if session already exists to preserve createdAt timestamp
|
|
128
|
+
const existingMetadata = await this.getSessionMetadata(sessionId);
|
|
129
|
+
// Build history data structure
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
const historyData = {
|
|
132
|
+
createdAt: existingMetadata?.createdAt ?? now, // Preserve original creation time
|
|
133
|
+
messageCount: messages.length,
|
|
134
|
+
messages,
|
|
135
|
+
sessionId,
|
|
136
|
+
updatedAt: now,
|
|
137
|
+
};
|
|
138
|
+
try {
|
|
139
|
+
// Serialize to JSON with pretty-printing for inspectability
|
|
140
|
+
const content = JSON.stringify(historyData, null, 2);
|
|
141
|
+
// Store in blob storage
|
|
142
|
+
await this.blobStorage.store(key, content, {
|
|
143
|
+
contentType: 'application/json',
|
|
144
|
+
tags: {
|
|
145
|
+
sessionId,
|
|
146
|
+
type: 'chat-history',
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
// Removed verbose console.log for cleaner interactive UX
|
|
150
|
+
// console.log(`[BlobHistoryStorage] Saved ${messages.length} messages for session ${sessionId}`)
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
// Log error but don't throw - graceful degradation
|
|
154
|
+
console.error(`[BlobHistoryStorage] Failed to save history for session ${sessionId}:`, error);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Extract session ID from storage key.
|
|
159
|
+
*
|
|
160
|
+
* @param key - Storage key (e.g., "session-abc123")
|
|
161
|
+
* @returns Session ID (e.g., "abc123") or undefined if invalid key
|
|
162
|
+
*/
|
|
163
|
+
extractSessionId(key) {
|
|
164
|
+
if (!key.startsWith(BlobHistoryStorage.SESSION_KEY_PREFIX)) {
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
return key.slice(BlobHistoryStorage.SESSION_KEY_PREFIX.length);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get storage key for a session.
|
|
171
|
+
*
|
|
172
|
+
* @param sessionId - Unique session identifier
|
|
173
|
+
* @returns Storage key (e.g., "session-abc123")
|
|
174
|
+
*/
|
|
175
|
+
getSessionKey(sessionId) {
|
|
176
|
+
return `${BlobHistoryStorage.SESSION_KEY_PREFIX}${sessionId}`;
|
|
177
|
+
}
|
|
178
|
+
}
|