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,729 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copilot Clean Service
|
|
3
|
+
* Transforms GitHub Copilot raw parsed data to clean normalized format
|
|
4
|
+
*/
|
|
5
|
+
import { promises as fs } from 'node:fs';
|
|
6
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
7
|
+
import { join as pathJoin } from 'node:path';
|
|
8
|
+
import { normalizeClaudeSession } from './shared.js';
|
|
9
|
+
/**
|
|
10
|
+
* Copilot Clean Service
|
|
11
|
+
* Transforms GitHub Copilot raw parsed sessions to clean normalized format
|
|
12
|
+
*/
|
|
13
|
+
export class CopilotCleanService {
|
|
14
|
+
ide;
|
|
15
|
+
constructor(ide) {
|
|
16
|
+
this.ide = ide;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse and transform GitHub Copilot raw sessions to clean normalized format
|
|
20
|
+
*
|
|
21
|
+
* Reads Copilot raw session files organized by workspace, transforms them using
|
|
22
|
+
* Claude-compatible format, and normalizes the sessions.
|
|
23
|
+
* Returns sessions in-memory without file writing.
|
|
24
|
+
*
|
|
25
|
+
* @param rawDir - Absolute path to the directory containing raw Copilot session files organized by workspace
|
|
26
|
+
* @returns Promise resolving to array of clean normalized sessions
|
|
27
|
+
*/
|
|
28
|
+
/* eslint-disable no-await-in-loop */
|
|
29
|
+
async parse(rawDir) {
|
|
30
|
+
console.log('🔍 Starting GitHub Copilot clean transformation...');
|
|
31
|
+
console.log(`📁 Raw directory: ${rawDir}`);
|
|
32
|
+
try {
|
|
33
|
+
const workspaceDirs = await readdir(rawDir);
|
|
34
|
+
const allCleanSessions = [];
|
|
35
|
+
for (const workspaceDir of workspaceDirs) {
|
|
36
|
+
const workspacePath = pathJoin(rawDir, workspaceDir);
|
|
37
|
+
const files = await readdir(workspacePath);
|
|
38
|
+
for (const file of files) {
|
|
39
|
+
if (!file.endsWith('.json') || file === 'summary.json')
|
|
40
|
+
continue;
|
|
41
|
+
try {
|
|
42
|
+
const content = await readFile(pathJoin(workspacePath, file), 'utf8');
|
|
43
|
+
const session = JSON.parse(content);
|
|
44
|
+
// Transform Copilot format to Claude format
|
|
45
|
+
const claudeFormatted = this.transformCopilotToClaudeFormat(session);
|
|
46
|
+
// Normalize the session using shared transformer
|
|
47
|
+
const normalized = normalizeClaudeSession(claudeFormatted, 'Copilot');
|
|
48
|
+
// Add to array instead of writing to disk
|
|
49
|
+
allCleanSessions.push(normalized);
|
|
50
|
+
console.log(` ✅ ${session.title}`);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.warn(`⚠️ Failed to transform ${file}:`, error instanceof Error ? error.message : String(error));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
console.log(`\n🎉 Copilot clean transformation complete! ${allCleanSessions.length} sessions processed`);
|
|
58
|
+
return Object.freeze(allCleanSessions);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error('❌ Error during transformation:', error instanceof Error ? error.message : 'Unknown error');
|
|
62
|
+
return Object.freeze([]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/* eslint-enable no-await-in-loop */
|
|
66
|
+
/**
|
|
67
|
+
* Process Copilot data by analyzing and transforming valid workspaces
|
|
68
|
+
*
|
|
69
|
+
* Performs complete workspace analysis and transformation:
|
|
70
|
+
* 1. Analyzes all workspaces to identify valid Copilot sessions
|
|
71
|
+
* 2. Logs workspace validity analysis with session counts
|
|
72
|
+
* 3. Copies and transforms valid workspaces to Claude-compatible format
|
|
73
|
+
* Returns statistics about processed workspaces.
|
|
74
|
+
*
|
|
75
|
+
* @param rawResultsDir - Absolute path to raw Copilot results directory
|
|
76
|
+
* @param cleanResultsDir - Absolute path to clean results output directory
|
|
77
|
+
* @returns Promise with statistics: total workspaces, valid count, invalid count
|
|
78
|
+
*/
|
|
79
|
+
/* eslint-disable no-await-in-loop */
|
|
80
|
+
async processCopilotData(rawResultsDir, cleanResultsDir) {
|
|
81
|
+
console.log('\n📊 Analyzing Copilot workspaces...');
|
|
82
|
+
const workspaces = await this.analyzeCopilotWorkspaces(rawResultsDir);
|
|
83
|
+
let validCount = 0;
|
|
84
|
+
let invalidCount = 0;
|
|
85
|
+
console.log('\n📋 Copilot Workspace Analysis:');
|
|
86
|
+
for (const [name, info] of workspaces.entries()) {
|
|
87
|
+
if (info.isValid) {
|
|
88
|
+
console.log(` ✅ ${name}`);
|
|
89
|
+
console.log(` ${info.reason}`);
|
|
90
|
+
validCount++;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
console.log(` ❌ ${name}`);
|
|
94
|
+
console.log(` ${info.reason}`);
|
|
95
|
+
invalidCount++;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Copy valid workspaces
|
|
99
|
+
console.log(`\n💾 Copying and transforming ${validCount} valid workspace(s) to clean_results...`);
|
|
100
|
+
const cleanCopilotDir = pathJoin(cleanResultsDir, 'copilot');
|
|
101
|
+
await fs.mkdir(cleanCopilotDir, { recursive: true });
|
|
102
|
+
for (const [name, info] of workspaces.entries()) {
|
|
103
|
+
if (info.isValid) {
|
|
104
|
+
await this.copyValidCopilotWorkspace(name, rawResultsDir, cleanCopilotDir);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
invalid: invalidCount,
|
|
109
|
+
total: workspaces.size,
|
|
110
|
+
valid: validCount,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/* eslint-enable no-await-in-loop */
|
|
114
|
+
/**
|
|
115
|
+
* Analyze Copilot workspaces to identify valid vs invalid sessions
|
|
116
|
+
*
|
|
117
|
+
* Scans workspace directories and validates each by checking for valid Copilot session
|
|
118
|
+
* files. A workspace is considered valid if it contains at least one session file with
|
|
119
|
+
* non-empty requests array. Returns a map of workspace information including validity
|
|
120
|
+
* status, valid/empty session counts, and reason.
|
|
121
|
+
*
|
|
122
|
+
* @param copilotResultsDir - Absolute path to directory containing Copilot workspace subdirectories
|
|
123
|
+
* @returns Promise that resolves to a map of workspace names to WorkspaceInfo objects
|
|
124
|
+
*/
|
|
125
|
+
/* eslint-disable no-await-in-loop */
|
|
126
|
+
async analyzeCopilotWorkspaces(copilotResultsDir) {
|
|
127
|
+
const workspaceMap = new Map();
|
|
128
|
+
try {
|
|
129
|
+
const entries = await fs.readdir(copilotResultsDir, { withFileTypes: true });
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
if (!entry.isDirectory() || entry.name === 'summary.json') {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const workspacePath = pathJoin(copilotResultsDir, entry.name);
|
|
135
|
+
const files = await fs.readdir(workspacePath);
|
|
136
|
+
const jsonFiles = files.filter((f) => f.endsWith('.json') && f !== 'summary.json');
|
|
137
|
+
const validCount = await this.countValidCopilotSessions(workspacePath, jsonFiles);
|
|
138
|
+
const hasValidSessions = validCount > 0;
|
|
139
|
+
workspaceMap.set(entry.name, {
|
|
140
|
+
isValid: hasValidSessions,
|
|
141
|
+
name: entry.name,
|
|
142
|
+
path: workspacePath,
|
|
143
|
+
reason: hasValidSessions
|
|
144
|
+
? `${validCount} valid session(s), ${jsonFiles.length - validCount} empty session(s)`
|
|
145
|
+
: `No valid sessions found (${jsonFiles.length} empty files)`,
|
|
146
|
+
type: 'copilot',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error('Error analyzing Copilot workspaces:', error);
|
|
152
|
+
}
|
|
153
|
+
return workspaceMap;
|
|
154
|
+
}
|
|
155
|
+
/* eslint-enable no-await-in-loop */
|
|
156
|
+
/**
|
|
157
|
+
* Build session metadata from Copilot session data
|
|
158
|
+
*
|
|
159
|
+
* Extracts and formats metadata from Copilot session including message/request counts,
|
|
160
|
+
* usernames, session ID, and duration. Combines data from transformed messages and
|
|
161
|
+
* original session metadata.
|
|
162
|
+
*
|
|
163
|
+
* @param transformedMessages - Array of transformed message objects
|
|
164
|
+
* @param copilotSession - Original Copilot session object with metadata
|
|
165
|
+
* @returns Metadata object with counts, usernames, session ID, and duration
|
|
166
|
+
*/
|
|
167
|
+
buildSessionMetadata(transformedMessages, copilotSession) {
|
|
168
|
+
const { metadata } = copilotSession;
|
|
169
|
+
return {
|
|
170
|
+
messageCount: transformedMessages.length,
|
|
171
|
+
requestCount: metadata?.requestCount,
|
|
172
|
+
requesterUsername: metadata?.requesterUsername,
|
|
173
|
+
responderUsername: metadata?.responderUsername,
|
|
174
|
+
sessionId: metadata?.sessionId,
|
|
175
|
+
totalDuration: metadata?.totalDuration,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Copy and transform valid Copilot workspace to clean results directory
|
|
180
|
+
*
|
|
181
|
+
* Processes all JSON files in a valid workspace, transforming valid Copilot sessions
|
|
182
|
+
* (those with non-empty requests) to Claude-compatible format. Applies full normalization
|
|
183
|
+
* pipeline and splits multi-content assistant messages. Creates target directory as needed.
|
|
184
|
+
*
|
|
185
|
+
* @param workspaceHash - Hash identifier of the workspace directory
|
|
186
|
+
* @param sourceDir - Absolute path to parent directory containing workspace directories
|
|
187
|
+
* @param targetDir - Absolute path to clean results output directory
|
|
188
|
+
* @returns Promise that resolves when all files are processed and copied
|
|
189
|
+
*/
|
|
190
|
+
/* eslint-disable no-await-in-loop */
|
|
191
|
+
async copyValidCopilotWorkspace(workspaceHash, sourceDir, targetDir) {
|
|
192
|
+
const sourcePath = pathJoin(sourceDir, workspaceHash);
|
|
193
|
+
const targetPath = pathJoin(targetDir, workspaceHash);
|
|
194
|
+
// Create target directory
|
|
195
|
+
await fs.mkdir(targetPath, { recursive: true });
|
|
196
|
+
// Read all files
|
|
197
|
+
const files = await fs.readdir(sourcePath);
|
|
198
|
+
// Copy and transform valid JSON files
|
|
199
|
+
for (const file of files) {
|
|
200
|
+
if (file.endsWith('.json') && file !== 'summary.json') {
|
|
201
|
+
try {
|
|
202
|
+
const sourceFile = pathJoin(sourcePath, file);
|
|
203
|
+
const content = await fs.readFile(sourceFile, 'utf8');
|
|
204
|
+
const data = JSON.parse(content);
|
|
205
|
+
// Only copy if has valid requests (messages field from raw parser)
|
|
206
|
+
if (data.requests && data.requests.length > 0) {
|
|
207
|
+
// Transform to Claude format from requests structure
|
|
208
|
+
const transformed = this.transformCopilotToClaudeFormat(data);
|
|
209
|
+
// Apply full normalization pipeline (content standardization, turn_id assignment, etc.)
|
|
210
|
+
const normalized = normalizeClaudeSession(transformed, 'Copilot');
|
|
211
|
+
// Split assistant messages with multiple content blocks into separate messages
|
|
212
|
+
const split = this.splitAllCopilotContent(normalized);
|
|
213
|
+
const targetFile = pathJoin(targetPath, file);
|
|
214
|
+
await fs.writeFile(targetFile, JSON.stringify(split, null, 2));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Skip files that can't be processed
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
console.log(`✅ Copied and transformed ${workspaceHash} to clean_results`);
|
|
223
|
+
}
|
|
224
|
+
/* eslint-enable no-await-in-loop */
|
|
225
|
+
/**
|
|
226
|
+
* Count valid Copilot session files in a workspace directory
|
|
227
|
+
*
|
|
228
|
+
* Iterates through provided JSON files and counts how many are valid Copilot sessions
|
|
229
|
+
* (have non-empty requests array). Used for workspace analysis and validation.
|
|
230
|
+
*
|
|
231
|
+
* @param workspacePath - Absolute path to the workspace directory
|
|
232
|
+
* @param jsonFiles - Array of JSON filename strings to validate
|
|
233
|
+
* @returns Promise that resolves to the count of valid Copilot session files
|
|
234
|
+
*/
|
|
235
|
+
/* eslint-disable no-await-in-loop */
|
|
236
|
+
async countValidCopilotSessions(workspacePath, jsonFiles) {
|
|
237
|
+
let validCount = 0;
|
|
238
|
+
for (const file of jsonFiles) {
|
|
239
|
+
const isValid = await this.isValidCopilotSession(pathJoin(workspacePath, file));
|
|
240
|
+
if (isValid) {
|
|
241
|
+
validCount++;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return validCount;
|
|
245
|
+
}
|
|
246
|
+
/* eslint-enable no-await-in-loop */
|
|
247
|
+
/**
|
|
248
|
+
* Create assistant message from Copilot request response
|
|
249
|
+
*
|
|
250
|
+
* Extracts response data from Copilot request and builds an assistant message:
|
|
251
|
+
* 1. Converts response text to thinking block
|
|
252
|
+
* 2. Extracts tool invocations with arguments and results
|
|
253
|
+
* Returns null if no content could be extracted.
|
|
254
|
+
*
|
|
255
|
+
* @param req - Copilot request object with response and result data
|
|
256
|
+
* @returns Assistant message object with content array, or null if no valid content
|
|
257
|
+
*/
|
|
258
|
+
createAssistantMessageFromRequest(req) {
|
|
259
|
+
if (!req.response || !Array.isArray(req.response)) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
const assistantContent = [];
|
|
263
|
+
// Extract main text response and convert to thinking block
|
|
264
|
+
const responseText = this.extractCopilotResponseText(req.response);
|
|
265
|
+
if (responseText) {
|
|
266
|
+
assistantContent.push({
|
|
267
|
+
thinking: responseText,
|
|
268
|
+
type: 'thinking',
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
// Extract tool invocations with their arguments and results
|
|
272
|
+
const { result } = req;
|
|
273
|
+
const resultMetadata = result?.metadata;
|
|
274
|
+
const toolCallRounds = resultMetadata?.toolCallRounds;
|
|
275
|
+
const toolCallResults = resultMetadata?.toolCallResults;
|
|
276
|
+
const toolInvocations = this.extractCopilotToolInvocations(req.response, toolCallRounds, toolCallResults);
|
|
277
|
+
assistantContent.push(...toolInvocations);
|
|
278
|
+
if (assistantContent.length === 0) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
content: assistantContent,
|
|
283
|
+
timestamp: new Date().toISOString(),
|
|
284
|
+
type: 'assistant',
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Create user message from Copilot request
|
|
289
|
+
*
|
|
290
|
+
* Extracts user message text from request and builds a user message object.
|
|
291
|
+
* Includes attachments from variableData if present (file references).
|
|
292
|
+
* Returns null if no message text found.
|
|
293
|
+
*
|
|
294
|
+
* @param req - Copilot request object with message and variableData
|
|
295
|
+
* @returns User message object with text content and optional attachments, or null
|
|
296
|
+
*/
|
|
297
|
+
createUserMessageFromRequest(req) {
|
|
298
|
+
if (!req.message) {
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
const { message } = req;
|
|
302
|
+
const userMessage = {
|
|
303
|
+
content: [
|
|
304
|
+
{
|
|
305
|
+
text: typeof message.text === 'string' ? message.text : '',
|
|
306
|
+
type: 'text',
|
|
307
|
+
},
|
|
308
|
+
],
|
|
309
|
+
timestamp: new Date().toISOString(),
|
|
310
|
+
type: 'user',
|
|
311
|
+
};
|
|
312
|
+
// Add attachments if present
|
|
313
|
+
const attachments = this.extractCopilotAttachments(req.variableData || { variables: [] });
|
|
314
|
+
if (attachments.length > 0) {
|
|
315
|
+
userMessage.attachments = attachments;
|
|
316
|
+
}
|
|
317
|
+
return userMessage;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Extract file attachments from Copilot variableData
|
|
321
|
+
*
|
|
322
|
+
* Scans the variableData object for file variables and extracts their names.
|
|
323
|
+
* File variables are identified by having kind='file'. Returns an array of filenames
|
|
324
|
+
* representing files attached to a Copilot request/message.
|
|
325
|
+
*
|
|
326
|
+
* @param variableData - Object containing variables array with file references
|
|
327
|
+
* @returns Array of file attachment names extracted from variables
|
|
328
|
+
*/
|
|
329
|
+
extractCopilotAttachments(variableData) {
|
|
330
|
+
const attachments = [];
|
|
331
|
+
if (variableData?.variables && Array.isArray(variableData.variables)) {
|
|
332
|
+
for (const variable of variableData.variables) {
|
|
333
|
+
if (variable.kind === 'file' && typeof variable.name === 'string') {
|
|
334
|
+
attachments.push(variable.name);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return attachments;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Extract text content from Copilot response items
|
|
342
|
+
*
|
|
343
|
+
* Filters response items to find main text responses (items without kind or with kind='unknown')
|
|
344
|
+
* and concatenates their values into a single text string. Skips prepareToolInvocation items
|
|
345
|
+
* which are used for tool setup rather than content. Returns trimmed concatenated text.
|
|
346
|
+
*
|
|
347
|
+
* @param responseItems - Array of response item objects with kind and value properties
|
|
348
|
+
* @returns Concatenated text content from non-tool response items
|
|
349
|
+
*/
|
|
350
|
+
extractCopilotResponseText(responseItems) {
|
|
351
|
+
const textParts = [];
|
|
352
|
+
for (const item of responseItems) {
|
|
353
|
+
// Skip prepareToolInvocation items
|
|
354
|
+
if (item.kind === 'prepareToolInvocation') {
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
// Extract text from unknown kind items (main responses)
|
|
358
|
+
if ((!item.kind || item.kind === 'unknown') && item.value && typeof item.value === 'string') {
|
|
359
|
+
textParts.push(item.value);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return textParts.join(' ').trim();
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Extract tool invocations and their results from Copilot response
|
|
366
|
+
*
|
|
367
|
+
* Processes toolInvocationSerialized response items and matches them with detailed tool calls
|
|
368
|
+
* from toolCallRounds and results from toolCallResults. Constructs tool_use content blocks
|
|
369
|
+
* with parsed arguments (converting from string JSON when needed) and associated output/results.
|
|
370
|
+
* Matches sequentially: the nth toolInvocationSerialized corresponds to the nth toolCall
|
|
371
|
+
* in the collected toolCalls array.
|
|
372
|
+
*
|
|
373
|
+
* @param responseItems - Array of response item objects, filtering for toolInvocationSerialized kind
|
|
374
|
+
* @param toolCallRounds - Optional array of tool call rounds, each containing toolCalls array
|
|
375
|
+
* @param toolCallResults - Optional map of tool results keyed by tool call ID
|
|
376
|
+
* @returns Array of tool_use content blocks with input arguments and output results
|
|
377
|
+
*/
|
|
378
|
+
extractCopilotToolInvocations(responseItems, toolCallRounds, toolCallResults) {
|
|
379
|
+
const toolInvocations = [];
|
|
380
|
+
// First, collect all toolCalls from all rounds in order
|
|
381
|
+
const allToolCalls = [];
|
|
382
|
+
if (toolCallRounds && Array.isArray(toolCallRounds)) {
|
|
383
|
+
for (const round of toolCallRounds) {
|
|
384
|
+
if (round.toolCalls && Array.isArray(round.toolCalls)) {
|
|
385
|
+
allToolCalls.push(...round.toolCalls);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
// Track position in allToolCalls - match toolInvocationSerialized items sequentially to toolCalls
|
|
390
|
+
let toolCallIndex = 0;
|
|
391
|
+
for (const item of responseItems) {
|
|
392
|
+
if (item.kind !== 'toolInvocationSerialized' || !item.toolCallId || !item.toolId) {
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
const toolUse = {
|
|
396
|
+
id: item.toolCallId,
|
|
397
|
+
input: item.invocationMessage?.value || '',
|
|
398
|
+
name: item.toolId,
|
|
399
|
+
type: 'tool_use',
|
|
400
|
+
};
|
|
401
|
+
// Try to find detailed tool call arguments from toolCallRounds
|
|
402
|
+
// Match sequentially - the nth toolInvocationSerialized corresponds to the nth toolCall
|
|
403
|
+
if (toolCallIndex < allToolCalls.length) {
|
|
404
|
+
const toolCall = allToolCalls[toolCallIndex];
|
|
405
|
+
try {
|
|
406
|
+
const args = typeof toolCall.arguments === 'string'
|
|
407
|
+
? JSON.parse(toolCall.arguments)
|
|
408
|
+
: toolCall.arguments;
|
|
409
|
+
toolUse.input = args;
|
|
410
|
+
// eslint-disable-next-line camelcase
|
|
411
|
+
toolUse.tool_use_id = toolCall.id;
|
|
412
|
+
// Try to find result in toolCallResults
|
|
413
|
+
if (toolCallResults && typeof toolCall.id === 'string' && toolCall.id in toolCallResults) {
|
|
414
|
+
const result = toolCallResults[toolCall.id];
|
|
415
|
+
const textContent = this.extractToolResultContent(result);
|
|
416
|
+
// Always create output property for consistency, even if content is empty
|
|
417
|
+
toolUse.output = {
|
|
418
|
+
content: textContent || '',
|
|
419
|
+
type: 'tool_result',
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
catch {
|
|
424
|
+
// Keep original input if parsing fails
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
toolCallIndex++;
|
|
428
|
+
toolInvocations.push(toolUse);
|
|
429
|
+
}
|
|
430
|
+
return toolInvocations;
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Extract valid workspace path from object's baseUri property
|
|
434
|
+
*
|
|
435
|
+
* Checks if an object contains a baseUri with a valid path property. Path must be
|
|
436
|
+
* a string starting with '/' and must not have been seen before (checked against seenPaths set).
|
|
437
|
+
* Adds valid paths to seenPaths to prevent duplicates. Used for workspace path extraction
|
|
438
|
+
* from nested Copilot session data structures.
|
|
439
|
+
*
|
|
440
|
+
* @param obj - Object that may contain baseUri.path structure
|
|
441
|
+
* @param seenPaths - Set of previously seen paths to avoid duplicates
|
|
442
|
+
* @returns Valid path string if found and not previously seen, null otherwise
|
|
443
|
+
*/
|
|
444
|
+
extractPathFromBaseUri(obj, seenPaths) {
|
|
445
|
+
if (!obj || typeof obj !== 'object') {
|
|
446
|
+
return null;
|
|
447
|
+
}
|
|
448
|
+
const objRecord = obj;
|
|
449
|
+
if (!objRecord.baseUri || typeof objRecord.baseUri !== 'object' || objRecord.baseUri === null) {
|
|
450
|
+
return null;
|
|
451
|
+
}
|
|
452
|
+
const baseUri = objRecord.baseUri;
|
|
453
|
+
if (!baseUri.path || typeof baseUri.path !== 'string') {
|
|
454
|
+
return null;
|
|
455
|
+
}
|
|
456
|
+
const { path } = baseUri;
|
|
457
|
+
if (path.startsWith('/') && !seenPaths.has(path)) {
|
|
458
|
+
seenPaths.add(path);
|
|
459
|
+
return path;
|
|
460
|
+
}
|
|
461
|
+
return null;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Extract readable text from deeply nested VS Code/Copilot object structures
|
|
465
|
+
*
|
|
466
|
+
* Recursively traverses nested object trees commonly found in Copilot tool results,
|
|
467
|
+
* extracting all text values from nodes. Handles multiple text source patterns:
|
|
468
|
+
* 1. Direct text property on nodes
|
|
469
|
+
* 2. String values in value property
|
|
470
|
+
* 3. Nested structures in children array
|
|
471
|
+
* 4. Nested structures in node property
|
|
472
|
+
* Returns concatenated text from all found sources, trimmed.
|
|
473
|
+
*
|
|
474
|
+
* @param obj - Nested object structure to traverse (may be object, array, or primitive)
|
|
475
|
+
* @returns Concatenated text content extracted from all nested text sources
|
|
476
|
+
*/
|
|
477
|
+
extractTextFromNestedObject(obj) {
|
|
478
|
+
const textParts = [];
|
|
479
|
+
function traverse(node) {
|
|
480
|
+
if (!node)
|
|
481
|
+
return;
|
|
482
|
+
// If this is an array, traverse each element
|
|
483
|
+
if (Array.isArray(node)) {
|
|
484
|
+
for (const item of node) {
|
|
485
|
+
traverse(item);
|
|
486
|
+
}
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
if (typeof node !== 'object')
|
|
490
|
+
return;
|
|
491
|
+
const nodeRecord = node;
|
|
492
|
+
// If node has a text property, add it
|
|
493
|
+
if (typeof nodeRecord.text === 'string' && nodeRecord.text) {
|
|
494
|
+
textParts.push(nodeRecord.text);
|
|
495
|
+
}
|
|
496
|
+
// If node has value, traverse it
|
|
497
|
+
if (nodeRecord.value) {
|
|
498
|
+
if (typeof nodeRecord.value === 'string') {
|
|
499
|
+
textParts.push(nodeRecord.value);
|
|
500
|
+
}
|
|
501
|
+
else if (typeof nodeRecord.value === 'object') {
|
|
502
|
+
traverse(nodeRecord.value);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
// If node has children array, traverse each child
|
|
506
|
+
if (Array.isArray(nodeRecord.children)) {
|
|
507
|
+
for (const child of nodeRecord.children) {
|
|
508
|
+
traverse(child);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
// If node has node property (nested structure)
|
|
512
|
+
if (nodeRecord.node && typeof nodeRecord.node === 'object') {
|
|
513
|
+
traverse(nodeRecord.node);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
traverse(obj);
|
|
517
|
+
return textParts.join('').trim();
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Extract human-readable text content from Copilot tool result objects
|
|
521
|
+
*
|
|
522
|
+
* Handles multiple result format patterns commonly returned by Copilot tools:
|
|
523
|
+
* 1. Array-based content: Simple string extraction from value properties (e.g., run_in_terminal)
|
|
524
|
+
* 2. Array-based content: Fallback to nested object extraction (e.g., copilot_readFile)
|
|
525
|
+
* 3. Object-based content: Traverses nested structures for text values
|
|
526
|
+
* Prefers simple extraction if content found, falls back to complex nested traversal.
|
|
527
|
+
* Used to extract readable output from tool invocation results.
|
|
528
|
+
*
|
|
529
|
+
* @param result - Tool result object with content property (array, object, or nested structure)
|
|
530
|
+
* @returns Extracted text content from the result, empty string if no content found
|
|
531
|
+
*/
|
|
532
|
+
extractToolResultContent(result) {
|
|
533
|
+
let textContent = '';
|
|
534
|
+
// Try to extract from array-based content
|
|
535
|
+
if (result.content && Array.isArray(result.content)) {
|
|
536
|
+
// First try simple string value extraction (e.g., run_in_terminal results)
|
|
537
|
+
const simpleExtracted = result.content
|
|
538
|
+
.map((c) => {
|
|
539
|
+
const cRecord = c;
|
|
540
|
+
if (typeof cRecord.value === 'string') {
|
|
541
|
+
return cRecord.value;
|
|
542
|
+
}
|
|
543
|
+
if (typeof c === 'string') {
|
|
544
|
+
return c;
|
|
545
|
+
}
|
|
546
|
+
return null;
|
|
547
|
+
})
|
|
548
|
+
.filter((v) => v !== null)
|
|
549
|
+
.join('\n');
|
|
550
|
+
// If simple extraction found content, use it; otherwise try nested object extraction (e.g., copilot_readFile results)
|
|
551
|
+
textContent = simpleExtracted || this.extractTextFromNestedObject(result.content);
|
|
552
|
+
}
|
|
553
|
+
// Try to extract from plain nested object structure
|
|
554
|
+
else if (result.content && typeof result.content === 'object') {
|
|
555
|
+
textContent = this.extractTextFromNestedObject(result.content);
|
|
556
|
+
}
|
|
557
|
+
// If result itself is a nested object with content, extract from it
|
|
558
|
+
else if (typeof result === 'object' && !Array.isArray(result)) {
|
|
559
|
+
textContent = this.extractTextFromNestedObject(result);
|
|
560
|
+
}
|
|
561
|
+
return textContent;
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Extract workspace path from Copilot session data structures
|
|
565
|
+
*
|
|
566
|
+
* Recursively searches through all properties and nested objects in a Copilot session
|
|
567
|
+
* to find workspace paths. Looks for baseUri.path patterns which contain absolute paths
|
|
568
|
+
* starting with '/'. Returns the first valid path found. Uses a seenPaths set internally
|
|
569
|
+
* to avoid returning duplicate paths if multiple workspace paths exist.
|
|
570
|
+
*
|
|
571
|
+
* @param copilotSession - Copilot session object containing nested data structures with baseUri patterns
|
|
572
|
+
* @returns First valid workspace path found (absolute path starting with '/'), or null if not found
|
|
573
|
+
*/
|
|
574
|
+
extractWorkspacePathFromCopilot(copilotSession) {
|
|
575
|
+
const seenPaths = new Set();
|
|
576
|
+
const traverse = (obj) => {
|
|
577
|
+
if (!obj || typeof obj !== 'object') {
|
|
578
|
+
return null;
|
|
579
|
+
}
|
|
580
|
+
const objRecord = obj;
|
|
581
|
+
// Check current object's baseUri
|
|
582
|
+
const pathFromBaseUri = this.extractPathFromBaseUri(obj, seenPaths);
|
|
583
|
+
if (pathFromBaseUri) {
|
|
584
|
+
return pathFromBaseUri;
|
|
585
|
+
}
|
|
586
|
+
// Traverse all properties
|
|
587
|
+
for (const key of Object.keys(objRecord)) {
|
|
588
|
+
const value = objRecord[key];
|
|
589
|
+
if (typeof value === 'object' && value !== null) {
|
|
590
|
+
const result = traverse(value);
|
|
591
|
+
if (result) {
|
|
592
|
+
return result;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
return null;
|
|
597
|
+
};
|
|
598
|
+
return traverse(copilotSession);
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Validate if a Copilot session file contains valid session data
|
|
602
|
+
*
|
|
603
|
+
* Reads and parses a JSON file, checking if it contains a non-empty requests array.
|
|
604
|
+
* A session is considered valid if requests field exists and contains at least one request.
|
|
605
|
+
* Used during workspace analysis to identify which session files have meaningful data.
|
|
606
|
+
* Returns false silently if file cannot be read or parsed.
|
|
607
|
+
*
|
|
608
|
+
* @param filePath - Absolute path to JSON session file
|
|
609
|
+
* @returns Promise resolving to true if file contains valid requests, false otherwise
|
|
610
|
+
*/
|
|
611
|
+
async isValidCopilotSession(filePath) {
|
|
612
|
+
try {
|
|
613
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
614
|
+
const data = JSON.parse(content);
|
|
615
|
+
return data.requests && Array.isArray(data.requests) && data.requests.length > 0;
|
|
616
|
+
}
|
|
617
|
+
catch {
|
|
618
|
+
return false;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* Normalize workspace paths from Copilot session to standard array format
|
|
623
|
+
*
|
|
624
|
+
* Ensures workspace paths are always returned as a string array. Handles multiple input formats:
|
|
625
|
+
* 1. Already-array workspace paths (monorepo with multiple paths)
|
|
626
|
+
* 2. String workspace paths (single workspace)
|
|
627
|
+
* 3. Extracted workspace paths via deep extraction if not found in top-level workspacePath property
|
|
628
|
+
* Returns empty array if no workspace paths found. Provides fallback extraction mechanism for
|
|
629
|
+
* complex Copilot session structures where workspace info is nested.
|
|
630
|
+
*
|
|
631
|
+
* @param copilotSession - Copilot session object which may have workspacePath property or nested paths
|
|
632
|
+
* @returns Array of workspace paths (may be empty if no paths found)
|
|
633
|
+
*/
|
|
634
|
+
normalizeWorkspacePaths(copilotSession) {
|
|
635
|
+
const workspacePath = copilotSession.workspacePath || this.extractWorkspacePathFromCopilot(copilotSession) || '';
|
|
636
|
+
// Handle array workspace paths (monorepo)
|
|
637
|
+
if (Array.isArray(workspacePath)) {
|
|
638
|
+
return workspacePath;
|
|
639
|
+
}
|
|
640
|
+
if (typeof workspacePath === 'string' && workspacePath) {
|
|
641
|
+
return [workspacePath];
|
|
642
|
+
}
|
|
643
|
+
return [];
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
646
|
+
* Split all messages in a session that have multiple content blocks
|
|
647
|
+
*
|
|
648
|
+
* Copilot assistant messages often contain multiple content blocks (thinking + tool_use)
|
|
649
|
+
* in a single message. This function splits such messages into separate messages, one per
|
|
650
|
+
* content block, to create a cleaner, more normalized message sequence.
|
|
651
|
+
*
|
|
652
|
+
* Processing logic:
|
|
653
|
+
* - User messages: Preserved as-is (no splitting)
|
|
654
|
+
* - Assistant messages with single content block: Preserved as-is
|
|
655
|
+
* - Assistant messages with multiple content blocks: Split into separate messages,
|
|
656
|
+
* one per content block, each with the same timestamp
|
|
657
|
+
*
|
|
658
|
+
* After splitting, recalculates turn_id for all messages to maintain proper sequential
|
|
659
|
+
* numbering (1, 2, 3, ...). This ensures the message sequence remains valid after the
|
|
660
|
+
* splitting transformation.
|
|
661
|
+
*
|
|
662
|
+
* @param session - Copilot session object with messages array to be split
|
|
663
|
+
* @returns New session object with split messages and recalculated turn_ids
|
|
664
|
+
*/
|
|
665
|
+
splitAllCopilotContent(session) {
|
|
666
|
+
const split = [];
|
|
667
|
+
if (!Array.isArray(session.messages)) {
|
|
668
|
+
return session;
|
|
669
|
+
}
|
|
670
|
+
for (const message of session.messages) {
|
|
671
|
+
const msg = message;
|
|
672
|
+
if (msg.type === 'assistant' && Array.isArray(msg.content) && msg.content.length > 1) {
|
|
673
|
+
// Split this message - each content block becomes its own message
|
|
674
|
+
const splitMessages = msg.content.map((block) => ({
|
|
675
|
+
content: [block],
|
|
676
|
+
timestamp: msg.timestamp,
|
|
677
|
+
type: 'assistant',
|
|
678
|
+
}));
|
|
679
|
+
split.push(...splitMessages);
|
|
680
|
+
}
|
|
681
|
+
else {
|
|
682
|
+
// Keep as-is (user messages or assistant messages with single content block)
|
|
683
|
+
split.push(msg);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
// Recalculate turn_id for all messages to maintain proper sequence
|
|
687
|
+
const withTurnIds = split.map((msg, index) => ({
|
|
688
|
+
...msg,
|
|
689
|
+
// eslint-disable-next-line camelcase
|
|
690
|
+
turn_id: index + 1,
|
|
691
|
+
}));
|
|
692
|
+
return {
|
|
693
|
+
...session,
|
|
694
|
+
messages: withTurnIds,
|
|
695
|
+
};
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Transform Copilot session to match Claude format
|
|
699
|
+
* Uses the requests array which contains detailed conversation structure
|
|
700
|
+
*/
|
|
701
|
+
transformCopilotToClaudeFormat(copilotSession) {
|
|
702
|
+
const transformedMessages = [];
|
|
703
|
+
const requests = copilotSession.requests || [];
|
|
704
|
+
for (const request of requests) {
|
|
705
|
+
const req = request;
|
|
706
|
+
// Create user message from request
|
|
707
|
+
const userMessage = this.createUserMessageFromRequest(req);
|
|
708
|
+
if (userMessage) {
|
|
709
|
+
transformedMessages.push(userMessage);
|
|
710
|
+
}
|
|
711
|
+
// Create assistant message from response
|
|
712
|
+
const assistantMessage = this.createAssistantMessageFromRequest(req);
|
|
713
|
+
if (assistantMessage) {
|
|
714
|
+
transformedMessages.push(assistantMessage);
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
const workspacePaths = this.normalizeWorkspacePaths(copilotSession);
|
|
718
|
+
const sessionMetadata = this.buildSessionMetadata(transformedMessages, copilotSession);
|
|
719
|
+
return {
|
|
720
|
+
id: copilotSession.id,
|
|
721
|
+
messages: transformedMessages,
|
|
722
|
+
metadata: sessionMetadata,
|
|
723
|
+
timestamp: copilotSession.timestamp,
|
|
724
|
+
title: copilotSession.title,
|
|
725
|
+
type: 'Copilot',
|
|
726
|
+
workspacePaths,
|
|
727
|
+
};
|
|
728
|
+
}
|
|
729
|
+
}
|