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,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loop Detector for Agent Tool Calls
|
|
3
|
+
*
|
|
4
|
+
* Detects repetitive tool call patterns to prevent the agent from:
|
|
5
|
+
* - Making the same tool call with identical arguments multiple times
|
|
6
|
+
* - Oscillating between two tool calls (A→B→A→B pattern)
|
|
7
|
+
*
|
|
8
|
+
* When a loop is detected, the caller should skip tool execution
|
|
9
|
+
* and inject a warning message to guide the LLM to try a different approach.
|
|
10
|
+
*
|
|
11
|
+
* Thread-safe: Uses AsyncMutex to protect shared state during parallel tool execution.
|
|
12
|
+
*/
|
|
13
|
+
import { AsyncMutex } from './async-mutex.js';
|
|
14
|
+
/**
|
|
15
|
+
* Default configuration values.
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_CONFIG = {
|
|
18
|
+
exactRepeatThreshold: 3,
|
|
19
|
+
oscillationThreshold: 2,
|
|
20
|
+
windowSize: 10,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Loop Detector.
|
|
24
|
+
*
|
|
25
|
+
* Tracks recent tool calls and detects repetitive patterns.
|
|
26
|
+
* This helps prevent the agent from wasting tokens and time
|
|
27
|
+
* on repeated unsuccessful attempts.
|
|
28
|
+
*
|
|
29
|
+
* Thread-safe: All mutating operations use AsyncMutex to ensure
|
|
30
|
+
* safe concurrent access during parallel tool execution.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const detector = new LoopDetector()
|
|
35
|
+
*
|
|
36
|
+
* // Before executing each tool call (async for thread safety)
|
|
37
|
+
* const result = await detector.recordAndCheck('read_file', { path: '/foo.ts' })
|
|
38
|
+
* if (result.isLoop) {
|
|
39
|
+
* // Skip execution, inject warning to LLM
|
|
40
|
+
* console.log(result.suggestion)
|
|
41
|
+
* } else {
|
|
42
|
+
* // Execute tool normally
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export class LoopDetector {
|
|
47
|
+
config;
|
|
48
|
+
mutex = new AsyncMutex();
|
|
49
|
+
recentCalls = [];
|
|
50
|
+
constructor(config = {}) {
|
|
51
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the current configuration.
|
|
55
|
+
*/
|
|
56
|
+
getConfig() {
|
|
57
|
+
return { ...this.config };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get the number of recorded calls in the window.
|
|
61
|
+
*/
|
|
62
|
+
getRecentCallCount() {
|
|
63
|
+
return this.recentCalls.length;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Record a tool call and check for loop patterns.
|
|
67
|
+
* Thread-safe: Uses mutex to protect shared state during parallel execution.
|
|
68
|
+
*
|
|
69
|
+
* @param toolName - Name of the tool being called
|
|
70
|
+
* @param args - Arguments passed to the tool
|
|
71
|
+
* @returns Detection result indicating if a loop was found
|
|
72
|
+
*/
|
|
73
|
+
async recordAndCheck(toolName, args) {
|
|
74
|
+
return this.mutex.withLock(async () => {
|
|
75
|
+
const signature = this.createSignature(toolName, args);
|
|
76
|
+
this.recentCalls.push(signature);
|
|
77
|
+
// Trim to window size
|
|
78
|
+
if (this.recentCalls.length > this.config.windowSize) {
|
|
79
|
+
this.recentCalls.shift();
|
|
80
|
+
}
|
|
81
|
+
return this.detectLoop();
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Reset the detector state.
|
|
86
|
+
* Should be called when starting a new conversation or task.
|
|
87
|
+
* Thread-safe: Uses mutex to protect shared state.
|
|
88
|
+
*/
|
|
89
|
+
async reset() {
|
|
90
|
+
return this.mutex.withLock(async () => {
|
|
91
|
+
this.recentCalls = [];
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Create a signature for a tool call.
|
|
96
|
+
*/
|
|
97
|
+
createSignature(toolName, args) {
|
|
98
|
+
return {
|
|
99
|
+
argsHash: this.hashArgs(args),
|
|
100
|
+
timestamp: Date.now(),
|
|
101
|
+
toolName,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Detect exact repeat pattern: same call N times consecutively.
|
|
106
|
+
*/
|
|
107
|
+
detectExactRepeat() {
|
|
108
|
+
if (this.recentCalls.length < this.config.exactRepeatThreshold) {
|
|
109
|
+
return { isLoop: false };
|
|
110
|
+
}
|
|
111
|
+
const lastCall = this.recentCalls.at(-1);
|
|
112
|
+
if (!lastCall) {
|
|
113
|
+
return { isLoop: false };
|
|
114
|
+
}
|
|
115
|
+
let repeatCount = 1;
|
|
116
|
+
// Count consecutive identical calls from the end
|
|
117
|
+
for (let i = this.recentCalls.length - 2; i >= 0; i--) {
|
|
118
|
+
if (this.signaturesMatch(this.recentCalls[i], lastCall)) {
|
|
119
|
+
repeatCount++;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (repeatCount >= this.config.exactRepeatThreshold) {
|
|
126
|
+
return {
|
|
127
|
+
isLoop: true,
|
|
128
|
+
loopType: 'exact_repeat',
|
|
129
|
+
repeatCount,
|
|
130
|
+
suggestion: `Tool "${lastCall.toolName}" has been called ${repeatCount} times with the same arguments. This indicates a loop. Please try a different approach to accomplish your goal.`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return { isLoop: false };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Detect loop patterns in recent calls.
|
|
137
|
+
*/
|
|
138
|
+
detectLoop() {
|
|
139
|
+
// Pattern 1: Exact repeat (same tool+args N times in a row)
|
|
140
|
+
const exactRepeat = this.detectExactRepeat();
|
|
141
|
+
if (exactRepeat.isLoop) {
|
|
142
|
+
return exactRepeat;
|
|
143
|
+
}
|
|
144
|
+
// Pattern 2: Oscillation (A→B→A→B)
|
|
145
|
+
const oscillation = this.detectOscillation();
|
|
146
|
+
if (oscillation.isLoop) {
|
|
147
|
+
return oscillation;
|
|
148
|
+
}
|
|
149
|
+
return { isLoop: false };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Detect oscillation pattern: A→B→A→B.
|
|
153
|
+
*/
|
|
154
|
+
detectOscillation() {
|
|
155
|
+
// Need at least 4 calls for one oscillation cycle (A→B→A→B)
|
|
156
|
+
const minCalls = this.config.oscillationThreshold * 2;
|
|
157
|
+
if (this.recentCalls.length < minCalls) {
|
|
158
|
+
return { isLoop: false };
|
|
159
|
+
}
|
|
160
|
+
// Check for A→B→A→B pattern in the last 4 calls
|
|
161
|
+
const calls = this.recentCalls.slice(-4);
|
|
162
|
+
// A[0] == A[2] and B[1] == B[3] and A[0] != B[1]
|
|
163
|
+
if (this.signaturesMatch(calls[0], calls[2]) &&
|
|
164
|
+
this.signaturesMatch(calls[1], calls[3]) &&
|
|
165
|
+
!this.signaturesMatch(calls[0], calls[1])) {
|
|
166
|
+
return {
|
|
167
|
+
isLoop: true,
|
|
168
|
+
loopType: 'oscillation',
|
|
169
|
+
repeatCount: 2,
|
|
170
|
+
suggestion: `Detected oscillation pattern between "${calls[0].toolName}" and "${calls[1].toolName}". The agent is alternating between these two tools without making progress. Please try a different strategy.`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
return { isLoop: false };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Create a deterministic hash of tool arguments.
|
|
177
|
+
* Sorts keys to ensure consistent ordering.
|
|
178
|
+
*/
|
|
179
|
+
hashArgs(args) {
|
|
180
|
+
// Sort keys for deterministic serialization
|
|
181
|
+
const sortedKeys = Object.keys(args).sort();
|
|
182
|
+
const sortedArgs = {};
|
|
183
|
+
for (const key of sortedKeys) {
|
|
184
|
+
sortedArgs[key] = args[key];
|
|
185
|
+
}
|
|
186
|
+
return JSON.stringify(sortedArgs);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if two signatures represent the same tool call.
|
|
190
|
+
*/
|
|
191
|
+
signaturesMatch(a, b) {
|
|
192
|
+
return a.toolName === b.toolName && a.argsHash === b.argsHash;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ITokenizer } from '../../../../core/interfaces/cipher/i-tokenizer.js';
|
|
2
|
+
import type { InternalMessage } from '../../../../core/interfaces/cipher/message-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Count total tokens in a message array.
|
|
5
|
+
* Adapted from dexto's token counting logic for cipher context.
|
|
6
|
+
*
|
|
7
|
+
* This provides a comprehensive token count including:
|
|
8
|
+
* - Role metadata tokens
|
|
9
|
+
* - Text content tokens
|
|
10
|
+
* - Multimodal content tokens (images, files)
|
|
11
|
+
* - Tool call tokens
|
|
12
|
+
*
|
|
13
|
+
* @param messages - Array of internal messages
|
|
14
|
+
* @param tokenizer - Tokenizer for counting
|
|
15
|
+
* @returns Total token count
|
|
16
|
+
*/
|
|
17
|
+
export declare function countMessagesTokens(messages: InternalMessage[], tokenizer: ITokenizer): number;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Count tokens for a single content part
|
|
3
|
+
*
|
|
4
|
+
* @param part - Content part
|
|
5
|
+
* @param part.text - Text content (for text type)
|
|
6
|
+
* @param part.type - Type of content part
|
|
7
|
+
* @param tokenizer - Tokenizer for counting
|
|
8
|
+
* @returns Token count for the part
|
|
9
|
+
*/
|
|
10
|
+
function countPartTokens(part, tokenizer) {
|
|
11
|
+
switch (part.type) {
|
|
12
|
+
case 'file': {
|
|
13
|
+
// File content - rough estimate
|
|
14
|
+
// Similar to images, files can vary widely in token cost
|
|
15
|
+
return 100;
|
|
16
|
+
}
|
|
17
|
+
case 'image': {
|
|
18
|
+
// Image content - rough estimate
|
|
19
|
+
// Images are typically encoded and consume significant tokens
|
|
20
|
+
// Conservative estimate: ~100 tokens per image
|
|
21
|
+
return 100;
|
|
22
|
+
}
|
|
23
|
+
case 'text': {
|
|
24
|
+
// Text content - use tokenizer
|
|
25
|
+
return tokenizer.countTokens(part.text ?? '');
|
|
26
|
+
}
|
|
27
|
+
default: {
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Count tokens for message content
|
|
34
|
+
*
|
|
35
|
+
* @param content - Message content
|
|
36
|
+
* @param tokenizer - Tokenizer for counting
|
|
37
|
+
* @returns Token count for the content
|
|
38
|
+
*/
|
|
39
|
+
function countContentTokens(content, tokenizer) {
|
|
40
|
+
if (!content) {
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
if (typeof content === 'string') {
|
|
44
|
+
// String content - use tokenizer
|
|
45
|
+
return tokenizer.countTokens(content);
|
|
46
|
+
}
|
|
47
|
+
if (Array.isArray(content)) {
|
|
48
|
+
// Array of parts (text, images, files)
|
|
49
|
+
let tokens = 0;
|
|
50
|
+
for (const part of content) {
|
|
51
|
+
tokens += countPartTokens(part, tokenizer);
|
|
52
|
+
}
|
|
53
|
+
return tokens;
|
|
54
|
+
}
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Count total tokens in a message array.
|
|
59
|
+
* Adapted from dexto's token counting logic for cipher context.
|
|
60
|
+
*
|
|
61
|
+
* This provides a comprehensive token count including:
|
|
62
|
+
* - Role metadata tokens
|
|
63
|
+
* - Text content tokens
|
|
64
|
+
* - Multimodal content tokens (images, files)
|
|
65
|
+
* - Tool call tokens
|
|
66
|
+
*
|
|
67
|
+
* @param messages - Array of internal messages
|
|
68
|
+
* @param tokenizer - Tokenizer for counting
|
|
69
|
+
* @returns Total token count
|
|
70
|
+
*/
|
|
71
|
+
export function countMessagesTokens(messages, tokenizer) {
|
|
72
|
+
let totalTokens = 0;
|
|
73
|
+
for (const message of messages) {
|
|
74
|
+
// Role token overhead (estimated)
|
|
75
|
+
// Each message has role metadata that consumes tokens
|
|
76
|
+
totalTokens += 4;
|
|
77
|
+
// Content tokens
|
|
78
|
+
totalTokens += countContentTokens(message.content, tokenizer);
|
|
79
|
+
// Tool call tokens
|
|
80
|
+
if (message.toolCalls) {
|
|
81
|
+
for (const call of message.toolCalls) {
|
|
82
|
+
// Tool calls are serialized as JSON
|
|
83
|
+
const callJson = JSON.stringify(call);
|
|
84
|
+
totalTokens += tokenizer.countTokens(callJson);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return totalTokens;
|
|
89
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { MessageCreateParamsBase, MessageParam } from '@anthropic-ai/sdk/resources/messages';
|
|
2
|
+
import type { IMessageFormatter } from '../../../../core/interfaces/cipher/i-message-formatter.js';
|
|
3
|
+
import type { InternalMessage } from '../../../../core/interfaces/cipher/message-types.js';
|
|
4
|
+
export type { MessageParam as ClaudeMessage, Message as ClaudeResponse } from '@anthropic-ai/sdk/resources/messages';
|
|
5
|
+
export type ClaudeGenerationConfig = Pick<MessageCreateParamsBase, 'max_tokens' | 'system' | 'temperature' | 'tools'>;
|
|
6
|
+
/**
|
|
7
|
+
* Message formatter for Anthropic Claude API.
|
|
8
|
+
*
|
|
9
|
+
* Converts the internal message format to Claude's specific structure:
|
|
10
|
+
* - System prompts are NOT included in messages (handled separately in config)
|
|
11
|
+
* - Uses 'assistant' role (not 'model' like Gemini)
|
|
12
|
+
* - Tool calls use tool_use blocks with id and input
|
|
13
|
+
* - Tool results use tool_result blocks with tool_use_id
|
|
14
|
+
*/
|
|
15
|
+
export declare class ClaudeMessageFormatter implements IMessageFormatter<MessageParam> {
|
|
16
|
+
/**
|
|
17
|
+
* Formats internal messages into Claude's API format.
|
|
18
|
+
*
|
|
19
|
+
* IMPORTANT: System prompts are NOT included in the returned array.
|
|
20
|
+
* They should be passed separately via the config.system parameter.
|
|
21
|
+
*
|
|
22
|
+
* @param history Array of internal messages to format
|
|
23
|
+
* @param _systemPrompt System prompt (ignored - handled separately in config)
|
|
24
|
+
* @returns Array of MessageParam objects formatted for Claude's API
|
|
25
|
+
*/
|
|
26
|
+
format(history: Readonly<InternalMessage[]>, _systemPrompt?: null | string): MessageParam[];
|
|
27
|
+
/**
|
|
28
|
+
* Parses Claude API response into internal message objects.
|
|
29
|
+
*
|
|
30
|
+
* @param response The raw response from Claude API
|
|
31
|
+
* @returns Array of internal messages (typically one assistant message)
|
|
32
|
+
*/
|
|
33
|
+
parseResponse(response: unknown): InternalMessage[];
|
|
34
|
+
/**
|
|
35
|
+
* Formats assistant message to Claude's format.
|
|
36
|
+
* Uses 'assistant' role and includes both text and tool_use blocks.
|
|
37
|
+
*/
|
|
38
|
+
private formatAssistantMessage;
|
|
39
|
+
/**
|
|
40
|
+
* Formats tool result message to Claude's format.
|
|
41
|
+
* Tool results are sent as user messages with tool_result blocks.
|
|
42
|
+
*/
|
|
43
|
+
private formatToolResult;
|
|
44
|
+
/**
|
|
45
|
+
* Formats a single user content part.
|
|
46
|
+
* Currently supports text parts, with placeholders for image/file support.
|
|
47
|
+
*/
|
|
48
|
+
private formatUserContentPart;
|
|
49
|
+
/**
|
|
50
|
+
* Formats user message to Claude's format.
|
|
51
|
+
* Handles both simple string content and multimodal content blocks.
|
|
52
|
+
*/
|
|
53
|
+
private formatUserMessage;
|
|
54
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message formatter for Anthropic Claude API.
|
|
3
|
+
*
|
|
4
|
+
* Converts the internal message format to Claude's specific structure:
|
|
5
|
+
* - System prompts are NOT included in messages (handled separately in config)
|
|
6
|
+
* - Uses 'assistant' role (not 'model' like Gemini)
|
|
7
|
+
* - Tool calls use tool_use blocks with id and input
|
|
8
|
+
* - Tool results use tool_result blocks with tool_use_id
|
|
9
|
+
*/
|
|
10
|
+
export class ClaudeMessageFormatter {
|
|
11
|
+
/**
|
|
12
|
+
* Formats internal messages into Claude's API format.
|
|
13
|
+
*
|
|
14
|
+
* IMPORTANT: System prompts are NOT included in the returned array.
|
|
15
|
+
* They should be passed separately via the config.system parameter.
|
|
16
|
+
*
|
|
17
|
+
* @param history Array of internal messages to format
|
|
18
|
+
* @param _systemPrompt System prompt (ignored - handled separately in config)
|
|
19
|
+
* @returns Array of MessageParam objects formatted for Claude's API
|
|
20
|
+
*/
|
|
21
|
+
format(history, _systemPrompt) {
|
|
22
|
+
const messages = [];
|
|
23
|
+
// Note: System prompt is NOT added to messages for Claude
|
|
24
|
+
// It's passed separately via config.system parameter
|
|
25
|
+
for (const msg of history) {
|
|
26
|
+
switch (msg.role) {
|
|
27
|
+
case 'assistant': {
|
|
28
|
+
messages.push(this.formatAssistantMessage(msg));
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
case 'system': {
|
|
32
|
+
// Skip system messages - they should be in config.system
|
|
33
|
+
// Additional system messages in history are ignored
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
case 'tool': {
|
|
37
|
+
messages.push(this.formatToolResult(msg));
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
case 'user': {
|
|
41
|
+
messages.push(this.formatUserMessage(msg));
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return messages;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Parses Claude API response into internal message objects.
|
|
50
|
+
*
|
|
51
|
+
* @param response The raw response from Claude API
|
|
52
|
+
* @returns Array of internal messages (typically one assistant message)
|
|
53
|
+
*/
|
|
54
|
+
parseResponse(response) {
|
|
55
|
+
const typedResponse = response;
|
|
56
|
+
if (!typedResponse.content || typedResponse.content.length === 0) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
const textParts = [];
|
|
60
|
+
const toolUses = [];
|
|
61
|
+
// Extract text and tool uses from response content blocks
|
|
62
|
+
for (const block of typedResponse.content) {
|
|
63
|
+
if (block.type === 'text') {
|
|
64
|
+
textParts.push(block.text);
|
|
65
|
+
}
|
|
66
|
+
else if (block.type === 'tool_use') {
|
|
67
|
+
toolUses.push(block);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Convert to internal message format
|
|
71
|
+
const toolCalls = toolUses.length > 0
|
|
72
|
+
? toolUses.map((tu) => ({
|
|
73
|
+
function: {
|
|
74
|
+
arguments: JSON.stringify(tu.input),
|
|
75
|
+
name: tu.name,
|
|
76
|
+
},
|
|
77
|
+
id: tu.id,
|
|
78
|
+
type: 'function',
|
|
79
|
+
}))
|
|
80
|
+
: undefined;
|
|
81
|
+
return [
|
|
82
|
+
{
|
|
83
|
+
content: textParts.join('') || null,
|
|
84
|
+
role: 'assistant',
|
|
85
|
+
toolCalls,
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Formats assistant message to Claude's format.
|
|
91
|
+
* Uses 'assistant' role and includes both text and tool_use blocks.
|
|
92
|
+
*/
|
|
93
|
+
formatAssistantMessage(msg) {
|
|
94
|
+
const contentBlocks = [];
|
|
95
|
+
// Add text content if present
|
|
96
|
+
if (msg.content) {
|
|
97
|
+
contentBlocks.push({
|
|
98
|
+
text: String(msg.content),
|
|
99
|
+
type: 'text',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// Add tool calls if present
|
|
103
|
+
if (msg.toolCalls) {
|
|
104
|
+
for (const tc of msg.toolCalls) {
|
|
105
|
+
contentBlocks.push({
|
|
106
|
+
id: tc.id,
|
|
107
|
+
input: JSON.parse(tc.function.arguments),
|
|
108
|
+
name: tc.function.name,
|
|
109
|
+
type: 'tool_use',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
content: contentBlocks,
|
|
115
|
+
role: 'assistant',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Formats tool result message to Claude's format.
|
|
120
|
+
* Tool results are sent as user messages with tool_result blocks.
|
|
121
|
+
*/
|
|
122
|
+
formatToolResult(msg) {
|
|
123
|
+
return {
|
|
124
|
+
content: [
|
|
125
|
+
{
|
|
126
|
+
content: String(msg.content ?? ''),
|
|
127
|
+
tool_use_id: msg.toolCallId ?? '',
|
|
128
|
+
type: 'tool_result',
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
role: 'user',
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Formats a single user content part.
|
|
136
|
+
* Currently supports text parts, with placeholders for image/file support.
|
|
137
|
+
*/
|
|
138
|
+
formatUserContentPart(part) {
|
|
139
|
+
if (part.type === 'text') {
|
|
140
|
+
return { text: part.text, type: 'text' };
|
|
141
|
+
}
|
|
142
|
+
if (part.type === 'image') {
|
|
143
|
+
// Image support not yet implemented for Claude
|
|
144
|
+
// Claude supports images via base64 encoded data
|
|
145
|
+
return { text: '[Image not yet supported]', type: 'text' };
|
|
146
|
+
}
|
|
147
|
+
if (part.type === 'file') {
|
|
148
|
+
// File support not yet implemented for Claude
|
|
149
|
+
return { text: '[File not yet supported]', type: 'text' };
|
|
150
|
+
}
|
|
151
|
+
return { text: '[Unknown content type]', type: 'text' };
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Formats user message to Claude's format.
|
|
155
|
+
* Handles both simple string content and multimodal content blocks.
|
|
156
|
+
*/
|
|
157
|
+
formatUserMessage(msg) {
|
|
158
|
+
if (typeof msg.content === 'string') {
|
|
159
|
+
// Simple text message
|
|
160
|
+
return {
|
|
161
|
+
content: msg.content,
|
|
162
|
+
role: 'user',
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
if (Array.isArray(msg.content)) {
|
|
166
|
+
// Multimodal content (text, images, files)
|
|
167
|
+
const contentBlocks = [];
|
|
168
|
+
for (const part of msg.content) {
|
|
169
|
+
contentBlocks.push(this.formatUserContentPart(part));
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
content: contentBlocks,
|
|
173
|
+
role: 'user',
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// Empty content
|
|
177
|
+
return {
|
|
178
|
+
content: '',
|
|
179
|
+
role: 'user',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { Content } from '@google/genai';
|
|
2
|
+
import type { IMessageFormatter } from '../../../../core/interfaces/cipher/i-message-formatter.js';
|
|
3
|
+
import type { InternalMessage } from '../../../../core/interfaces/cipher/message-types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Message formatter for Google Gemini API.
|
|
6
|
+
*
|
|
7
|
+
* Converts the internal message format to Gemini's specific structure:
|
|
8
|
+
* - Maps 'assistant' role to 'model' (Gemini's terminology)
|
|
9
|
+
* - System prompts are injected as user messages (Gemini doesn't have system role)
|
|
10
|
+
* - Tool calls use functionCall parts
|
|
11
|
+
* - Tool results use functionResponse parts in user messages
|
|
12
|
+
*/
|
|
13
|
+
export declare class GeminiMessageFormatter implements IMessageFormatter<Content> {
|
|
14
|
+
/**
|
|
15
|
+
* Formats internal messages into Gemini's API format.
|
|
16
|
+
*
|
|
17
|
+
* @param history Array of internal messages to format
|
|
18
|
+
* @param systemPrompt Optional system prompt to include at the beginning
|
|
19
|
+
* @returns Array of Content objects formatted for Gemini's API
|
|
20
|
+
*/
|
|
21
|
+
format(history: Readonly<InternalMessage[]>, systemPrompt?: null | string): Content[];
|
|
22
|
+
/**
|
|
23
|
+
* Parses Gemini API response into internal message objects.
|
|
24
|
+
*
|
|
25
|
+
* @param response The raw response from Gemini API
|
|
26
|
+
* @returns Array of internal messages (typically one assistant message)
|
|
27
|
+
*/
|
|
28
|
+
parseResponse(response: unknown): InternalMessage[];
|
|
29
|
+
/**
|
|
30
|
+
* Combines multiple tool results into a single Gemini user message.
|
|
31
|
+
* Required by Gemini API when assistant made multiple tool calls.
|
|
32
|
+
*/
|
|
33
|
+
private combineToolResults;
|
|
34
|
+
/**
|
|
35
|
+
* Formats assistant message to Gemini's Content format.
|
|
36
|
+
* Maps 'assistant' role to 'model' and includes both text and tool calls.
|
|
37
|
+
*/
|
|
38
|
+
private formatAssistantMessage;
|
|
39
|
+
/**
|
|
40
|
+
* Formats a single non-tool message to Gemini Content.
|
|
41
|
+
*/
|
|
42
|
+
private formatNonToolMessage;
|
|
43
|
+
/**
|
|
44
|
+
* Formats a single tool result message to a Gemini functionResponse Part.
|
|
45
|
+
* Multiple tool results are combined into a single user message by format().
|
|
46
|
+
*
|
|
47
|
+
* Note: msg.content is a JSON string from ToolOutputProcessor.
|
|
48
|
+
* We need to parse it back to an object for Gemini's API.
|
|
49
|
+
*/
|
|
50
|
+
private formatToolResultPart;
|
|
51
|
+
/**
|
|
52
|
+
* Formats a single user content part.
|
|
53
|
+
* Currently supports text parts, with placeholders for image/file support.
|
|
54
|
+
*/
|
|
55
|
+
private formatUserContentPart;
|
|
56
|
+
/**
|
|
57
|
+
* Formats user message to Gemini's Content format.
|
|
58
|
+
* Handles both simple string content and multimodal content parts.
|
|
59
|
+
*/
|
|
60
|
+
private formatUserMessage;
|
|
61
|
+
/**
|
|
62
|
+
* Generates a unique tool call ID.
|
|
63
|
+
* Gemini doesn't provide tool call IDs, so we generate them.
|
|
64
|
+
*
|
|
65
|
+
* @param toolName The name of the tool being called
|
|
66
|
+
* @returns A unique identifier for the tool call
|
|
67
|
+
*/
|
|
68
|
+
private generateToolCallId;
|
|
69
|
+
}
|