byterover-cli 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -56
- package/bin/dev.js +1 -1
- package/dist/commands/cipher-agent/run.d.ts +111 -0
- package/dist/commands/cipher-agent/run.js +493 -0
- package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
- package/dist/commands/cipher-agent/set-prompt.js +53 -0
- package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
- package/dist/commands/cipher-agent/show-prompt.js +48 -0
- package/dist/commands/clear.d.ts +6 -0
- package/dist/commands/clear.js +36 -15
- package/dist/commands/curate.d.ts +74 -0
- package/dist/commands/curate.js +396 -0
- package/dist/commands/foo.d.ts +12 -0
- package/dist/commands/foo.js +61 -0
- package/dist/commands/gen-rules.d.ts +3 -0
- package/dist/commands/gen-rules.js +39 -20
- package/dist/commands/init.d.ts +63 -3
- package/dist/commands/init.js +285 -70
- package/dist/commands/login.js +9 -4
- package/dist/commands/pull.d.ts +33 -0
- package/dist/commands/pull.js +115 -0
- package/dist/commands/push.d.ts +13 -13
- package/dist/commands/push.js +81 -101
- package/dist/commands/query.d.ts +63 -0
- package/dist/commands/query.js +349 -0
- package/dist/commands/space/list.d.ts +5 -2
- package/dist/commands/space/list.js +60 -56
- package/dist/commands/space/switch.d.ts +16 -0
- package/dist/commands/space/switch.js +102 -53
- package/dist/commands/status.d.ts +5 -2
- package/dist/commands/status.js +43 -33
- package/dist/commands/watch.d.ts +23 -0
- package/dist/commands/watch.js +171 -0
- package/dist/config/auth.config.js +14 -2
- package/dist/config/context-tree-domains.d.ts +12 -0
- package/dist/config/context-tree-domains.js +29 -0
- package/dist/config/environment.d.ts +6 -0
- package/dist/config/environment.js +9 -2
- package/dist/constants.d.ts +5 -0
- package/dist/constants.js +6 -0
- package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
- package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
- package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
- package/dist/core/domain/cipher/agent/agent-state.js +59 -0
- package/dist/core/domain/cipher/agent/index.d.ts +7 -0
- package/dist/core/domain/cipher/agent/index.js +7 -0
- package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
- package/dist/core/domain/cipher/agent-events/index.js +7 -0
- package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
- package/dist/core/domain/cipher/agent-events/types.js +42 -0
- package/dist/core/domain/cipher/blob/types.d.ts +108 -0
- package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
- package/dist/core/domain/cipher/errors/blob-error.js +68 -0
- package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
- package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
- package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
- package/dist/core/domain/cipher/errors/llm-error.js +161 -0
- package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
- package/dist/core/domain/cipher/errors/memory-error.js +62 -0
- package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
- package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
- package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
- package/dist/core/domain/cipher/errors/process-error.js +173 -0
- package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
- package/dist/core/domain/cipher/errors/session-error.js +74 -0
- package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
- package/dist/core/domain/cipher/errors/tool-error.js +81 -0
- package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
- package/dist/core/domain/cipher/memory/types.d.ts +102 -0
- package/dist/core/domain/cipher/memory/types.js +4 -0
- package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
- package/dist/core/domain/cipher/parsed-interaction.js +25 -0
- package/dist/core/domain/cipher/process/types.d.ts +286 -0
- package/dist/core/domain/cipher/session/types.d.ts +54 -0
- package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
- package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
- package/dist/core/domain/cipher/todos/index.d.ts +4 -0
- package/dist/core/domain/cipher/todos/index.js +4 -0
- package/dist/core/domain/cipher/todos/types.d.ts +57 -0
- package/dist/core/domain/cipher/todos/types.js +5 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
- package/dist/core/domain/cipher/tools/constants.js +24 -0
- package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
- package/dist/core/domain/cipher/tools/tool-error.js +246 -0
- package/dist/core/domain/cipher/tools/types.d.ts +145 -0
- package/dist/core/domain/entities/brv-config.d.ts +42 -6
- package/dist/core/domain/entities/brv-config.js +115 -17
- package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
- package/dist/core/domain/entities/cogit-push-context.js +91 -0
- package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
- package/dist/core/domain/entities/cogit-push-response.js +31 -0
- package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
- package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
- package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
- package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
- package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
- package/dist/core/domain/entities/cogit-snapshot.js +58 -0
- package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
- package/dist/core/domain/entities/context-tree-index.js +27 -0
- package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
- package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
- package/dist/core/domain/entities/event.d.ts +1 -1
- package/dist/core/domain/entities/event.js +3 -1
- package/dist/core/domain/entities/parser.d.ts +567 -0
- package/dist/core/domain/entities/parser.js +10 -0
- package/dist/core/domain/entities/playbook.d.ts +2 -23
- package/dist/core/domain/entities/playbook.js +2 -70
- package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
- package/dist/core/domain/errors/brv-config-version-error.js +21 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
- package/dist/core/domain/knowledge/directory-manager.js +145 -0
- package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
- package/dist/core/domain/knowledge/markdown-writer.js +18 -0
- package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
- package/dist/core/domain/knowledge/relation-parser.js +131 -0
- package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
- package/dist/core/interfaces/cipher/cipher-services.js +1 -0
- package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
- package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
- package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
- package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
- package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
- package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
- package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
- package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
- package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
- package/dist/core/interfaces/cipher/i-file-system.js +1 -0
- package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
- package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
- package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
- package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
- package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
- package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
- package/dist/core/interfaces/cipher/i-logger.js +28 -0
- package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
- package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
- package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
- package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
- package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
- package/dist/core/interfaces/cipher/i-process-service.js +1 -0
- package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
- package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
- package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
- package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
- package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
- package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
- package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
- package/dist/core/interfaces/cipher/llm-types.js +5 -0
- package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
- package/dist/core/interfaces/cipher/message-types.js +5 -0
- package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
- package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
- package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
- package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
- package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
- package/dist/core/interfaces/i-cogit-push-service.js +1 -0
- package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
- package/dist/core/interfaces/i-context-file-reader.js +1 -0
- package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
- package/dist/core/interfaces/i-context-tree-service.js +1 -0
- package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
- package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
- package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
- package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
- package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
- package/dist/core/interfaces/i-file-watcher-service.js +1 -0
- package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
- package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
- package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
- package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
- package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
- package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
- package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
- package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
- package/dist/hooks/error/clean-errors.d.ts +7 -0
- package/dist/hooks/error/clean-errors.js +50 -0
- package/dist/hooks/init/welcome.js +72 -1
- package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
- package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
- package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
- package/dist/infra/cipher/agent-service-factory.js +212 -0
- package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
- package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
- package/dist/infra/cipher/blob/index.d.ts +10 -0
- package/dist/infra/cipher/blob/index.js +12 -0
- package/dist/infra/cipher/blob/migrations.d.ts +63 -0
- package/dist/infra/cipher/blob/migrations.js +148 -0
- package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
- package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
- package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
- package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
- package/dist/infra/cipher/cipher-agent.d.ts +182 -0
- package/dist/infra/cipher/cipher-agent.js +317 -0
- package/dist/infra/cipher/command-parser.d.ts +23 -0
- package/dist/infra/cipher/command-parser.js +85 -0
- package/dist/infra/cipher/display/todo-display.d.ts +23 -0
- package/dist/infra/cipher/display/todo-display.js +129 -0
- package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
- package/dist/infra/cipher/events/event-emitter.js +158 -0
- package/dist/infra/cipher/exit-codes.d.ts +44 -0
- package/dist/infra/cipher/exit-codes.js +58 -0
- package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
- package/dist/infra/cipher/file-system/file-system-service.js +641 -0
- package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
- package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
- package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
- package/dist/infra/cipher/file-system/glob-utils.js +120 -0
- package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
- package/dist/infra/cipher/file-system/path-validator.js +184 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
- package/dist/infra/cipher/interactive-commands.d.ts +16 -0
- package/dist/infra/cipher/interactive-commands.js +198 -0
- package/dist/infra/cipher/interactive-loop.d.ts +24 -0
- package/dist/infra/cipher/interactive-loop.js +352 -0
- package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
- package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
- package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
- package/dist/infra/cipher/llm/context/compression/index.js +5 -0
- package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
- package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
- package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
- package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
- package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
- package/dist/infra/cipher/llm/context/compression/types.js +1 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
- package/dist/infra/cipher/llm/context/context-manager.js +419 -0
- package/dist/infra/cipher/llm/context/index.d.ts +2 -0
- package/dist/infra/cipher/llm/context/index.js +2 -0
- package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
- package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
- package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
- package/dist/infra/cipher/llm/context/utils.js +89 -0
- package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
- package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
- package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
- package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
- package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
- package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
- package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
- package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
- package/dist/infra/cipher/llm/generators/index.js +13 -0
- package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
- package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
- package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
- package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
- package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
- package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
- package/dist/infra/cipher/llm/index.d.ts +9 -0
- package/dist/infra/cipher/llm/index.js +13 -0
- package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
- package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
- package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
- package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
- package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
- package/dist/infra/cipher/llm/response-validator.js +157 -0
- package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
- package/dist/infra/cipher/llm/retry/index.js +10 -0
- package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
- package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
- package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
- package/dist/infra/cipher/llm/thought-parser.js +190 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
- package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
- package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
- package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
- package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
- package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
- package/dist/infra/cipher/logger/console-logger.js +63 -0
- package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
- package/dist/infra/cipher/logger/event-based-logger.js +92 -0
- package/dist/infra/cipher/memory/index.d.ts +6 -0
- package/dist/infra/cipher/memory/index.js +7 -0
- package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
- package/dist/infra/cipher/memory/memory-manager.js +523 -0
- package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
- package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
- package/dist/infra/cipher/process/command-validator.d.ts +59 -0
- package/dist/infra/cipher/process/command-validator.js +266 -0
- package/dist/infra/cipher/process/index.d.ts +8 -0
- package/dist/infra/cipher/process/index.js +8 -0
- package/dist/infra/cipher/process/process-service.d.ts +95 -0
- package/dist/infra/cipher/process/process-service.js +439 -0
- package/dist/infra/cipher/session/chat-session.d.ts +80 -0
- package/dist/infra/cipher/session/chat-session.js +165 -0
- package/dist/infra/cipher/session/index.d.ts +6 -0
- package/dist/infra/cipher/session/index.js +5 -0
- package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
- package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
- package/dist/infra/cipher/session/session-manager.d.ts +109 -0
- package/dist/infra/cipher/session/session-manager.js +172 -0
- package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
- package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
- package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
- package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
- package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
- package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
- package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
- package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
- package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
- package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
- package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
- package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
- package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
- package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
- package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
- package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
- package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
- package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
- package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
- package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
- package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
- package/dist/infra/cipher/tools/index.d.ts +18 -0
- package/dist/infra/cipher/tools/index.js +19 -0
- package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
- package/dist/infra/cipher/tools/policy-engine.js +110 -0
- package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
- package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
- package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
- package/dist/infra/cipher/tools/tool-invocation.js +294 -0
- package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
- package/dist/infra/cipher/tools/tool-manager.js +209 -0
- package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
- package/dist/infra/cipher/tools/tool-markers.js +49 -0
- package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
- package/dist/infra/cipher/tools/tool-provider.js +196 -0
- package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
- package/dist/infra/cipher/tools/tool-registry.js +144 -0
- package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
- package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
- package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
- package/dist/infra/cipher/validation/workspace-validator.js +37 -0
- package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
- package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
- package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
- package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
- package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
- package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
- package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
- package/dist/infra/cogit/http-cogit-push-service.js +104 -0
- package/dist/infra/config/file-config-store.js +9 -3
- package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
- package/dist/infra/context-tree/file-context-file-reader.js +46 -0
- package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
- package/dist/infra/context-tree/file-context-tree-service.js +46 -0
- package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
- package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
- package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
- package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
- package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
- package/dist/infra/memory/http-memory-storage-service.js +4 -3
- package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
- package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
- package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
- package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
- package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
- package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
- package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
- package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
- package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
- package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
- package/dist/infra/parsers/clean/shared.d.ts +84 -0
- package/dist/infra/parsers/clean/shared.js +273 -0
- package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
- package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
- package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
- package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
- package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
- package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
- package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
- package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
- package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
- package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
- package/dist/infra/space/http-space-service.js +2 -1
- package/dist/infra/team/http-team-service.js +2 -1
- package/dist/infra/user/http-user-service.js +2 -1
- package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
- package/dist/infra/watcher/file-watcher-service.js +81 -0
- package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
- package/dist/infra/workspace/workspace-detector-service.js +165 -0
- package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
- package/dist/resources/prompts/modes/autonomous.yml +9 -0
- package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
- package/dist/resources/prompts/reflection.yml +27 -0
- package/dist/resources/prompts/system-prompt.yml +82 -0
- package/dist/resources/prompts/tool-outputs.yml +30 -0
- package/dist/templates/README.md +6 -7
- package/dist/templates/sections/command-reference.md +40 -111
- package/dist/templates/sections/workflow.md +3 -30
- package/dist/utils/emoji-helpers.d.ts +38 -0
- package/dist/utils/emoji-helpers.js +42 -0
- package/dist/utils/error-handler.d.ts +51 -0
- package/dist/utils/error-handler.js +169 -0
- package/dist/utils/error-helpers.d.ts +30 -0
- package/dist/utils/error-helpers.js +47 -0
- package/dist/utils/file-helpers.d.ts +15 -0
- package/dist/utils/file-helpers.js +44 -0
- package/dist/utils/oclif-error-helpers.d.ts +40 -0
- package/dist/utils/oclif-error-helpers.js +46 -0
- package/dist/utils/tool-display-formatter.d.ts +53 -0
- package/dist/utils/tool-display-formatter.js +257 -0
- package/oclif.manifest.json +381 -141
- package/package.json +27 -6
- package/dist/commands/add.d.ts +0 -49
- package/dist/commands/add.js +0 -192
- package/dist/commands/complete.d.ts +0 -108
- package/dist/commands/complete.js +0 -340
- package/dist/commands/retrieve.d.ts +0 -26
- package/dist/commands/retrieve.js +0 -101
- package/dist/core/domain/entities/curator-output.d.ts +0 -14
- package/dist/core/domain/entities/curator-output.js +0 -23
- package/dist/core/domain/entities/delta-batch.d.ts +0 -30
- package/dist/core/domain/entities/delta-batch.js +0 -52
- package/dist/core/domain/entities/delta-operation.d.ts +0 -31
- package/dist/core/domain/entities/delta-operation.js +0 -50
- package/dist/core/domain/entities/executor-output.d.ts +0 -27
- package/dist/core/domain/entities/executor-output.js +0 -33
- package/dist/core/domain/entities/reflector-output.d.ts +0 -38
- package/dist/core/domain/entities/reflector-output.js +0 -44
- package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
- package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
- package/dist/core/interfaces/i-delta-store.d.ts +0 -15
- package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
- package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
- package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
- package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
- package/dist/infra/ace/ace-file-utils.d.ts +0 -46
- package/dist/infra/ace/ace-file-utils.js +0 -83
- package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
- package/dist/infra/ace/ace-prompt-templates.js +0 -177
- package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
- package/dist/infra/ace/file-bullet-content-store.js +0 -89
- package/dist/infra/ace/file-delta-store.d.ts +0 -9
- package/dist/infra/ace/file-delta-store.js +0 -26
- package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
- package/dist/infra/ace/file-executor-output-store.js +0 -26
- package/dist/infra/ace/file-playbook-store.d.ts +0 -29
- package/dist/infra/ace/file-playbook-store.js +0 -107
- package/dist/infra/ace/file-reflection-store.d.ts +0 -10
- package/dist/infra/ace/file-reflection-store.js +0 -55
- package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
- package/dist/infra/playbook/file-playbook-service.js +0 -132
- /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
- /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
- /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
- /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
- /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
- /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
- /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
import { nanoid } from 'nanoid';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { MemoryError, MemoryErrorCode } from '../../../core/domain/cipher/errors/memory-error.js';
|
|
4
|
+
import { NoOpLogger } from '../../../core/interfaces/cipher/i-logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* Validation constants
|
|
7
|
+
*/
|
|
8
|
+
const MAX_CONTENT_LENGTH = 10_000; // 10k characters max per memory
|
|
9
|
+
const MAX_TAG_LENGTH = 50;
|
|
10
|
+
const MAX_TAGS = 10;
|
|
11
|
+
/**
|
|
12
|
+
* Embedded Zod schemas for runtime validation
|
|
13
|
+
* Following cipher pattern: schemas are co-located with implementation
|
|
14
|
+
*/
|
|
15
|
+
const MemorySourceSchema = z.enum(['agent', 'system', 'user']).describe('Source of the memory');
|
|
16
|
+
const AttachmentSchema = z
|
|
17
|
+
.object({
|
|
18
|
+
blobKey: z.string().min(1).describe('Reference to blob in BlobStorage'),
|
|
19
|
+
createdAt: z.number().int().positive().describe('Timestamp when attached (Unix ms)'),
|
|
20
|
+
name: z.string().optional().describe('Original filename'),
|
|
21
|
+
size: z.number().int().nonnegative().describe('Size in bytes'),
|
|
22
|
+
type: z.string().min(1).describe('MIME type'),
|
|
23
|
+
})
|
|
24
|
+
.strict()
|
|
25
|
+
.describe('Blob attachment metadata');
|
|
26
|
+
const MemoryMetadataSchema = z
|
|
27
|
+
.object({
|
|
28
|
+
attachments: z.array(AttachmentSchema).optional().describe('Blob attachments'),
|
|
29
|
+
pinned: z.boolean().optional().describe('Whether this memory is pinned for auto-loading'),
|
|
30
|
+
source: MemorySourceSchema.optional().describe('Source of the memory'),
|
|
31
|
+
})
|
|
32
|
+
.passthrough() // Allow additional custom fields
|
|
33
|
+
.describe('Memory metadata');
|
|
34
|
+
const MemorySchema = z
|
|
35
|
+
.object({
|
|
36
|
+
content: z
|
|
37
|
+
.string()
|
|
38
|
+
.min(1, 'Memory content cannot be empty')
|
|
39
|
+
.max(MAX_CONTENT_LENGTH, `Memory content cannot exceed ${MAX_CONTENT_LENGTH} characters`)
|
|
40
|
+
.describe('The actual memory content'),
|
|
41
|
+
createdAt: z.number().int().positive().describe('Creation timestamp (Unix ms)'),
|
|
42
|
+
id: z.string().min(1).describe('Unique identifier for the memory'),
|
|
43
|
+
metadata: MemoryMetadataSchema.optional().describe('Additional metadata'),
|
|
44
|
+
tags: z
|
|
45
|
+
.array(z.string().min(1).max(MAX_TAG_LENGTH))
|
|
46
|
+
.max(MAX_TAGS)
|
|
47
|
+
.optional()
|
|
48
|
+
.describe('Optional tags for categorization'),
|
|
49
|
+
updatedAt: z.number().int().positive().describe('Last update timestamp (Unix ms)'),
|
|
50
|
+
})
|
|
51
|
+
.strict()
|
|
52
|
+
.describe('Memory item stored in the system');
|
|
53
|
+
const CreateMemoryInputSchema = z
|
|
54
|
+
.object({
|
|
55
|
+
content: z
|
|
56
|
+
.string()
|
|
57
|
+
.min(1, 'Memory content cannot be empty')
|
|
58
|
+
.max(MAX_CONTENT_LENGTH, `Memory content cannot exceed ${MAX_CONTENT_LENGTH} characters`)
|
|
59
|
+
.describe('The memory content'),
|
|
60
|
+
metadata: MemoryMetadataSchema.optional().describe('Optional metadata'),
|
|
61
|
+
tags: z
|
|
62
|
+
.array(z.string().min(1).max(MAX_TAG_LENGTH))
|
|
63
|
+
.max(MAX_TAGS)
|
|
64
|
+
.optional()
|
|
65
|
+
.describe('Optional tags for categorization'),
|
|
66
|
+
})
|
|
67
|
+
.strict()
|
|
68
|
+
.describe('Input for creating a new memory');
|
|
69
|
+
const UpdateMemoryInputSchema = z
|
|
70
|
+
.object({
|
|
71
|
+
content: z
|
|
72
|
+
.string()
|
|
73
|
+
.min(1, 'Memory content cannot be empty')
|
|
74
|
+
.max(MAX_CONTENT_LENGTH, `Memory content cannot exceed ${MAX_CONTENT_LENGTH} characters`)
|
|
75
|
+
.optional()
|
|
76
|
+
.describe('Updated content'),
|
|
77
|
+
metadata: MemoryMetadataSchema.optional().describe('Updated metadata (merges with existing)'),
|
|
78
|
+
})
|
|
79
|
+
.strict()
|
|
80
|
+
.describe('Input for updating an existing memory');
|
|
81
|
+
const ListMemoriesOptionsSchema = z
|
|
82
|
+
.object({
|
|
83
|
+
limit: z.number().int().positive().optional().describe('Limit number of results'),
|
|
84
|
+
offset: z.number().int().nonnegative().optional().describe('Skip first N results'),
|
|
85
|
+
pinned: z.boolean().optional().describe('Filter by pinned status'),
|
|
86
|
+
source: MemorySourceSchema.optional().describe('Filter by source'),
|
|
87
|
+
})
|
|
88
|
+
.strict()
|
|
89
|
+
.describe('Options for listing memories');
|
|
90
|
+
/**
|
|
91
|
+
* MemoryManager handles CRUD operations for cipher agent memories
|
|
92
|
+
*
|
|
93
|
+
* Responsibilities:
|
|
94
|
+
* - Store and retrieve memories using BlobStorage
|
|
95
|
+
* - Validate memory data using embedded Zod schemas
|
|
96
|
+
* - Generate unique IDs for memories
|
|
97
|
+
* - Filter and search memories by source and pinned status
|
|
98
|
+
* - Sort memories by recency (updatedAt descending)
|
|
99
|
+
* - Manage blob attachments
|
|
100
|
+
*
|
|
101
|
+
* Storage:
|
|
102
|
+
* - Memories are stored as JSON blobs with key pattern: memory-{id}
|
|
103
|
+
* - Attachments are stored as blobs with key pattern: memory-{id}-{suffix}
|
|
104
|
+
* - All persistence operations use BlobStorage
|
|
105
|
+
*/
|
|
106
|
+
export class MemoryManager {
|
|
107
|
+
blobStorage;
|
|
108
|
+
static MEMORY_KEY_PREFIX = 'memory-';
|
|
109
|
+
logger;
|
|
110
|
+
constructor(blobStorage, logger) {
|
|
111
|
+
this.blobStorage = blobStorage;
|
|
112
|
+
this.logger = logger ?? new NoOpLogger();
|
|
113
|
+
this.logger.info('Memory manager initialized');
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Attach a blob to an existing memory
|
|
117
|
+
* @param memoryId - Memory ID to attach blob to
|
|
118
|
+
* @param content - Blob content (Buffer or string)
|
|
119
|
+
* @param metadata - Blob metadata
|
|
120
|
+
* @param metadata.name - Optional filename
|
|
121
|
+
* @param metadata.type - Optional MIME type
|
|
122
|
+
* @returns Attachment metadata
|
|
123
|
+
* @throws MemoryError if memory not found or attachment fails
|
|
124
|
+
*/
|
|
125
|
+
async attachBlob(memoryId, content, metadata = {}) {
|
|
126
|
+
// Get existing memory
|
|
127
|
+
const memory = await this.get(memoryId);
|
|
128
|
+
// Generate unique blob key
|
|
129
|
+
const blobKey = `memory-${memoryId}-${nanoid(8)}`;
|
|
130
|
+
// Store blob
|
|
131
|
+
try {
|
|
132
|
+
const storedBlob = await this.blobStorage.store(blobKey, content, {
|
|
133
|
+
contentType: metadata.type,
|
|
134
|
+
originalName: metadata.name,
|
|
135
|
+
tags: { memoryId },
|
|
136
|
+
});
|
|
137
|
+
// Create attachment metadata
|
|
138
|
+
const attachment = {
|
|
139
|
+
blobKey,
|
|
140
|
+
createdAt: Date.now(),
|
|
141
|
+
name: metadata.name,
|
|
142
|
+
size: storedBlob.metadata.size,
|
|
143
|
+
type: storedBlob.metadata.contentType || 'application/octet-stream',
|
|
144
|
+
};
|
|
145
|
+
// Validate attachment
|
|
146
|
+
const validatedAttachment = AttachmentSchema.parse(attachment);
|
|
147
|
+
// Update memory metadata
|
|
148
|
+
const updatedMemory = {
|
|
149
|
+
...memory,
|
|
150
|
+
metadata: {
|
|
151
|
+
...memory.metadata,
|
|
152
|
+
attachments: [
|
|
153
|
+
...(memory.metadata?.attachments && Array.isArray(memory.metadata.attachments)
|
|
154
|
+
? memory.metadata.attachments
|
|
155
|
+
: []),
|
|
156
|
+
validatedAttachment,
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
updatedAt: Date.now(),
|
|
160
|
+
};
|
|
161
|
+
// Save updated memory
|
|
162
|
+
await this.saveMemory(updatedMemory);
|
|
163
|
+
this.logger.debug('Attached blob to memory', { blobKey, memoryId });
|
|
164
|
+
return validatedAttachment;
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
// Cleanup: try to delete the blob if attachment failed
|
|
168
|
+
try {
|
|
169
|
+
await this.blobStorage.delete(blobKey);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Ignore cleanup errors
|
|
173
|
+
}
|
|
174
|
+
throw MemoryError.storageError(`Failed to attach blob: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get count of total memories matching the filter criteria
|
|
179
|
+
* @param options - Query options for filtering
|
|
180
|
+
* @returns Number of memories matching the criteria
|
|
181
|
+
*/
|
|
182
|
+
async count(options = {}) {
|
|
183
|
+
const memories = await this.list(options);
|
|
184
|
+
return memories.length;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Create a new memory
|
|
188
|
+
* @param input - Memory creation input
|
|
189
|
+
* @returns Created memory with generated ID and timestamps
|
|
190
|
+
*/
|
|
191
|
+
async create(input) {
|
|
192
|
+
// Validate input
|
|
193
|
+
const validatedInput = CreateMemoryInputSchema.parse(input);
|
|
194
|
+
// Generate unique ID (12 characters)
|
|
195
|
+
const id = nanoid(12);
|
|
196
|
+
const now = Date.now();
|
|
197
|
+
const memory = {
|
|
198
|
+
content: validatedInput.content,
|
|
199
|
+
createdAt: now,
|
|
200
|
+
id,
|
|
201
|
+
metadata: validatedInput.metadata,
|
|
202
|
+
tags: validatedInput.tags,
|
|
203
|
+
updatedAt: now,
|
|
204
|
+
};
|
|
205
|
+
// Validate the complete memory object
|
|
206
|
+
const validatedMemory = MemorySchema.parse(memory);
|
|
207
|
+
try {
|
|
208
|
+
await this.saveMemory(validatedMemory);
|
|
209
|
+
this.logger.debug('Created memory', { id });
|
|
210
|
+
return validatedMemory;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
throw MemoryError.storageError(`Failed to store memory: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Delete a memory by ID
|
|
218
|
+
* Also deletes all associated blob attachments
|
|
219
|
+
* @param id - Memory ID to delete
|
|
220
|
+
* @throws MemoryError if ID is invalid or memory not found
|
|
221
|
+
*/
|
|
222
|
+
async delete(id) {
|
|
223
|
+
if (!id || typeof id !== 'string') {
|
|
224
|
+
throw MemoryError.invalidId(id);
|
|
225
|
+
}
|
|
226
|
+
// Get memory to find attachments
|
|
227
|
+
const memory = await this.get(id);
|
|
228
|
+
// Delete all blob attachments
|
|
229
|
+
if (memory.metadata?.attachments && Array.isArray(memory.metadata.attachments)) {
|
|
230
|
+
await Promise.allSettled(memory.metadata.attachments.map((att) => this.blobStorage.delete(att.blobKey).catch((error) => {
|
|
231
|
+
this.logger.warn('Failed to delete blob', { blobKey: att.blobKey, error: error.message });
|
|
232
|
+
})));
|
|
233
|
+
}
|
|
234
|
+
// Delete the memory itself
|
|
235
|
+
try {
|
|
236
|
+
await this.deleteMemory(id);
|
|
237
|
+
this.logger.debug('Deleted memory', { id });
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
throw MemoryError.deleteError(`Failed to delete memory: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Detach (remove) a blob from a memory
|
|
245
|
+
* @param memoryId - Memory ID to detach blob from
|
|
246
|
+
* @param blobKey - Blob key to remove
|
|
247
|
+
* @throws MemoryError if memory not found or detachment fails
|
|
248
|
+
*/
|
|
249
|
+
async detachBlob(memoryId, blobKey) {
|
|
250
|
+
// Get memory
|
|
251
|
+
const memory = await this.get(memoryId);
|
|
252
|
+
// Find attachment
|
|
253
|
+
const attachments = memory.metadata?.attachments && Array.isArray(memory.metadata.attachments) ? memory.metadata.attachments : [];
|
|
254
|
+
const attachment = attachments.find((a) => a.blobKey === blobKey);
|
|
255
|
+
if (!attachment) {
|
|
256
|
+
throw MemoryError.storageError(`Attachment not found: ${blobKey}`);
|
|
257
|
+
}
|
|
258
|
+
// Delete blob from storage
|
|
259
|
+
try {
|
|
260
|
+
await this.blobStorage.delete(blobKey);
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
this.logger.warn('Failed to delete blob', {
|
|
264
|
+
blobKey,
|
|
265
|
+
error: error instanceof Error ? error.message : String(error),
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
// Update memory metadata (remove attachment)
|
|
269
|
+
const updatedMemory = {
|
|
270
|
+
...memory,
|
|
271
|
+
metadata: {
|
|
272
|
+
...memory.metadata,
|
|
273
|
+
attachments: attachments.filter((a) => a.blobKey !== blobKey),
|
|
274
|
+
},
|
|
275
|
+
updatedAt: Date.now(),
|
|
276
|
+
};
|
|
277
|
+
// Save updated memory
|
|
278
|
+
try {
|
|
279
|
+
await this.saveMemory(updatedMemory);
|
|
280
|
+
this.logger.debug('Detached blob from memory', { blobKey, memoryId });
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
throw MemoryError.storageError(`Failed to update memory after detaching blob: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get a memory by ID
|
|
288
|
+
* @param id - Memory ID to retrieve
|
|
289
|
+
* @returns Memory object
|
|
290
|
+
* @throws MemoryError if ID is invalid or memory not found
|
|
291
|
+
*/
|
|
292
|
+
async get(id) {
|
|
293
|
+
if (!id || typeof id !== 'string') {
|
|
294
|
+
throw MemoryError.invalidId(id);
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
const memory = await this.loadMemory(id);
|
|
298
|
+
if (!memory) {
|
|
299
|
+
throw MemoryError.notFound(id);
|
|
300
|
+
}
|
|
301
|
+
return memory;
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
if (error instanceof MemoryError && error.code === MemoryErrorCode.MEMORY_NOT_FOUND) {
|
|
305
|
+
throw error;
|
|
306
|
+
}
|
|
307
|
+
throw MemoryError.retrievalError(`Failed to retrieve memory: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Get a blob attachment from a memory
|
|
312
|
+
* @param memoryId - Memory ID
|
|
313
|
+
* @param blobKey - Blob key to retrieve
|
|
314
|
+
* @returns Stored blob with content and metadata
|
|
315
|
+
* @throws MemoryError if memory not found or blob not found
|
|
316
|
+
*/
|
|
317
|
+
async getAttachment(memoryId, blobKey) {
|
|
318
|
+
// Get memory to verify attachment exists
|
|
319
|
+
const memory = await this.get(memoryId);
|
|
320
|
+
const attachments = memory.metadata?.attachments && Array.isArray(memory.metadata.attachments) ? memory.metadata.attachments : [];
|
|
321
|
+
const attachment = attachments.find((a) => a.blobKey === blobKey);
|
|
322
|
+
if (!attachment) {
|
|
323
|
+
throw MemoryError.storageError(`Attachment not found: ${blobKey}`);
|
|
324
|
+
}
|
|
325
|
+
// Retrieve blob
|
|
326
|
+
try {
|
|
327
|
+
const blob = await this.blobStorage.retrieve(blobKey);
|
|
328
|
+
if (!blob) {
|
|
329
|
+
throw MemoryError.retrievalError(`Failed to retrieve attachment: Blob ${blobKey} not found in storage`);
|
|
330
|
+
}
|
|
331
|
+
return blob;
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
if (error instanceof MemoryError) {
|
|
335
|
+
throw error;
|
|
336
|
+
}
|
|
337
|
+
throw MemoryError.retrievalError(`Failed to retrieve attachment: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Check if a memory exists
|
|
342
|
+
* @param id - Memory ID to check
|
|
343
|
+
* @returns true if memory exists, false otherwise
|
|
344
|
+
*/
|
|
345
|
+
async has(id) {
|
|
346
|
+
try {
|
|
347
|
+
await this.get(id);
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
if (error instanceof MemoryError && error.code === MemoryErrorCode.MEMORY_NOT_FOUND) {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
throw error;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* List all memories with optional filtering, sorting, and pagination
|
|
359
|
+
* @param options - Query options for filtering and pagination
|
|
360
|
+
* @returns Array of memories matching the criteria
|
|
361
|
+
*/
|
|
362
|
+
async list(options = {}) {
|
|
363
|
+
// Validate and parse options
|
|
364
|
+
const validatedOptions = ListMemoriesOptionsSchema.parse(options);
|
|
365
|
+
try {
|
|
366
|
+
// Load all memories from blob storage
|
|
367
|
+
const memories = await this.loadAllMemories();
|
|
368
|
+
// Apply filters
|
|
369
|
+
let filtered = memories;
|
|
370
|
+
// Filter by source
|
|
371
|
+
if (validatedOptions.source) {
|
|
372
|
+
filtered = filtered.filter((m) => m.metadata?.source === validatedOptions.source);
|
|
373
|
+
}
|
|
374
|
+
// Filter by pinned status
|
|
375
|
+
if (validatedOptions.pinned !== undefined) {
|
|
376
|
+
filtered = filtered.filter((m) => m.metadata?.pinned === validatedOptions.pinned);
|
|
377
|
+
}
|
|
378
|
+
// Sort by updatedAt descending (most recent first)
|
|
379
|
+
filtered.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
380
|
+
// Apply pagination
|
|
381
|
+
if (validatedOptions.offset !== undefined || validatedOptions.limit !== undefined) {
|
|
382
|
+
const start = validatedOptions.offset ?? 0;
|
|
383
|
+
const end = validatedOptions.limit ? start + validatedOptions.limit : undefined;
|
|
384
|
+
filtered = filtered.slice(start, end);
|
|
385
|
+
}
|
|
386
|
+
return filtered;
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
throw MemoryError.retrievalError(`Failed to list memories: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* List all attachments for a memory
|
|
394
|
+
* @param memoryId - Memory ID
|
|
395
|
+
* @returns Array of attachment metadata
|
|
396
|
+
* @throws MemoryError if memory not found
|
|
397
|
+
*/
|
|
398
|
+
async listAttachments(memoryId) {
|
|
399
|
+
const memory = await this.get(memoryId);
|
|
400
|
+
const attachments = memory.metadata?.attachments;
|
|
401
|
+
if (!attachments || !Array.isArray(attachments)) {
|
|
402
|
+
return [];
|
|
403
|
+
}
|
|
404
|
+
return attachments;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Update an existing memory
|
|
408
|
+
* @param id - Memory ID to update
|
|
409
|
+
* @param input - Update input (partial)
|
|
410
|
+
* @returns Updated memory
|
|
411
|
+
* @throws MemoryError if ID is invalid or memory not found
|
|
412
|
+
*/
|
|
413
|
+
async update(id, input) {
|
|
414
|
+
if (!id || typeof id !== 'string') {
|
|
415
|
+
throw MemoryError.invalidId(id);
|
|
416
|
+
}
|
|
417
|
+
// Validate input
|
|
418
|
+
const validatedInput = UpdateMemoryInputSchema.parse(input);
|
|
419
|
+
// Get existing memory
|
|
420
|
+
const existing = await this.get(id);
|
|
421
|
+
// Merge updates
|
|
422
|
+
const updated = {
|
|
423
|
+
...existing,
|
|
424
|
+
content: validatedInput.content === undefined ? existing.content : validatedInput.content,
|
|
425
|
+
updatedAt: Date.now(),
|
|
426
|
+
};
|
|
427
|
+
// Merge metadata if provided
|
|
428
|
+
if (validatedInput.metadata) {
|
|
429
|
+
updated.metadata = {
|
|
430
|
+
...existing.metadata,
|
|
431
|
+
...validatedInput.metadata,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
// Validate the updated memory
|
|
435
|
+
const validatedMemory = MemorySchema.parse(updated);
|
|
436
|
+
try {
|
|
437
|
+
await this.saveMemory(validatedMemory);
|
|
438
|
+
this.logger.debug('Updated memory', { id });
|
|
439
|
+
return validatedMemory;
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
throw MemoryError.storageError(`Failed to update memory: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Delete a memory from blob storage
|
|
447
|
+
*/
|
|
448
|
+
async deleteMemory(id) {
|
|
449
|
+
const key = this.getMemoryKey(id);
|
|
450
|
+
await this.blobStorage.delete(key);
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Extract memory ID from blob key
|
|
454
|
+
*/
|
|
455
|
+
extractMemoryId(key) {
|
|
456
|
+
return key.replace(MemoryManager.MEMORY_KEY_PREFIX, '');
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Get the blob key for a memory
|
|
460
|
+
*/
|
|
461
|
+
getMemoryKey(id) {
|
|
462
|
+
return `${MemoryManager.MEMORY_KEY_PREFIX}${id}`;
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Check if a blob key is a memory key (not an attachment)
|
|
466
|
+
*/
|
|
467
|
+
isMemoryKey(key) {
|
|
468
|
+
if (!key.startsWith(MemoryManager.MEMORY_KEY_PREFIX)) {
|
|
469
|
+
return false;
|
|
470
|
+
}
|
|
471
|
+
// Memory keys have format: memory-{id}
|
|
472
|
+
// Attachment keys have format: memory-{id}-{suffix}
|
|
473
|
+
// Count dashes: memory keys have 1 dash, attachments have 2+
|
|
474
|
+
const dashCount = (key.match(/-/g) || []).length;
|
|
475
|
+
return dashCount === 1;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Load all memories from blob storage
|
|
479
|
+
*/
|
|
480
|
+
async loadAllMemories() {
|
|
481
|
+
const keys = await this.blobStorage.list(MemoryManager.MEMORY_KEY_PREFIX);
|
|
482
|
+
// Filter to only memory keys (exclude attachments)
|
|
483
|
+
const memoryKeys = keys.filter((key) => this.isMemoryKey(key));
|
|
484
|
+
// Load all memories in parallel
|
|
485
|
+
const memories = await Promise.all(memoryKeys.map(async (key) => {
|
|
486
|
+
const id = this.extractMemoryId(key);
|
|
487
|
+
return this.loadMemory(id);
|
|
488
|
+
}));
|
|
489
|
+
// Filter out undefined values
|
|
490
|
+
return memories.filter((m) => m !== undefined);
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Load a memory from blob storage
|
|
494
|
+
*/
|
|
495
|
+
async loadMemory(id) {
|
|
496
|
+
const key = this.getMemoryKey(id);
|
|
497
|
+
const blob = await this.blobStorage.retrieve(key);
|
|
498
|
+
if (!blob) {
|
|
499
|
+
return undefined;
|
|
500
|
+
}
|
|
501
|
+
try {
|
|
502
|
+
const memory = JSON.parse(blob.content.toString('utf8'));
|
|
503
|
+
return memory;
|
|
504
|
+
}
|
|
505
|
+
catch (error) {
|
|
506
|
+
throw MemoryError.retrievalError(`Failed to parse memory ${id}: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Save a memory to blob storage
|
|
511
|
+
*/
|
|
512
|
+
async saveMemory(memory) {
|
|
513
|
+
const key = this.getMemoryKey(memory.id);
|
|
514
|
+
const content = JSON.stringify(memory, null, 2);
|
|
515
|
+
await this.blobStorage.store(key, content, {
|
|
516
|
+
contentType: 'application/json',
|
|
517
|
+
tags: {
|
|
518
|
+
memoryId: memory.id,
|
|
519
|
+
source: memory.metadata?.source || 'unknown',
|
|
520
|
+
},
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coding Agent Log Parser
|
|
3
|
+
* Parses coding agent log files using the existing raw/clean parser pipeline
|
|
4
|
+
* Follows the same logic as the 'brv watch' command's triggerParsing method
|
|
5
|
+
*/
|
|
6
|
+
import type { CleanSession } from '../../../core/domain/entities/parser.js';
|
|
7
|
+
import type { ICodingAgentLogParser } from '../../../core/interfaces/cipher/i-coding-agent-log-parser.js';
|
|
8
|
+
import { Agent } from '../../../core/domain/entities/agent.js';
|
|
9
|
+
/**
|
|
10
|
+
* Coding Agent Log Parser
|
|
11
|
+
*
|
|
12
|
+
* Reuses the existing raw/clean parser infrastructure to parse coding agent log files.
|
|
13
|
+
* This implementation follows the same two-phase pipeline as the 'brv watch' command:
|
|
14
|
+
*
|
|
15
|
+
* 1. Raw Phase: Parse IDE-specific files from chatLogPath directory, write to .brv/logs/{ide}/raw/
|
|
16
|
+
* 2. Clean Phase: Read from .brv/logs/{ide}/raw/, normalize to CleanSession format
|
|
17
|
+
*
|
|
18
|
+
* Note: This parser processes entire directories (not individual files) for consistency
|
|
19
|
+
* with the existing parser architecture. When a single file changes, all files in the
|
|
20
|
+
* directory will be re-parsed. This is inefficient but safe, and can be optimized later.
|
|
21
|
+
*/
|
|
22
|
+
export declare class CodingAgentLogParser implements ICodingAgentLogParser {
|
|
23
|
+
parse(chatLogPath: string, ide: Agent): Promise<readonly CleanSession[]>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coding Agent Log Parser
|
|
3
|
+
* Parses coding agent log files using the existing raw/clean parser pipeline
|
|
4
|
+
* Follows the same logic as the 'brv watch' command's triggerParsing method
|
|
5
|
+
*/
|
|
6
|
+
import { CleanParserServiceFactory } from '../../parsers/clean/clean-parser-service-factory.js';
|
|
7
|
+
import { RawParserServiceFactory } from '../../parsers/raw/raw-parser-service-factory.js';
|
|
8
|
+
/**
|
|
9
|
+
* Coding Agent Log Parser
|
|
10
|
+
*
|
|
11
|
+
* Reuses the existing raw/clean parser infrastructure to parse coding agent log files.
|
|
12
|
+
* This implementation follows the same two-phase pipeline as the 'brv watch' command:
|
|
13
|
+
*
|
|
14
|
+
* 1. Raw Phase: Parse IDE-specific files from chatLogPath directory, write to .brv/logs/{ide}/raw/
|
|
15
|
+
* 2. Clean Phase: Read from .brv/logs/{ide}/raw/, normalize to CleanSession format
|
|
16
|
+
*
|
|
17
|
+
* Note: This parser processes entire directories (not individual files) for consistency
|
|
18
|
+
* with the existing parser architecture. When a single file changes, all files in the
|
|
19
|
+
* directory will be re-parsed. This is inefficient but safe, and can be optimized later.
|
|
20
|
+
*/
|
|
21
|
+
export class CodingAgentLogParser {
|
|
22
|
+
async parse(chatLogPath, ide) {
|
|
23
|
+
if (!RawParserServiceFactory.isSupported(ide)) {
|
|
24
|
+
throw new Error(`Unsupported IDE: ${ide}`);
|
|
25
|
+
}
|
|
26
|
+
if (!chatLogPath || chatLogPath.trim().length === 0) {
|
|
27
|
+
throw new Error('Chat log path cannot be empty');
|
|
28
|
+
}
|
|
29
|
+
let isRawSuccess = false;
|
|
30
|
+
try {
|
|
31
|
+
isRawSuccess = await RawParserServiceFactory.parseConversations(ide, chatLogPath);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new Error(`Raw parsing error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
35
|
+
}
|
|
36
|
+
if (isRawSuccess) {
|
|
37
|
+
try {
|
|
38
|
+
const rawOutputDir = `${process.cwd()}/.brv/logs/${ide}/raw`;
|
|
39
|
+
const cleanSessions = await CleanParserServiceFactory.parseConversations(ide, rawOutputDir);
|
|
40
|
+
if (cleanSessions.length > 0) {
|
|
41
|
+
return Object.freeze(cleanSessions);
|
|
42
|
+
}
|
|
43
|
+
throw new Error('Clean parsing returned no sessions');
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
throw new Error(`Clean parsing error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
throw new Error('Raw parsing failed');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { CommandValidation, ProcessConfig } from '../../../core/domain/cipher/process/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Command validator for security and safety checks.
|
|
4
|
+
*
|
|
5
|
+
* Validates commands against dangerous patterns, injection attacks,
|
|
6
|
+
* and approval requirements based on security level.
|
|
7
|
+
*/
|
|
8
|
+
export declare class CommandValidator {
|
|
9
|
+
private readonly config;
|
|
10
|
+
/**
|
|
11
|
+
* Creates a new command validator.
|
|
12
|
+
*
|
|
13
|
+
* @param config - Process configuration for security settings
|
|
14
|
+
*/
|
|
15
|
+
constructor(config: Pick<ProcessConfig, 'allowedCommands' | 'blockedCommands' | 'securityLevel'>);
|
|
16
|
+
/**
|
|
17
|
+
* Get the list of allowed commands.
|
|
18
|
+
*
|
|
19
|
+
* @returns Array of allowed command patterns
|
|
20
|
+
*/
|
|
21
|
+
getAllowedCommands(): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Get the list of blocked commands.
|
|
24
|
+
*
|
|
25
|
+
* @returns Array of blocked command patterns
|
|
26
|
+
*/
|
|
27
|
+
getBlockedCommands(): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Get the current security level.
|
|
30
|
+
*
|
|
31
|
+
* @returns Security level setting
|
|
32
|
+
*/
|
|
33
|
+
getSecurityLevel(): string;
|
|
34
|
+
/**
|
|
35
|
+
* Validate a command for security and safety.
|
|
36
|
+
*
|
|
37
|
+
* Performs multiple checks:
|
|
38
|
+
* 1. Empty command check
|
|
39
|
+
* 2. Length limit check
|
|
40
|
+
* 3. Dangerous pattern detection
|
|
41
|
+
* 4. Injection detection
|
|
42
|
+
* 5. Blocked/allowed command list checks
|
|
43
|
+
* 6. Approval requirement determination
|
|
44
|
+
*
|
|
45
|
+
* @param command - Command string to validate
|
|
46
|
+
* @returns Validation result with approval requirement
|
|
47
|
+
*/
|
|
48
|
+
validateCommand(command: string): CommandValidation;
|
|
49
|
+
/**
|
|
50
|
+
* Detect command injection patterns.
|
|
51
|
+
*
|
|
52
|
+
* Checks for unsafe command chaining, substitution, and other
|
|
53
|
+
* injection attack vectors.
|
|
54
|
+
*
|
|
55
|
+
* @param command - Command to check
|
|
56
|
+
* @returns Validation result
|
|
57
|
+
*/
|
|
58
|
+
private detectInjection;
|
|
59
|
+
}
|