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,548 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code Raw Service
|
|
3
|
+
* Consolidates ClaudeCodeParser + ClaudeRawParser
|
|
4
|
+
* Parses JSONL transcript files from ~/.claude/projects/
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
7
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
8
|
+
import path, { basename, join } from 'node:path';
|
|
9
|
+
/**
|
|
10
|
+
* Constants
|
|
11
|
+
*/
|
|
12
|
+
const CLAUDE_PROJECTS_PATH = '/.claude/projects/';
|
|
13
|
+
const JSONL_FILE_EXTENSION = '.jsonl';
|
|
14
|
+
const COMBINED_FILE_SUFFIX = '-combined';
|
|
15
|
+
const FILE_SIZE_DECIMAL_PLACES = 1;
|
|
16
|
+
const TITLE_MAX_LENGTH = 100;
|
|
17
|
+
const MESSAGES = {
|
|
18
|
+
CLAUDE_FOLDER_NAME: '📁 Claude folder name:',
|
|
19
|
+
CUSTOM_DIRECTORY: '📁 Custom directory:',
|
|
20
|
+
DEFAULT_SESSION_TITLE: 'Claude Code Session',
|
|
21
|
+
ERROR_PARSING: '❌ Error during parsing:',
|
|
22
|
+
EXPORT_COMPLETE: '🎉 Claude Code export complete! Sessions exported to:',
|
|
23
|
+
EXPORTING: '💾 Exporting sessions...',
|
|
24
|
+
FAILED_PARSE_DIR: 'Failed to parse directory:',
|
|
25
|
+
FAILED_PARSE_LOG: 'Failed to parse Claude Code log:',
|
|
26
|
+
INVALID_LOG_PATH: 'Invalid Claude Code log path:',
|
|
27
|
+
NO_ENTRIES_FOUND: 'No valid entries found in',
|
|
28
|
+
NO_SESSIONS: 'ℹ️ No Claude Code sessions found',
|
|
29
|
+
PARSE_ERROR: 'Parse error',
|
|
30
|
+
PARSING_START: '🔍 Starting Claude Code conversation parsing...',
|
|
31
|
+
SESSION_EXPORTED: '✅',
|
|
32
|
+
SESSIONS_FAILED: 'Failed to parse some logs:',
|
|
33
|
+
SESSIONS_FOUND: 'Found',
|
|
34
|
+
SYSTEM_MESSAGE: 'System message',
|
|
35
|
+
UNKNOWN_ERROR: 'Unknown error',
|
|
36
|
+
UNKNOWN_REPO: 'unknown',
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Claude Raw Service - Wraps parser and handles file I/O and output management
|
|
40
|
+
*/
|
|
41
|
+
export class ClaudeRawService {
|
|
42
|
+
ide;
|
|
43
|
+
/**
|
|
44
|
+
* Initialize Claude Raw Service
|
|
45
|
+
*
|
|
46
|
+
* @param ide - The IDE type (Claude Code)
|
|
47
|
+
*/
|
|
48
|
+
constructor(ide) {
|
|
49
|
+
this.ide = ide;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Main entry point - Parse Claude Code sessions from a custom directory
|
|
53
|
+
*
|
|
54
|
+
* Parses all JSONL transcript files from a custom Claude projects directory,
|
|
55
|
+
* extracts session information, and writes normalized JSON files to output directory.
|
|
56
|
+
* Organizes output by Claude project folder name. Returns success status.
|
|
57
|
+
*
|
|
58
|
+
* @param customDir - Path to directory containing Claude Code session files
|
|
59
|
+
* @param outputDir - Optional output directory (defaults to process.cwd()/.brv/logs/{ide}/raw)
|
|
60
|
+
* @returns Promise resolving to true if parsing succeeded, false otherwise
|
|
61
|
+
*/
|
|
62
|
+
async parse(customDir, outputDir) {
|
|
63
|
+
const baseOutputDir = this.getOutputDir(this.ide, outputDir);
|
|
64
|
+
console.log(MESSAGES.PARSING_START);
|
|
65
|
+
console.log(`${MESSAGES.CUSTOM_DIRECTORY} ${customDir}`);
|
|
66
|
+
// Extract Claude folder name from customDir
|
|
67
|
+
// customDir is like: /Users/datpham/.claude/projects/-Users-datpham-dpmemories-byterover-cli
|
|
68
|
+
// We want to use: -Users-datpham-dpmemories-byterover-cli as the project folder name
|
|
69
|
+
const claudeFolderName = basename(customDir);
|
|
70
|
+
console.log(`${MESSAGES.CLAUDE_FOLDER_NAME} ${claudeFolderName}`);
|
|
71
|
+
// Create output directory
|
|
72
|
+
if (!existsSync(baseOutputDir)) {
|
|
73
|
+
mkdirSync(baseOutputDir, { recursive: true });
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
// Parse sessions from custom directory
|
|
77
|
+
const sessions = await this.parseSessionDirectory(customDir);
|
|
78
|
+
if (sessions.length === 0) {
|
|
79
|
+
console.log(MESSAGES.NO_SESSIONS);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
console.log(`\n${MESSAGES.SESSION_EXPORTED} ${MESSAGES.SESSIONS_FOUND} ${sessions.length} sessions`);
|
|
83
|
+
// Export sessions organized by Claude project folder name
|
|
84
|
+
console.log(`\n${MESSAGES.EXPORTING}`);
|
|
85
|
+
// Create project-specific directory using Claude folder name
|
|
86
|
+
const projectDir = this.createSubdirectory(baseOutputDir, claudeFolderName);
|
|
87
|
+
for (const session of sessions) {
|
|
88
|
+
const filename = `${session.id}.json`;
|
|
89
|
+
const filepath = path.join(projectDir, filename);
|
|
90
|
+
writeFileSync(filepath, JSON.stringify(session, null, 2));
|
|
91
|
+
const fileSize = readFileSync(filepath).length;
|
|
92
|
+
const fileSizeKb = (fileSize / 1024).toFixed(FILE_SIZE_DECIMAL_PLACES);
|
|
93
|
+
console.log(` ${MESSAGES.SESSION_EXPORTED} ${session.title} (${fileSizeKb} KB)`);
|
|
94
|
+
}
|
|
95
|
+
console.log(`\n${MESSAGES.EXPORT_COMPLETE} ${outputDir}`);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error(`${MESSAGES.ERROR_PARSING}`, error);
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Calculate aggregate session metadata from transcript entries
|
|
105
|
+
*
|
|
106
|
+
* Aggregates token usage (input, output, cache), counts message types, extracts workspace,
|
|
107
|
+
* workspace path, and timestamps. Returns comprehensive metadata about the session including
|
|
108
|
+
* duration, token costs, and message counts for analysis and reporting.
|
|
109
|
+
*
|
|
110
|
+
* @param entries - Array of transcript entries from JSONL file
|
|
111
|
+
* @param messages - Parsed messages array (for count verification)
|
|
112
|
+
* @param logPath - Log file path (used to extract workspace information)
|
|
113
|
+
* @returns RawClaudeSessionMetadata object with aggregated statistics
|
|
114
|
+
*/
|
|
115
|
+
calculateMetadata(entries, messages, logPath) {
|
|
116
|
+
let inputTokens = 0;
|
|
117
|
+
let outputTokens = 0;
|
|
118
|
+
let cacheTokens = 0;
|
|
119
|
+
let userCount = 0;
|
|
120
|
+
let assistantCount = 0;
|
|
121
|
+
let cwd;
|
|
122
|
+
for (const entry of entries) {
|
|
123
|
+
if (entry.message?.usage) {
|
|
124
|
+
inputTokens += entry.message.usage.input_tokens || 0;
|
|
125
|
+
outputTokens += entry.message.usage.output_tokens || 0;
|
|
126
|
+
cacheTokens += entry.message.usage.cache_creation_input_tokens || 0;
|
|
127
|
+
cacheTokens += entry.message.usage.cache_read_input_tokens || 0;
|
|
128
|
+
}
|
|
129
|
+
if (entry.type === 'user')
|
|
130
|
+
userCount++;
|
|
131
|
+
if (entry.type === 'assistant')
|
|
132
|
+
assistantCount++;
|
|
133
|
+
// Capture cwd from the first entry that has it
|
|
134
|
+
if (!cwd && entry.cwd) {
|
|
135
|
+
cwd = entry.cwd;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const { endedAt, startedAt } = this.extractTimestamps(entries);
|
|
139
|
+
const duration = new Date(endedAt || new Date()).getTime() - new Date(startedAt).getTime();
|
|
140
|
+
const metadata = {
|
|
141
|
+
assistantMessageCount: assistantCount,
|
|
142
|
+
duration,
|
|
143
|
+
endedAt,
|
|
144
|
+
messageCount: messages.length,
|
|
145
|
+
sessionId: this.extractSessionId(logPath),
|
|
146
|
+
startedAt,
|
|
147
|
+
tokenUsage: {
|
|
148
|
+
cacheTokens: cacheTokens > 0 ? cacheTokens : undefined,
|
|
149
|
+
inputTokens,
|
|
150
|
+
outputTokens,
|
|
151
|
+
totalTokens: inputTokens + outputTokens,
|
|
152
|
+
},
|
|
153
|
+
userMessageCount: userCount,
|
|
154
|
+
workspace: this.extractWorkspace(logPath),
|
|
155
|
+
};
|
|
156
|
+
// Only include cwd if it has a value
|
|
157
|
+
if (cwd) {
|
|
158
|
+
metadata.cwd = cwd;
|
|
159
|
+
}
|
|
160
|
+
return metadata;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Convert Claude Code transcript entries to normalized messages
|
|
164
|
+
*
|
|
165
|
+
* Transforms raw JSONL transcript entries (user, assistant, system) into standardized
|
|
166
|
+
* RawClaudeRawMessage objects with preserved content, timestamps, and token counts.
|
|
167
|
+
* Filters out invalid entries without content.
|
|
168
|
+
*
|
|
169
|
+
* @param entries - Array of RawClaudeTranscriptEntry objects from JSONL file
|
|
170
|
+
* @returns Array of normalized RawClaudeRawMessage objects
|
|
171
|
+
*/
|
|
172
|
+
convertToMessages(entries) {
|
|
173
|
+
const messages = [];
|
|
174
|
+
for (const entry of entries) {
|
|
175
|
+
if (entry.type === 'user' && entry.message) {
|
|
176
|
+
messages.push(this.createMessageFromEntry(entry, 'user'));
|
|
177
|
+
}
|
|
178
|
+
else if (entry.type === 'assistant' && entry.message) {
|
|
179
|
+
messages.push(this.createMessageFromEntry(entry, 'assistant'));
|
|
180
|
+
}
|
|
181
|
+
else if (entry.type === 'system') {
|
|
182
|
+
messages.push(this.createSystemMessage(entry));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return messages;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Create normalized message from transcript entry
|
|
189
|
+
*
|
|
190
|
+
* Converts a single transcript entry (user or assistant) into a normalized message.
|
|
191
|
+
* Extracts content blocks, preserving array structure for multi-block content but
|
|
192
|
+
* converting single text blocks to plain strings for backward compatibility.
|
|
193
|
+
* Includes token counts if available and preserves cwd if present.
|
|
194
|
+
*
|
|
195
|
+
* @param entry - Transcript entry with message content
|
|
196
|
+
* @param type - Message type: 'user' or 'assistant'
|
|
197
|
+
* @returns Normalized RawClaudeRawMessage object
|
|
198
|
+
* @throws Error if message field is missing
|
|
199
|
+
*/
|
|
200
|
+
createMessageFromEntry(entry, type) {
|
|
201
|
+
const { message } = entry;
|
|
202
|
+
if (!message) {
|
|
203
|
+
throw new Error(`Message required for ${type} entry`);
|
|
204
|
+
}
|
|
205
|
+
// Preserve content as array of blocks instead of converting to string
|
|
206
|
+
const contentBlocks = this.extractContentBlocks(message.content);
|
|
207
|
+
const isSingleTextBlock = contentBlocks.length === 1 && contentBlocks[0].type === 'text' && 'text' in contentBlocks[0];
|
|
208
|
+
const result = {
|
|
209
|
+
content: isSingleTextBlock
|
|
210
|
+
? contentBlocks[0].text
|
|
211
|
+
: contentBlocks,
|
|
212
|
+
timestamp: entry.timestamp || new Date().toISOString(),
|
|
213
|
+
tokens: message.usage
|
|
214
|
+
? {
|
|
215
|
+
input: message.usage.input_tokens || 0,
|
|
216
|
+
output: message.usage.output_tokens || 0,
|
|
217
|
+
}
|
|
218
|
+
: undefined,
|
|
219
|
+
type,
|
|
220
|
+
};
|
|
221
|
+
// Only include cwd if it has a value
|
|
222
|
+
if (entry.cwd) {
|
|
223
|
+
result.cwd = entry.cwd;
|
|
224
|
+
}
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Create or get subdirectory within output directory
|
|
229
|
+
*
|
|
230
|
+
* Creates a subdirectory within the output directory if it doesn't exist.
|
|
231
|
+
* Uses recursive mode to create parent directories as needed.
|
|
232
|
+
*
|
|
233
|
+
* @param outputDir - Base output directory path
|
|
234
|
+
* @param subdirName - Name of subdirectory to create
|
|
235
|
+
* @returns Full path to the created or existing subdirectory
|
|
236
|
+
*/
|
|
237
|
+
createSubdirectory(outputDir, subdirName) {
|
|
238
|
+
const subdir = path.join(outputDir, subdirName);
|
|
239
|
+
if (!existsSync(subdir)) {
|
|
240
|
+
mkdirSync(subdir, { recursive: true });
|
|
241
|
+
}
|
|
242
|
+
return subdir;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Create system message from transcript entry
|
|
246
|
+
*
|
|
247
|
+
* Converts a system-type transcript entry into a normalized message object.
|
|
248
|
+
* System messages typically contain metadata or initial instructions.
|
|
249
|
+
* Preserves cwd if present in the entry.
|
|
250
|
+
*
|
|
251
|
+
* @param entry - Transcript entry with type='system'
|
|
252
|
+
* @returns Normalized RawClaudeRawMessage with type='system'
|
|
253
|
+
*/
|
|
254
|
+
createSystemMessage(entry) {
|
|
255
|
+
const result = {
|
|
256
|
+
content: entry.content || MESSAGES.SYSTEM_MESSAGE,
|
|
257
|
+
timestamp: entry.timestamp || new Date().toISOString(),
|
|
258
|
+
type: 'system',
|
|
259
|
+
};
|
|
260
|
+
// Only include cwd if it has a value
|
|
261
|
+
if (entry.cwd) {
|
|
262
|
+
result.cwd = entry.cwd;
|
|
263
|
+
}
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Extract and normalize content blocks from message
|
|
268
|
+
*
|
|
269
|
+
* Handles multiple content formats: null/undefined (empty array), strings (wrapped as text block),
|
|
270
|
+
* arrays of blocks/strings (normalized to ContentBlock array), objects with type (treated as block),
|
|
271
|
+
* and other objects (stringified as text). Produces consistent ContentBlock array output.
|
|
272
|
+
*
|
|
273
|
+
* @param content - Raw message content in various formats
|
|
274
|
+
* @returns Array of normalized ContentBlock objects
|
|
275
|
+
*/
|
|
276
|
+
extractContentBlocks(content) {
|
|
277
|
+
// If content is null or undefined, return empty array
|
|
278
|
+
if (content === null || content === undefined) {
|
|
279
|
+
return [];
|
|
280
|
+
}
|
|
281
|
+
// If content is a string, wrap it as a text block
|
|
282
|
+
if (typeof content === 'string') {
|
|
283
|
+
return [{ text: content, type: 'text' }];
|
|
284
|
+
}
|
|
285
|
+
// If content is already an array of blocks
|
|
286
|
+
if (Array.isArray(content)) {
|
|
287
|
+
const blocks = [];
|
|
288
|
+
for (const block of content) {
|
|
289
|
+
if (typeof block === 'string') {
|
|
290
|
+
blocks.push({ text: block, type: 'text' });
|
|
291
|
+
}
|
|
292
|
+
else if (block && typeof block === 'object' && 'type' in block) {
|
|
293
|
+
// It's a valid block with a type field
|
|
294
|
+
blocks.push(block);
|
|
295
|
+
}
|
|
296
|
+
else if (block && typeof block === 'object') {
|
|
297
|
+
// Fallback: wrap as text
|
|
298
|
+
blocks.push({ text: JSON.stringify(block), type: 'text' });
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return blocks;
|
|
302
|
+
}
|
|
303
|
+
// If it's an object, try to handle it as a content block or stringify
|
|
304
|
+
if (typeof content === 'object') {
|
|
305
|
+
if ('type' in content) {
|
|
306
|
+
return [content];
|
|
307
|
+
}
|
|
308
|
+
return [{ text: JSON.stringify(content), type: 'text' }];
|
|
309
|
+
}
|
|
310
|
+
// Fallback for any other type
|
|
311
|
+
return [{ text: String(content), type: 'text' }];
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Extract session ID from Claude Code log file path
|
|
315
|
+
*
|
|
316
|
+
* Parses the filename from the log path to extract the session ID.
|
|
317
|
+
* Claude Code session IDs are typically UUIDs in the JSONL filename.
|
|
318
|
+
* Removes the .jsonl extension to get the session ID.
|
|
319
|
+
*
|
|
320
|
+
* @param logPath - Path to Claude Code session log file
|
|
321
|
+
* @returns Session ID extracted from the filename
|
|
322
|
+
*/
|
|
323
|
+
extractSessionId(logPath) {
|
|
324
|
+
// Claude Code session IDs are typically UUIDs in the filename
|
|
325
|
+
// Format: ~/.claude/projects/-path-to-project/{session-id}.jsonl
|
|
326
|
+
const parts = logPath.split('/');
|
|
327
|
+
const filename = parts.at(-1) || '';
|
|
328
|
+
return filename.replace(JSONL_FILE_EXTENSION, '');
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Extract and sort session start and end timestamps
|
|
332
|
+
*
|
|
333
|
+
* Collects timestamps from transcript entries, filters out empty values,
|
|
334
|
+
* sorts them chronologically, and returns first (startedAt) and last (endedAt).
|
|
335
|
+
* Returns default current timestamp if no valid timestamps found.
|
|
336
|
+
*
|
|
337
|
+
* @param entries - Array of transcript entries with optional timestamp fields
|
|
338
|
+
* @returns RawClaudeTimestamps object with startedAt and optional endedAt ISO timestamp strings
|
|
339
|
+
*/
|
|
340
|
+
extractTimestamps(entries) {
|
|
341
|
+
const validTimestamps = entries
|
|
342
|
+
.filter((e) => e.timestamp)
|
|
343
|
+
.map((e) => e.timestamp || '')
|
|
344
|
+
.filter((t) => t.trim().length > 0)
|
|
345
|
+
.sort();
|
|
346
|
+
return {
|
|
347
|
+
endedAt: validTimestamps.at(-1),
|
|
348
|
+
startedAt: validTimestamps[0] || new Date().toISOString(),
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Extract session title from first user message
|
|
353
|
+
*
|
|
354
|
+
* Uses the first line of the first user message as the session title.
|
|
355
|
+
* Truncates to TITLE_MAX_LENGTH (100 chars) and appends "..." if truncated.
|
|
356
|
+
* Returns default title if no user messages found or first message is not text.
|
|
357
|
+
*
|
|
358
|
+
* @param messages - Array of parsed session messages
|
|
359
|
+
* @returns Session title string (max 100 characters)
|
|
360
|
+
*/
|
|
361
|
+
extractTitle(messages) {
|
|
362
|
+
// Use first user message as title
|
|
363
|
+
const firstUserMessage = messages.find((m) => m.type === 'user');
|
|
364
|
+
if (firstUserMessage && typeof firstUserMessage.content === 'string') {
|
|
365
|
+
const text = firstUserMessage.content;
|
|
366
|
+
const lines = text.split('\n').filter((l) => l.trim());
|
|
367
|
+
if (lines.length > 0) {
|
|
368
|
+
const title = lines[0].slice(0, Math.max(0, TITLE_MAX_LENGTH));
|
|
369
|
+
return title.length === TITLE_MAX_LENGTH ? title + '...' : title;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return MESSAGES.DEFAULT_SESSION_TITLE;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Extract workspace information from Claude Code log file path
|
|
376
|
+
*
|
|
377
|
+
* Parses the log path to extract workspace information. Claude Code stores projects
|
|
378
|
+
* in ~/.claude/projects/-path-to-workspace format where slashes are replaced with dashes.
|
|
379
|
+
* Extracts and reconstructs the original workspace path and repository name.
|
|
380
|
+
* Returns default path object if extraction fails.
|
|
381
|
+
*
|
|
382
|
+
* @param logPath - Claude Code session log file path
|
|
383
|
+
* @returns RawClaudeWorkspaceMetadata with workspace path and optional repository name/url
|
|
384
|
+
*/
|
|
385
|
+
extractWorkspace(logPath) {
|
|
386
|
+
// Claude Code stores projects in ~/.claude/projects/-path-to-workspace
|
|
387
|
+
// Extract the workspace path from the CLAUDE_PROJECTS_PATH directory name
|
|
388
|
+
try {
|
|
389
|
+
const match = logPath.match(/\.claude\/projects\/(.*?)\//);
|
|
390
|
+
if (match && match[1]) {
|
|
391
|
+
// Convert -path-to-workspace back to /path/to/workspace
|
|
392
|
+
const projectName = match[1];
|
|
393
|
+
const workspacePath = projectName.startsWith('-')
|
|
394
|
+
? projectName.slice(1).replaceAll('-', '/')
|
|
395
|
+
: projectName;
|
|
396
|
+
return {
|
|
397
|
+
path: `/${workspacePath}`,
|
|
398
|
+
repository: {
|
|
399
|
+
name: workspacePath.split('/').pop() || MESSAGES.UNKNOWN_REPO,
|
|
400
|
+
},
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
catch {
|
|
405
|
+
// Fall through to default
|
|
406
|
+
}
|
|
407
|
+
return {
|
|
408
|
+
path: logPath,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Get the output directory path for raw parser results
|
|
413
|
+
*
|
|
414
|
+
* Returns the standardized output directory path for storing raw parsed sessions.
|
|
415
|
+
* Directory is relative to current working directory under .brv/logs/{ide}/raw
|
|
416
|
+
*
|
|
417
|
+
* @param ide - IDE agent type (used as directory component)
|
|
418
|
+
* @param override - Optional custom output directory (overrides default)
|
|
419
|
+
* @returns Full path to raw output directory
|
|
420
|
+
*/
|
|
421
|
+
getOutputDir(ide, override) {
|
|
422
|
+
return override || path.join(process.cwd(), `.brv/logs/${ide}/raw`);
|
|
423
|
+
}
|
|
424
|
+
// ============================================================================
|
|
425
|
+
// Private Metadata Helpers
|
|
426
|
+
// ============================================================================
|
|
427
|
+
/**
|
|
428
|
+
* Parse all Claude Code session logs in a directory
|
|
429
|
+
*
|
|
430
|
+
* Finds all JSONL files in the directory (excluding combined files), parses them in parallel,
|
|
431
|
+
* and returns array of successfully parsed sessions sorted by start time.
|
|
432
|
+
* Collects and reports any parse errors without failing completely.
|
|
433
|
+
*
|
|
434
|
+
* @param dirPath - Path to directory containing JSONL session files
|
|
435
|
+
* @returns Promise resolving to array of parsed RawClaudeRawSession objects
|
|
436
|
+
* @throws Error if directory cannot be read
|
|
437
|
+
*/
|
|
438
|
+
async parseSessionDirectory(dirPath) {
|
|
439
|
+
try {
|
|
440
|
+
const files = await readdir(dirPath, { recursive: false });
|
|
441
|
+
const jsonlFiles = files.filter((f) => typeof f === 'string' && f.endsWith(JSONL_FILE_EXTENSION) && !f.includes(COMBINED_FILE_SUFFIX));
|
|
442
|
+
const errors = [];
|
|
443
|
+
// Parse all files in parallel
|
|
444
|
+
const parsePromises = jsonlFiles.map(async (file) => {
|
|
445
|
+
try {
|
|
446
|
+
const fullPath = join(dirPath, file);
|
|
447
|
+
return await this.parseSessionLog(fullPath);
|
|
448
|
+
}
|
|
449
|
+
catch (error) {
|
|
450
|
+
errors.push(`${file}: ${error instanceof Error ? error.message : MESSAGES.UNKNOWN_ERROR}`);
|
|
451
|
+
return null;
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
const results = await Promise.all(parsePromises);
|
|
455
|
+
const sessions = results.filter((session) => session !== null);
|
|
456
|
+
if (sessions.length === 0 && errors.length > 0) {
|
|
457
|
+
console.warn(`${MESSAGES.SESSIONS_FAILED} ${errors.join(', ')}`);
|
|
458
|
+
}
|
|
459
|
+
// Sort by start time
|
|
460
|
+
sessions.sort((a, b) => a.metadata.startedAt.localeCompare(b.metadata.startedAt));
|
|
461
|
+
return sessions;
|
|
462
|
+
}
|
|
463
|
+
catch (error) {
|
|
464
|
+
throw new Error(`${MESSAGES.FAILED_PARSE_DIR} ${error instanceof Error ? error.message : MESSAGES.UNKNOWN_ERROR}`);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Parse a single Claude Code session log file
|
|
469
|
+
*
|
|
470
|
+
* Validates log file format, reads JSONL content, parses each line as a transcript entry,
|
|
471
|
+
* converts entries to messages, calculates session metadata, and extracts session title.
|
|
472
|
+
* Throws detailed error if log file is invalid or unparseable.
|
|
473
|
+
*
|
|
474
|
+
* @param logPath - Absolute path to Claude Code session JSONL file
|
|
475
|
+
* @returns Promise resolving to parsed RawClaudeRawSession object
|
|
476
|
+
* @throws Error if file is invalid or cannot be parsed
|
|
477
|
+
*/
|
|
478
|
+
async parseSessionLog(logPath) {
|
|
479
|
+
try {
|
|
480
|
+
// Validate first
|
|
481
|
+
const valid = await this.validateLogFile(logPath);
|
|
482
|
+
if (!valid) {
|
|
483
|
+
throw new Error(`${MESSAGES.INVALID_LOG_PATH} ${logPath}`);
|
|
484
|
+
}
|
|
485
|
+
// Read and parse JSONL file
|
|
486
|
+
const content = await readFile(logPath, 'utf8');
|
|
487
|
+
const lines = content.trim().split('\n').filter((l) => l.trim());
|
|
488
|
+
const entries = [];
|
|
489
|
+
const parseErrors = [];
|
|
490
|
+
for (const [i, line] of lines.entries()) {
|
|
491
|
+
try {
|
|
492
|
+
const entry = JSON.parse(line);
|
|
493
|
+
entries.push(entry);
|
|
494
|
+
}
|
|
495
|
+
catch (error) {
|
|
496
|
+
parseErrors.push(`Line ${i + 1}: ${error instanceof Error ? error.message : MESSAGES.PARSE_ERROR}`);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
if (entries.length === 0) {
|
|
500
|
+
throw new Error(`${MESSAGES.NO_ENTRIES_FOUND} ${logPath}`);
|
|
501
|
+
}
|
|
502
|
+
// Extract session info
|
|
503
|
+
const sessionId = this.extractSessionId(logPath);
|
|
504
|
+
const messages = this.convertToMessages(entries);
|
|
505
|
+
const metadata = this.calculateMetadata(entries, messages, logPath);
|
|
506
|
+
const title = this.extractTitle(messages);
|
|
507
|
+
return {
|
|
508
|
+
id: sessionId,
|
|
509
|
+
messages,
|
|
510
|
+
metadata,
|
|
511
|
+
timestamp: new Date(metadata.startedAt).getTime(),
|
|
512
|
+
title,
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
throw new Error(`${MESSAGES.FAILED_PARSE_LOG} ${error instanceof Error ? error.message : MESSAGES.UNKNOWN_ERROR}`);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Validate Claude Code log file format and existence
|
|
521
|
+
*
|
|
522
|
+
* Checks three validation criteria:
|
|
523
|
+
* 1. Path contains /.claude/projects/ directory marker
|
|
524
|
+
* 2. File has .jsonl extension
|
|
525
|
+
* 3. File exists on filesystem
|
|
526
|
+
* Returns false silently if any check fails.
|
|
527
|
+
*
|
|
528
|
+
* @param logPath - Path to file to validate
|
|
529
|
+
* @returns Promise resolving to true if file is valid Claude Code log file, false otherwise
|
|
530
|
+
*/
|
|
531
|
+
async validateLogFile(logPath) {
|
|
532
|
+
try {
|
|
533
|
+
// Check path contains CLAUDE_PROJECTS_PATH
|
|
534
|
+
if (!logPath.includes(CLAUDE_PROJECTS_PATH)) {
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
537
|
+
// Check file extension is JSONL
|
|
538
|
+
if (!logPath.endsWith(JSONL_FILE_EXTENSION)) {
|
|
539
|
+
return false;
|
|
540
|
+
}
|
|
541
|
+
// Check file exists
|
|
542
|
+
return existsSync(logPath);
|
|
543
|
+
}
|
|
544
|
+
catch {
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|