byterover-cli 0.2.0 → 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 +53 -2
- package/dist/commands/init.js +279 -66
- package/dist/commands/login.js +9 -4
- package/dist/commands/logout.d.ts +16 -0
- package/dist/commands/logout.js +61 -0
- 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 +4 -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/i-rule-template-service.d.ts +0 -4
- package/dist/core/interfaces/i-rule-template-service.js +1 -4
- 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/rule/constants.d.ts +4 -0
- package/dist/infra/rule/constants.js +4 -0
- package/dist/infra/rule/rule-template-service.js +1 -1
- package/dist/infra/rule/rule-writer-service.js +1 -5
- 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 -93
- 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 +422 -142
- package/package.json +29 -10
- 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,439 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { randomBytes } from 'node:crypto';
|
|
3
|
+
import { isAbsolute, relative, resolve } from 'node:path';
|
|
4
|
+
import { ProcessError } from '../../../core/domain/cipher/errors/process-error.js';
|
|
5
|
+
import { CommandValidator } from './command-validator.js';
|
|
6
|
+
/**
|
|
7
|
+
* Default timeout for foreground commands (milliseconds).
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_TIMEOUT = 120_000; // 2 minutes
|
|
10
|
+
/**
|
|
11
|
+
* Default maximum timeout (milliseconds).
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_MAX_TIMEOUT = 600_000; // 10 minutes
|
|
14
|
+
/**
|
|
15
|
+
* Default maximum concurrent background processes.
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_MAX_CONCURRENT_PROCESSES = 5;
|
|
18
|
+
/**
|
|
19
|
+
* Default maximum output buffer size (bytes).
|
|
20
|
+
*/
|
|
21
|
+
const DEFAULT_MAX_OUTPUT_BUFFER = 1024 * 1024; // 1MB
|
|
22
|
+
/**
|
|
23
|
+
* Process service implementation.
|
|
24
|
+
*
|
|
25
|
+
* Provides secure command execution with:
|
|
26
|
+
* - Multi-layer security validation
|
|
27
|
+
* - Foreground and background execution
|
|
28
|
+
* - Output buffering with size limits
|
|
29
|
+
* - Timeout management with signal escalation
|
|
30
|
+
* - Working directory confinement
|
|
31
|
+
* - Approval system integration
|
|
32
|
+
*/
|
|
33
|
+
export class ProcessService {
|
|
34
|
+
backgroundProcesses = new Map();
|
|
35
|
+
commandValidator;
|
|
36
|
+
config;
|
|
37
|
+
initialized = false;
|
|
38
|
+
/**
|
|
39
|
+
* Creates a new process service.
|
|
40
|
+
*
|
|
41
|
+
* @param config - Process configuration (partial, will be merged with defaults)
|
|
42
|
+
*/
|
|
43
|
+
constructor(config = {}) {
|
|
44
|
+
// Merge with defaults
|
|
45
|
+
this.config = {
|
|
46
|
+
allowedCommands: config.allowedCommands || [],
|
|
47
|
+
blockedCommands: config.blockedCommands || [],
|
|
48
|
+
environment: config.environment || {},
|
|
49
|
+
maxConcurrentProcesses: config.maxConcurrentProcesses || DEFAULT_MAX_CONCURRENT_PROCESSES,
|
|
50
|
+
maxOutputBuffer: config.maxOutputBuffer || DEFAULT_MAX_OUTPUT_BUFFER,
|
|
51
|
+
maxTimeout: config.maxTimeout || DEFAULT_MAX_TIMEOUT,
|
|
52
|
+
securityLevel: config.securityLevel || 'moderate',
|
|
53
|
+
workingDirectory: config.workingDirectory,
|
|
54
|
+
};
|
|
55
|
+
this.commandValidator = new CommandValidator({
|
|
56
|
+
allowedCommands: this.config.allowedCommands,
|
|
57
|
+
blockedCommands: this.config.blockedCommands,
|
|
58
|
+
securityLevel: this.config.securityLevel,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Clean up completed background processes older than 1 hour.
|
|
63
|
+
*/
|
|
64
|
+
async cleanup() {
|
|
65
|
+
const now = Date.now();
|
|
66
|
+
const CLEANUP_AGE = 3_600_000; // 1 hour in milliseconds
|
|
67
|
+
for (const [processId, bgProcess] of this.backgroundProcesses.entries()) {
|
|
68
|
+
if (bgProcess.status !== 'running' && bgProcess.completedAt) {
|
|
69
|
+
const age = now - bgProcess.completedAt.getTime();
|
|
70
|
+
if (age > CLEANUP_AGE) {
|
|
71
|
+
this.backgroundProcesses.delete(processId);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Execute a shell command.
|
|
78
|
+
*
|
|
79
|
+
* @param command - Shell command to execute
|
|
80
|
+
* @param options - Execution options
|
|
81
|
+
* @returns Process result or handle
|
|
82
|
+
*/
|
|
83
|
+
async executeCommand(command, options = {}) {
|
|
84
|
+
if (!this.initialized) {
|
|
85
|
+
throw ProcessError.notInitialized();
|
|
86
|
+
}
|
|
87
|
+
// Validate command
|
|
88
|
+
const validation = this.commandValidator.validateCommand(command);
|
|
89
|
+
if (!validation.isValid) {
|
|
90
|
+
throw ProcessError.invalidCommand(command, validation.error);
|
|
91
|
+
}
|
|
92
|
+
const { normalizedCommand } = validation;
|
|
93
|
+
// Validate timeout
|
|
94
|
+
const timeout = options.timeout || DEFAULT_TIMEOUT;
|
|
95
|
+
if (timeout > this.config.maxTimeout) {
|
|
96
|
+
throw ProcessError.invalidCommand(command, `Timeout ${timeout}ms exceeds maximum ${this.config.maxTimeout}ms`);
|
|
97
|
+
}
|
|
98
|
+
// Resolve working directory
|
|
99
|
+
const cwd = this.resolveSafeCwd(options.cwd);
|
|
100
|
+
// Merge environment variables
|
|
101
|
+
const env = {};
|
|
102
|
+
for (const [key, value] of Object.entries({
|
|
103
|
+
...process.env,
|
|
104
|
+
...this.config.environment,
|
|
105
|
+
...options.env,
|
|
106
|
+
})) {
|
|
107
|
+
if (value !== undefined) {
|
|
108
|
+
env[key] = value;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Execute based on mode
|
|
112
|
+
if (options.runInBackground) {
|
|
113
|
+
return this.executeInBackground(normalizedCommand, {
|
|
114
|
+
cwd,
|
|
115
|
+
description: options.description,
|
|
116
|
+
env,
|
|
117
|
+
timeout,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return this.executeForeground(normalizedCommand, { cwd, env, timeout });
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get the current process configuration.
|
|
124
|
+
*/
|
|
125
|
+
getConfig() {
|
|
126
|
+
return { ...this.config };
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get output from a background process.
|
|
130
|
+
*
|
|
131
|
+
* @param processId - Unique process identifier
|
|
132
|
+
* @returns Process output
|
|
133
|
+
*/
|
|
134
|
+
async getProcessOutput(processId) {
|
|
135
|
+
const bgProcess = this.backgroundProcesses.get(processId);
|
|
136
|
+
if (!bgProcess) {
|
|
137
|
+
throw ProcessError.processNotFound(processId);
|
|
138
|
+
}
|
|
139
|
+
// Join output chunks
|
|
140
|
+
const stdout = bgProcess.outputBuffer.stdout.join('');
|
|
141
|
+
const stderr = bgProcess.outputBuffer.stderr.join('');
|
|
142
|
+
// Clear buffer (destructive read)
|
|
143
|
+
bgProcess.outputBuffer.stdout = [];
|
|
144
|
+
bgProcess.outputBuffer.stderr = [];
|
|
145
|
+
bgProcess.outputBuffer.lastRead = Date.now();
|
|
146
|
+
bgProcess.outputBuffer.bytesUsed = 0;
|
|
147
|
+
// Calculate duration if completed
|
|
148
|
+
let duration;
|
|
149
|
+
if (bgProcess.completedAt) {
|
|
150
|
+
duration = bgProcess.completedAt.getTime() - bgProcess.startedAt.getTime();
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
duration,
|
|
154
|
+
exitCode: bgProcess.exitCode,
|
|
155
|
+
status: bgProcess.status,
|
|
156
|
+
stderr,
|
|
157
|
+
stdout,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Initialize the process service.
|
|
162
|
+
*/
|
|
163
|
+
async initialize() {
|
|
164
|
+
// Clear any stale processes
|
|
165
|
+
this.backgroundProcesses.clear();
|
|
166
|
+
this.initialized = true;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Terminate a background process.
|
|
170
|
+
*
|
|
171
|
+
* @param processId - Unique process identifier
|
|
172
|
+
*/
|
|
173
|
+
async killProcess(processId) {
|
|
174
|
+
const bgProcess = this.backgroundProcesses.get(processId);
|
|
175
|
+
if (!bgProcess) {
|
|
176
|
+
throw ProcessError.processNotFound(processId);
|
|
177
|
+
}
|
|
178
|
+
if (bgProcess.status !== 'running') {
|
|
179
|
+
// Process already terminated
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
// Send SIGTERM
|
|
184
|
+
bgProcess.child.kill('SIGTERM');
|
|
185
|
+
// Wait 5 seconds, then escalate to SIGKILL
|
|
186
|
+
setTimeout(() => {
|
|
187
|
+
if (bgProcess.child.exitCode === null) {
|
|
188
|
+
bgProcess.child.kill('SIGKILL');
|
|
189
|
+
}
|
|
190
|
+
}, 5000);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
throw ProcessError.killFailed(processId, error instanceof Error ? error.message : String(error));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* List all background processes.
|
|
198
|
+
*/
|
|
199
|
+
async listProcesses() {
|
|
200
|
+
const processes = [];
|
|
201
|
+
for (const bgProcess of this.backgroundProcesses.values()) {
|
|
202
|
+
processes.push({
|
|
203
|
+
command: bgProcess.command,
|
|
204
|
+
completedAt: bgProcess.completedAt,
|
|
205
|
+
description: bgProcess.description,
|
|
206
|
+
exitCode: bgProcess.exitCode,
|
|
207
|
+
pid: bgProcess.child.pid,
|
|
208
|
+
processId: bgProcess.processId,
|
|
209
|
+
startedAt: bgProcess.startedAt,
|
|
210
|
+
status: bgProcess.status,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return processes;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Execute command in foreground (wait for completion).
|
|
217
|
+
*
|
|
218
|
+
* @param command - Normalized command to execute
|
|
219
|
+
* @param options - Execution options
|
|
220
|
+
* @param options.cwd - Working directory
|
|
221
|
+
* @param options.env - Environment variables
|
|
222
|
+
* @param options.timeout - Timeout in milliseconds
|
|
223
|
+
* @returns Process result with stdout, stderr, exit code, duration
|
|
224
|
+
*/
|
|
225
|
+
async executeForeground(command, options) {
|
|
226
|
+
return new Promise((resolve, reject) => {
|
|
227
|
+
const startTime = Date.now();
|
|
228
|
+
let stdout = '';
|
|
229
|
+
let stderr = '';
|
|
230
|
+
let killed = false;
|
|
231
|
+
let closed = false;
|
|
232
|
+
// Spawn process
|
|
233
|
+
const child = spawn(command, {
|
|
234
|
+
cwd: options.cwd,
|
|
235
|
+
env: options.env,
|
|
236
|
+
shell: true,
|
|
237
|
+
});
|
|
238
|
+
// Collect stdout
|
|
239
|
+
child.stdout?.on('data', (data) => {
|
|
240
|
+
stdout += data.toString();
|
|
241
|
+
});
|
|
242
|
+
// Collect stderr
|
|
243
|
+
child.stderr?.on('data', (data) => {
|
|
244
|
+
stderr += data.toString();
|
|
245
|
+
});
|
|
246
|
+
// Handle timeout
|
|
247
|
+
const timeoutHandle = setTimeout(() => {
|
|
248
|
+
if (!closed) {
|
|
249
|
+
killed = true;
|
|
250
|
+
child.kill('SIGTERM');
|
|
251
|
+
// Escalate to SIGKILL after 5 seconds
|
|
252
|
+
setTimeout(() => {
|
|
253
|
+
if (!closed && child.exitCode === null) {
|
|
254
|
+
child.kill('SIGKILL');
|
|
255
|
+
}
|
|
256
|
+
}, 5000);
|
|
257
|
+
}
|
|
258
|
+
}, options.timeout);
|
|
259
|
+
// Handle process exit
|
|
260
|
+
child.on('close', (code, signal) => {
|
|
261
|
+
closed = true;
|
|
262
|
+
clearTimeout(timeoutHandle);
|
|
263
|
+
const duration = Date.now() - startTime;
|
|
264
|
+
if (killed) {
|
|
265
|
+
reject(ProcessError.timeout(command, options.timeout));
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (signal) {
|
|
269
|
+
reject(ProcessError.executionFailed(command, `Process terminated by signal: ${signal}`));
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
resolve({
|
|
273
|
+
duration,
|
|
274
|
+
exitCode: code ?? 1,
|
|
275
|
+
stderr,
|
|
276
|
+
stdout,
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
// Handle spawn errors
|
|
280
|
+
child.on('error', (error) => {
|
|
281
|
+
clearTimeout(timeoutHandle);
|
|
282
|
+
if (error.code === 'ENOENT') {
|
|
283
|
+
reject(ProcessError.commandNotFound(command));
|
|
284
|
+
}
|
|
285
|
+
else if (error.code === 'EACCES') {
|
|
286
|
+
reject(ProcessError.permissionDenied(command));
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
reject(ProcessError.executionFailed(command, error.message));
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Execute command in background (return immediately).
|
|
296
|
+
*
|
|
297
|
+
* @param command - Normalized command to execute
|
|
298
|
+
* @param options - Execution options
|
|
299
|
+
* @param options.cwd - Working directory
|
|
300
|
+
* @param options.description - Optional description
|
|
301
|
+
* @param options.env - Environment variables
|
|
302
|
+
* @param options.timeout - Timeout in milliseconds
|
|
303
|
+
* @returns Process handle with processId
|
|
304
|
+
*/
|
|
305
|
+
async executeInBackground(command, options) {
|
|
306
|
+
// Check concurrent process limit
|
|
307
|
+
const runningCount = [...this.backgroundProcesses.values()].filter(p => p.status === 'running').length;
|
|
308
|
+
if (runningCount >= this.config.maxConcurrentProcesses) {
|
|
309
|
+
throw ProcessError.tooManyProcesses(runningCount, this.config.maxConcurrentProcesses);
|
|
310
|
+
}
|
|
311
|
+
// Generate unique process ID
|
|
312
|
+
const processId = randomBytes(4).toString('hex');
|
|
313
|
+
// Initialize output buffer
|
|
314
|
+
const outputBuffer = {
|
|
315
|
+
bytesUsed: 0,
|
|
316
|
+
complete: false,
|
|
317
|
+
lastRead: Date.now(),
|
|
318
|
+
stderr: [],
|
|
319
|
+
stdout: [],
|
|
320
|
+
truncated: false,
|
|
321
|
+
};
|
|
322
|
+
// Spawn process
|
|
323
|
+
const child = spawn(command, {
|
|
324
|
+
cwd: options.cwd,
|
|
325
|
+
detached: false, // Process dies with parent
|
|
326
|
+
env: options.env,
|
|
327
|
+
shell: true,
|
|
328
|
+
});
|
|
329
|
+
const startedAt = new Date();
|
|
330
|
+
// Create background process entry
|
|
331
|
+
const bgProcess = {
|
|
332
|
+
child,
|
|
333
|
+
command,
|
|
334
|
+
description: options.description,
|
|
335
|
+
outputBuffer,
|
|
336
|
+
processId,
|
|
337
|
+
startedAt,
|
|
338
|
+
status: 'running',
|
|
339
|
+
};
|
|
340
|
+
this.backgroundProcesses.set(processId, bgProcess);
|
|
341
|
+
// Collect stdout with buffer limit
|
|
342
|
+
child.stdout?.on('data', (data) => {
|
|
343
|
+
const chunk = data.toString();
|
|
344
|
+
const chunkBytes = Buffer.byteLength(chunk, 'utf8');
|
|
345
|
+
if (outputBuffer.bytesUsed + chunkBytes <= this.config.maxOutputBuffer) {
|
|
346
|
+
outputBuffer.stdout.push(chunk);
|
|
347
|
+
outputBuffer.bytesUsed += chunkBytes;
|
|
348
|
+
}
|
|
349
|
+
else if (!outputBuffer.truncated) {
|
|
350
|
+
outputBuffer.truncated = true;
|
|
351
|
+
// Note: In production, you might want to log this
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
// Collect stderr with buffer limit
|
|
355
|
+
child.stderr?.on('data', (data) => {
|
|
356
|
+
const chunk = data.toString();
|
|
357
|
+
const chunkBytes = Buffer.byteLength(chunk, 'utf8');
|
|
358
|
+
if (outputBuffer.bytesUsed + chunkBytes <= this.config.maxOutputBuffer) {
|
|
359
|
+
outputBuffer.stderr.push(chunk);
|
|
360
|
+
outputBuffer.bytesUsed += chunkBytes;
|
|
361
|
+
}
|
|
362
|
+
else if (!outputBuffer.truncated) {
|
|
363
|
+
outputBuffer.truncated = true;
|
|
364
|
+
// Note: In production, you might want to log this
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
// Handle process completion
|
|
368
|
+
child.on('close', (code, signal) => {
|
|
369
|
+
outputBuffer.complete = true;
|
|
370
|
+
bgProcess.completedAt = new Date();
|
|
371
|
+
bgProcess.exitCode = code ?? 1;
|
|
372
|
+
if (signal) {
|
|
373
|
+
bgProcess.status = 'failed';
|
|
374
|
+
}
|
|
375
|
+
else if (code === 0) {
|
|
376
|
+
bgProcess.status = 'completed';
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
bgProcess.status = 'failed';
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
// Handle spawn errors
|
|
383
|
+
child.on('error', () => {
|
|
384
|
+
bgProcess.status = 'failed';
|
|
385
|
+
bgProcess.completedAt = new Date();
|
|
386
|
+
bgProcess.exitCode = 1;
|
|
387
|
+
outputBuffer.complete = true;
|
|
388
|
+
});
|
|
389
|
+
// Set timeout handler
|
|
390
|
+
const killTimer = setTimeout(() => {
|
|
391
|
+
if (bgProcess.status === 'running') {
|
|
392
|
+
child.kill('SIGTERM');
|
|
393
|
+
// Escalate to SIGKILL after 5 seconds
|
|
394
|
+
setTimeout(() => {
|
|
395
|
+
if (bgProcess.status === 'running') {
|
|
396
|
+
child.kill('SIGKILL');
|
|
397
|
+
}
|
|
398
|
+
}, 5000);
|
|
399
|
+
}
|
|
400
|
+
}, options.timeout);
|
|
401
|
+
// Clear timeout when process completes
|
|
402
|
+
child.on('close', () => {
|
|
403
|
+
clearTimeout(killTimer);
|
|
404
|
+
});
|
|
405
|
+
// Return handle immediately
|
|
406
|
+
return {
|
|
407
|
+
command,
|
|
408
|
+
description: options.description,
|
|
409
|
+
pid: child.pid,
|
|
410
|
+
processId,
|
|
411
|
+
startedAt,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Resolve and validate working directory.
|
|
416
|
+
*
|
|
417
|
+
* Ensures the directory is within the configured base directory
|
|
418
|
+
* and prevents directory traversal attacks.
|
|
419
|
+
*
|
|
420
|
+
* @param cwd - Optional working directory (relative or absolute)
|
|
421
|
+
* @returns Safe absolute working directory
|
|
422
|
+
*/
|
|
423
|
+
resolveSafeCwd(cwd) {
|
|
424
|
+
const baseDir = this.config.workingDirectory || process.cwd();
|
|
425
|
+
// If no cwd specified, use base directory
|
|
426
|
+
if (!cwd) {
|
|
427
|
+
return baseDir;
|
|
428
|
+
}
|
|
429
|
+
// Resolve to absolute path
|
|
430
|
+
const candidatePath = isAbsolute(cwd) ? resolve(cwd) : resolve(baseDir, cwd);
|
|
431
|
+
// Check if path is within base directory
|
|
432
|
+
const relativePath = relative(baseDir, candidatePath);
|
|
433
|
+
const isOutsideBase = relativePath.startsWith('..') || isAbsolute(relativePath);
|
|
434
|
+
if (isOutsideBase) {
|
|
435
|
+
throw ProcessError.invalidWorkingDirectory(cwd, `Working directory must be within ${baseDir}`);
|
|
436
|
+
}
|
|
437
|
+
return candidatePath;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Message } from '../../../core/domain/cipher/session/types.js';
|
|
2
|
+
import type { CipherAgentServices, SessionServices } from '../../../core/interfaces/cipher/cipher-services.js';
|
|
3
|
+
import type { IChatSession } from '../../../core/interfaces/cipher/i-chat-session.js';
|
|
4
|
+
import type { ExecutionContext } from '../../../core/interfaces/cipher/i-cipher-agent.js';
|
|
5
|
+
import type { ILLMService } from '../../../core/interfaces/cipher/i-llm-service.js';
|
|
6
|
+
import { SessionEventBus } from '../events/event-emitter.js';
|
|
7
|
+
/**
|
|
8
|
+
* Chat session implementation.
|
|
9
|
+
*
|
|
10
|
+
* Following Dexto's pattern: ChatSession owns session-specific services
|
|
11
|
+
* (LLM, EventBus) and receives shared services (ToolManager, SystemPromptManager).
|
|
12
|
+
*
|
|
13
|
+
* The LLM service handles:
|
|
14
|
+
* - Message history (via ContextManager)
|
|
15
|
+
* - Agentic loop
|
|
16
|
+
* - Tool execution
|
|
17
|
+
*
|
|
18
|
+
* This session provides:
|
|
19
|
+
* - Session isolation
|
|
20
|
+
* - Cancellation support
|
|
21
|
+
* - Event forwarding to agent bus
|
|
22
|
+
* - Proper cleanup/disposal
|
|
23
|
+
*/
|
|
24
|
+
export declare class ChatSession implements IChatSession {
|
|
25
|
+
readonly eventBus: SessionEventBus;
|
|
26
|
+
readonly id: string;
|
|
27
|
+
private currentController?;
|
|
28
|
+
private readonly forwarders;
|
|
29
|
+
private readonly llmService;
|
|
30
|
+
private readonly sharedServices;
|
|
31
|
+
/**
|
|
32
|
+
* Creates a new chat session
|
|
33
|
+
*
|
|
34
|
+
* @param id - Unique session identifier
|
|
35
|
+
* @param sharedServices - Shared services from CipherAgent
|
|
36
|
+
* @param sessionServices - Session-specific services (LLM, EventBus)
|
|
37
|
+
*/
|
|
38
|
+
constructor(id: string, sharedServices: CipherAgentServices, sessionServices: SessionServices);
|
|
39
|
+
/**
|
|
40
|
+
* Cancel the current operation.
|
|
41
|
+
*/
|
|
42
|
+
cancel(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Dispose of the session and clean up resources.
|
|
45
|
+
* Removes event listeners to prevent memory leaks.
|
|
46
|
+
*/
|
|
47
|
+
dispose(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Get the conversation history.
|
|
50
|
+
*/
|
|
51
|
+
getHistory(): Message[];
|
|
52
|
+
/**
|
|
53
|
+
* Get the LLM service for direct access to context manager.
|
|
54
|
+
* Useful for pre-loading conversation history in JSON input mode.
|
|
55
|
+
*/
|
|
56
|
+
getLLMService(): ILLMService;
|
|
57
|
+
/**
|
|
58
|
+
* Get the number of messages in the conversation.
|
|
59
|
+
*/
|
|
60
|
+
getMessageCount(): number;
|
|
61
|
+
/**
|
|
62
|
+
* Reset the conversation history.
|
|
63
|
+
*/
|
|
64
|
+
reset(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Send a message and get a response.
|
|
67
|
+
* Delegates to the LLM service which handles the agentic loop.
|
|
68
|
+
*/
|
|
69
|
+
run(input: string, options?: {
|
|
70
|
+
executionContext?: ExecutionContext;
|
|
71
|
+
mode?: 'autonomous' | 'default' | 'query';
|
|
72
|
+
}): Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* Setup automatic event forwarding from SessionEventBus to AgentEventBus.
|
|
75
|
+
* All session events are forwarded with sessionId added to the payload.
|
|
76
|
+
*
|
|
77
|
+
* Following Dexto's pattern: event forwarding is built into the session.
|
|
78
|
+
*/
|
|
79
|
+
private setupEventForwarding;
|
|
80
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { LLMError, SessionCancelledError } from '../../../core/domain/cipher/errors/session-error.js';
|
|
2
|
+
// List of all session events that should be forwarded to agent bus
|
|
3
|
+
const SESSION_EVENT_NAMES = [
|
|
4
|
+
'llmservice:thinking',
|
|
5
|
+
'llmservice:chunk',
|
|
6
|
+
'llmservice:response',
|
|
7
|
+
'llmservice:toolCall',
|
|
8
|
+
'llmservice:toolResult',
|
|
9
|
+
'llmservice:error',
|
|
10
|
+
'llmservice:unsupportedInput',
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Chat session implementation.
|
|
14
|
+
*
|
|
15
|
+
* Following Dexto's pattern: ChatSession owns session-specific services
|
|
16
|
+
* (LLM, EventBus) and receives shared services (ToolManager, SystemPromptManager).
|
|
17
|
+
*
|
|
18
|
+
* The LLM service handles:
|
|
19
|
+
* - Message history (via ContextManager)
|
|
20
|
+
* - Agentic loop
|
|
21
|
+
* - Tool execution
|
|
22
|
+
*
|
|
23
|
+
* This session provides:
|
|
24
|
+
* - Session isolation
|
|
25
|
+
* - Cancellation support
|
|
26
|
+
* - Event forwarding to agent bus
|
|
27
|
+
* - Proper cleanup/disposal
|
|
28
|
+
*/
|
|
29
|
+
export class ChatSession {
|
|
30
|
+
eventBus;
|
|
31
|
+
id;
|
|
32
|
+
currentController;
|
|
33
|
+
forwarders = new Map();
|
|
34
|
+
llmService;
|
|
35
|
+
sharedServices;
|
|
36
|
+
/**
|
|
37
|
+
* Creates a new chat session
|
|
38
|
+
*
|
|
39
|
+
* @param id - Unique session identifier
|
|
40
|
+
* @param sharedServices - Shared services from CipherAgent
|
|
41
|
+
* @param sessionServices - Session-specific services (LLM, EventBus)
|
|
42
|
+
*/
|
|
43
|
+
constructor(id, sharedServices, sessionServices) {
|
|
44
|
+
this.id = id;
|
|
45
|
+
this.sharedServices = sharedServices;
|
|
46
|
+
this.eventBus = sessionServices.sessionEventBus;
|
|
47
|
+
this.llmService = sessionServices.llmService;
|
|
48
|
+
// Setup event forwarding from session bus to agent bus
|
|
49
|
+
this.setupEventForwarding();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Cancel the current operation.
|
|
53
|
+
*/
|
|
54
|
+
cancel() {
|
|
55
|
+
if (this.currentController) {
|
|
56
|
+
this.currentController.abort();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Dispose of the session and clean up resources.
|
|
61
|
+
* Removes event listeners to prevent memory leaks.
|
|
62
|
+
*/
|
|
63
|
+
dispose() {
|
|
64
|
+
// Remove all event forwarders
|
|
65
|
+
for (const [eventName, forwarder] of this.forwarders.entries()) {
|
|
66
|
+
this.eventBus.off(eventName, forwarder);
|
|
67
|
+
}
|
|
68
|
+
this.forwarders.clear();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get the conversation history.
|
|
72
|
+
*/
|
|
73
|
+
getHistory() {
|
|
74
|
+
// Get history from service's context manager
|
|
75
|
+
const contextManager = this.llmService.getContextManager();
|
|
76
|
+
const internalMessages = contextManager.getMessages();
|
|
77
|
+
// Convert to session Message format
|
|
78
|
+
return internalMessages.map((msg) => ({
|
|
79
|
+
content: typeof msg.content === 'string' ? msg.content : '',
|
|
80
|
+
role: msg.role,
|
|
81
|
+
timestamp: Date.now(), // Internal messages don't have timestamps
|
|
82
|
+
toolCallId: msg.toolCallId,
|
|
83
|
+
toolCalls: msg.toolCalls?.map((tc) => ({
|
|
84
|
+
arguments: JSON.parse(tc.function.arguments),
|
|
85
|
+
id: tc.id,
|
|
86
|
+
name: tc.function.name,
|
|
87
|
+
})),
|
|
88
|
+
toolName: msg.name,
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get the LLM service for direct access to context manager.
|
|
93
|
+
* Useful for pre-loading conversation history in JSON input mode.
|
|
94
|
+
*/
|
|
95
|
+
getLLMService() {
|
|
96
|
+
return this.llmService;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get the number of messages in the conversation.
|
|
100
|
+
*/
|
|
101
|
+
getMessageCount() {
|
|
102
|
+
const contextManager = this.llmService.getContextManager();
|
|
103
|
+
return contextManager.getMessages().length;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Reset the conversation history.
|
|
107
|
+
*/
|
|
108
|
+
reset() {
|
|
109
|
+
const contextManager = this.llmService.getContextManager();
|
|
110
|
+
contextManager.clearHistory();
|
|
111
|
+
// Emit conversation reset event
|
|
112
|
+
this.sharedServices.agentEventBus.emit('cipher:conversationReset', {
|
|
113
|
+
sessionId: this.id,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Send a message and get a response.
|
|
118
|
+
* Delegates to the LLM service which handles the agentic loop.
|
|
119
|
+
*/
|
|
120
|
+
async run(input, options) {
|
|
121
|
+
// Create abort controller for cancellation
|
|
122
|
+
this.currentController = new AbortController();
|
|
123
|
+
try {
|
|
124
|
+
// Delegate to service - it handles everything
|
|
125
|
+
const response = await this.llmService.completeTask(input, this.id, {
|
|
126
|
+
executionContext: options?.executionContext,
|
|
127
|
+
mode: options?.mode,
|
|
128
|
+
signal: this.currentController.signal,
|
|
129
|
+
});
|
|
130
|
+
return response;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
// Check if cancelled
|
|
134
|
+
if (this.currentController.signal.aborted) {
|
|
135
|
+
throw new SessionCancelledError(this.id);
|
|
136
|
+
}
|
|
137
|
+
// Wrap other errors - pass message as-is since it's already formatted
|
|
138
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
139
|
+
throw new LLMError(errorMessage, this.id);
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
this.currentController = undefined;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Setup automatic event forwarding from SessionEventBus to AgentEventBus.
|
|
147
|
+
* All session events are forwarded with sessionId added to the payload.
|
|
148
|
+
*
|
|
149
|
+
* Following Dexto's pattern: event forwarding is built into the session.
|
|
150
|
+
*/
|
|
151
|
+
setupEventForwarding() {
|
|
152
|
+
for (const eventName of SESSION_EVENT_NAMES) {
|
|
153
|
+
const forwarder = (payload) => {
|
|
154
|
+
// Add sessionId to payload
|
|
155
|
+
const payloadWithSession = payload && typeof payload === 'object' ? { ...payload, sessionId: this.id } : { sessionId: this.id };
|
|
156
|
+
// Forward to agent bus - eventName is properly typed from SESSION_EVENT_NAMES
|
|
157
|
+
this.sharedServices.agentEventBus.emit(eventName, payloadWithSession);
|
|
158
|
+
};
|
|
159
|
+
// Track forwarder for cleanup
|
|
160
|
+
this.forwarders.set(eventName, forwarder);
|
|
161
|
+
// Register listener on session bus - eventName is properly typed from SESSION_EVENT_NAMES
|
|
162
|
+
this.eventBus.on(eventName, forwarder);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { LLMError, MaxIterationsExceededError, SessionCancelledError, SessionError, SessionNotInitializedError, } from '../../../core/domain/cipher/errors/session-error.js';
|
|
2
|
+
export type { LLMResponse, Message, MessageRole, SessionConfig, ToolCall } from '../../../core/domain/cipher/session/types.js';
|
|
3
|
+
export type { IChatSession } from '../../../core/interfaces/cipher/i-chat-session.js';
|
|
4
|
+
export type { ILLMService } from '../../../core/interfaces/cipher/i-llm-service.js';
|
|
5
|
+
export { ChatSession } from './chat-session.js';
|
|
6
|
+
export { SessionManager } from './session-manager.js';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Session errors
|
|
2
|
+
export { LLMError, MaxIterationsExceededError, SessionCancelledError, SessionError, SessionNotInitializedError, } from '../../../core/domain/cipher/errors/session-error.js';
|
|
3
|
+
export { ChatSession } from './chat-session.js';
|
|
4
|
+
// Session manager
|
|
5
|
+
export { SessionManager } from './session-manager.js';
|