byterover-cli 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -56
- package/bin/dev.js +1 -1
- package/dist/commands/cipher-agent/run.d.ts +111 -0
- package/dist/commands/cipher-agent/run.js +493 -0
- package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
- package/dist/commands/cipher-agent/set-prompt.js +53 -0
- package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
- package/dist/commands/cipher-agent/show-prompt.js +48 -0
- package/dist/commands/clear.d.ts +6 -0
- package/dist/commands/clear.js +36 -15
- package/dist/commands/curate.d.ts +74 -0
- package/dist/commands/curate.js +396 -0
- package/dist/commands/foo.d.ts +12 -0
- package/dist/commands/foo.js +61 -0
- package/dist/commands/gen-rules.d.ts +3 -0
- package/dist/commands/gen-rules.js +39 -20
- package/dist/commands/init.d.ts +48 -3
- package/dist/commands/init.js +242 -70
- package/dist/commands/login.js +9 -4
- package/dist/commands/pull.d.ts +33 -0
- package/dist/commands/pull.js +115 -0
- package/dist/commands/push.d.ts +13 -13
- package/dist/commands/push.js +81 -101
- package/dist/commands/query.d.ts +63 -0
- package/dist/commands/query.js +349 -0
- package/dist/commands/space/list.d.ts +5 -2
- package/dist/commands/space/list.js +60 -56
- package/dist/commands/space/switch.d.ts +16 -0
- package/dist/commands/space/switch.js +102 -53
- package/dist/commands/status.d.ts +5 -2
- package/dist/commands/status.js +43 -33
- package/dist/commands/watch.d.ts +23 -0
- package/dist/commands/watch.js +171 -0
- package/dist/config/auth.config.js +14 -2
- package/dist/config/context-tree-domains.d.ts +12 -0
- package/dist/config/context-tree-domains.js +29 -0
- package/dist/config/environment.d.ts +6 -0
- package/dist/config/environment.js +9 -2
- package/dist/constants.d.ts +5 -0
- package/dist/constants.js +6 -0
- package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
- package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
- package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
- package/dist/core/domain/cipher/agent/agent-state.js +59 -0
- package/dist/core/domain/cipher/agent/index.d.ts +7 -0
- package/dist/core/domain/cipher/agent/index.js +7 -0
- package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
- package/dist/core/domain/cipher/agent-events/index.js +7 -0
- package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
- package/dist/core/domain/cipher/agent-events/types.js +42 -0
- package/dist/core/domain/cipher/blob/types.d.ts +108 -0
- package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
- package/dist/core/domain/cipher/errors/blob-error.js +68 -0
- package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
- package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
- package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
- package/dist/core/domain/cipher/errors/llm-error.js +161 -0
- package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
- package/dist/core/domain/cipher/errors/memory-error.js +62 -0
- package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
- package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
- package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
- package/dist/core/domain/cipher/errors/process-error.js +173 -0
- package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
- package/dist/core/domain/cipher/errors/session-error.js +74 -0
- package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
- package/dist/core/domain/cipher/errors/tool-error.js +81 -0
- package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
- package/dist/core/domain/cipher/memory/types.d.ts +102 -0
- package/dist/core/domain/cipher/memory/types.js +4 -0
- package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
- package/dist/core/domain/cipher/parsed-interaction.js +25 -0
- package/dist/core/domain/cipher/process/types.d.ts +286 -0
- package/dist/core/domain/cipher/session/types.d.ts +54 -0
- package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
- package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
- package/dist/core/domain/cipher/todos/index.d.ts +4 -0
- package/dist/core/domain/cipher/todos/index.js +4 -0
- package/dist/core/domain/cipher/todos/types.d.ts +57 -0
- package/dist/core/domain/cipher/todos/types.js +5 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
- package/dist/core/domain/cipher/tools/constants.js +24 -0
- package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
- package/dist/core/domain/cipher/tools/tool-error.js +246 -0
- package/dist/core/domain/cipher/tools/types.d.ts +145 -0
- package/dist/core/domain/entities/brv-config.d.ts +42 -6
- package/dist/core/domain/entities/brv-config.js +115 -17
- package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
- package/dist/core/domain/entities/cogit-push-context.js +91 -0
- package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
- package/dist/core/domain/entities/cogit-push-response.js +31 -0
- package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
- package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
- package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
- package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
- package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
- package/dist/core/domain/entities/cogit-snapshot.js +58 -0
- package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
- package/dist/core/domain/entities/context-tree-index.js +27 -0
- package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
- package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
- package/dist/core/domain/entities/event.d.ts +1 -1
- package/dist/core/domain/entities/event.js +3 -1
- package/dist/core/domain/entities/parser.d.ts +567 -0
- package/dist/core/domain/entities/parser.js +10 -0
- package/dist/core/domain/entities/playbook.d.ts +2 -23
- package/dist/core/domain/entities/playbook.js +2 -70
- package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
- package/dist/core/domain/errors/brv-config-version-error.js +21 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
- package/dist/core/domain/knowledge/directory-manager.js +145 -0
- package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
- package/dist/core/domain/knowledge/markdown-writer.js +18 -0
- package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
- package/dist/core/domain/knowledge/relation-parser.js +131 -0
- package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
- package/dist/core/interfaces/cipher/cipher-services.js +1 -0
- package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
- package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
- package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
- package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
- package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
- package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
- package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
- package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
- package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
- package/dist/core/interfaces/cipher/i-file-system.js +1 -0
- package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
- package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
- package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
- package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
- package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
- package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
- package/dist/core/interfaces/cipher/i-logger.js +28 -0
- package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
- package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
- package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
- package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
- package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
- package/dist/core/interfaces/cipher/i-process-service.js +1 -0
- package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
- package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
- package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
- package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
- package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
- package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
- package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
- package/dist/core/interfaces/cipher/llm-types.js +5 -0
- package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
- package/dist/core/interfaces/cipher/message-types.js +5 -0
- package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
- package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
- package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
- package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
- package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
- package/dist/core/interfaces/i-cogit-push-service.js +1 -0
- package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
- package/dist/core/interfaces/i-context-file-reader.js +1 -0
- package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
- package/dist/core/interfaces/i-context-tree-service.js +1 -0
- package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
- package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
- package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
- package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
- package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
- package/dist/core/interfaces/i-file-watcher-service.js +1 -0
- package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
- package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
- package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
- package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
- package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
- package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
- package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
- package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
- package/dist/hooks/error/clean-errors.d.ts +7 -0
- package/dist/hooks/error/clean-errors.js +50 -0
- package/dist/hooks/init/welcome.js +72 -1
- package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
- package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
- package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
- package/dist/infra/cipher/agent-service-factory.js +212 -0
- package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
- package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
- package/dist/infra/cipher/blob/index.d.ts +10 -0
- package/dist/infra/cipher/blob/index.js +12 -0
- package/dist/infra/cipher/blob/migrations.d.ts +63 -0
- package/dist/infra/cipher/blob/migrations.js +148 -0
- package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
- package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
- package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
- package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
- package/dist/infra/cipher/cipher-agent.d.ts +182 -0
- package/dist/infra/cipher/cipher-agent.js +317 -0
- package/dist/infra/cipher/command-parser.d.ts +23 -0
- package/dist/infra/cipher/command-parser.js +85 -0
- package/dist/infra/cipher/display/todo-display.d.ts +23 -0
- package/dist/infra/cipher/display/todo-display.js +129 -0
- package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
- package/dist/infra/cipher/events/event-emitter.js +158 -0
- package/dist/infra/cipher/exit-codes.d.ts +44 -0
- package/dist/infra/cipher/exit-codes.js +58 -0
- package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
- package/dist/infra/cipher/file-system/file-system-service.js +641 -0
- package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
- package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
- package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
- package/dist/infra/cipher/file-system/glob-utils.js +120 -0
- package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
- package/dist/infra/cipher/file-system/path-validator.js +184 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
- package/dist/infra/cipher/interactive-commands.d.ts +16 -0
- package/dist/infra/cipher/interactive-commands.js +198 -0
- package/dist/infra/cipher/interactive-loop.d.ts +24 -0
- package/dist/infra/cipher/interactive-loop.js +352 -0
- package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
- package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
- package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
- package/dist/infra/cipher/llm/context/compression/index.js +5 -0
- package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
- package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
- package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
- package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
- package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
- package/dist/infra/cipher/llm/context/compression/types.js +1 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
- package/dist/infra/cipher/llm/context/context-manager.js +419 -0
- package/dist/infra/cipher/llm/context/index.d.ts +2 -0
- package/dist/infra/cipher/llm/context/index.js +2 -0
- package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
- package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
- package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
- package/dist/infra/cipher/llm/context/utils.js +89 -0
- package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
- package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
- package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
- package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
- package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
- package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
- package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
- package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
- package/dist/infra/cipher/llm/generators/index.js +13 -0
- package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
- package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
- package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
- package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
- package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
- package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
- package/dist/infra/cipher/llm/index.d.ts +9 -0
- package/dist/infra/cipher/llm/index.js +13 -0
- package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
- package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
- package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
- package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
- package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
- package/dist/infra/cipher/llm/response-validator.js +157 -0
- package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
- package/dist/infra/cipher/llm/retry/index.js +10 -0
- package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
- package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
- package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
- package/dist/infra/cipher/llm/thought-parser.js +190 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
- package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
- package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
- package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
- package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
- package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
- package/dist/infra/cipher/logger/console-logger.js +63 -0
- package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
- package/dist/infra/cipher/logger/event-based-logger.js +92 -0
- package/dist/infra/cipher/memory/index.d.ts +6 -0
- package/dist/infra/cipher/memory/index.js +7 -0
- package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
- package/dist/infra/cipher/memory/memory-manager.js +523 -0
- package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
- package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
- package/dist/infra/cipher/process/command-validator.d.ts +59 -0
- package/dist/infra/cipher/process/command-validator.js +266 -0
- package/dist/infra/cipher/process/index.d.ts +8 -0
- package/dist/infra/cipher/process/index.js +8 -0
- package/dist/infra/cipher/process/process-service.d.ts +95 -0
- package/dist/infra/cipher/process/process-service.js +439 -0
- package/dist/infra/cipher/session/chat-session.d.ts +80 -0
- package/dist/infra/cipher/session/chat-session.js +165 -0
- package/dist/infra/cipher/session/index.d.ts +6 -0
- package/dist/infra/cipher/session/index.js +5 -0
- package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
- package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
- package/dist/infra/cipher/session/session-manager.d.ts +109 -0
- package/dist/infra/cipher/session/session-manager.js +172 -0
- package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
- package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
- package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
- package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
- package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
- package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
- package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
- package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
- package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
- package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
- package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
- package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
- package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
- package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
- package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
- package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
- package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
- package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
- package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
- package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
- package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
- package/dist/infra/cipher/tools/index.d.ts +18 -0
- package/dist/infra/cipher/tools/index.js +19 -0
- package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
- package/dist/infra/cipher/tools/policy-engine.js +110 -0
- package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
- package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
- package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
- package/dist/infra/cipher/tools/tool-invocation.js +294 -0
- package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
- package/dist/infra/cipher/tools/tool-manager.js +209 -0
- package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
- package/dist/infra/cipher/tools/tool-markers.js +49 -0
- package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
- package/dist/infra/cipher/tools/tool-provider.js +196 -0
- package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
- package/dist/infra/cipher/tools/tool-registry.js +144 -0
- package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
- package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
- package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
- package/dist/infra/cipher/validation/workspace-validator.js +37 -0
- package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
- package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
- package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
- package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
- package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
- package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
- package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
- package/dist/infra/cogit/http-cogit-push-service.js +104 -0
- package/dist/infra/config/file-config-store.js +9 -3
- package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
- package/dist/infra/context-tree/file-context-file-reader.js +46 -0
- package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
- package/dist/infra/context-tree/file-context-tree-service.js +46 -0
- package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
- package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
- package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
- package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
- package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
- package/dist/infra/memory/http-memory-storage-service.js +4 -3
- package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
- package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
- package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
- package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
- package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
- package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
- package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
- package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
- package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
- package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
- package/dist/infra/parsers/clean/shared.d.ts +84 -0
- package/dist/infra/parsers/clean/shared.js +273 -0
- package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
- package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
- package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
- package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
- package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
- package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
- package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
- package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
- package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
- package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
- package/dist/infra/space/http-space-service.js +2 -1
- package/dist/infra/team/http-team-service.js +2 -1
- package/dist/infra/user/http-user-service.js +2 -1
- package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
- package/dist/infra/watcher/file-watcher-service.js +81 -0
- package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
- package/dist/infra/workspace/workspace-detector-service.js +165 -0
- package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
- package/dist/resources/prompts/modes/autonomous.yml +9 -0
- package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
- package/dist/resources/prompts/reflection.yml +27 -0
- package/dist/resources/prompts/system-prompt.yml +82 -0
- package/dist/resources/prompts/tool-outputs.yml +30 -0
- package/dist/templates/README.md +6 -7
- package/dist/templates/sections/command-reference.md +40 -111
- package/dist/templates/sections/workflow.md +3 -30
- package/dist/utils/emoji-helpers.d.ts +38 -0
- package/dist/utils/emoji-helpers.js +42 -0
- package/dist/utils/error-handler.d.ts +51 -0
- package/dist/utils/error-handler.js +169 -0
- package/dist/utils/error-helpers.d.ts +30 -0
- package/dist/utils/error-helpers.js +47 -0
- package/dist/utils/file-helpers.d.ts +15 -0
- package/dist/utils/file-helpers.js +44 -0
- package/dist/utils/oclif-error-helpers.d.ts +40 -0
- package/dist/utils/oclif-error-helpers.js +46 -0
- package/dist/utils/tool-display-formatter.d.ts +53 -0
- package/dist/utils/tool-display-formatter.js +257 -0
- package/oclif.manifest.json +381 -141
- package/package.json +27 -6
- package/dist/commands/add.d.ts +0 -49
- package/dist/commands/add.js +0 -192
- package/dist/commands/complete.d.ts +0 -108
- package/dist/commands/complete.js +0 -340
- package/dist/commands/retrieve.d.ts +0 -26
- package/dist/commands/retrieve.js +0 -101
- package/dist/core/domain/entities/curator-output.d.ts +0 -14
- package/dist/core/domain/entities/curator-output.js +0 -23
- package/dist/core/domain/entities/delta-batch.d.ts +0 -30
- package/dist/core/domain/entities/delta-batch.js +0 -52
- package/dist/core/domain/entities/delta-operation.d.ts +0 -31
- package/dist/core/domain/entities/delta-operation.js +0 -50
- package/dist/core/domain/entities/executor-output.d.ts +0 -27
- package/dist/core/domain/entities/executor-output.js +0 -33
- package/dist/core/domain/entities/reflector-output.d.ts +0 -38
- package/dist/core/domain/entities/reflector-output.js +0 -44
- package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
- package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
- package/dist/core/interfaces/i-delta-store.d.ts +0 -15
- package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
- package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
- package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
- package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
- package/dist/infra/ace/ace-file-utils.d.ts +0 -46
- package/dist/infra/ace/ace-file-utils.js +0 -83
- package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
- package/dist/infra/ace/ace-prompt-templates.js +0 -177
- package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
- package/dist/infra/ace/file-bullet-content-store.js +0 -89
- package/dist/infra/ace/file-delta-store.d.ts +0 -9
- package/dist/infra/ace/file-delta-store.js +0 -26
- package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
- package/dist/infra/ace/file-executor-output-store.js +0 -26
- package/dist/infra/ace/file-playbook-store.d.ts +0 -29
- package/dist/infra/ace/file-playbook-store.js +0 -107
- package/dist/infra/ace/file-reflection-store.d.ts +0 -10
- package/dist/infra/ace/file-reflection-store.js +0 -55
- package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
- package/dist/infra/playbook/file-playbook-service.js +0 -132
- /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
- /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
- /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
- /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
- /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
- /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
- /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Copilot Raw Service
|
|
3
|
+
* Consolidates CopilotParser + CopilotRawParser
|
|
4
|
+
* Extracts and exports GitHub Copilot chat sessions
|
|
5
|
+
*/
|
|
6
|
+
import Database from 'better-sqlite3';
|
|
7
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import { basename, join } from 'node:path';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Constants
|
|
12
|
+
// ============================================================================
|
|
13
|
+
const VS_CODE_STORAGE_PATH = 'Library/Application Support/Code/User/workspaceStorage';
|
|
14
|
+
const DEFAULT_HOME_DIR = '~';
|
|
15
|
+
const SCM_REPOSITORIES_KEY = 'scm:view:visibleRepositories';
|
|
16
|
+
const FILE_URI_PATTERN = /file:\/\/(.+)$/;
|
|
17
|
+
const TITLE_MAX_LENGTH = 150;
|
|
18
|
+
const TITLE_TRUNCATE_LENGTH = 100;
|
|
19
|
+
const TITLE_ELLIPSIS = '...';
|
|
20
|
+
const UNKNOWN_USERNAME = 'Unknown';
|
|
21
|
+
const GITHUB_COPILOT = 'GitHub Copilot';
|
|
22
|
+
const UNKNOWN_LOCATION = 'unknown';
|
|
23
|
+
const DEFAULT_SESSION_TITLE = 'Copilot Chat Session';
|
|
24
|
+
const UNKNOWN_WORKSPACE = 'unknown-workspace';
|
|
25
|
+
const UNKNOWN_KIND = 'unknown';
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Copilot Raw Parser Service
|
|
28
|
+
// ============================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Copilot Raw Parser Service class
|
|
31
|
+
* Handles extraction of GitHub Copilot sessions from VS Code workspace storage
|
|
32
|
+
*/
|
|
33
|
+
export class CopilotRawService {
|
|
34
|
+
ide;
|
|
35
|
+
workspaceStoragePath;
|
|
36
|
+
// ========================================================================
|
|
37
|
+
// Constructor
|
|
38
|
+
// ========================================================================
|
|
39
|
+
/**
|
|
40
|
+
* Initialize Copilot Raw Service
|
|
41
|
+
*
|
|
42
|
+
* Detects and initializes the VS Code workspace storage path where
|
|
43
|
+
* GitHub Copilot chat session databases are stored.
|
|
44
|
+
*
|
|
45
|
+
* @param ide - The IDE type (Github Copilot)
|
|
46
|
+
*/
|
|
47
|
+
constructor(ide) {
|
|
48
|
+
this.ide = ide;
|
|
49
|
+
this.workspaceStoragePath = this.detectWorkspacePath();
|
|
50
|
+
}
|
|
51
|
+
// ========================================================================
|
|
52
|
+
// Public Methods
|
|
53
|
+
// ========================================================================
|
|
54
|
+
/**
|
|
55
|
+
* Main entry point - Parse and export GitHub Copilot sessions
|
|
56
|
+
*
|
|
57
|
+
* Parses GitHub Copilot sessions from custom directory, extracts session data,
|
|
58
|
+
* and exports to JSON files organized by workspace. Creates summary file with
|
|
59
|
+
* aggregate statistics across all sessions. Returns success status.
|
|
60
|
+
*
|
|
61
|
+
* @param customDir - Path to directory containing GitHub Copilot session data
|
|
62
|
+
* @param outputDir - Optional output directory (defaults to process.cwd()/.brv/logs/{ide}/raw)
|
|
63
|
+
* @returns Promise resolving to true if parsing succeeded, false otherwise
|
|
64
|
+
*/
|
|
65
|
+
async parse(customDir, outputDir) {
|
|
66
|
+
const baseOutputDir = outputDir || join(process.cwd(), `.brv/logs/${this.ide}/raw`);
|
|
67
|
+
console.log('🔍 Starting GitHub Copilot conversation parsing...');
|
|
68
|
+
try {
|
|
69
|
+
// Parse all sessions from custom directory
|
|
70
|
+
const sessions = await this.parseFromDirectory(customDir);
|
|
71
|
+
if (sessions.length === 0) {
|
|
72
|
+
console.log('ℹ️ No GitHub Copilot sessions found');
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
console.log(`\n✅ Found ${sessions.length} Copilot sessions`);
|
|
76
|
+
// Organize sessions by workspace hash
|
|
77
|
+
const sessionsByWorkspace = {};
|
|
78
|
+
for (const session of sessions) {
|
|
79
|
+
const workspaceHash = session.metadata.workspace?.path || UNKNOWN_WORKSPACE;
|
|
80
|
+
if (!sessionsByWorkspace[workspaceHash]) {
|
|
81
|
+
sessionsByWorkspace[workspaceHash] = [];
|
|
82
|
+
}
|
|
83
|
+
sessionsByWorkspace[workspaceHash].push({
|
|
84
|
+
...session,
|
|
85
|
+
workspaceHash,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
console.log(`\n📁 Organized into ${Object.keys(sessionsByWorkspace).length} workspace(s)`);
|
|
89
|
+
// Export sessions organized by workspace
|
|
90
|
+
console.log('\n💾 Exporting sessions by workspace...');
|
|
91
|
+
for (const [workspaceHash, workspaceSessions] of Object.entries(sessionsByWorkspace)) {
|
|
92
|
+
const workspaceDir = join(baseOutputDir, workspaceHash);
|
|
93
|
+
if (!fs.existsSync(workspaceDir)) {
|
|
94
|
+
fs.mkdirSync(workspaceDir, { recursive: true });
|
|
95
|
+
}
|
|
96
|
+
console.log(`\n 📂 Workspace (${workspaceHash})`);
|
|
97
|
+
// Extract workspace path from first session (should be consistent)
|
|
98
|
+
const workspacePath = workspaceSessions[0]?.workspacePath || 'Unknown Workspace';
|
|
99
|
+
// Export session files for this workspace
|
|
100
|
+
for (const session of workspaceSessions) {
|
|
101
|
+
const filename = `${session.id}.json`;
|
|
102
|
+
const filepath = join(workspaceDir, filename);
|
|
103
|
+
const sessionData = {
|
|
104
|
+
...session,
|
|
105
|
+
workspacePath: session.workspacePath || workspacePath
|
|
106
|
+
};
|
|
107
|
+
writeFileSync(filepath, JSON.stringify(sessionData, null, 2));
|
|
108
|
+
const fileSize = readFileSync(filepath).length;
|
|
109
|
+
const fileSizeKb = (fileSize / 1024).toFixed(1);
|
|
110
|
+
console.log(` ✅ ${session.title} (${fileSizeKb} KB)`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
console.log(`\n🎉 Copilot export complete! Sessions exported to: ${baseOutputDir}`);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error('❌ Error during parsing:', error);
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Calculate total session duration from request timings
|
|
123
|
+
*
|
|
124
|
+
* Aggregates the totalElapsed time from all requests' result.timings field.
|
|
125
|
+
* Returns total duration in milliseconds across all request/response cycles.
|
|
126
|
+
*
|
|
127
|
+
* @param requests - Array of Copilot request data with timing information
|
|
128
|
+
* @returns Total elapsed time in milliseconds
|
|
129
|
+
*/
|
|
130
|
+
calculateTotalDuration(requests) {
|
|
131
|
+
let totalTime = 0;
|
|
132
|
+
for (const request of requests) {
|
|
133
|
+
if (request.result?.timings?.totalElapsed) {
|
|
134
|
+
totalTime += request.result.timings.totalElapsed;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return totalTime;
|
|
138
|
+
}
|
|
139
|
+
// ========================================================================
|
|
140
|
+
// Private Methods - Initialization
|
|
141
|
+
// ========================================================================
|
|
142
|
+
/**
|
|
143
|
+
* Convert Copilot requests to normalized messages
|
|
144
|
+
*
|
|
145
|
+
* Transforms request/response pairs into alternating user and assistant messages.
|
|
146
|
+
* Each request becomes a user message (with attachments), and the response becomes
|
|
147
|
+
* an assistant message. Handles multiple response blocks and normalizes content format.
|
|
148
|
+
*
|
|
149
|
+
* @param requests - Array of Copilot request data to convert
|
|
150
|
+
* @returns Array of normalized RawCopilotRawMessage objects
|
|
151
|
+
*/
|
|
152
|
+
convertRequestsToMessages(requests) {
|
|
153
|
+
const messages = [];
|
|
154
|
+
for (const request of requests) {
|
|
155
|
+
// Add user message
|
|
156
|
+
if (request.message?.text) {
|
|
157
|
+
messages.push({
|
|
158
|
+
attachments: this.extractAttachments(request.variableData),
|
|
159
|
+
content: request.message.text,
|
|
160
|
+
type: 'user',
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// Add assistant response(s)
|
|
164
|
+
if (request.response && Array.isArray(request.response)) {
|
|
165
|
+
const responseContent = request.response.map((block) => this.normalizeContentBlock(block));
|
|
166
|
+
if (responseContent.length > 0) {
|
|
167
|
+
// If single string, use it directly; if single block, use it; otherwise filter blocks only
|
|
168
|
+
let content;
|
|
169
|
+
if (responseContent.length === 1 && typeof responseContent[0] === 'string') {
|
|
170
|
+
content = responseContent[0];
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
const blockContent = responseContent.filter((item) => typeof item !== 'string');
|
|
174
|
+
content = blockContent.length === 1 ? blockContent[0] : blockContent;
|
|
175
|
+
}
|
|
176
|
+
messages.push({
|
|
177
|
+
content,
|
|
178
|
+
type: 'assistant',
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return messages;
|
|
184
|
+
}
|
|
185
|
+
// ========================================================================
|
|
186
|
+
// Private Methods - Parsing
|
|
187
|
+
// ========================================================================
|
|
188
|
+
/**
|
|
189
|
+
* Detect VS Code Copilot workspace storage path
|
|
190
|
+
*
|
|
191
|
+
* Locates the VS Code workspace storage directory where GitHub Copilot chat sessions
|
|
192
|
+
* are stored. Defaults to ~/Library/Application Support/Code/User/workspaceStorage
|
|
193
|
+
* on macOS or constructs path from HOME environment variable.
|
|
194
|
+
*
|
|
195
|
+
* @returns Absolute path to VS Code workspace storage directory
|
|
196
|
+
* @throws Error if VS Code workspace storage directory not found
|
|
197
|
+
*/
|
|
198
|
+
detectWorkspacePath() {
|
|
199
|
+
const homedir = process.env.HOME || DEFAULT_HOME_DIR;
|
|
200
|
+
const defaultPath = join(homedir, VS_CODE_STORAGE_PATH);
|
|
201
|
+
if (fs.existsSync(defaultPath)) {
|
|
202
|
+
return defaultPath;
|
|
203
|
+
}
|
|
204
|
+
throw new Error(`VS Code workspace storage not found at ${defaultPath}`);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Extract attachment file names from variable data
|
|
208
|
+
*
|
|
209
|
+
* Extracts names of attached files/references from Copilot variable data.
|
|
210
|
+
* Returns empty array if variable data is missing or contains no variables.
|
|
211
|
+
*
|
|
212
|
+
* @param variableData - Optional Copilot variable data containing attachments
|
|
213
|
+
* @returns Array of attachment file names
|
|
214
|
+
*/
|
|
215
|
+
extractAttachments(variableData) {
|
|
216
|
+
const attachments = [];
|
|
217
|
+
if (!variableData?.variables || !Array.isArray(variableData.variables)) {
|
|
218
|
+
return attachments;
|
|
219
|
+
}
|
|
220
|
+
for (const variable of variableData.variables) {
|
|
221
|
+
if (variable.name) {
|
|
222
|
+
attachments.push(variable.name);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return attachments;
|
|
226
|
+
}
|
|
227
|
+
// ========================================================================
|
|
228
|
+
// Private Methods - Data Transformation
|
|
229
|
+
// ========================================================================
|
|
230
|
+
/**
|
|
231
|
+
* Extract metadata from session data
|
|
232
|
+
*
|
|
233
|
+
* Aggregates session metadata including message counts, participant information,
|
|
234
|
+
* total duration, and workspace identification. Calculates message count as requests * 2
|
|
235
|
+
* (user + assistant message per request).
|
|
236
|
+
*
|
|
237
|
+
* @param data - Copilot session file data
|
|
238
|
+
* @param sessionId - Unique session identifier
|
|
239
|
+
* @param workspaceHash - Workspace hash identifying the workspace
|
|
240
|
+
* @returns Extracted RawCopilotSessionMetadata object
|
|
241
|
+
*/
|
|
242
|
+
extractMetadata(data, sessionId, workspaceHash) {
|
|
243
|
+
const requests = data.requests || [];
|
|
244
|
+
return {
|
|
245
|
+
initialLocation: data.initialLocation || UNKNOWN_LOCATION,
|
|
246
|
+
messageCount: Math.max(0, requests.length * 2), // Each request has user + assistant
|
|
247
|
+
requestCount: requests.length,
|
|
248
|
+
requesterUsername: data.requesterUsername || UNKNOWN_USERNAME,
|
|
249
|
+
responderUsername: data.responderUsername || GITHUB_COPILOT,
|
|
250
|
+
sessionId,
|
|
251
|
+
totalDuration: this.calculateTotalDuration(requests),
|
|
252
|
+
workspace: {
|
|
253
|
+
path: workspaceHash
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Extract session title from first message or request
|
|
259
|
+
*
|
|
260
|
+
* Uses the first message content as session title (preferred), falls back to first request text.
|
|
261
|
+
* Truncates to TITLE_TRUNCATE_LENGTH (100) if content exceeds TITLE_MAX_LENGTH (150) characters.
|
|
262
|
+
* Appends ellipsis ("...") if truncated. Returns default title if no messages or requests.
|
|
263
|
+
*
|
|
264
|
+
* @param requests - Array of Copilot requests (fallback source)
|
|
265
|
+
* @param messages - Array of normalized messages (preferred source)
|
|
266
|
+
* @returns Session title string (max 103 characters with ellipsis)
|
|
267
|
+
*/
|
|
268
|
+
extractTitle(requests, messages) {
|
|
269
|
+
// Try to use first message text
|
|
270
|
+
if (messages.length > 0 && typeof messages[0].content === 'string') {
|
|
271
|
+
const text = messages[0].content;
|
|
272
|
+
return text.length > TITLE_MAX_LENGTH ? text.slice(0, Math.max(0, TITLE_TRUNCATE_LENGTH)) + TITLE_ELLIPSIS : text;
|
|
273
|
+
}
|
|
274
|
+
// Fallback to first request message
|
|
275
|
+
if (requests.length > 0 && requests[0].message?.text) {
|
|
276
|
+
const { text } = requests[0].message;
|
|
277
|
+
return text.length > TITLE_MAX_LENGTH ? text.slice(0, Math.max(0, TITLE_TRUNCATE_LENGTH)) + TITLE_ELLIPSIS : text;
|
|
278
|
+
}
|
|
279
|
+
return DEFAULT_SESSION_TITLE;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Extract workspace path using hybrid approach
|
|
283
|
+
*
|
|
284
|
+
* Attempts extraction using two tiers in order of reliability:
|
|
285
|
+
* - Tier 1A: SQLite scm:view:visibleRepositories (most reliable, handles monorepos)
|
|
286
|
+
* - Tier 1B: baseUri.path from session data (fallback approach)
|
|
287
|
+
* Returns single string for single repo, array for monorepo, or null if not found.
|
|
288
|
+
*
|
|
289
|
+
* @param data - Copilot session file data (used for Tier 1B fallback)
|
|
290
|
+
* @param workspaceHash - Workspace hash for SQLite database lookup
|
|
291
|
+
* @returns Workspace path(s) as string, string array, or null if not found
|
|
292
|
+
*/
|
|
293
|
+
extractWorkspacePath(data, workspaceHash) {
|
|
294
|
+
// Tier 1A: Try SQLite first
|
|
295
|
+
const tier1aResult = this.extractWorkspacePathTier1A(workspaceHash);
|
|
296
|
+
if (tier1aResult) {
|
|
297
|
+
return tier1aResult;
|
|
298
|
+
}
|
|
299
|
+
// Tier 1B: Fall back to baseUri extraction
|
|
300
|
+
const tier1bResult = this.extractWorkspacePathTier1B(data);
|
|
301
|
+
if (tier1bResult) {
|
|
302
|
+
return tier1bResult;
|
|
303
|
+
}
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Tier 1A: Extract repository paths from VS Code SQLite state.vscdb
|
|
308
|
+
* This is the most reliable source as it contains actual repositories visible in the workspace
|
|
309
|
+
* and can handle multi-repo/monorepo setups
|
|
310
|
+
*
|
|
311
|
+
* Returns:
|
|
312
|
+
* - Array of strings for monorepo/multi-repo workspaces
|
|
313
|
+
* - Single string for single-repo workspaces
|
|
314
|
+
* - null if not found
|
|
315
|
+
*/
|
|
316
|
+
extractWorkspacePathTier1A(workspaceHash) {
|
|
317
|
+
try {
|
|
318
|
+
const dbPath = join(this.workspaceStoragePath, workspaceHash, 'state.vscdb');
|
|
319
|
+
if (!fs.existsSync(dbPath)) {
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
const db = new Database(dbPath, { readonly: true });
|
|
323
|
+
try {
|
|
324
|
+
// Query for scm:view:visibleRepositories
|
|
325
|
+
const stmt = db.prepare(`SELECT value FROM ItemTable WHERE key = '${SCM_REPOSITORIES_KEY}'`);
|
|
326
|
+
const row = stmt.get();
|
|
327
|
+
if (!row?.value) {
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
// Parse the JSON value
|
|
331
|
+
const scmData = JSON.parse(row.value);
|
|
332
|
+
const repositories = scmData.all;
|
|
333
|
+
if (!repositories || repositories.length === 0) {
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
// Extract all repository paths
|
|
337
|
+
// Format is: git:Git:file:///path/to/repo
|
|
338
|
+
const extractedPaths = [];
|
|
339
|
+
for (const repoUri of repositories) {
|
|
340
|
+
const pathMatch = repoUri.match(FILE_URI_PATTERN);
|
|
341
|
+
if (pathMatch && pathMatch[1]) {
|
|
342
|
+
extractedPaths.push(pathMatch[1]);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (extractedPaths.length === 0) {
|
|
346
|
+
return null;
|
|
347
|
+
}
|
|
348
|
+
// Return array for multiple repos, string for single repo
|
|
349
|
+
return extractedPaths.length > 1 ? extractedPaths : extractedPaths[0];
|
|
350
|
+
}
|
|
351
|
+
finally {
|
|
352
|
+
db.close();
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Extract workspace path from baseUri in session data (Tier 1B fallback)
|
|
361
|
+
*
|
|
362
|
+
* Recursively searches session data for objects with baseUri.path property containing
|
|
363
|
+
* an absolute file path. Used as fallback when SQLite extraction fails. Returns first
|
|
364
|
+
* valid path found, or null if no baseUri path found.
|
|
365
|
+
*
|
|
366
|
+
* @param data - Copilot session file data to search
|
|
367
|
+
* @returns Extracted workspace path string, or null if not found
|
|
368
|
+
*/
|
|
369
|
+
extractWorkspacePathTier1B(data) {
|
|
370
|
+
const traverse = (obj) => {
|
|
371
|
+
if (!obj || typeof obj !== 'object')
|
|
372
|
+
return null;
|
|
373
|
+
const objRecord = obj;
|
|
374
|
+
// If this object has baseUri with path, return it
|
|
375
|
+
const baseUri = objRecord.baseUri;
|
|
376
|
+
if (baseUri?.path && typeof baseUri.path === 'string') {
|
|
377
|
+
const filePath = baseUri.path;
|
|
378
|
+
if (filePath.startsWith('/')) {
|
|
379
|
+
return filePath;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// Traverse all properties
|
|
383
|
+
for (const key in objRecord) {
|
|
384
|
+
if (typeof objRecord[key] === 'object' && objRecord[key] !== null) {
|
|
385
|
+
const result = traverse(objRecord[key]);
|
|
386
|
+
if (result)
|
|
387
|
+
return result;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return null;
|
|
391
|
+
};
|
|
392
|
+
return traverse(data);
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Normalize Copilot content blocks
|
|
396
|
+
*
|
|
397
|
+
* Converts various content block formats to normalized RawCopilotContentBlock format.
|
|
398
|
+
* Preserves string content as-is, ensures all blocks have a kind field (defaults to 'unknown'),
|
|
399
|
+
* and stringifies non-object content as fallback.
|
|
400
|
+
*
|
|
401
|
+
* @param block - Content block to normalize (string or object)
|
|
402
|
+
* @returns Normalized content block or string
|
|
403
|
+
*/
|
|
404
|
+
normalizeContentBlock(block) {
|
|
405
|
+
if (typeof block === 'string') {
|
|
406
|
+
return block;
|
|
407
|
+
}
|
|
408
|
+
if (!block || typeof block !== 'object') {
|
|
409
|
+
return JSON.stringify(block);
|
|
410
|
+
}
|
|
411
|
+
// Return block as-is with kind field
|
|
412
|
+
return {
|
|
413
|
+
kind: block.kind || UNKNOWN_KIND,
|
|
414
|
+
...block
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Normalize a Copilot request to RawCopilotParsedRequest type
|
|
419
|
+
*
|
|
420
|
+
* Standardizes request data structure, ensuring all required fields have values
|
|
421
|
+
* (using empty defaults where needed). Preserves response, result, and variable data.
|
|
422
|
+
*
|
|
423
|
+
* @param req - Raw Copilot request data to normalize
|
|
424
|
+
* @returns Normalized RawCopilotParsedRequest object
|
|
425
|
+
*/
|
|
426
|
+
normalizeParsedRequest(req) {
|
|
427
|
+
// Normalize response array if present
|
|
428
|
+
let response;
|
|
429
|
+
if (Array.isArray(req.response)) {
|
|
430
|
+
response = req.response;
|
|
431
|
+
}
|
|
432
|
+
return {
|
|
433
|
+
message: req.message || {},
|
|
434
|
+
requestId: req.requestId || '',
|
|
435
|
+
response: response,
|
|
436
|
+
responseId: req.responseId || '',
|
|
437
|
+
result: req.result,
|
|
438
|
+
variableData: req.variableData,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Parse GitHub Copilot sessions from a custom directory
|
|
443
|
+
*
|
|
444
|
+
* Handles two directory structures:
|
|
445
|
+
* 1. Direct workspace directory (containing chatSessions/ subdirectory)
|
|
446
|
+
* 2. Parent directory (containing multiple workspace hash subdirectories)
|
|
447
|
+
* Parses all workspace directories in parallel and returns combined sessions array.
|
|
448
|
+
*
|
|
449
|
+
* @param customDir - Path to custom directory containing Copilot session data
|
|
450
|
+
* @returns Promise resolving to array of parsed RawCopilotRawSession objects
|
|
451
|
+
*/
|
|
452
|
+
async parseFromDirectory(customDir) {
|
|
453
|
+
const sessions = [];
|
|
454
|
+
try {
|
|
455
|
+
// Check if the provided directory itself contains chatSessions
|
|
456
|
+
const chatSessionsPath = join(customDir, 'chatSessions');
|
|
457
|
+
if (fs.existsSync(chatSessionsPath)) {
|
|
458
|
+
// This is a workspace directory, parse it directly
|
|
459
|
+
const workspaceSessions = await this.parseWorkspaceDirectory(customDir, basename(customDir));
|
|
460
|
+
sessions.push(...workspaceSessions);
|
|
461
|
+
return sessions;
|
|
462
|
+
}
|
|
463
|
+
// Otherwise, iterate through subdirectories looking for workspace directories
|
|
464
|
+
const workspaceDirs = fs.readdirSync(customDir);
|
|
465
|
+
const parsePromises = workspaceDirs
|
|
466
|
+
.filter((workspaceDir) => {
|
|
467
|
+
const workspacePath = join(customDir, workspaceDir);
|
|
468
|
+
const stat = fs.statSync(workspacePath);
|
|
469
|
+
return stat.isDirectory();
|
|
470
|
+
})
|
|
471
|
+
.map((workspaceDir) => this.parseWorkspaceDirectory(join(customDir, workspaceDir), workspaceDir));
|
|
472
|
+
const allSessions = await Promise.all(parsePromises);
|
|
473
|
+
for (const workspaceSessions of allSessions) {
|
|
474
|
+
sessions.push(...workspaceSessions);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
console.error('Error parsing custom directory:', error);
|
|
479
|
+
}
|
|
480
|
+
return sessions;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Parse a single Copilot session file
|
|
484
|
+
*
|
|
485
|
+
* Reads and parses a GitHub Copilot session JSON file, extracting all session data
|
|
486
|
+
* including messages, metadata, requests, title, and workspace information.
|
|
487
|
+
* Returns null if file cannot be read or parsed.
|
|
488
|
+
*
|
|
489
|
+
* @param filePath - Absolute path to Copilot session JSON file
|
|
490
|
+
* @param workspaceHash - Workspace hash for the session (used for lookups)
|
|
491
|
+
* @returns Parsed RawCopilotRawSession object, or null if parsing fails
|
|
492
|
+
*/
|
|
493
|
+
parseSessionFile(filePath, workspaceHash) {
|
|
494
|
+
try {
|
|
495
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
496
|
+
const data = JSON.parse(content);
|
|
497
|
+
const sessionId = basename(filePath, '.json');
|
|
498
|
+
const requests = data.requests || [];
|
|
499
|
+
// Convert requests to messages
|
|
500
|
+
const messages = this.convertRequestsToMessages(requests);
|
|
501
|
+
// Generate title from first message or request
|
|
502
|
+
const title = this.extractTitle(requests, messages);
|
|
503
|
+
// Extract metadata
|
|
504
|
+
const metadata = this.extractMetadata(data, sessionId, workspaceHash);
|
|
505
|
+
// Extract workspace path using hybrid approach (Tier 1A SQLite, fallback to Tier 1B baseUri)
|
|
506
|
+
const workspacePath = this.extractWorkspacePath(data, workspaceHash);
|
|
507
|
+
return {
|
|
508
|
+
id: sessionId,
|
|
509
|
+
messages,
|
|
510
|
+
metadata,
|
|
511
|
+
requests: requests.map((req) => this.normalizeParsedRequest(req)),
|
|
512
|
+
timestamp: Date.now(),
|
|
513
|
+
title,
|
|
514
|
+
workspaceHash,
|
|
515
|
+
workspacePath: workspacePath || undefined,
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
catch (error) {
|
|
519
|
+
console.error(`Error parsing session ${filePath}:`, error);
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Parse sessions from a specific workspace directory
|
|
525
|
+
*
|
|
526
|
+
* Reads all .json files from the chatSessions subdirectory within a workspace,
|
|
527
|
+
* parses each session file, and returns array of successfully parsed sessions.
|
|
528
|
+
* Returns empty array if chatSessions directory doesn't exist. Logs errors for
|
|
529
|
+
* failed parses but continues processing remaining files.
|
|
530
|
+
*
|
|
531
|
+
* @param workspacePath - Path to workspace directory containing chatSessions
|
|
532
|
+
* @param workspaceHash - Workspace hash for the workspace
|
|
533
|
+
* @returns Promise resolving to array of parsed RawCopilotRawSession objects
|
|
534
|
+
*/
|
|
535
|
+
async parseWorkspaceDirectory(workspacePath, workspaceHash) {
|
|
536
|
+
const sessions = [];
|
|
537
|
+
const chatSessionsDir = join(workspacePath, 'chatSessions');
|
|
538
|
+
if (!fs.existsSync(chatSessionsDir)) {
|
|
539
|
+
return sessions;
|
|
540
|
+
}
|
|
541
|
+
try {
|
|
542
|
+
const files = fs.readdirSync(chatSessionsDir);
|
|
543
|
+
for (const file of files) {
|
|
544
|
+
if (file.endsWith('.json')) {
|
|
545
|
+
const filePath = join(chatSessionsDir, file);
|
|
546
|
+
const session = this.parseSessionFile(filePath, workspaceHash);
|
|
547
|
+
if (session) {
|
|
548
|
+
sessions.push(session);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
catch (error) {
|
|
554
|
+
console.error(`Error parsing workspace ${workspaceHash}:`, error);
|
|
555
|
+
}
|
|
556
|
+
return sessions;
|
|
557
|
+
}
|
|
558
|
+
}
|