byterover-cli 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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 +48 -3
- package/dist/commands/init.js +242 -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,183 @@
|
|
|
1
|
+
import type { ToolSet } from '../../../core/domain/cipher/tools/types.js';
|
|
2
|
+
import type { ExecutionContext } from '../../../core/interfaces/cipher/i-cipher-agent.js';
|
|
3
|
+
import type { IHistoryStorage } from '../../../core/interfaces/cipher/i-history-storage.js';
|
|
4
|
+
import type { ILLMService } from '../../../core/interfaces/cipher/i-llm-service.js';
|
|
5
|
+
import type { ILogger } from '../../../core/interfaces/cipher/i-logger.js';
|
|
6
|
+
import type { MemoryManager } from '../memory/memory-manager.js';
|
|
7
|
+
import type { SimplePromptFactory } from '../system-prompt/simple-prompt-factory.js';
|
|
8
|
+
import type { ToolManager } from '../tools/tool-manager.js';
|
|
9
|
+
import { SessionEventBus } from '../events/event-emitter.js';
|
|
10
|
+
import { ContextManager, type FileData, type ImageData } from './context/context-manager.js';
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for OpenRouter LLM service
|
|
13
|
+
*/
|
|
14
|
+
export interface OpenRouterServiceConfig {
|
|
15
|
+
apiKey: string;
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
httpReferer?: string;
|
|
18
|
+
maxInputTokens?: number;
|
|
19
|
+
maxIterations?: number;
|
|
20
|
+
maxTokens?: number;
|
|
21
|
+
model?: string;
|
|
22
|
+
siteName?: string;
|
|
23
|
+
temperature?: number;
|
|
24
|
+
timeout?: number;
|
|
25
|
+
verbose?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* LLM service configuration response
|
|
29
|
+
*/
|
|
30
|
+
export interface LLMServiceConfig {
|
|
31
|
+
configuredMaxInputTokens: number;
|
|
32
|
+
model: string;
|
|
33
|
+
modelMaxInputTokens: number;
|
|
34
|
+
provider: string;
|
|
35
|
+
router: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* OpenRouter LLM Service.
|
|
39
|
+
*
|
|
40
|
+
* Orchestrates the agentic loop for tool calling with OpenRouter.
|
|
41
|
+
* OpenRouter provides access to multiple LLM providers through an OpenAI-compatible API.
|
|
42
|
+
*
|
|
43
|
+
* Responsibilities:
|
|
44
|
+
* - Manage conversation context via ContextManager
|
|
45
|
+
* - Execute agentic loop (call LLM → execute tools → repeat)
|
|
46
|
+
* - Delegate tool execution to ToolManager
|
|
47
|
+
* - Format messages for OpenRouter API via formatter
|
|
48
|
+
* - Handle errors and iteration limits
|
|
49
|
+
*
|
|
50
|
+
* Does NOT:
|
|
51
|
+
* - Execute tools directly (uses ToolManager)
|
|
52
|
+
* - Store persistent history (uses in-memory ContextManager)
|
|
53
|
+
*/
|
|
54
|
+
export declare class OpenRouterLLMService implements ILLMService {
|
|
55
|
+
private readonly client;
|
|
56
|
+
private readonly config;
|
|
57
|
+
private readonly contextManager;
|
|
58
|
+
private readonly formatter;
|
|
59
|
+
private readonly logger;
|
|
60
|
+
private readonly memoryManager?;
|
|
61
|
+
private readonly promptFactory;
|
|
62
|
+
private readonly sessionEventBus;
|
|
63
|
+
private readonly tokenizer;
|
|
64
|
+
private readonly toolManager;
|
|
65
|
+
/**
|
|
66
|
+
* Creates a new OpenRouter LLM service
|
|
67
|
+
*
|
|
68
|
+
* @param sessionId - Unique session identifier
|
|
69
|
+
* @param config - Service configuration
|
|
70
|
+
* @param options - Service dependencies
|
|
71
|
+
* @param options.toolManager - Tool manager for tool execution
|
|
72
|
+
* @param options.systemPromptManager - Simple prompt factory for building system prompts
|
|
73
|
+
* @param options.sessionEventBus - Session event bus for emitting events
|
|
74
|
+
* @param options.memoryManager - Optional memory manager for agent memories
|
|
75
|
+
* @param options.historyStorage - Optional history storage for persistence
|
|
76
|
+
* @param options.logger - Optional logger for structured logging
|
|
77
|
+
*/
|
|
78
|
+
constructor(sessionId: string, config: OpenRouterServiceConfig, options: {
|
|
79
|
+
historyStorage?: IHistoryStorage;
|
|
80
|
+
logger?: ILogger;
|
|
81
|
+
memoryManager?: MemoryManager;
|
|
82
|
+
sessionEventBus: SessionEventBus;
|
|
83
|
+
systemPromptManager: SimplePromptFactory;
|
|
84
|
+
toolManager: ToolManager;
|
|
85
|
+
});
|
|
86
|
+
/**
|
|
87
|
+
* Complete a task with tool calling support.
|
|
88
|
+
*
|
|
89
|
+
* This is the main entry point for the agentic loop.
|
|
90
|
+
* It handles:
|
|
91
|
+
* 1. Adding user message to context
|
|
92
|
+
* 2. Looping: call LLM → check for tool calls → execute tools
|
|
93
|
+
* 3. Returning final response when no more tool calls
|
|
94
|
+
*
|
|
95
|
+
* @param textInput - User input text
|
|
96
|
+
* @param sessionId - Session ID for tracking the conversation
|
|
97
|
+
* @param options - Execution options
|
|
98
|
+
* @param options.signal - Optional abort signal for cancellation
|
|
99
|
+
* @param options.imageData - Optional image data
|
|
100
|
+
* @param options.fileData - Optional file data
|
|
101
|
+
* @param options.stream - Whether to stream response (not implemented yet)
|
|
102
|
+
* @param options.executionContext - Optional execution context (for JSON input mode, etc.)
|
|
103
|
+
* @param options.mode - Optional mode for system prompt ('json-input' enables autonomous mode)
|
|
104
|
+
* @returns Final assistant response
|
|
105
|
+
*/
|
|
106
|
+
completeTask(textInput: string, sessionId: string, options?: {
|
|
107
|
+
executionContext?: ExecutionContext;
|
|
108
|
+
fileData?: FileData;
|
|
109
|
+
imageData?: ImageData;
|
|
110
|
+
mode?: 'autonomous' | 'default' | 'query';
|
|
111
|
+
signal?: AbortSignal;
|
|
112
|
+
stream?: boolean;
|
|
113
|
+
}): Promise<string>;
|
|
114
|
+
/**
|
|
115
|
+
* Get all available tools from ToolManager.
|
|
116
|
+
*/
|
|
117
|
+
getAllTools(): Promise<ToolSet>;
|
|
118
|
+
/**
|
|
119
|
+
* Get service configuration.
|
|
120
|
+
*/
|
|
121
|
+
getConfig(): LLMServiceConfig;
|
|
122
|
+
/**
|
|
123
|
+
* Get the context manager instance.
|
|
124
|
+
*/
|
|
125
|
+
getContextManager(): ContextManager<unknown>;
|
|
126
|
+
/**
|
|
127
|
+
* Initialize the LLM service by loading persisted history.
|
|
128
|
+
* Should be called after construction to restore previous conversation.
|
|
129
|
+
*
|
|
130
|
+
* @returns True if history was loaded, false otherwise
|
|
131
|
+
*/
|
|
132
|
+
initialize(): Promise<boolean>;
|
|
133
|
+
/**
|
|
134
|
+
* Call LLM and parse the response.
|
|
135
|
+
*
|
|
136
|
+
* @param tools - Available tools for function calling
|
|
137
|
+
* @param formattedMessages - Formatted messages to send
|
|
138
|
+
* @returns Parsed message from LLM response
|
|
139
|
+
*/
|
|
140
|
+
private callLLMAndParseResponse;
|
|
141
|
+
/**
|
|
142
|
+
* Execute a single iteration of the agentic loop.
|
|
143
|
+
*
|
|
144
|
+
* @param iterationCount - Current iteration number
|
|
145
|
+
* @param tools - Available tools for this iteration
|
|
146
|
+
* @param executionContext - Optional execution context
|
|
147
|
+
* @param mode - Optional mode for system prompt
|
|
148
|
+
* @returns Final response string if complete, null if more iterations needed
|
|
149
|
+
*/
|
|
150
|
+
private executeAgenticIteration;
|
|
151
|
+
/**
|
|
152
|
+
* Execute a single tool call.
|
|
153
|
+
*
|
|
154
|
+
* @param toolCall - Tool call to execute
|
|
155
|
+
*/
|
|
156
|
+
private executeToolCall;
|
|
157
|
+
/**
|
|
158
|
+
* Extract text content from an internal message.
|
|
159
|
+
*
|
|
160
|
+
* @param message - Internal message
|
|
161
|
+
* @returns Text content as string
|
|
162
|
+
*/
|
|
163
|
+
private extractTextContent;
|
|
164
|
+
/**
|
|
165
|
+
* Handle final response when there are no tool calls.
|
|
166
|
+
*
|
|
167
|
+
* @param lastMessage - Last message from LLM
|
|
168
|
+
* @returns Final response content
|
|
169
|
+
*/
|
|
170
|
+
private handleFinalResponse;
|
|
171
|
+
/**
|
|
172
|
+
* Handle LLM errors and re-throw or wrap appropriately.
|
|
173
|
+
*
|
|
174
|
+
* @param error - Error to handle
|
|
175
|
+
*/
|
|
176
|
+
private handleLLMError;
|
|
177
|
+
/**
|
|
178
|
+
* Handle tool calls from LLM response.
|
|
179
|
+
*
|
|
180
|
+
* @param lastMessage - Last message containing tool calls
|
|
181
|
+
*/
|
|
182
|
+
private handleToolCalls;
|
|
183
|
+
}
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { OpenAI } from 'openai';
|
|
2
|
+
import { LlmGenerationError, LlmMaxIterationsError, LlmResponseParsingError, } from '../../../core/domain/cipher/errors/llm-error.js';
|
|
3
|
+
import { NoOpLogger } from '../../../core/interfaces/cipher/i-logger.js';
|
|
4
|
+
import { getErrorMessage } from '../../../utils/error-helpers.js';
|
|
5
|
+
import { ContextManager } from './context/context-manager.js';
|
|
6
|
+
import { OpenRouterMessageFormatter } from './formatters/openrouter-formatter.js';
|
|
7
|
+
import { OpenRouterTokenizer } from './tokenizers/openrouter-tokenizer.js';
|
|
8
|
+
/**
|
|
9
|
+
* OpenRouter LLM Service.
|
|
10
|
+
*
|
|
11
|
+
* Orchestrates the agentic loop for tool calling with OpenRouter.
|
|
12
|
+
* OpenRouter provides access to multiple LLM providers through an OpenAI-compatible API.
|
|
13
|
+
*
|
|
14
|
+
* Responsibilities:
|
|
15
|
+
* - Manage conversation context via ContextManager
|
|
16
|
+
* - Execute agentic loop (call LLM → execute tools → repeat)
|
|
17
|
+
* - Delegate tool execution to ToolManager
|
|
18
|
+
* - Format messages for OpenRouter API via formatter
|
|
19
|
+
* - Handle errors and iteration limits
|
|
20
|
+
*
|
|
21
|
+
* Does NOT:
|
|
22
|
+
* - Execute tools directly (uses ToolManager)
|
|
23
|
+
* - Store persistent history (uses in-memory ContextManager)
|
|
24
|
+
*/
|
|
25
|
+
export class OpenRouterLLMService {
|
|
26
|
+
client;
|
|
27
|
+
config;
|
|
28
|
+
contextManager;
|
|
29
|
+
formatter;
|
|
30
|
+
logger;
|
|
31
|
+
memoryManager;
|
|
32
|
+
promptFactory;
|
|
33
|
+
sessionEventBus;
|
|
34
|
+
tokenizer;
|
|
35
|
+
toolManager;
|
|
36
|
+
/**
|
|
37
|
+
* Creates a new OpenRouter LLM service
|
|
38
|
+
*
|
|
39
|
+
* @param sessionId - Unique session identifier
|
|
40
|
+
* @param config - Service configuration
|
|
41
|
+
* @param options - Service dependencies
|
|
42
|
+
* @param options.toolManager - Tool manager for tool execution
|
|
43
|
+
* @param options.systemPromptManager - Simple prompt factory for building system prompts
|
|
44
|
+
* @param options.sessionEventBus - Session event bus for emitting events
|
|
45
|
+
* @param options.memoryManager - Optional memory manager for agent memories
|
|
46
|
+
* @param options.historyStorage - Optional history storage for persistence
|
|
47
|
+
* @param options.logger - Optional logger for structured logging
|
|
48
|
+
*/
|
|
49
|
+
constructor(sessionId, config, options) {
|
|
50
|
+
this.toolManager = options.toolManager;
|
|
51
|
+
this.promptFactory = options.systemPromptManager;
|
|
52
|
+
this.memoryManager = options.memoryManager;
|
|
53
|
+
this.sessionEventBus = options.sessionEventBus;
|
|
54
|
+
this.logger = options.logger ?? new NoOpLogger();
|
|
55
|
+
this.config = {
|
|
56
|
+
apiKey: config.apiKey,
|
|
57
|
+
baseUrl: config.baseUrl ?? 'https://openrouter.ai/api/v1',
|
|
58
|
+
httpReferer: config.httpReferer,
|
|
59
|
+
maxInputTokens: config.maxInputTokens ?? 200_000,
|
|
60
|
+
maxIterations: config.maxIterations ?? 50,
|
|
61
|
+
maxTokens: config.maxTokens ?? 8192,
|
|
62
|
+
model: config.model ?? 'anthropic/claude-haiku-4.5',
|
|
63
|
+
siteName: config.siteName,
|
|
64
|
+
temperature: config.temperature ?? 0.7,
|
|
65
|
+
timeout: config.timeout,
|
|
66
|
+
verbose: config.verbose,
|
|
67
|
+
};
|
|
68
|
+
// Initialize OpenAI client with OpenRouter base URL
|
|
69
|
+
this.client = new OpenAI({
|
|
70
|
+
apiKey: this.config.apiKey,
|
|
71
|
+
baseURL: this.config.baseUrl,
|
|
72
|
+
defaultHeaders: {
|
|
73
|
+
...(this.config.httpReferer && { 'HTTP-Referer': this.config.httpReferer }),
|
|
74
|
+
...(this.config.siteName && { 'X-Title': this.config.siteName }),
|
|
75
|
+
},
|
|
76
|
+
timeout: this.config.timeout,
|
|
77
|
+
});
|
|
78
|
+
// Initialize formatter and tokenizer
|
|
79
|
+
this.formatter = new OpenRouterMessageFormatter();
|
|
80
|
+
this.tokenizer = new OpenRouterTokenizer();
|
|
81
|
+
// Initialize context manager with optional history storage
|
|
82
|
+
this.contextManager = new ContextManager({
|
|
83
|
+
formatter: this.formatter,
|
|
84
|
+
historyStorage: options.historyStorage,
|
|
85
|
+
maxInputTokens: this.config.maxInputTokens,
|
|
86
|
+
sessionId,
|
|
87
|
+
tokenizer: this.tokenizer,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Complete a task with tool calling support.
|
|
92
|
+
*
|
|
93
|
+
* This is the main entry point for the agentic loop.
|
|
94
|
+
* It handles:
|
|
95
|
+
* 1. Adding user message to context
|
|
96
|
+
* 2. Looping: call LLM → check for tool calls → execute tools
|
|
97
|
+
* 3. Returning final response when no more tool calls
|
|
98
|
+
*
|
|
99
|
+
* @param textInput - User input text
|
|
100
|
+
* @param sessionId - Session ID for tracking the conversation
|
|
101
|
+
* @param options - Execution options
|
|
102
|
+
* @param options.signal - Optional abort signal for cancellation
|
|
103
|
+
* @param options.imageData - Optional image data
|
|
104
|
+
* @param options.fileData - Optional file data
|
|
105
|
+
* @param options.stream - Whether to stream response (not implemented yet)
|
|
106
|
+
* @param options.executionContext - Optional execution context (for JSON input mode, etc.)
|
|
107
|
+
* @param options.mode - Optional mode for system prompt ('json-input' enables autonomous mode)
|
|
108
|
+
* @returns Final assistant response
|
|
109
|
+
*/
|
|
110
|
+
async completeTask(textInput, sessionId, options) {
|
|
111
|
+
// Extract options with defaults
|
|
112
|
+
const { executionContext, fileData, imageData, mode, signal } = options ?? {};
|
|
113
|
+
// Add user message to context
|
|
114
|
+
await this.contextManager.addUserMessage(textInput, imageData, fileData);
|
|
115
|
+
// Get all available tools
|
|
116
|
+
const toolSet = this.toolManager.getAllTools();
|
|
117
|
+
const tools = Object.entries(toolSet).map(([name, schema]) => ({
|
|
118
|
+
function: {
|
|
119
|
+
description: schema.description ?? '',
|
|
120
|
+
name,
|
|
121
|
+
parameters: schema.parameters,
|
|
122
|
+
},
|
|
123
|
+
type: 'function',
|
|
124
|
+
}));
|
|
125
|
+
let iterationCount = 0;
|
|
126
|
+
// Agentic loop
|
|
127
|
+
while (iterationCount < this.config.maxIterations) {
|
|
128
|
+
// Check if aborted
|
|
129
|
+
if (signal?.aborted) {
|
|
130
|
+
throw new Error('Operation aborted');
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
// eslint-disable-next-line no-await-in-loop -- Sequential iterations required for agentic loop
|
|
134
|
+
const result = await this.executeAgenticIteration(iterationCount, tools, executionContext, mode);
|
|
135
|
+
if (result !== null) {
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
iterationCount++;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
this.handleLLMError(error);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Max iterations exceeded
|
|
145
|
+
throw new LlmMaxIterationsError(this.config.maxIterations, 'openrouter', this.config.model);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get all available tools from ToolManager.
|
|
149
|
+
*/
|
|
150
|
+
async getAllTools() {
|
|
151
|
+
return this.toolManager.getAllTools();
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get service configuration.
|
|
155
|
+
*/
|
|
156
|
+
getConfig() {
|
|
157
|
+
return {
|
|
158
|
+
configuredMaxInputTokens: this.config.maxInputTokens,
|
|
159
|
+
model: this.config.model,
|
|
160
|
+
modelMaxInputTokens: this.config.maxInputTokens,
|
|
161
|
+
provider: 'openrouter',
|
|
162
|
+
router: 'openrouter',
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get the context manager instance.
|
|
167
|
+
*/
|
|
168
|
+
getContextManager() {
|
|
169
|
+
return this.contextManager;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Initialize the LLM service by loading persisted history.
|
|
173
|
+
* Should be called after construction to restore previous conversation.
|
|
174
|
+
*
|
|
175
|
+
* @returns True if history was loaded, false otherwise
|
|
176
|
+
*/
|
|
177
|
+
async initialize() {
|
|
178
|
+
return this.contextManager.initialize();
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Call LLM and parse the response.
|
|
182
|
+
*
|
|
183
|
+
* @param tools - Available tools for function calling
|
|
184
|
+
* @param formattedMessages - Formatted messages to send
|
|
185
|
+
* @returns Parsed message from LLM response
|
|
186
|
+
*/
|
|
187
|
+
async callLLMAndParseResponse(tools, formattedMessages) {
|
|
188
|
+
// Call OpenRouter API via OpenAI client
|
|
189
|
+
const response = await this.client.chat.completions.create({
|
|
190
|
+
// eslint-disable-next-line camelcase
|
|
191
|
+
max_tokens: this.config.maxTokens,
|
|
192
|
+
messages: formattedMessages,
|
|
193
|
+
model: this.config.model,
|
|
194
|
+
temperature: this.config.temperature,
|
|
195
|
+
...(tools.length > 0 && { tools: tools }),
|
|
196
|
+
});
|
|
197
|
+
// Parse response to internal format
|
|
198
|
+
const messages = this.formatter.parseResponse(response);
|
|
199
|
+
if (messages.length === 0) {
|
|
200
|
+
throw new LlmResponseParsingError('No messages returned from formatter', 'openrouter', this.config.model);
|
|
201
|
+
}
|
|
202
|
+
const lastMessage = messages.at(-1);
|
|
203
|
+
if (!lastMessage) {
|
|
204
|
+
throw new LlmResponseParsingError('Failed to get last message from response', 'openrouter', this.config.model);
|
|
205
|
+
}
|
|
206
|
+
return lastMessage;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Execute a single iteration of the agentic loop.
|
|
210
|
+
*
|
|
211
|
+
* @param iterationCount - Current iteration number
|
|
212
|
+
* @param tools - Available tools for this iteration
|
|
213
|
+
* @param executionContext - Optional execution context
|
|
214
|
+
* @param mode - Optional mode for system prompt
|
|
215
|
+
* @returns Final response string if complete, null if more iterations needed
|
|
216
|
+
*/
|
|
217
|
+
async executeAgenticIteration(iterationCount, tools, executionContext, mode) {
|
|
218
|
+
// Build system prompt using SimplePromptFactory (before compression for correct token accounting)
|
|
219
|
+
const availableTools = this.toolManager.getToolNames();
|
|
220
|
+
const markersSet = this.toolManager.getAvailableMarkers();
|
|
221
|
+
// Convert Set<string> to Record<string, string> for SimplePromptFactory
|
|
222
|
+
const availableMarkers = {};
|
|
223
|
+
for (const marker of markersSet) {
|
|
224
|
+
availableMarkers[marker] = marker;
|
|
225
|
+
}
|
|
226
|
+
const systemPrompt = await this.promptFactory.buildSystemPrompt({
|
|
227
|
+
availableMarkers,
|
|
228
|
+
availableTools,
|
|
229
|
+
commandType: executionContext?.commandType,
|
|
230
|
+
conversationMetadata: executionContext?.conversationMetadata,
|
|
231
|
+
memoryManager: this.memoryManager,
|
|
232
|
+
mode,
|
|
233
|
+
});
|
|
234
|
+
// Verbose debug: Show complete system prompt
|
|
235
|
+
if (this.config.verbose) {
|
|
236
|
+
this.logger.debug('System prompt details', {
|
|
237
|
+
first500Chars: systemPrompt.slice(0, 500),
|
|
238
|
+
iteration: iterationCount + 1,
|
|
239
|
+
last500Chars: systemPrompt.slice(-500),
|
|
240
|
+
length: systemPrompt.length,
|
|
241
|
+
lines: systemPrompt.split('\n').length,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
// Get formatted messages from context with compression (passing system prompt for token accounting)
|
|
245
|
+
const { formattedMessages, tokensUsed } = await this.contextManager.getFormattedMessagesWithCompression(systemPrompt);
|
|
246
|
+
// Verbose: Log formatted messages and token usage
|
|
247
|
+
if (this.config.verbose) {
|
|
248
|
+
this.logger.debug('Formatted messages for LLM', {
|
|
249
|
+
formattedMessages,
|
|
250
|
+
iteration: `${iterationCount + 1}/${this.config.maxIterations}`,
|
|
251
|
+
maxInputTokens: this.config.maxInputTokens,
|
|
252
|
+
tokensUsed,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// Emit thinking event
|
|
256
|
+
this.sessionEventBus.emit('llmservice:thinking');
|
|
257
|
+
// Call LLM and parse response
|
|
258
|
+
const lastMessage = await this.callLLMAndParseResponse(tools, formattedMessages);
|
|
259
|
+
// Check if there are tool calls
|
|
260
|
+
if (!lastMessage.toolCalls || lastMessage.toolCalls.length === 0) {
|
|
261
|
+
return this.handleFinalResponse(lastMessage);
|
|
262
|
+
}
|
|
263
|
+
// Has tool calls - handle them
|
|
264
|
+
await this.handleToolCalls(lastMessage);
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Execute a single tool call.
|
|
269
|
+
*
|
|
270
|
+
* @param toolCall - Tool call to execute
|
|
271
|
+
*/
|
|
272
|
+
async executeToolCall(toolCall) {
|
|
273
|
+
try {
|
|
274
|
+
const toolName = toolCall.function.name;
|
|
275
|
+
const toolArgs = JSON.parse(toolCall.function.arguments);
|
|
276
|
+
// Emit tool call event
|
|
277
|
+
this.sessionEventBus.emit('llmservice:toolCall', {
|
|
278
|
+
args: toolArgs,
|
|
279
|
+
callId: toolCall.id,
|
|
280
|
+
toolName,
|
|
281
|
+
});
|
|
282
|
+
// Execute tool via ToolManager (handles approval, routing, etc.)
|
|
283
|
+
const result = await this.toolManager.executeTool(toolName, toolArgs);
|
|
284
|
+
// Emit tool result event (success)
|
|
285
|
+
this.sessionEventBus.emit('llmservice:toolResult', {
|
|
286
|
+
callId: toolCall.id,
|
|
287
|
+
result,
|
|
288
|
+
success: true,
|
|
289
|
+
toolName,
|
|
290
|
+
});
|
|
291
|
+
// Add tool result to context
|
|
292
|
+
await this.contextManager.addToolResult(toolCall.id, toolName, result, { success: true });
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
// Add error result to context
|
|
296
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
297
|
+
// Emit tool result event (error)
|
|
298
|
+
this.sessionEventBus.emit('llmservice:toolResult', {
|
|
299
|
+
callId: toolCall.id,
|
|
300
|
+
error: errorMessage,
|
|
301
|
+
success: false,
|
|
302
|
+
toolName: toolCall.function.name,
|
|
303
|
+
});
|
|
304
|
+
await this.contextManager.addToolResult(toolCall.id, toolCall.function.name, `Error: ${errorMessage}`, {
|
|
305
|
+
success: false,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Extract text content from an internal message.
|
|
311
|
+
*
|
|
312
|
+
* @param message - Internal message
|
|
313
|
+
* @returns Text content as string
|
|
314
|
+
*/
|
|
315
|
+
extractTextContent(message) {
|
|
316
|
+
if (typeof message.content === 'string') {
|
|
317
|
+
return message.content;
|
|
318
|
+
}
|
|
319
|
+
if (Array.isArray(message.content)) {
|
|
320
|
+
return message.content
|
|
321
|
+
.filter((part) => part.type === 'text')
|
|
322
|
+
.map((part) => (part.type === 'text' ? part.text : ''))
|
|
323
|
+
.join('');
|
|
324
|
+
}
|
|
325
|
+
return '';
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Handle final response when there are no tool calls.
|
|
329
|
+
*
|
|
330
|
+
* @param lastMessage - Last message from LLM
|
|
331
|
+
* @returns Final response content
|
|
332
|
+
*/
|
|
333
|
+
async handleFinalResponse(lastMessage) {
|
|
334
|
+
const content = this.extractTextContent(lastMessage);
|
|
335
|
+
// Emit response event
|
|
336
|
+
this.sessionEventBus.emit('llmservice:response', {
|
|
337
|
+
content,
|
|
338
|
+
model: this.config.model,
|
|
339
|
+
provider: 'openrouter',
|
|
340
|
+
});
|
|
341
|
+
// Add assistant message to context
|
|
342
|
+
await this.contextManager.addAssistantMessage(content);
|
|
343
|
+
return content;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Handle LLM errors and re-throw or wrap appropriately.
|
|
347
|
+
*
|
|
348
|
+
* @param error - Error to handle
|
|
349
|
+
*/
|
|
350
|
+
handleLLMError(error) {
|
|
351
|
+
// Emit error event
|
|
352
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
353
|
+
this.sessionEventBus.emit('llmservice:error', {
|
|
354
|
+
error: errorMessage,
|
|
355
|
+
});
|
|
356
|
+
// Re-throw LLM errors as-is
|
|
357
|
+
if (error instanceof LlmResponseParsingError ||
|
|
358
|
+
error instanceof LlmGenerationError ||
|
|
359
|
+
error instanceof LlmMaxIterationsError) {
|
|
360
|
+
throw error;
|
|
361
|
+
}
|
|
362
|
+
// Wrap other errors
|
|
363
|
+
if (error && typeof error === 'object' && 'message' in error) {
|
|
364
|
+
throw new LlmGenerationError(getErrorMessage(error), 'openrouter', this.config.model);
|
|
365
|
+
}
|
|
366
|
+
throw new LlmGenerationError(String(error), 'openrouter', this.config.model);
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Handle tool calls from LLM response.
|
|
370
|
+
*
|
|
371
|
+
* @param lastMessage - Last message containing tool calls
|
|
372
|
+
*/
|
|
373
|
+
async handleToolCalls(lastMessage) {
|
|
374
|
+
if (!lastMessage.toolCalls || lastMessage.toolCalls.length === 0) {
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
// Has tool calls - add assistant message with tool calls
|
|
378
|
+
const assistantContent = this.extractTextContent(lastMessage);
|
|
379
|
+
await this.contextManager.addAssistantMessage(assistantContent, lastMessage.toolCalls);
|
|
380
|
+
// Execute tool calls via ToolManager
|
|
381
|
+
for (const toolCall of lastMessage.toolCalls) {
|
|
382
|
+
// eslint-disable-next-line no-await-in-loop -- Sequential tool execution required
|
|
383
|
+
await this.executeToolCall(toolCall);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response Validation Layer
|
|
3
|
+
*
|
|
4
|
+
* Validates LLM responses before processing to catch malformed content.
|
|
5
|
+
* Pure validation only - retry logic is handled by RetryableContentGenerator.
|
|
6
|
+
*/
|
|
7
|
+
import type { InternalMessage } from '../../../core/interfaces/cipher/message-types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Types of validation errors that can occur
|
|
10
|
+
*/
|
|
11
|
+
export type ResponseValidationType = 'EMPTY_RESPONSE' | 'INVALID_ROLE' | 'MALFORMED_TOOL_CALL' | 'NO_CONTENT' | 'NO_MESSAGES';
|
|
12
|
+
/**
|
|
13
|
+
* Error thrown when response validation fails
|
|
14
|
+
*/
|
|
15
|
+
export declare class ResponseValidationError extends Error {
|
|
16
|
+
/**
|
|
17
|
+
* Original response that failed validation (for debugging)
|
|
18
|
+
*/
|
|
19
|
+
readonly originalResponse?: unknown;
|
|
20
|
+
/**
|
|
21
|
+
* Type of validation failure
|
|
22
|
+
*/
|
|
23
|
+
readonly validationType: ResponseValidationType;
|
|
24
|
+
/**
|
|
25
|
+
* Create a new ResponseValidationError
|
|
26
|
+
*
|
|
27
|
+
* @param message - Human-readable error message
|
|
28
|
+
* @param validationType - Type of validation failure
|
|
29
|
+
* @param originalResponse - Original response object (optional)
|
|
30
|
+
*/
|
|
31
|
+
constructor(message: string, validationType: ResponseValidationType, originalResponse?: unknown);
|
|
32
|
+
/**
|
|
33
|
+
* Convert error to JSON for serialization
|
|
34
|
+
*/
|
|
35
|
+
toJSON(): Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Response validator with validation rules and helper methods.
|
|
39
|
+
*
|
|
40
|
+
* Pure validation only - no retry logic.
|
|
41
|
+
* Retry behavior is handled by RetryableContentGenerator decorator.
|
|
42
|
+
*/
|
|
43
|
+
export declare const ResponseValidator: {
|
|
44
|
+
/**
|
|
45
|
+
* Validate individual message structure
|
|
46
|
+
*
|
|
47
|
+
* Checks that message has:
|
|
48
|
+
* 1. Valid role (assistant)
|
|
49
|
+
* 2. Either content or tool calls
|
|
50
|
+
* 3. Well-formed tool calls (if present)
|
|
51
|
+
*
|
|
52
|
+
* @param message - Internal message to validate
|
|
53
|
+
* @throws ResponseValidationError if validation fails
|
|
54
|
+
*/
|
|
55
|
+
readonly validateMessage: (message: InternalMessage) => void;
|
|
56
|
+
/**
|
|
57
|
+
* Validate parsed message array
|
|
58
|
+
*
|
|
59
|
+
* Checks that:
|
|
60
|
+
* 1. Array is not empty
|
|
61
|
+
* 2. Has at least one message
|
|
62
|
+
*
|
|
63
|
+
* @param messages - Parsed messages from formatter
|
|
64
|
+
* @throws ResponseValidationError if validation fails
|
|
65
|
+
*/
|
|
66
|
+
readonly validateMessageArray: (messages: InternalMessage[]) => void;
|
|
67
|
+
/**
|
|
68
|
+
* Validate raw response from LLM provider
|
|
69
|
+
*
|
|
70
|
+
* Checks that response is:
|
|
71
|
+
* 1. Not null/undefined
|
|
72
|
+
* 2. An object
|
|
73
|
+
*
|
|
74
|
+
* @param response - Raw response from provider
|
|
75
|
+
* @throws ResponseValidationError if validation fails
|
|
76
|
+
*/
|
|
77
|
+
readonly validateRawResponse: (response: unknown) => void;
|
|
78
|
+
/**
|
|
79
|
+
* Validate complete response after parsing
|
|
80
|
+
*
|
|
81
|
+
* Runs all validation checks on raw response, message array, and last message.
|
|
82
|
+
*
|
|
83
|
+
* @param response - Raw response from provider
|
|
84
|
+
* @param messages - Parsed messages from formatter
|
|
85
|
+
* @returns Last message if all validations pass
|
|
86
|
+
* @throws ResponseValidationError if any validation fails
|
|
87
|
+
*/
|
|
88
|
+
readonly validateResponse: (response: unknown, messages: InternalMessage[]) => InternalMessage;
|
|
89
|
+
};
|