byterover-cli 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -56
- package/bin/dev.js +1 -1
- package/dist/commands/cipher-agent/run.d.ts +111 -0
- package/dist/commands/cipher-agent/run.js +493 -0
- package/dist/commands/cipher-agent/set-prompt.d.ts +14 -0
- package/dist/commands/cipher-agent/set-prompt.js +53 -0
- package/dist/commands/cipher-agent/show-prompt.d.ts +11 -0
- package/dist/commands/cipher-agent/show-prompt.js +48 -0
- package/dist/commands/clear.d.ts +6 -0
- package/dist/commands/clear.js +36 -15
- package/dist/commands/curate.d.ts +74 -0
- package/dist/commands/curate.js +396 -0
- package/dist/commands/foo.d.ts +12 -0
- package/dist/commands/foo.js +61 -0
- package/dist/commands/gen-rules.d.ts +3 -0
- package/dist/commands/gen-rules.js +39 -20
- package/dist/commands/init.d.ts +48 -3
- package/dist/commands/init.js +242 -70
- package/dist/commands/login.js +9 -4
- package/dist/commands/pull.d.ts +33 -0
- package/dist/commands/pull.js +115 -0
- package/dist/commands/push.d.ts +13 -13
- package/dist/commands/push.js +81 -101
- package/dist/commands/query.d.ts +63 -0
- package/dist/commands/query.js +349 -0
- package/dist/commands/space/list.d.ts +5 -2
- package/dist/commands/space/list.js +60 -56
- package/dist/commands/space/switch.d.ts +16 -0
- package/dist/commands/space/switch.js +102 -53
- package/dist/commands/status.d.ts +5 -2
- package/dist/commands/status.js +43 -33
- package/dist/commands/watch.d.ts +23 -0
- package/dist/commands/watch.js +171 -0
- package/dist/config/auth.config.js +14 -2
- package/dist/config/context-tree-domains.d.ts +12 -0
- package/dist/config/context-tree-domains.js +29 -0
- package/dist/config/environment.d.ts +6 -0
- package/dist/config/environment.js +9 -2
- package/dist/constants.d.ts +5 -0
- package/dist/constants.js +6 -0
- package/dist/core/domain/cipher/agent/agent-state-machine.d.ts +128 -0
- package/dist/core/domain/cipher/agent/agent-state-machine.js +183 -0
- package/dist/core/domain/cipher/agent/agent-state.d.ts +77 -0
- package/dist/core/domain/cipher/agent/agent-state.js +59 -0
- package/dist/core/domain/cipher/agent/index.d.ts +7 -0
- package/dist/core/domain/cipher/agent/index.js +7 -0
- package/dist/core/domain/cipher/agent-events/index.d.ts +8 -0
- package/dist/core/domain/cipher/agent-events/index.js +7 -0
- package/dist/core/domain/cipher/agent-events/types.d.ts +419 -0
- package/dist/core/domain/cipher/agent-events/types.js +42 -0
- package/dist/core/domain/cipher/blob/types.d.ts +108 -0
- package/dist/core/domain/cipher/errors/blob-error.d.ts +36 -0
- package/dist/core/domain/cipher/errors/blob-error.js +68 -0
- package/dist/core/domain/cipher/errors/file-system-error.d.ts +211 -0
- package/dist/core/domain/cipher/errors/file-system-error.js +291 -0
- package/dist/core/domain/cipher/errors/llm-error.d.ts +120 -0
- package/dist/core/domain/cipher/errors/llm-error.js +161 -0
- package/dist/core/domain/cipher/errors/memory-error.d.ts +35 -0
- package/dist/core/domain/cipher/errors/memory-error.js +62 -0
- package/dist/core/domain/cipher/errors/process-error-code.d.ts +97 -0
- package/dist/core/domain/cipher/errors/process-error-code.js +98 -0
- package/dist/core/domain/cipher/errors/process-error.d.ts +135 -0
- package/dist/core/domain/cipher/errors/process-error.js +173 -0
- package/dist/core/domain/cipher/errors/session-error.d.ts +56 -0
- package/dist/core/domain/cipher/errors/session-error.js +74 -0
- package/dist/core/domain/cipher/errors/tool-error.d.ts +57 -0
- package/dist/core/domain/cipher/errors/tool-error.js +81 -0
- package/dist/core/domain/cipher/file-system/types.d.ts +203 -0
- package/dist/core/domain/cipher/memory/types.d.ts +102 -0
- package/dist/core/domain/cipher/memory/types.js +4 -0
- package/dist/core/domain/cipher/parsed-interaction.d.ts +47 -0
- package/dist/core/domain/cipher/parsed-interaction.js +25 -0
- package/dist/core/domain/cipher/process/types.d.ts +286 -0
- package/dist/core/domain/cipher/session/types.d.ts +54 -0
- package/dist/core/domain/cipher/storage/history-types.d.ts +38 -0
- package/dist/core/domain/cipher/system-prompt/types.d.ts +131 -0
- package/dist/core/domain/cipher/todos/index.d.ts +4 -0
- package/dist/core/domain/cipher/todos/index.js +4 -0
- package/dist/core/domain/cipher/todos/types.d.ts +57 -0
- package/dist/core/domain/cipher/todos/types.js +5 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +28 -0
- package/dist/core/domain/cipher/tools/constants.js +24 -0
- package/dist/core/domain/cipher/tools/tool-error.d.ts +183 -0
- package/dist/core/domain/cipher/tools/tool-error.js +246 -0
- package/dist/core/domain/cipher/tools/types.d.ts +145 -0
- package/dist/core/domain/entities/brv-config.d.ts +42 -6
- package/dist/core/domain/entities/brv-config.js +115 -17
- package/dist/core/domain/entities/cogit-push-context.d.ts +38 -0
- package/dist/core/domain/entities/cogit-push-context.js +91 -0
- package/dist/core/domain/entities/cogit-push-response.d.ts +20 -0
- package/dist/core/domain/entities/cogit-push-response.js +31 -0
- package/dist/core/domain/entities/cogit-snapshot-author.d.ts +24 -0
- package/dist/core/domain/entities/cogit-snapshot-author.js +39 -0
- package/dist/core/domain/entities/cogit-snapshot-file.d.ts +34 -0
- package/dist/core/domain/entities/cogit-snapshot-file.js +59 -0
- package/dist/core/domain/entities/cogit-snapshot.d.ts +31 -0
- package/dist/core/domain/entities/cogit-snapshot.js +58 -0
- package/dist/core/domain/entities/context-tree-index.d.ts +26 -0
- package/dist/core/domain/entities/context-tree-index.js +27 -0
- package/dist/core/domain/entities/context-tree-snapshot.d.ts +56 -0
- package/dist/core/domain/entities/context-tree-snapshot.js +83 -0
- package/dist/core/domain/entities/event.d.ts +1 -1
- package/dist/core/domain/entities/event.js +3 -1
- package/dist/core/domain/entities/parser.d.ts +567 -0
- package/dist/core/domain/entities/parser.js +10 -0
- package/dist/core/domain/entities/playbook.d.ts +2 -23
- package/dist/core/domain/entities/playbook.js +2 -70
- package/dist/core/domain/errors/brv-config-version-error.d.ts +16 -0
- package/dist/core/domain/errors/brv-config-version-error.js +21 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +80 -0
- package/dist/core/domain/knowledge/directory-manager.js +145 -0
- package/dist/core/domain/knowledge/markdown-writer.d.ts +18 -0
- package/dist/core/domain/knowledge/markdown-writer.js +18 -0
- package/dist/core/domain/knowledge/relation-parser.d.ts +90 -0
- package/dist/core/domain/knowledge/relation-parser.js +131 -0
- package/dist/core/interfaces/cipher/cipher-services.d.ts +71 -0
- package/dist/core/interfaces/cipher/cipher-services.js +1 -0
- package/dist/core/interfaces/cipher/i-blob-storage.d.ts +78 -0
- package/dist/core/interfaces/cipher/i-blob-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-chat-session.d.ts +62 -0
- package/dist/core/interfaces/cipher/i-chat-session.js +1 -0
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +88 -0
- package/dist/core/interfaces/cipher/i-cipher-agent.js +1 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-parser.d.ts +20 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-parser.js +1 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.d.ts +31 -0
- package/dist/core/interfaces/cipher/i-coding-agent-log-watcher.js +1 -0
- package/dist/core/interfaces/cipher/i-content-generator.d.ts +120 -0
- package/dist/core/interfaces/cipher/i-content-generator.js +12 -0
- package/dist/core/interfaces/cipher/i-event-emitter.d.ts +76 -0
- package/dist/core/interfaces/cipher/i-event-emitter.js +1 -0
- package/dist/core/interfaces/cipher/i-file-system.d.ts +68 -0
- package/dist/core/interfaces/cipher/i-file-system.js +1 -0
- package/dist/core/interfaces/cipher/i-history-storage.d.ts +53 -0
- package/dist/core/interfaces/cipher/i-history-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-llm-provider.d.ts +14 -0
- package/dist/core/interfaces/cipher/i-llm-provider.js +1 -0
- package/dist/core/interfaces/cipher/i-llm-service.d.ts +62 -0
- package/dist/core/interfaces/cipher/i-llm-service.js +1 -0
- package/dist/core/interfaces/cipher/i-logger.d.ts +78 -0
- package/dist/core/interfaces/cipher/i-logger.js +28 -0
- package/dist/core/interfaces/cipher/i-message-formatter.d.ts +44 -0
- package/dist/core/interfaces/cipher/i-message-formatter.js +1 -0
- package/dist/core/interfaces/cipher/i-policy-engine.d.ts +102 -0
- package/dist/core/interfaces/cipher/i-policy-engine.js +9 -0
- package/dist/core/interfaces/cipher/i-process-service.d.ts +65 -0
- package/dist/core/interfaces/cipher/i-process-service.js +1 -0
- package/dist/core/interfaces/cipher/i-system-prompt-contributor.d.ts +25 -0
- package/dist/core/interfaces/cipher/i-system-prompt-contributor.js +1 -0
- package/dist/core/interfaces/cipher/i-tokenizer.d.ts +15 -0
- package/dist/core/interfaces/cipher/i-tokenizer.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-provider.d.ts +64 -0
- package/dist/core/interfaces/cipher/i-tool-provider.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +103 -0
- package/dist/core/interfaces/cipher/i-tool-scheduler.js +11 -0
- package/dist/core/interfaces/cipher/llm-types.d.ts +46 -0
- package/dist/core/interfaces/cipher/llm-types.js +5 -0
- package/dist/core/interfaces/cipher/message-types.d.ts +118 -0
- package/dist/core/interfaces/cipher/message-types.js +5 -0
- package/dist/core/interfaces/cipher/tokenizer-types.d.ts +11 -0
- package/dist/core/interfaces/cipher/tokenizer-types.js +14 -0
- package/dist/core/interfaces/i-cogit-pull-service.d.ts +24 -0
- package/dist/core/interfaces/i-cogit-pull-service.js +1 -0
- package/dist/core/interfaces/i-cogit-push-service.d.ts +27 -0
- package/dist/core/interfaces/i-cogit-push-service.js +1 -0
- package/dist/core/interfaces/i-context-file-reader.d.ts +32 -0
- package/dist/core/interfaces/i-context-file-reader.js +1 -0
- package/dist/core/interfaces/i-context-tree-service.d.ts +21 -0
- package/dist/core/interfaces/i-context-tree-service.js +1 -0
- package/dist/core/interfaces/i-context-tree-snapshot-service.d.ts +36 -0
- package/dist/core/interfaces/i-context-tree-snapshot-service.js +1 -0
- package/dist/core/interfaces/i-context-tree-writer-service.d.ts +32 -0
- package/dist/core/interfaces/i-context-tree-writer-service.js +1 -0
- package/dist/core/interfaces/i-file-watcher-service.d.ts +41 -0
- package/dist/core/interfaces/i-file-watcher-service.js +1 -0
- package/dist/core/interfaces/parser/i-clean-parser-service.d.ts +18 -0
- package/dist/core/interfaces/parser/i-clean-parser-service.js +1 -0
- package/dist/core/interfaces/parser/i-raw-parser-service.d.ts +17 -0
- package/dist/core/interfaces/parser/i-raw-parser-service.js +1 -0
- package/dist/core/interfaces/parser/i-session-normalizer.d.ts +56 -0
- package/dist/core/interfaces/parser/i-session-normalizer.js +1 -0
- package/dist/hooks/command_not_found/handle-invalid-commands.d.ts +7 -0
- package/dist/hooks/command_not_found/handle-invalid-commands.js +32 -0
- package/dist/hooks/error/clean-errors.d.ts +7 -0
- package/dist/hooks/error/clean-errors.js +50 -0
- package/dist/hooks/init/welcome.js +72 -1
- package/dist/hooks/prerun/validate-brv-config-version.d.ts +28 -0
- package/dist/hooks/prerun/validate-brv-config-version.js +43 -0
- package/dist/infra/cipher/agent-service-factory.d.ts +86 -0
- package/dist/infra/cipher/agent-service-factory.js +212 -0
- package/dist/infra/cipher/blob/blob-storage-factory.d.ts +13 -0
- package/dist/infra/cipher/blob/blob-storage-factory.js +14 -0
- package/dist/infra/cipher/blob/index.d.ts +10 -0
- package/dist/infra/cipher/blob/index.js +12 -0
- package/dist/infra/cipher/blob/migrations.d.ts +63 -0
- package/dist/infra/cipher/blob/migrations.js +148 -0
- package/dist/infra/cipher/blob/sqlite-blob-storage.d.ts +82 -0
- package/dist/infra/cipher/blob/sqlite-blob-storage.js +307 -0
- package/dist/infra/cipher/cipher-agent-state-manager.d.ts +63 -0
- package/dist/infra/cipher/cipher-agent-state-manager.js +108 -0
- package/dist/infra/cipher/cipher-agent.d.ts +182 -0
- package/dist/infra/cipher/cipher-agent.js +317 -0
- package/dist/infra/cipher/command-parser.d.ts +23 -0
- package/dist/infra/cipher/command-parser.js +85 -0
- package/dist/infra/cipher/display/todo-display.d.ts +23 -0
- package/dist/infra/cipher/display/todo-display.js +129 -0
- package/dist/infra/cipher/events/event-emitter.d.ts +137 -0
- package/dist/infra/cipher/events/event-emitter.js +158 -0
- package/dist/infra/cipher/exit-codes.d.ts +44 -0
- package/dist/infra/cipher/exit-codes.js +58 -0
- package/dist/infra/cipher/file-system/file-system-service.d.ts +105 -0
- package/dist/infra/cipher/file-system/file-system-service.js +641 -0
- package/dist/infra/cipher/file-system/gitignore-filter.d.ts +77 -0
- package/dist/infra/cipher/file-system/gitignore-filter.js +120 -0
- package/dist/infra/cipher/file-system/glob-utils.d.ts +60 -0
- package/dist/infra/cipher/file-system/glob-utils.js +120 -0
- package/dist/infra/cipher/file-system/path-validator.d.ts +69 -0
- package/dist/infra/cipher/file-system/path-validator.js +184 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.d.ts +149 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc-service.js +364 -0
- package/dist/infra/cipher/grpc/internal-llm-grpc.proto +94 -0
- package/dist/infra/cipher/interactive-commands.d.ts +16 -0
- package/dist/infra/cipher/interactive-commands.js +198 -0
- package/dist/infra/cipher/interactive-loop.d.ts +24 -0
- package/dist/infra/cipher/interactive-loop.js +352 -0
- package/dist/infra/cipher/llm/context/async-mutex.d.ts +59 -0
- package/dist/infra/cipher/llm/context/async-mutex.js +92 -0
- package/dist/infra/cipher/llm/context/compression/index.d.ts +6 -0
- package/dist/infra/cipher/llm/context/compression/index.js +5 -0
- package/dist/infra/cipher/llm/context/compression/middle-removal.d.ts +40 -0
- package/dist/infra/cipher/llm/context/compression/middle-removal.js +76 -0
- package/dist/infra/cipher/llm/context/compression/oldest-removal.d.ts +38 -0
- package/dist/infra/cipher/llm/context/compression/oldest-removal.js +53 -0
- package/dist/infra/cipher/llm/context/compression/types.d.ts +36 -0
- package/dist/infra/cipher/llm/context/compression/types.js +1 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +234 -0
- package/dist/infra/cipher/llm/context/context-manager.js +419 -0
- package/dist/infra/cipher/llm/context/index.d.ts +2 -0
- package/dist/infra/cipher/llm/context/index.js +2 -0
- package/dist/infra/cipher/llm/context/loop-detector.d.ts +125 -0
- package/dist/infra/cipher/llm/context/loop-detector.js +194 -0
- package/dist/infra/cipher/llm/context/utils.d.ts +17 -0
- package/dist/infra/cipher/llm/context/utils.js +89 -0
- package/dist/infra/cipher/llm/formatters/claude-formatter.d.ts +54 -0
- package/dist/infra/cipher/llm/formatters/claude-formatter.js +182 -0
- package/dist/infra/cipher/llm/formatters/gemini-formatter.d.ts +69 -0
- package/dist/infra/cipher/llm/formatters/gemini-formatter.js +253 -0
- package/dist/infra/cipher/llm/formatters/openrouter-formatter.d.ts +47 -0
- package/dist/infra/cipher/llm/formatters/openrouter-formatter.js +238 -0
- package/dist/infra/cipher/llm/generators/byterover-content-generator.d.ts +92 -0
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +211 -0
- package/dist/infra/cipher/llm/generators/index.d.ts +13 -0
- package/dist/infra/cipher/llm/generators/index.js +13 -0
- package/dist/infra/cipher/llm/generators/logging-content-generator.d.ts +104 -0
- package/dist/infra/cipher/llm/generators/logging-content-generator.js +182 -0
- package/dist/infra/cipher/llm/generators/openrouter-content-generator.d.ts +93 -0
- package/dist/infra/cipher/llm/generators/openrouter-content-generator.js +254 -0
- package/dist/infra/cipher/llm/generators/retryable-content-generator.d.ts +90 -0
- package/dist/infra/cipher/llm/generators/retryable-content-generator.js +157 -0
- package/dist/infra/cipher/llm/index.d.ts +9 -0
- package/dist/infra/cipher/llm/index.js +13 -0
- package/dist/infra/cipher/llm/internal-llm-service.d.ts +308 -0
- package/dist/infra/cipher/llm/internal-llm-service.js +724 -0
- package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +183 -0
- package/dist/infra/cipher/llm/openrouter-llm-service.js +386 -0
- package/dist/infra/cipher/llm/response-validator.d.ts +89 -0
- package/dist/infra/cipher/llm/response-validator.js +157 -0
- package/dist/infra/cipher/llm/retry/index.d.ts +10 -0
- package/dist/infra/cipher/llm/retry/index.js +10 -0
- package/dist/infra/cipher/llm/retry/retry-policy.d.ts +74 -0
- package/dist/infra/cipher/llm/retry/retry-policy.js +146 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.d.ts +113 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.js +247 -0
- package/dist/infra/cipher/llm/thought-parser.d.ts +145 -0
- package/dist/infra/cipher/llm/thought-parser.js +190 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +47 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +55 -0
- package/dist/infra/cipher/llm/tokenizers/default-tokenizer.d.ts +31 -0
- package/dist/infra/cipher/llm/tokenizers/default-tokenizer.js +38 -0
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +37 -0
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +45 -0
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +29 -0
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +37 -0
- package/dist/infra/cipher/llm/tool-output-processor.d.ts +117 -0
- package/dist/infra/cipher/llm/tool-output-processor.js +153 -0
- package/dist/infra/cipher/logger/console-logger.d.ts +42 -0
- package/dist/infra/cipher/logger/console-logger.js +63 -0
- package/dist/infra/cipher/logger/event-based-logger.d.ts +54 -0
- package/dist/infra/cipher/logger/event-based-logger.js +92 -0
- package/dist/infra/cipher/memory/index.d.ts +6 -0
- package/dist/infra/cipher/memory/index.js +7 -0
- package/dist/infra/cipher/memory/memory-manager.d.ts +136 -0
- package/dist/infra/cipher/memory/memory-manager.js +523 -0
- package/dist/infra/cipher/parsers/coding-agent-log-parser.d.ts +24 -0
- package/dist/infra/cipher/parsers/coding-agent-log-parser.js +51 -0
- package/dist/infra/cipher/process/command-validator.d.ts +59 -0
- package/dist/infra/cipher/process/command-validator.js +266 -0
- package/dist/infra/cipher/process/index.d.ts +8 -0
- package/dist/infra/cipher/process/index.js +8 -0
- package/dist/infra/cipher/process/process-service.d.ts +95 -0
- package/dist/infra/cipher/process/process-service.js +439 -0
- package/dist/infra/cipher/session/chat-session.d.ts +80 -0
- package/dist/infra/cipher/session/chat-session.js +165 -0
- package/dist/infra/cipher/session/index.d.ts +6 -0
- package/dist/infra/cipher/session/index.js +5 -0
- package/dist/infra/cipher/session/session-event-forwarder.d.ts +37 -0
- package/dist/infra/cipher/session/session-event-forwarder.js +83 -0
- package/dist/infra/cipher/session/session-manager.d.ts +109 -0
- package/dist/infra/cipher/session/session-manager.js +172 -0
- package/dist/infra/cipher/storage/blob-history-storage.d.ts +76 -0
- package/dist/infra/cipher/storage/blob-history-storage.js +178 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +105 -0
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +290 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.d.ts +99 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.js +161 -0
- package/dist/infra/cipher/tools/default-policy-rules.d.ts +26 -0
- package/dist/infra/cipher/tools/default-policy-rules.js +125 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +93 -0
- package/dist/infra/cipher/tools/implementations/bash-output-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/bash-output-tool.js +47 -0
- package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.d.ts +11 -0
- package/dist/infra/cipher/tools/implementations/create-knowledge-topic-tool.js +142 -0
- package/dist/infra/cipher/tools/implementations/delete-memory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/delete-memory-tool.js +37 -0
- package/dist/infra/cipher/tools/implementations/detect-domains-tool.d.ts +7 -0
- package/dist/infra/cipher/tools/implementations/detect-domains-tool.js +73 -0
- package/dist/infra/cipher/tools/implementations/edit-file-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/edit-file-tool.js +50 -0
- package/dist/infra/cipher/tools/implementations/edit-memory-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/edit-memory-tool.js +53 -0
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +7 -0
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +421 -0
- package/dist/infra/cipher/tools/implementations/glob-files-tool.d.ts +18 -0
- package/dist/infra/cipher/tools/implementations/glob-files-tool.js +70 -0
- package/dist/infra/cipher/tools/implementations/grep-content-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/grep-content-tool.js +77 -0
- package/dist/infra/cipher/tools/implementations/kill-process-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/kill-process-tool.js +55 -0
- package/dist/infra/cipher/tools/implementations/list-memories-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/list-memories-tool.js +63 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.js +54 -0
- package/dist/infra/cipher/tools/implementations/read-memory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/read-memory-tool.js +39 -0
- package/dist/infra/cipher/tools/implementations/search-history-tool.d.ts +10 -0
- package/dist/infra/cipher/tools/implementations/search-history-tool.js +36 -0
- package/dist/infra/cipher/tools/implementations/write-file-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/write-file-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/write-memory-tool.d.ts +13 -0
- package/dist/infra/cipher/tools/implementations/write-memory-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +10 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.js +165 -0
- package/dist/infra/cipher/tools/index.d.ts +18 -0
- package/dist/infra/cipher/tools/index.js +19 -0
- package/dist/infra/cipher/tools/policy-engine.d.ts +80 -0
- package/dist/infra/cipher/tools/policy-engine.js +110 -0
- package/dist/infra/cipher/tools/tool-invocation-queue.d.ts +191 -0
- package/dist/infra/cipher/tools/tool-invocation-queue.js +254 -0
- package/dist/infra/cipher/tools/tool-invocation.d.ts +216 -0
- package/dist/infra/cipher/tools/tool-invocation.js +294 -0
- package/dist/infra/cipher/tools/tool-manager.d.ts +135 -0
- package/dist/infra/cipher/tools/tool-manager.js +209 -0
- package/dist/infra/cipher/tools/tool-markers.d.ts +48 -0
- package/dist/infra/cipher/tools/tool-markers.js +49 -0
- package/dist/infra/cipher/tools/tool-provider.d.ts +77 -0
- package/dist/infra/cipher/tools/tool-provider.js +196 -0
- package/dist/infra/cipher/tools/tool-registry.d.ts +52 -0
- package/dist/infra/cipher/tools/tool-registry.js +144 -0
- package/dist/infra/cipher/tools/utils/schema-converter.d.ts +10 -0
- package/dist/infra/cipher/tools/utils/schema-converter.js +29 -0
- package/dist/infra/cipher/validation/workspace-validator.d.ts +19 -0
- package/dist/infra/cipher/validation/workspace-validator.js +37 -0
- package/dist/infra/cipher/watcher/coding-agent-log-watcher.d.ts +14 -0
- package/dist/infra/cipher/watcher/coding-agent-log-watcher.js +55 -0
- package/dist/infra/cogit/context-tree-to-push-context-mapper.d.ts +21 -0
- package/dist/infra/cogit/context-tree-to-push-context-mapper.js +32 -0
- package/dist/infra/cogit/http-cogit-pull-service.d.ts +15 -0
- package/dist/infra/cogit/http-cogit-pull-service.js +30 -0
- package/dist/infra/cogit/http-cogit-push-service.d.ts +17 -0
- package/dist/infra/cogit/http-cogit-push-service.js +104 -0
- package/dist/infra/config/file-config-store.js +9 -3
- package/dist/infra/context-tree/file-context-file-reader.d.ts +14 -0
- package/dist/infra/context-tree/file-context-file-reader.js +46 -0
- package/dist/infra/context-tree/file-context-tree-service.d.ts +14 -0
- package/dist/infra/context-tree/file-context-tree-service.js +46 -0
- package/dist/infra/context-tree/file-context-tree-snapshot-service.d.ts +34 -0
- package/dist/infra/context-tree/file-context-tree-snapshot-service.js +117 -0
- package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +22 -0
- package/dist/infra/context-tree/file-context-tree-writer-service.js +61 -0
- package/dist/infra/memory/http-memory-retrieval-service.js +2 -1
- package/dist/infra/memory/http-memory-storage-service.js +4 -3
- package/dist/infra/parsers/clean/clean-claude-service.d.ts +111 -0
- package/dist/infra/parsers/clean/clean-claude-service.js +271 -0
- package/dist/infra/parsers/clean/clean-codex-service.d.ts +231 -0
- package/dist/infra/parsers/clean/clean-codex-service.js +534 -0
- package/dist/infra/parsers/clean/clean-copilot-service.d.ts +255 -0
- package/dist/infra/parsers/clean/clean-copilot-service.js +729 -0
- package/dist/infra/parsers/clean/clean-cursor-service.d.ts +161 -0
- package/dist/infra/parsers/clean/clean-cursor-service.js +432 -0
- package/dist/infra/parsers/clean/clean-parser-service-factory.d.ts +54 -0
- package/dist/infra/parsers/clean/clean-parser-service-factory.js +80 -0
- package/dist/infra/parsers/clean/shared.d.ts +84 -0
- package/dist/infra/parsers/clean/shared.js +273 -0
- package/dist/infra/parsers/raw/raw-claude-service.d.ts +195 -0
- package/dist/infra/parsers/raw/raw-claude-service.js +548 -0
- package/dist/infra/parsers/raw/raw-codex-service.d.ts +313 -0
- package/dist/infra/parsers/raw/raw-codex-service.js +782 -0
- package/dist/infra/parsers/raw/raw-copilot-service.d.ts +196 -0
- package/dist/infra/parsers/raw/raw-copilot-service.js +558 -0
- package/dist/infra/parsers/raw/raw-cursor-service.d.ts +316 -0
- package/dist/infra/parsers/raw/raw-cursor-service.js +818 -0
- package/dist/infra/parsers/raw/raw-parser-service-factory.d.ts +54 -0
- package/dist/infra/parsers/raw/raw-parser-service-factory.js +81 -0
- package/dist/infra/space/http-space-service.js +2 -1
- package/dist/infra/team/http-team-service.js +2 -1
- package/dist/infra/user/http-user-service.js +2 -1
- package/dist/infra/watcher/file-watcher-service.d.ts +10 -0
- package/dist/infra/watcher/file-watcher-service.js +81 -0
- package/dist/infra/workspace/workspace-detector-service.d.ts +60 -0
- package/dist/infra/workspace/workspace-detector-service.js +165 -0
- package/dist/resources/prompts/curate-context-tree-curation.yml +48 -0
- package/dist/resources/prompts/modes/autonomous.yml +9 -0
- package/dist/resources/prompts/query-context-tree-retrieval.yml +49 -0
- package/dist/resources/prompts/reflection.yml +27 -0
- package/dist/resources/prompts/system-prompt.yml +82 -0
- package/dist/resources/prompts/tool-outputs.yml +30 -0
- package/dist/templates/README.md +6 -7
- package/dist/templates/sections/command-reference.md +40 -111
- package/dist/templates/sections/workflow.md +3 -30
- package/dist/utils/emoji-helpers.d.ts +38 -0
- package/dist/utils/emoji-helpers.js +42 -0
- package/dist/utils/error-handler.d.ts +51 -0
- package/dist/utils/error-handler.js +169 -0
- package/dist/utils/error-helpers.d.ts +30 -0
- package/dist/utils/error-helpers.js +47 -0
- package/dist/utils/file-helpers.d.ts +15 -0
- package/dist/utils/file-helpers.js +44 -0
- package/dist/utils/oclif-error-helpers.d.ts +40 -0
- package/dist/utils/oclif-error-helpers.js +46 -0
- package/dist/utils/tool-display-formatter.d.ts +53 -0
- package/dist/utils/tool-display-formatter.js +257 -0
- package/oclif.manifest.json +381 -141
- package/package.json +27 -6
- package/dist/commands/add.d.ts +0 -49
- package/dist/commands/add.js +0 -192
- package/dist/commands/complete.d.ts +0 -108
- package/dist/commands/complete.js +0 -340
- package/dist/commands/retrieve.d.ts +0 -26
- package/dist/commands/retrieve.js +0 -101
- package/dist/core/domain/entities/curator-output.d.ts +0 -14
- package/dist/core/domain/entities/curator-output.js +0 -23
- package/dist/core/domain/entities/delta-batch.d.ts +0 -30
- package/dist/core/domain/entities/delta-batch.js +0 -52
- package/dist/core/domain/entities/delta-operation.d.ts +0 -31
- package/dist/core/domain/entities/delta-operation.js +0 -50
- package/dist/core/domain/entities/executor-output.d.ts +0 -27
- package/dist/core/domain/entities/executor-output.js +0 -33
- package/dist/core/domain/entities/reflector-output.d.ts +0 -38
- package/dist/core/domain/entities/reflector-output.js +0 -44
- package/dist/core/interfaces/i-ace-prompt-builder.d.ts +0 -48
- package/dist/core/interfaces/i-bullet-content-store.d.ts +0 -36
- package/dist/core/interfaces/i-delta-store.d.ts +0 -15
- package/dist/core/interfaces/i-executor-output-store.d.ts +0 -14
- package/dist/core/interfaces/i-playbook-service.d.ts +0 -69
- package/dist/core/interfaces/i-playbook-store.d.ts +0 -38
- package/dist/core/interfaces/i-reflection-store.d.ts +0 -21
- package/dist/infra/ace/ace-file-utils.d.ts +0 -46
- package/dist/infra/ace/ace-file-utils.js +0 -83
- package/dist/infra/ace/ace-prompt-templates.d.ts +0 -13
- package/dist/infra/ace/ace-prompt-templates.js +0 -177
- package/dist/infra/ace/file-bullet-content-store.d.ts +0 -27
- package/dist/infra/ace/file-bullet-content-store.js +0 -89
- package/dist/infra/ace/file-delta-store.d.ts +0 -9
- package/dist/infra/ace/file-delta-store.js +0 -26
- package/dist/infra/ace/file-executor-output-store.d.ts +0 -9
- package/dist/infra/ace/file-executor-output-store.js +0 -26
- package/dist/infra/ace/file-playbook-store.d.ts +0 -29
- package/dist/infra/ace/file-playbook-store.js +0 -107
- package/dist/infra/ace/file-reflection-store.d.ts +0 -10
- package/dist/infra/ace/file-reflection-store.js +0 -55
- package/dist/infra/playbook/file-playbook-service.d.ts +0 -42
- package/dist/infra/playbook/file-playbook-service.js +0 -132
- /package/dist/core/{interfaces/i-ace-prompt-builder.js → domain/cipher/blob/types.js} +0 -0
- /package/dist/core/{interfaces/i-bullet-content-store.js → domain/cipher/file-system/types.js} +0 -0
- /package/dist/core/{interfaces/i-delta-store.js → domain/cipher/process/types.js} +0 -0
- /package/dist/core/{interfaces/i-executor-output-store.js → domain/cipher/session/types.js} +0 -0
- /package/dist/core/{interfaces/i-playbook-service.js → domain/cipher/storage/history-types.js} +0 -0
- /package/dist/core/{interfaces/i-playbook-store.js → domain/cipher/system-prompt/types.js} +0 -0
- /package/dist/core/{interfaces/i-reflection-store.js → domain/cipher/tools/types.js} +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command parser for interactive CLI
|
|
3
|
+
* Parses user input to distinguish between slash commands and regular prompts
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Parse user input into command or prompt
|
|
7
|
+
*
|
|
8
|
+
* @param input - Raw user input string
|
|
9
|
+
* @returns Parsed command result (discriminated union)
|
|
10
|
+
*/
|
|
11
|
+
export function parseInput(input) {
|
|
12
|
+
const trimmed = input.trim();
|
|
13
|
+
// Check if it's a slash command
|
|
14
|
+
if (trimmed.startsWith('/')) {
|
|
15
|
+
const args = parseQuotedArguments(trimmed.slice(1));
|
|
16
|
+
const command = args[0] || '';
|
|
17
|
+
const commandArgs = args.slice(1);
|
|
18
|
+
return {
|
|
19
|
+
args: commandArgs,
|
|
20
|
+
command,
|
|
21
|
+
rawInput: trimmed,
|
|
22
|
+
type: 'command',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// Regular user prompt
|
|
26
|
+
return {
|
|
27
|
+
rawInput: input,
|
|
28
|
+
type: 'prompt',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Parse command arguments with support for quoted strings
|
|
33
|
+
* Respects single and double quotes with escape sequences
|
|
34
|
+
*
|
|
35
|
+
* @param input - Command input (without leading slash)
|
|
36
|
+
* @returns Array of parsed arguments
|
|
37
|
+
*/
|
|
38
|
+
function parseQuotedArguments(input) {
|
|
39
|
+
const args = [];
|
|
40
|
+
let current = '';
|
|
41
|
+
let inQuote = null;
|
|
42
|
+
let escaped = false;
|
|
43
|
+
for (const char of input) {
|
|
44
|
+
if (escaped) {
|
|
45
|
+
// Handle escape sequences
|
|
46
|
+
current += char;
|
|
47
|
+
escaped = false;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (char === '\\') {
|
|
51
|
+
// Start escape sequence
|
|
52
|
+
escaped = true;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (inQuote) {
|
|
56
|
+
// Inside quoted string
|
|
57
|
+
if (char === inQuote) {
|
|
58
|
+
// End quote
|
|
59
|
+
inQuote = null;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
current += char;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (char === '"' || char === "'") {
|
|
66
|
+
// Start quote
|
|
67
|
+
inQuote = char;
|
|
68
|
+
}
|
|
69
|
+
else if (char === ' ' || char === '\t') {
|
|
70
|
+
// Whitespace - end of argument
|
|
71
|
+
if (current.length > 0) {
|
|
72
|
+
args.push(current);
|
|
73
|
+
current = '';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
current += char;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Add final argument if any
|
|
81
|
+
if (current.length > 0) {
|
|
82
|
+
args.push(current);
|
|
83
|
+
}
|
|
84
|
+
return args;
|
|
85
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Todo } from '../../../core/domain/cipher/todos/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Formats a single todo item for display.
|
|
4
|
+
*
|
|
5
|
+
* @param todo - Todo item to format
|
|
6
|
+
* @param index - 1-based index of the todo
|
|
7
|
+
* @returns Formatted todo string
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatTodoItem(todo: Todo, index: number): string;
|
|
10
|
+
/**
|
|
11
|
+
* Formats the entire todo list for display.
|
|
12
|
+
*
|
|
13
|
+
* @param todos - Array of todos to format
|
|
14
|
+
* @returns Formatted todo list string
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatTodoList(todos: Todo[]): string;
|
|
17
|
+
/**
|
|
18
|
+
* Formats a compact status line for the current task.
|
|
19
|
+
*
|
|
20
|
+
* @param todos - Array of todos
|
|
21
|
+
* @returns Status line string or null if no task in progress
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatCurrentTaskStatus(todos: Todo[]): null | string;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ANSI color codes for terminal output.
|
|
3
|
+
*/
|
|
4
|
+
const Colors = {
|
|
5
|
+
blue: '\u001B[34m',
|
|
6
|
+
cyan: '\u001B[36m',
|
|
7
|
+
dim: '\u001B[2m',
|
|
8
|
+
green: '\u001B[32m',
|
|
9
|
+
red: '\u001B[31m',
|
|
10
|
+
reset: '\u001B[0m',
|
|
11
|
+
yellow: '\u001B[33m',
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Gets the status icon for a todo.
|
|
15
|
+
*
|
|
16
|
+
* @param status - Todo status
|
|
17
|
+
* @returns Colored status icon
|
|
18
|
+
*/
|
|
19
|
+
function getStatusIcon(status) {
|
|
20
|
+
switch (status) {
|
|
21
|
+
case 'cancelled': {
|
|
22
|
+
return `${Colors.dim}⊘${Colors.reset}`;
|
|
23
|
+
}
|
|
24
|
+
case 'completed': {
|
|
25
|
+
return `${Colors.green}✓${Colors.reset}`;
|
|
26
|
+
}
|
|
27
|
+
case 'in_progress': {
|
|
28
|
+
return `${Colors.blue}→${Colors.reset}`;
|
|
29
|
+
}
|
|
30
|
+
case 'pending': {
|
|
31
|
+
return `${Colors.dim}○${Colors.reset}`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Gets the status color for a todo.
|
|
37
|
+
*
|
|
38
|
+
* @param status - Todo status
|
|
39
|
+
* @returns ANSI color code
|
|
40
|
+
*/
|
|
41
|
+
function getStatusColor(status) {
|
|
42
|
+
switch (status) {
|
|
43
|
+
case 'cancelled': {
|
|
44
|
+
return Colors.dim;
|
|
45
|
+
}
|
|
46
|
+
case 'completed': {
|
|
47
|
+
return Colors.green;
|
|
48
|
+
}
|
|
49
|
+
case 'in_progress': {
|
|
50
|
+
return Colors.blue;
|
|
51
|
+
}
|
|
52
|
+
case 'pending': {
|
|
53
|
+
return Colors.dim;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Formats a single todo item for display.
|
|
59
|
+
*
|
|
60
|
+
* @param todo - Todo item to format
|
|
61
|
+
* @param index - 1-based index of the todo
|
|
62
|
+
* @returns Formatted todo string
|
|
63
|
+
*/
|
|
64
|
+
export function formatTodoItem(todo, index) {
|
|
65
|
+
const icon = getStatusIcon(todo.status);
|
|
66
|
+
const color = getStatusColor(todo.status);
|
|
67
|
+
const content = todo.status === 'in_progress' ? todo.activeForm : todo.content;
|
|
68
|
+
return `${icon} ${color}${index}. ${content}${Colors.reset}`;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Formats the entire todo list for display.
|
|
72
|
+
*
|
|
73
|
+
* @param todos - Array of todos to format
|
|
74
|
+
* @returns Formatted todo list string
|
|
75
|
+
*/
|
|
76
|
+
export function formatTodoList(todos) {
|
|
77
|
+
if (todos.length === 0) {
|
|
78
|
+
return `${Colors.dim}No tasks${Colors.reset}`;
|
|
79
|
+
}
|
|
80
|
+
// Add each todo
|
|
81
|
+
const lines = todos.map((todo, i) => formatTodoItem(todo, i + 1));
|
|
82
|
+
// Add progress summary
|
|
83
|
+
const stats = getTodoStats(todos);
|
|
84
|
+
const summaryLines = ['', formatProgressBar(stats)];
|
|
85
|
+
return [...lines, ...summaryLines].join('\n');
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Formats a compact progress bar.
|
|
89
|
+
*
|
|
90
|
+
* @param stats - Todo statistics
|
|
91
|
+
* @returns Formatted progress bar string
|
|
92
|
+
*/
|
|
93
|
+
function formatProgressBar(stats) {
|
|
94
|
+
const percentage = stats.total > 0 ? Math.round((stats.completed / stats.total) * 100) : 0;
|
|
95
|
+
const barWidth = 20;
|
|
96
|
+
const filled = Math.round((percentage / 100) * barWidth);
|
|
97
|
+
const empty = barWidth - filled;
|
|
98
|
+
const bar = `${Colors.green}${'█'.repeat(filled)}${Colors.dim}${'░'.repeat(empty)}${Colors.reset}`;
|
|
99
|
+
return `${bar} ${percentage}% (${stats.completed}/${stats.total})`;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Gets statistics about the todo list.
|
|
103
|
+
*
|
|
104
|
+
* @param todos - Array of todos
|
|
105
|
+
* @returns Statistics object
|
|
106
|
+
*/
|
|
107
|
+
function getTodoStats(todos) {
|
|
108
|
+
return {
|
|
109
|
+
cancelled: todos.filter((t) => t.status === 'cancelled').length,
|
|
110
|
+
completed: todos.filter((t) => t.status === 'completed').length,
|
|
111
|
+
inProgress: todos.filter((t) => t.status === 'in_progress').length,
|
|
112
|
+
pending: todos.filter((t) => t.status === 'pending').length,
|
|
113
|
+
total: todos.length,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Formats a compact status line for the current task.
|
|
118
|
+
*
|
|
119
|
+
* @param todos - Array of todos
|
|
120
|
+
* @returns Status line string or null if no task in progress
|
|
121
|
+
*/
|
|
122
|
+
export function formatCurrentTaskStatus(todos) {
|
|
123
|
+
const inProgress = todos.find((t) => t.status === 'in_progress');
|
|
124
|
+
if (!inProgress) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const stats = getTodoStats(todos);
|
|
128
|
+
return `${Colors.blue}→${Colors.reset} ${inProgress.activeForm} ${Colors.dim}(${stats.completed + 1}/${stats.total})${Colors.reset}`;
|
|
129
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { AgentEventMap, SessionEventMap } from '../../../core/domain/cipher/agent-events/types.js';
|
|
3
|
+
import type { EventListenerOptions, IEventEmitter } from '../../../core/interfaces/cipher/i-event-emitter.js';
|
|
4
|
+
/**
|
|
5
|
+
* Base implementation of a type-safe event emitter.
|
|
6
|
+
*
|
|
7
|
+
* Extends Node.js EventEmitter with TypeScript type safety and AbortController support.
|
|
8
|
+
* This follows the pattern from Dexto's event system.
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - Type-safe emit/on/once/off methods
|
|
12
|
+
* - AbortController integration for automatic listener cleanup
|
|
13
|
+
* - Proper handling of void payloads
|
|
14
|
+
* - WeakMap-based tracking for signal-listener associations
|
|
15
|
+
*
|
|
16
|
+
* @template TEventMap - Map of event names to their payload types
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* interface MyEvents {
|
|
21
|
+
* 'data:received': { value: number };
|
|
22
|
+
* 'data:cleared': void;
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* class MyEventBus extends BaseTypedEventEmitter<MyEvents> {}
|
|
26
|
+
*
|
|
27
|
+
* const bus = new MyEventBus();
|
|
28
|
+
* bus.emit('data:received', { value: 42 });
|
|
29
|
+
* bus.emit('data:cleared');
|
|
30
|
+
*
|
|
31
|
+
* // With AbortController
|
|
32
|
+
* const controller = new AbortController();
|
|
33
|
+
* bus.on('data:received', (data) => console.log(data.value), { signal: controller.signal });
|
|
34
|
+
* controller.abort(); // Automatically removes listener
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare class BaseTypedEventEmitter<TEventMap extends object> extends EventEmitter implements IEventEmitter<TEventMap> {
|
|
38
|
+
/**
|
|
39
|
+
* WeakMap tracking AbortSignal → Set<listener function>.
|
|
40
|
+
* Used to automatically remove listeners when signals are aborted.
|
|
41
|
+
*/
|
|
42
|
+
private readonly signalListeners;
|
|
43
|
+
/**
|
|
44
|
+
* Emit an event with optional payload.
|
|
45
|
+
*
|
|
46
|
+
* @param eventName - Name of the event to emit
|
|
47
|
+
* @param payload - Event payload (omit for void events)
|
|
48
|
+
* @returns true if the event had listeners, false otherwise
|
|
49
|
+
*/
|
|
50
|
+
emit<K extends keyof TEventMap>(eventName: K, ...payload: TEventMap[K] extends void ? [] : [TEventMap[K]]): boolean;
|
|
51
|
+
emit(eventName: string, ...args: never[]): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Remove an event listener.
|
|
54
|
+
*
|
|
55
|
+
* @param eventName - Name of the event
|
|
56
|
+
* @param listener - Callback function to remove
|
|
57
|
+
* @returns this (for chaining)
|
|
58
|
+
*/
|
|
59
|
+
off<K extends keyof TEventMap>(eventName: K, listener: TEventMap[K] extends void ? () => void : (payload: TEventMap[K]) => void): this;
|
|
60
|
+
off(eventName: string | symbol, listener: (data?: unknown) => void): this;
|
|
61
|
+
/**
|
|
62
|
+
* Register an event listener.
|
|
63
|
+
*
|
|
64
|
+
* @param eventName - Name of the event to listen for
|
|
65
|
+
* @param listener - Callback function
|
|
66
|
+
* @param options - Optional AbortSignal for automatic cleanup
|
|
67
|
+
* @returns this (for chaining)
|
|
68
|
+
*/
|
|
69
|
+
on<K extends keyof TEventMap>(eventName: K, listener: TEventMap[K] extends void ? () => void : (payload: TEventMap[K]) => void, options?: EventListenerOptions): this;
|
|
70
|
+
on(eventName: string | symbol, listener: (data?: unknown) => void): this;
|
|
71
|
+
/**
|
|
72
|
+
* Register a one-time event listener.
|
|
73
|
+
*
|
|
74
|
+
* @param eventName - Name of the event to listen for
|
|
75
|
+
* @param listener - Callback function
|
|
76
|
+
* @param options - Optional AbortSignal for automatic cleanup
|
|
77
|
+
* @returns this (for chaining)
|
|
78
|
+
*/
|
|
79
|
+
once<K extends keyof TEventMap>(eventName: K, listener: TEventMap[K] extends void ? () => void : (payload: TEventMap[K]) => void, options?: EventListenerOptions): this;
|
|
80
|
+
once(eventName: string | symbol, listener: (data?: unknown) => void): this;
|
|
81
|
+
/**
|
|
82
|
+
* Setup automatic cleanup when AbortSignal fires.
|
|
83
|
+
*
|
|
84
|
+
* @param eventName - Event name
|
|
85
|
+
* @param listener - Listener function to remove
|
|
86
|
+
* @param signal - AbortSignal to watch
|
|
87
|
+
*/
|
|
88
|
+
private setupAbortCleanup;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Event bus for agent-level events.
|
|
92
|
+
*
|
|
93
|
+
* Handles global agent events like state changes, conversation resets, etc.
|
|
94
|
+
* All events include sessionId to track which session triggered the event.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* const agentBus = new AgentEventBus();
|
|
99
|
+
*
|
|
100
|
+
* agentBus.on('cipher:stateChanged', (payload) => {
|
|
101
|
+
* console.log(`State changed: ${payload.field} in session ${payload.sessionId}`);
|
|
102
|
+
* });
|
|
103
|
+
*
|
|
104
|
+
* agentBus.emit('cipher:stateChanged', {
|
|
105
|
+
* field: 'model',
|
|
106
|
+
* newValue: 'gemini-2.5-flash',
|
|
107
|
+
* sessionId: 'session-123'
|
|
108
|
+
* });
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare class AgentEventBus extends BaseTypedEventEmitter<AgentEventMap> {
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Event bus for session-level events.
|
|
115
|
+
*
|
|
116
|
+
* Handles session-scoped events like LLM thinking, tool calls, responses, etc.
|
|
117
|
+
* Events do not include sessionId as they are already scoped to a specific session.
|
|
118
|
+
*
|
|
119
|
+
* Typically, these events are forwarded to the AgentEventBus with sessionId added.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* const sessionBus = new SessionEventBus();
|
|
124
|
+
*
|
|
125
|
+
* sessionBus.on('llmservice:toolCall', (payload) => {
|
|
126
|
+
* console.log(`Tool call: ${payload.toolName}`);
|
|
127
|
+
* });
|
|
128
|
+
*
|
|
129
|
+
* sessionBus.emit('llmservice:toolCall', {
|
|
130
|
+
* toolName: 'read_file',
|
|
131
|
+
* args: { filePath: '/path/to/file' },
|
|
132
|
+
* callId: 'call-456'
|
|
133
|
+
* });
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
export declare class SessionEventBus extends BaseTypedEventEmitter<SessionEventMap> {
|
|
137
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
/**
|
|
3
|
+
* Base implementation of a type-safe event emitter.
|
|
4
|
+
*
|
|
5
|
+
* Extends Node.js EventEmitter with TypeScript type safety and AbortController support.
|
|
6
|
+
* This follows the pattern from Dexto's event system.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Type-safe emit/on/once/off methods
|
|
10
|
+
* - AbortController integration for automatic listener cleanup
|
|
11
|
+
* - Proper handling of void payloads
|
|
12
|
+
* - WeakMap-based tracking for signal-listener associations
|
|
13
|
+
*
|
|
14
|
+
* @template TEventMap - Map of event names to their payload types
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* interface MyEvents {
|
|
19
|
+
* 'data:received': { value: number };
|
|
20
|
+
* 'data:cleared': void;
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* class MyEventBus extends BaseTypedEventEmitter<MyEvents> {}
|
|
24
|
+
*
|
|
25
|
+
* const bus = new MyEventBus();
|
|
26
|
+
* bus.emit('data:received', { value: 42 });
|
|
27
|
+
* bus.emit('data:cleared');
|
|
28
|
+
*
|
|
29
|
+
* // With AbortController
|
|
30
|
+
* const controller = new AbortController();
|
|
31
|
+
* bus.on('data:received', (data) => console.log(data.value), { signal: controller.signal });
|
|
32
|
+
* controller.abort(); // Automatically removes listener
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class BaseTypedEventEmitter
|
|
36
|
+
// eslint-disable-next-line unicorn/prefer-event-target
|
|
37
|
+
extends EventEmitter {
|
|
38
|
+
/**
|
|
39
|
+
* WeakMap tracking AbortSignal → Set<listener function>.
|
|
40
|
+
* Used to automatically remove listeners when signals are aborted.
|
|
41
|
+
*/
|
|
42
|
+
signalListeners = new WeakMap();
|
|
43
|
+
emit(eventName, ...args) {
|
|
44
|
+
return super.emit(eventName, ...args);
|
|
45
|
+
}
|
|
46
|
+
off(eventName, listener) {
|
|
47
|
+
return super.off(eventName, listener);
|
|
48
|
+
}
|
|
49
|
+
on(eventName, listener, options) {
|
|
50
|
+
// If signal is already aborted, don't add the listener
|
|
51
|
+
if (options?.signal?.aborted) {
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
// Add the listener
|
|
55
|
+
super.on(eventName, listener);
|
|
56
|
+
// Handle AbortController cleanup
|
|
57
|
+
if (options?.signal) {
|
|
58
|
+
this.setupAbortCleanup(eventName, listener, options.signal);
|
|
59
|
+
}
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
once(eventName, listener, options) {
|
|
63
|
+
// If signal is already aborted, don't add the listener
|
|
64
|
+
if (options?.signal?.aborted) {
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
// Add the listener
|
|
68
|
+
super.once(eventName, listener);
|
|
69
|
+
// Handle AbortController cleanup
|
|
70
|
+
if (options?.signal) {
|
|
71
|
+
this.setupAbortCleanup(eventName, listener, options.signal);
|
|
72
|
+
}
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Setup automatic cleanup when AbortSignal fires.
|
|
77
|
+
*
|
|
78
|
+
* @param eventName - Event name
|
|
79
|
+
* @param listener - Listener function to remove
|
|
80
|
+
* @param signal - AbortSignal to watch
|
|
81
|
+
*/
|
|
82
|
+
setupAbortCleanup(eventName, listener, signal) {
|
|
83
|
+
// If already aborted, remove listener immediately
|
|
84
|
+
if (signal.aborted) {
|
|
85
|
+
super.off(eventName, listener);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// Track this listener for this signal
|
|
89
|
+
let listeners = this.signalListeners.get(signal);
|
|
90
|
+
if (!listeners) {
|
|
91
|
+
listeners = new Set();
|
|
92
|
+
this.signalListeners.set(signal, listeners);
|
|
93
|
+
}
|
|
94
|
+
listeners.add(listener);
|
|
95
|
+
// Setup abort handler
|
|
96
|
+
const abortHandler = () => {
|
|
97
|
+
super.off(eventName, listener);
|
|
98
|
+
// Cleanup tracking
|
|
99
|
+
const trackedListeners = this.signalListeners.get(signal);
|
|
100
|
+
if (trackedListeners) {
|
|
101
|
+
trackedListeners.delete(listener);
|
|
102
|
+
if (trackedListeners.size === 0) {
|
|
103
|
+
// No more listeners for this signal
|
|
104
|
+
signal.removeEventListener('abort', abortHandler);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Event bus for agent-level events.
|
|
113
|
+
*
|
|
114
|
+
* Handles global agent events like state changes, conversation resets, etc.
|
|
115
|
+
* All events include sessionId to track which session triggered the event.
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* const agentBus = new AgentEventBus();
|
|
120
|
+
*
|
|
121
|
+
* agentBus.on('cipher:stateChanged', (payload) => {
|
|
122
|
+
* console.log(`State changed: ${payload.field} in session ${payload.sessionId}`);
|
|
123
|
+
* });
|
|
124
|
+
*
|
|
125
|
+
* agentBus.emit('cipher:stateChanged', {
|
|
126
|
+
* field: 'model',
|
|
127
|
+
* newValue: 'gemini-2.5-flash',
|
|
128
|
+
* sessionId: 'session-123'
|
|
129
|
+
* });
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export class AgentEventBus extends BaseTypedEventEmitter {
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Event bus for session-level events.
|
|
136
|
+
*
|
|
137
|
+
* Handles session-scoped events like LLM thinking, tool calls, responses, etc.
|
|
138
|
+
* Events do not include sessionId as they are already scoped to a specific session.
|
|
139
|
+
*
|
|
140
|
+
* Typically, these events are forwarded to the AgentEventBus with sessionId added.
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```typescript
|
|
144
|
+
* const sessionBus = new SessionEventBus();
|
|
145
|
+
*
|
|
146
|
+
* sessionBus.on('llmservice:toolCall', (payload) => {
|
|
147
|
+
* console.log(`Tool call: ${payload.toolName}`);
|
|
148
|
+
* });
|
|
149
|
+
*
|
|
150
|
+
* sessionBus.emit('llmservice:toolCall', {
|
|
151
|
+
* toolName: 'read_file',
|
|
152
|
+
* args: { filePath: '/path/to/file' },
|
|
153
|
+
* callId: 'call-456'
|
|
154
|
+
* });
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
export class SessionEventBus extends BaseTypedEventEmitter {
|
|
158
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exit codes for cipher-agent command
|
|
3
|
+
*
|
|
4
|
+
* These codes follow Unix conventions and provide clear signals
|
|
5
|
+
* for scripting and automation scenarios.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ExitCode: {
|
|
8
|
+
/**
|
|
9
|
+
* Configuration error - Invalid API key, missing model config, invalid settings
|
|
10
|
+
*/
|
|
11
|
+
readonly CONFIG_ERROR: 3;
|
|
12
|
+
/**
|
|
13
|
+
* Runtime error - LLM execution failure, network issues, unexpected errors
|
|
14
|
+
*/
|
|
15
|
+
readonly RUNTIME_ERROR: 1;
|
|
16
|
+
/**
|
|
17
|
+
* Success - AI response generated successfully
|
|
18
|
+
*/
|
|
19
|
+
readonly SUCCESS: 0;
|
|
20
|
+
/**
|
|
21
|
+
* Validation error - Invalid input, workspace not initialized, file not found
|
|
22
|
+
*/
|
|
23
|
+
readonly VALIDATION_ERROR: 2;
|
|
24
|
+
};
|
|
25
|
+
export type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];
|
|
26
|
+
/**
|
|
27
|
+
* Custom error class for exit codes with oclif integration.
|
|
28
|
+
* Extends Error to add code and oclif properties without type assertions.
|
|
29
|
+
*/
|
|
30
|
+
export declare class ExitError extends Error {
|
|
31
|
+
readonly code: number;
|
|
32
|
+
readonly oclif: {
|
|
33
|
+
exit: number;
|
|
34
|
+
};
|
|
35
|
+
constructor(code: ExitCode, message?: string);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Exit the process with the given code and optional error message
|
|
39
|
+
*
|
|
40
|
+
* @param code - Exit code to use
|
|
41
|
+
* @param message - Optional error message to write to stderr
|
|
42
|
+
* @throws {ExitError} Throws ExitError for oclif to handle (except for silent success exits)
|
|
43
|
+
*/
|
|
44
|
+
export declare function exitWithCode(code: ExitCode, message?: string): never;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exit codes for cipher-agent command
|
|
3
|
+
*
|
|
4
|
+
* These codes follow Unix conventions and provide clear signals
|
|
5
|
+
* for scripting and automation scenarios.
|
|
6
|
+
*/
|
|
7
|
+
export const ExitCode = {
|
|
8
|
+
/**
|
|
9
|
+
* Configuration error - Invalid API key, missing model config, invalid settings
|
|
10
|
+
*/
|
|
11
|
+
CONFIG_ERROR: 3,
|
|
12
|
+
/**
|
|
13
|
+
* Runtime error - LLM execution failure, network issues, unexpected errors
|
|
14
|
+
*/
|
|
15
|
+
RUNTIME_ERROR: 1,
|
|
16
|
+
/**
|
|
17
|
+
* Success - AI response generated successfully
|
|
18
|
+
*/
|
|
19
|
+
SUCCESS: 0,
|
|
20
|
+
/**
|
|
21
|
+
* Validation error - Invalid input, workspace not initialized, file not found
|
|
22
|
+
*/
|
|
23
|
+
VALIDATION_ERROR: 2,
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Custom error class for exit codes with oclif integration.
|
|
27
|
+
* Extends Error to add code and oclif properties without type assertions.
|
|
28
|
+
*/
|
|
29
|
+
export class ExitError extends Error {
|
|
30
|
+
code;
|
|
31
|
+
oclif;
|
|
32
|
+
constructor(code, message) {
|
|
33
|
+
super(message ?? 'Exit');
|
|
34
|
+
this.name = 'ExitError';
|
|
35
|
+
this.code = code;
|
|
36
|
+
this.oclif = { exit: code };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Exit the process with the given code and optional error message
|
|
41
|
+
*
|
|
42
|
+
* @param code - Exit code to use
|
|
43
|
+
* @param message - Optional error message to write to stderr
|
|
44
|
+
* @throws {ExitError} Throws ExitError for oclif to handle (except for silent success exits)
|
|
45
|
+
*/
|
|
46
|
+
export function exitWithCode(code, message) {
|
|
47
|
+
if (message) {
|
|
48
|
+
process.stderr.write(`${message}\n`);
|
|
49
|
+
}
|
|
50
|
+
// For successful exits without message, exit silently via process.exit
|
|
51
|
+
// This prevents oclif from showing "Error: Exit" or similar messages
|
|
52
|
+
if (code === ExitCode.SUCCESS && !message) {
|
|
53
|
+
// eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit
|
|
54
|
+
process.exit(code);
|
|
55
|
+
}
|
|
56
|
+
// Throw ExitError - no type assertions needed!
|
|
57
|
+
throw new ExitError(code, message);
|
|
58
|
+
}
|