byterover-cli 0.4.1 → 1.0.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 +1 -9
- package/dist/commands/curate.d.ts +1 -3
- package/dist/commands/curate.js +14 -51
- package/dist/commands/main.d.ts +8 -0
- package/dist/commands/main.js +29 -8
- package/dist/commands/query.d.ts +1 -3
- package/dist/commands/query.js +8 -35
- package/dist/config/context-tree-domains.d.ts +5 -0
- package/dist/config/context-tree-domains.js +6 -1
- package/dist/config/environment.js +9 -9
- package/dist/constants.d.ts +14 -0
- package/dist/constants.js +18 -0
- package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
- package/dist/core/domain/cipher/agent/agent-info.js +143 -0
- package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
- package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
- package/dist/core/domain/cipher/agent/index.d.ts +4 -1
- package/dist/core/domain/cipher/agent/index.js +7 -1
- package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
- package/dist/core/domain/cipher/agent-events/types.js +11 -0
- package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
- package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
- package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
- package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
- package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
- package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
- package/dist/core/domain/cipher/llm/error-codes.js +51 -0
- package/dist/core/domain/cipher/llm/index.d.ts +9 -0
- package/dist/core/domain/cipher/llm/index.js +13 -0
- package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
- package/dist/core/domain/cipher/llm/registry.js +244 -0
- package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
- package/dist/core/domain/cipher/llm/schemas.js +151 -0
- package/dist/core/domain/cipher/llm/types.d.ts +121 -0
- package/dist/core/domain/cipher/llm/types.js +60 -0
- package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
- package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
- package/dist/core/domain/cipher/streaming/types.js +16 -0
- package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
- package/dist/core/domain/cipher/todos/types.d.ts +34 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
- package/dist/core/domain/cipher/tools/constants.js +5 -2
- package/dist/core/domain/cipher/tools/types.d.ts +31 -0
- package/dist/core/domain/errors/connection-error.d.ts +33 -0
- package/dist/core/domain/errors/connection-error.js +54 -0
- package/dist/core/domain/errors/core-process-error.d.ts +27 -0
- package/dist/core/domain/errors/core-process-error.js +43 -0
- package/dist/core/domain/errors/task-error.d.ts +64 -0
- package/dist/core/domain/errors/task-error.js +116 -0
- package/dist/core/domain/errors/transport-error.d.ts +72 -0
- package/dist/core/domain/errors/transport-error.js +114 -0
- package/dist/core/domain/instance/index.d.ts +1 -0
- package/dist/core/domain/instance/index.js +1 -0
- package/dist/core/domain/instance/types.d.ts +57 -0
- package/dist/core/domain/instance/types.js +72 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
- package/dist/core/domain/knowledge/directory-manager.js +31 -0
- package/dist/core/domain/transport/index.d.ts +2 -0
- package/dist/core/domain/transport/index.js +2 -0
- package/dist/core/domain/transport/schemas.d.ts +1149 -0
- package/dist/core/domain/transport/schemas.js +554 -0
- package/dist/core/domain/transport/types.d.ts +67 -0
- package/dist/core/domain/transport/types.js +7 -0
- package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
- package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
- package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
- package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
- package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
- package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
- package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
- package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
- package/dist/core/interfaces/cipher/index.d.ts +35 -0
- package/dist/core/interfaces/cipher/index.js +11 -0
- package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
- package/dist/core/interfaces/cipher/message-factory.js +252 -0
- package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
- package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
- package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
- package/dist/core/interfaces/cipher/message-types.js +6 -0
- package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
- package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
- package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
- package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
- package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
- package/dist/core/interfaces/executor/i-query-executor.js +1 -0
- package/dist/core/interfaces/executor/index.d.ts +2 -0
- package/dist/core/interfaces/executor/index.js +2 -0
- package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
- package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
- package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
- package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
- package/dist/core/interfaces/instance/index.d.ts +2 -0
- package/dist/core/interfaces/instance/index.js +2 -0
- package/dist/core/interfaces/noop-implementations.d.ts +53 -0
- package/dist/core/interfaces/noop-implementations.js +62 -0
- package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
- package/dist/core/interfaces/transport/i-transport-client.js +1 -0
- package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
- package/dist/core/interfaces/transport/i-transport-server.js +1 -0
- package/dist/core/interfaces/transport/index.d.ts +2 -0
- package/dist/core/interfaces/transport/index.js +2 -0
- package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
- package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
- package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
- package/dist/infra/cipher/agent/agent-error.js +79 -0
- package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
- package/dist/infra/cipher/agent/agent-schemas.js +97 -0
- package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
- package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
- package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
- package/dist/infra/cipher/agent/base-agent.js +240 -0
- package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
- package/dist/infra/cipher/agent/cipher-agent.js +546 -0
- package/dist/infra/cipher/agent/index.d.ts +22 -0
- package/dist/infra/cipher/agent/index.js +24 -0
- package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
- package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
- package/dist/infra/cipher/agent/types.d.ts +35 -0
- package/dist/infra/cipher/agent/types.js +1 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
- package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
- package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
- package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
- package/dist/infra/cipher/consumer/consumer-service.js +1 -0
- package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
- package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
- package/dist/infra/cipher/consumer/index.d.ts +1 -1
- package/dist/infra/cipher/consumer/index.js +2 -1
- package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
- package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
- package/dist/infra/cipher/file-system/binary-utils.js +164 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
- package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
- package/dist/infra/cipher/file-system/file-system-service.js +327 -36
- package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
- package/dist/infra/cipher/file-system/path-validator.js +111 -6
- package/dist/infra/cipher/interactive-loop.js +41 -33
- package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
- package/dist/infra/cipher/llm/capability-cache.js +125 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
- package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
- package/dist/infra/cipher/llm/context/compression/index.js +6 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
- package/dist/infra/cipher/llm/context/context-manager.js +129 -0
- package/dist/infra/cipher/llm/context/utils.js +17 -4
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
- package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
- package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
- package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
- package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
- package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
- package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
- package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
- package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
- package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
- package/dist/infra/cipher/llm/sanitization/index.js +13 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
- package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
- package/dist/infra/cipher/llm/stream-processor.js +276 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
- package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
- package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
- package/dist/infra/cipher/process/command-validator.d.ts +23 -0
- package/dist/infra/cipher/process/command-validator.js +75 -0
- package/dist/infra/cipher/process/path-utils.d.ts +66 -0
- package/dist/infra/cipher/process/path-utils.js +94 -0
- package/dist/infra/cipher/process/process-service.d.ts +32 -0
- package/dist/infra/cipher/process/process-service.js +98 -17
- package/dist/infra/cipher/session/chat-session.d.ts +56 -7
- package/dist/infra/cipher/session/chat-session.js +163 -13
- package/dist/infra/cipher/session/index.d.ts +1 -0
- package/dist/infra/cipher/session/index.js +2 -0
- package/dist/infra/cipher/session/message-queue.d.ts +65 -0
- package/dist/infra/cipher/session/message-queue.js +90 -0
- package/dist/infra/cipher/session/session-manager.d.ts +106 -5
- package/dist/infra/cipher/session/session-manager.js +254 -7
- package/dist/infra/cipher/session/session-status.d.ts +137 -0
- package/dist/infra/cipher/session/session-status.js +184 -0
- package/dist/infra/cipher/session/title-generator.d.ts +8 -0
- package/dist/infra/cipher/session/title-generator.js +31 -0
- package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
- package/dist/infra/cipher/storage/message-storage-service.js +300 -54
- package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
- package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
- package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
- package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
- package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
- package/dist/infra/cipher/system-prompt/schemas.js +94 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
- package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
- package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
- package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
- package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
- package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
- package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
- package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
- package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
- package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
- package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
- package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
- package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
- package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
- package/dist/infra/cipher/tools/index.d.ts +1 -1
- package/dist/infra/cipher/tools/index.js +1 -1
- package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
- package/dist/infra/cipher/tools/plugins/index.js +2 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
- package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
- package/dist/infra/cipher/tools/streaming/index.js +1 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
- package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
- package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
- package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
- package/dist/infra/cipher/tools/tool-manager.js +107 -11
- package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
- package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
- package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
- package/dist/infra/cipher/tools/tool-provider.js +81 -25
- package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
- package/dist/infra/cipher/tools/tool-registry.js +58 -16
- package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
- package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
- package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
- package/dist/infra/context-tree/path-utils.d.ts +7 -0
- package/dist/infra/context-tree/path-utils.js +7 -0
- package/dist/infra/core/executors/curate-executor.d.ts +35 -0
- package/dist/infra/core/executors/curate-executor.js +123 -0
- package/dist/infra/core/executors/index.d.ts +2 -0
- package/dist/infra/core/executors/index.js +2 -0
- package/dist/infra/core/executors/query-executor.d.ts +23 -0
- package/dist/infra/core/executors/query-executor.js +51 -0
- package/dist/infra/core/task-processor.d.ts +81 -0
- package/dist/infra/core/task-processor.js +115 -0
- package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
- package/dist/infra/instance/file-instance-discovery.js +84 -0
- package/dist/infra/instance/file-instance-manager.d.ts +46 -0
- package/dist/infra/instance/file-instance-manager.js +123 -0
- package/dist/infra/instance/index.d.ts +3 -0
- package/dist/infra/instance/index.js +3 -0
- package/dist/infra/instance/process-utils.d.ts +14 -0
- package/dist/infra/instance/process-utils.js +39 -0
- package/dist/infra/process/agent-worker.d.ts +20 -0
- package/dist/infra/process/agent-worker.js +602 -0
- package/dist/infra/process/index.d.ts +12 -0
- package/dist/infra/process/index.js +11 -0
- package/dist/infra/process/ipc-types.d.ts +55 -0
- package/dist/infra/process/ipc-types.js +12 -0
- package/dist/infra/process/process-manager.d.ts +154 -0
- package/dist/infra/process/process-manager.js +471 -0
- package/dist/infra/process/task-queue-manager.d.ts +123 -0
- package/dist/infra/process/task-queue-manager.js +226 -0
- package/dist/infra/process/transport-handlers.d.ts +124 -0
- package/dist/infra/process/transport-handlers.js +348 -0
- package/dist/infra/process/transport-worker.d.ts +20 -0
- package/dist/infra/process/transport-worker.js +168 -0
- package/dist/infra/repl/commands/curate-command.js +0 -5
- package/dist/infra/repl/commands/query-command.js +0 -3
- package/dist/infra/repl/repl-startup.d.ts +4 -0
- package/dist/infra/repl/repl-startup.js +8 -1
- package/dist/infra/repl/transport-client-helper.d.ts +9 -0
- package/dist/infra/repl/transport-client-helper.js +96 -0
- package/dist/infra/transport/index.d.ts +4 -0
- package/dist/infra/transport/index.js +4 -0
- package/dist/infra/transport/port-utils.d.ts +42 -0
- package/dist/infra/transport/port-utils.js +84 -0
- package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
- package/dist/infra/transport/socket-io-transport-client.js +270 -0
- package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
- package/dist/infra/transport/socket-io-transport-server.js +207 -0
- package/dist/infra/transport/transport-client-factory.d.ts +76 -0
- package/dist/infra/transport/transport-client-factory.js +168 -0
- package/dist/infra/transport/transport-factory.d.ts +33 -0
- package/dist/infra/transport/transport-factory.js +59 -0
- package/dist/infra/usecase/curate-use-case.d.ts +8 -55
- package/dist/infra/usecase/curate-use-case.js +71 -262
- package/dist/infra/usecase/init-use-case.js +3 -2
- package/dist/infra/usecase/query-use-case.d.ts +18 -45
- package/dist/infra/usecase/query-use-case.js +250 -326
- package/dist/infra/usecase/status-use-case.js +1 -1
- package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
- package/dist/resources/prompts/explore.yml +78 -0
- package/dist/resources/prompts/plan.yml +114 -0
- package/dist/resources/prompts/reflection.yml +1 -1
- package/dist/resources/prompts/system-prompt.yml +15 -8
- package/dist/resources/prompts/tool-outputs.yml +0 -5
- package/dist/resources/tools/bash_exec.txt +98 -0
- package/dist/resources/tools/bash_output.txt +40 -0
- package/dist/resources/tools/batch.txt +28 -0
- package/dist/resources/tools/create_knowledge_topic.txt +23 -0
- package/dist/resources/tools/curate.txt +22 -0
- package/dist/resources/tools/delete_memory.txt +1 -0
- package/dist/resources/tools/detect_domains.txt +11 -0
- package/dist/resources/tools/edit_file.txt +1 -0
- package/dist/resources/tools/edit_memory.txt +1 -0
- package/dist/resources/tools/glob_files.txt +20 -0
- package/dist/resources/tools/grep_content.txt +18 -0
- package/dist/resources/tools/kill_process.txt +16 -0
- package/dist/resources/tools/list_directory.txt +16 -0
- package/dist/resources/tools/list_memories.txt +1 -0
- package/dist/resources/tools/read_file.txt +31 -0
- package/dist/resources/tools/read_memory.txt +1 -0
- package/dist/resources/tools/read_todos.txt +17 -0
- package/dist/resources/tools/search_history.txt +1 -0
- package/dist/resources/tools/task.txt +23 -0
- package/dist/resources/tools/write_file.txt +1 -0
- package/dist/resources/tools/write_memory.txt +1 -0
- package/dist/resources/tools/write_todos.txt +29 -0
- package/dist/tui/app.js +9 -13
- package/dist/tui/components/command-details.d.ts +14 -0
- package/dist/tui/components/command-details.js +35 -0
- package/dist/tui/components/execution/execution-changes.d.ts +5 -0
- package/dist/tui/components/execution/execution-changes.js +19 -4
- package/dist/tui/components/execution/execution-content.d.ts +4 -2
- package/dist/tui/components/execution/execution-content.js +26 -13
- package/dist/tui/components/execution/execution-input.js +3 -3
- package/dist/tui/components/execution/execution-progress.d.ts +2 -2
- package/dist/tui/components/execution/execution-progress.js +8 -6
- package/dist/tui/components/execution/log-item.d.ts +3 -4
- package/dist/tui/components/execution/log-item.js +2 -5
- package/dist/tui/components/footer.js +9 -4
- package/dist/tui/components/header.d.ts +3 -3
- package/dist/tui/components/header.js +5 -3
- package/dist/tui/components/index.d.ts +1 -0
- package/dist/tui/components/index.js +1 -0
- package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
- package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
- package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
- package/dist/tui/components/scrollable-list.js +12 -10
- package/dist/tui/components/suggestions.js +39 -41
- package/dist/tui/components/tab-bar.d.ts +2 -1
- package/dist/tui/components/tab-bar.js +3 -4
- package/dist/tui/constants.d.ts +0 -5
- package/dist/tui/constants.js +0 -5
- package/dist/tui/contexts/auth-context.js +9 -2
- package/dist/tui/contexts/{use-commands.js → commands-context.js} +3 -3
- package/dist/tui/contexts/index.d.ts +6 -1
- package/dist/tui/contexts/index.js +6 -1
- package/dist/tui/contexts/onboarding-context.d.ts +1 -1
- package/dist/tui/contexts/onboarding-context.js +9 -9
- package/dist/tui/contexts/tasks-context.d.ts +84 -0
- package/dist/tui/contexts/tasks-context.js +218 -0
- package/dist/tui/contexts/transport-context.d.ts +29 -0
- package/dist/tui/contexts/transport-context.js +82 -0
- package/dist/tui/hooks/index.d.ts +10 -6
- package/dist/tui/hooks/index.js +7 -6
- package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
- package/dist/tui/hooks/use-activity-logs.js +87 -34
- package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
- package/dist/tui/hooks/use-auth-polling.js +104 -0
- package/dist/tui/hooks/use-slash-command-processor.js +0 -1
- package/dist/tui/hooks/use-slash-completion.js +1 -1
- package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
- package/dist/tui/hooks/use-tab-navigation.js +16 -7
- package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
- package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
- package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
- package/dist/tui/hooks/use-ui-heights.js +88 -0
- package/dist/tui/providers/app-providers.js +2 -6
- package/dist/tui/types/commands.d.ts +0 -26
- package/dist/tui/types/index.d.ts +1 -1
- package/dist/tui/types/ui.d.ts +9 -4
- package/dist/tui/utils/line.d.ts +11 -0
- package/dist/tui/utils/line.js +16 -0
- package/dist/tui/utils/log.d.ts +27 -0
- package/dist/tui/utils/log.js +114 -0
- package/dist/tui/views/command-view.d.ts +7 -0
- package/dist/tui/views/command-view.js +103 -80
- package/dist/tui/views/login-view.js +7 -4
- package/dist/tui/views/logs-view.d.ts +13 -0
- package/dist/tui/views/logs-view.js +27 -52
- package/dist/utils/connection-error-handler.d.ts +16 -0
- package/dist/utils/connection-error-handler.js +49 -0
- package/dist/utils/crash-log.d.ts +14 -0
- package/dist/utils/crash-log.js +19 -0
- package/dist/utils/file-helpers.d.ts +14 -0
- package/dist/utils/file-helpers.js +21 -0
- package/dist/utils/global-logs-path.d.ts +11 -0
- package/dist/utils/global-logs-path.js +37 -0
- package/dist/utils/process-logger.d.ts +53 -0
- package/dist/utils/process-logger.js +253 -0
- package/dist/utils/sandbox-detector.d.ts +31 -0
- package/dist/utils/sandbox-detector.js +122 -0
- package/oclif.manifest.json +10 -198
- package/package.json +5 -1
- package/dist/commands/cipher-agent/run.d.ts +0 -142
- package/dist/commands/cipher-agent/run.js +0 -555
- package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
- package/dist/commands/cipher-agent/set-prompt.js +0 -58
- package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
- package/dist/commands/cipher-agent/show-prompt.js +0 -53
- package/dist/commands/foo.d.ts +0 -14
- package/dist/commands/foo.js +0 -66
- package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
- package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
- package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
- package/dist/infra/cipher/cipher-agent.d.ts +0 -182
- package/dist/infra/cipher/cipher-agent.js +0 -317
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
- package/dist/resources/prompts/modes/autonomous.yml +0 -9
- package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
- package/dist/tui/contexts/consumer.d.ts +0 -31
- package/dist/tui/contexts/consumer.js +0 -56
- package/dist/tui/hooks/use-consumer.d.ts +0 -12
- package/dist/tui/hooks/use-consumer.js +0 -50
- package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
- package/dist/tui/hooks/use-queue-polling.js +0 -90
- /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
- /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Base schema for all contributor configurations.
|
|
4
|
+
*/
|
|
5
|
+
const BaseContributorSchema = z.object({
|
|
6
|
+
enabled: z.boolean().optional().default(true).describe('Whether this contributor is enabled'),
|
|
7
|
+
id: z.string().min(1).describe('Unique identifier for this contributor'),
|
|
8
|
+
priority: z.number().int().nonnegative().describe('Execution priority (lower = first)'),
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* Schema for static contributors.
|
|
12
|
+
* Returns inline content directly.
|
|
13
|
+
*/
|
|
14
|
+
export const StaticContributorConfigSchema = BaseContributorSchema.extend({
|
|
15
|
+
content: z.string().min(1).describe('Static content to include in the prompt'),
|
|
16
|
+
type: z.literal('static'),
|
|
17
|
+
}).strict();
|
|
18
|
+
/**
|
|
19
|
+
* Schema for file contributors.
|
|
20
|
+
* Loads content from YAML files.
|
|
21
|
+
*/
|
|
22
|
+
export const FileContributorConfigSchema = BaseContributorSchema.extend({
|
|
23
|
+
filepath: z.string().min(1).describe('Path to YAML prompt file'),
|
|
24
|
+
options: z
|
|
25
|
+
.object({
|
|
26
|
+
cache: z.boolean().optional().default(true).describe('Whether to cache file contents'),
|
|
27
|
+
validateMtime: z.boolean().optional().default(true).describe('Whether to validate file modification time'),
|
|
28
|
+
})
|
|
29
|
+
.strict()
|
|
30
|
+
.optional(),
|
|
31
|
+
type: z.literal('file'),
|
|
32
|
+
}).strict();
|
|
33
|
+
/**
|
|
34
|
+
* Schema for memory contributor options.
|
|
35
|
+
*/
|
|
36
|
+
export const MemoryContributorOptionsSchema = z
|
|
37
|
+
.object({
|
|
38
|
+
includeTags: z.boolean().optional().default(true).describe('Whether to include tags in memory display'),
|
|
39
|
+
limit: z.number().int().positive().optional().default(20).describe('Maximum number of memories to include'),
|
|
40
|
+
pinnedOnly: z.boolean().optional().default(false).describe('Only include pinned memories'),
|
|
41
|
+
})
|
|
42
|
+
.strict();
|
|
43
|
+
/**
|
|
44
|
+
* Schema for memory contributors.
|
|
45
|
+
* Loads memories from the memory manager.
|
|
46
|
+
*/
|
|
47
|
+
export const MemoryContributorConfigSchema = BaseContributorSchema.extend({
|
|
48
|
+
options: MemoryContributorOptionsSchema.optional(),
|
|
49
|
+
type: z.literal('memory'),
|
|
50
|
+
}).strict();
|
|
51
|
+
/**
|
|
52
|
+
* Schema for environment contributors.
|
|
53
|
+
* Provides environment context (working directory, git status, etc.).
|
|
54
|
+
*/
|
|
55
|
+
export const EnvironmentContributorConfigSchema = BaseContributorSchema.extend({
|
|
56
|
+
type: z.literal('environment'),
|
|
57
|
+
}).strict();
|
|
58
|
+
/**
|
|
59
|
+
* Schema for datetime contributors.
|
|
60
|
+
* Provides current date and time.
|
|
61
|
+
*/
|
|
62
|
+
export const DateTimeContributorConfigSchema = BaseContributorSchema.extend({
|
|
63
|
+
type: z.literal('dateTime'),
|
|
64
|
+
}).strict();
|
|
65
|
+
/**
|
|
66
|
+
* Discriminated union schema for all contributor configurations.
|
|
67
|
+
*/
|
|
68
|
+
export const ContributorConfigSchema = z
|
|
69
|
+
.discriminatedUnion('type', [
|
|
70
|
+
StaticContributorConfigSchema,
|
|
71
|
+
FileContributorConfigSchema,
|
|
72
|
+
MemoryContributorConfigSchema,
|
|
73
|
+
EnvironmentContributorConfigSchema,
|
|
74
|
+
DateTimeContributorConfigSchema,
|
|
75
|
+
])
|
|
76
|
+
.describe('System prompt contributor configuration');
|
|
77
|
+
/**
|
|
78
|
+
* Schema for the system prompt manager configuration.
|
|
79
|
+
*/
|
|
80
|
+
export const SystemPromptManagerConfigSchema = z
|
|
81
|
+
.object({
|
|
82
|
+
contributors: z.array(ContributorConfigSchema).min(1).describe('Array of contributor configurations'),
|
|
83
|
+
})
|
|
84
|
+
.strict()
|
|
85
|
+
.describe('System prompt manager configuration');
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ContributorContext, SystemPromptContributor } from '../../../../core/domain/cipher/system-prompt/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Options for agent prompt contributor configuration.
|
|
4
|
+
*/
|
|
5
|
+
export interface AgentPromptContributorOptions {
|
|
6
|
+
/** Base path for resolving relative file paths */
|
|
7
|
+
basePath?: string;
|
|
8
|
+
/** Whether to cache file contents (default: true) */
|
|
9
|
+
cache?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Agent prompt contributor that loads agent-specific prompts from YAML files.
|
|
13
|
+
*
|
|
14
|
+
* This contributor reads the agent's prompt configuration from the agent registry
|
|
15
|
+
* and loads the corresponding YAML prompt file. It supports:
|
|
16
|
+
* - Loading prompts from the agent's `promptFile` configuration
|
|
17
|
+
* - Falling back to inline `prompt` if no promptFile is specified
|
|
18
|
+
* - Caching loaded prompts for performance
|
|
19
|
+
*
|
|
20
|
+
* The agent name is typically passed via the ContributorContext.
|
|
21
|
+
*/
|
|
22
|
+
export declare class AgentPromptContributor implements SystemPromptContributor {
|
|
23
|
+
readonly id: string;
|
|
24
|
+
readonly priority: number;
|
|
25
|
+
private readonly basePath;
|
|
26
|
+
private readonly cache;
|
|
27
|
+
private readonly useCache;
|
|
28
|
+
/**
|
|
29
|
+
* Creates a new agent prompt contributor.
|
|
30
|
+
*
|
|
31
|
+
* @param id - Unique identifier for this contributor
|
|
32
|
+
* @param priority - Execution priority (lower = first)
|
|
33
|
+
* @param options - Configuration options
|
|
34
|
+
*/
|
|
35
|
+
constructor(id: string, priority: number, options?: AgentPromptContributorOptions);
|
|
36
|
+
/**
|
|
37
|
+
* Loads and returns the agent-specific prompt content.
|
|
38
|
+
*
|
|
39
|
+
* The agent name should be provided in the context. If no agent name
|
|
40
|
+
* is specified, or the agent has no prompt configured, returns an empty string.
|
|
41
|
+
*
|
|
42
|
+
* @param context - Contributor context with agent name
|
|
43
|
+
* @returns Agent prompt content string
|
|
44
|
+
*/
|
|
45
|
+
getContent(context: ContributorContext): Promise<string>;
|
|
46
|
+
/**
|
|
47
|
+
* Invalidate the cache for a specific file.
|
|
48
|
+
*
|
|
49
|
+
* @param filepath - Path to the file to invalidate
|
|
50
|
+
*/
|
|
51
|
+
invalidateCache(filepath?: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Load prompt content from a YAML file.
|
|
54
|
+
*
|
|
55
|
+
* @param filepath - Path to the YAML prompt file
|
|
56
|
+
* @returns Prompt content string
|
|
57
|
+
*/
|
|
58
|
+
private loadPromptFile;
|
|
59
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { load as loadYaml } from 'js-yaml';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { getAgentRegistry } from '../../../../core/domain/cipher/agent/agent-registry.js';
|
|
5
|
+
import { SystemPromptError } from '../../../../core/domain/cipher/errors/system-prompt-error.js';
|
|
6
|
+
import { PromptCache } from '../prompt-cache.js';
|
|
7
|
+
import { PromptConfigSchema } from '../schemas.js';
|
|
8
|
+
/**
|
|
9
|
+
* Agent prompt contributor that loads agent-specific prompts from YAML files.
|
|
10
|
+
*
|
|
11
|
+
* This contributor reads the agent's prompt configuration from the agent registry
|
|
12
|
+
* and loads the corresponding YAML prompt file. It supports:
|
|
13
|
+
* - Loading prompts from the agent's `promptFile` configuration
|
|
14
|
+
* - Falling back to inline `prompt` if no promptFile is specified
|
|
15
|
+
* - Caching loaded prompts for performance
|
|
16
|
+
*
|
|
17
|
+
* The agent name is typically passed via the ContributorContext.
|
|
18
|
+
*/
|
|
19
|
+
export class AgentPromptContributor {
|
|
20
|
+
id;
|
|
21
|
+
priority;
|
|
22
|
+
basePath;
|
|
23
|
+
cache;
|
|
24
|
+
useCache;
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new agent prompt contributor.
|
|
27
|
+
*
|
|
28
|
+
* @param id - Unique identifier for this contributor
|
|
29
|
+
* @param priority - Execution priority (lower = first)
|
|
30
|
+
* @param options - Configuration options
|
|
31
|
+
*/
|
|
32
|
+
constructor(id, priority, options = {}) {
|
|
33
|
+
this.id = id;
|
|
34
|
+
this.priority = priority;
|
|
35
|
+
this.basePath = options.basePath ?? '';
|
|
36
|
+
this.useCache = options.cache ?? true;
|
|
37
|
+
this.cache = new PromptCache({
|
|
38
|
+
maxSize: 20,
|
|
39
|
+
validateMtime: true,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Loads and returns the agent-specific prompt content.
|
|
44
|
+
*
|
|
45
|
+
* The agent name should be provided in the context. If no agent name
|
|
46
|
+
* is specified, or the agent has no prompt configured, returns an empty string.
|
|
47
|
+
*
|
|
48
|
+
* @param context - Contributor context with agent name
|
|
49
|
+
* @returns Agent prompt content string
|
|
50
|
+
*/
|
|
51
|
+
async getContent(context) {
|
|
52
|
+
// Get agent name from context (extended property)
|
|
53
|
+
const { agentName } = context;
|
|
54
|
+
if (!agentName) {
|
|
55
|
+
// No agent specified, return empty
|
|
56
|
+
return '';
|
|
57
|
+
}
|
|
58
|
+
// Get agent from registry
|
|
59
|
+
const registry = getAgentRegistry();
|
|
60
|
+
const agent = registry.get(agentName);
|
|
61
|
+
if (!agent) {
|
|
62
|
+
// Unknown agent, return empty
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
// Check for inline prompt first (takes precedence if promptFile is not specified)
|
|
66
|
+
if (agent.prompt && !agent.promptFile) {
|
|
67
|
+
return agent.prompt;
|
|
68
|
+
}
|
|
69
|
+
// Load from promptFile if specified
|
|
70
|
+
if (agent.promptFile) {
|
|
71
|
+
return this.loadPromptFile(agent.promptFile);
|
|
72
|
+
}
|
|
73
|
+
// No prompt configured for this agent
|
|
74
|
+
return '';
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Invalidate the cache for a specific file.
|
|
78
|
+
*
|
|
79
|
+
* @param filepath - Path to the file to invalidate
|
|
80
|
+
*/
|
|
81
|
+
invalidateCache(filepath) {
|
|
82
|
+
if (filepath) {
|
|
83
|
+
const fullPath = this.basePath ? path.join(this.basePath, filepath) : filepath;
|
|
84
|
+
this.cache.invalidate(fullPath);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Load prompt content from a YAML file.
|
|
89
|
+
*
|
|
90
|
+
* @param filepath - Path to the YAML prompt file
|
|
91
|
+
* @returns Prompt content string
|
|
92
|
+
*/
|
|
93
|
+
loadPromptFile(filepath) {
|
|
94
|
+
const fullPath = this.basePath ? path.join(this.basePath, filepath) : filepath;
|
|
95
|
+
// Check cache first
|
|
96
|
+
if (this.useCache) {
|
|
97
|
+
const cached = this.cache.get(fullPath);
|
|
98
|
+
if (cached?.prompt) {
|
|
99
|
+
return cached.prompt;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Load from file
|
|
103
|
+
if (!fs.existsSync(fullPath)) {
|
|
104
|
+
throw SystemPromptError.fileNotFound(fullPath);
|
|
105
|
+
}
|
|
106
|
+
let yamlContent;
|
|
107
|
+
try {
|
|
108
|
+
yamlContent = fs.readFileSync(fullPath, 'utf8');
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
112
|
+
throw SystemPromptError.fileReadFailed(fullPath, reason);
|
|
113
|
+
}
|
|
114
|
+
const rawConfig = loadYaml(yamlContent);
|
|
115
|
+
// Validate with Zod schema
|
|
116
|
+
const parseResult = PromptConfigSchema.safeParse(rawConfig);
|
|
117
|
+
if (!parseResult.success) {
|
|
118
|
+
const errorMessages = parseResult.error.errors.map((err) => `${err.path.join('.')}: ${err.message}`).join('; ');
|
|
119
|
+
throw SystemPromptError.configInvalid(errorMessages, parseResult.error.errors);
|
|
120
|
+
}
|
|
121
|
+
const config = parseResult.data;
|
|
122
|
+
if (!config.prompt) {
|
|
123
|
+
throw SystemPromptError.configMissingField('prompt', fullPath);
|
|
124
|
+
}
|
|
125
|
+
// Cache the config
|
|
126
|
+
if (this.useCache) {
|
|
127
|
+
this.cache.set(fullPath, config);
|
|
128
|
+
}
|
|
129
|
+
return config.prompt;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ContributorContext, SystemPromptContributor } from '../../../../core/domain/cipher/system-prompt/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Options for companion contributor configuration.
|
|
4
|
+
*/
|
|
5
|
+
export interface CompanionContributorOptions {
|
|
6
|
+
/** Base path for resolving relative file paths */
|
|
7
|
+
basePath?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Companion contributor that discovers and loads companion prompts.
|
|
11
|
+
*
|
|
12
|
+
* Discovers files matching the pattern `{commandType}-*.yml` and
|
|
13
|
+
* loads their prompt content.
|
|
14
|
+
*
|
|
15
|
+
* Features:
|
|
16
|
+
* - Automatic discovery of companion prompts by commandType
|
|
17
|
+
* - Loads and concatenates multiple companion files
|
|
18
|
+
* - Graceful handling of missing files
|
|
19
|
+
*/
|
|
20
|
+
export declare class CompanionContributor implements SystemPromptContributor {
|
|
21
|
+
readonly id: string;
|
|
22
|
+
readonly priority: number;
|
|
23
|
+
private readonly basePath;
|
|
24
|
+
/**
|
|
25
|
+
* Creates a new companion contributor.
|
|
26
|
+
*
|
|
27
|
+
* @param id - Unique identifier for this contributor
|
|
28
|
+
* @param priority - Execution priority (lower = first)
|
|
29
|
+
* @param options - Configuration options
|
|
30
|
+
*/
|
|
31
|
+
constructor(id: string, priority: number, options?: CompanionContributorOptions);
|
|
32
|
+
/**
|
|
33
|
+
* Discovers and loads companion prompts based on commandType.
|
|
34
|
+
*
|
|
35
|
+
* @param context - Contributor context with commandType
|
|
36
|
+
* @returns Concatenated companion prompt content
|
|
37
|
+
*/
|
|
38
|
+
getContent(context: ContributorContext): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Discover companion prompt files for a given commandType.
|
|
41
|
+
* Looks for files matching the pattern: {commandType}-*.yml
|
|
42
|
+
*
|
|
43
|
+
* @param commandType - The command type (e.g., 'query', 'curate')
|
|
44
|
+
* @returns Array of filenames matching the pattern
|
|
45
|
+
*/
|
|
46
|
+
private discoverCompanionPrompts;
|
|
47
|
+
/**
|
|
48
|
+
* Load and parse a prompt YAML file.
|
|
49
|
+
*
|
|
50
|
+
* @param filename - Filename to load
|
|
51
|
+
* @returns Prompt content or null if not found
|
|
52
|
+
*/
|
|
53
|
+
private loadPromptFile;
|
|
54
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { load as loadYaml } from 'js-yaml';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { SystemPromptError } from '../../../../core/domain/cipher/errors/system-prompt-error.js';
|
|
6
|
+
/**
|
|
7
|
+
* Companion contributor that discovers and loads companion prompts.
|
|
8
|
+
*
|
|
9
|
+
* Discovers files matching the pattern `{commandType}-*.yml` and
|
|
10
|
+
* loads their prompt content.
|
|
11
|
+
*
|
|
12
|
+
* Features:
|
|
13
|
+
* - Automatic discovery of companion prompts by commandType
|
|
14
|
+
* - Loads and concatenates multiple companion files
|
|
15
|
+
* - Graceful handling of missing files
|
|
16
|
+
*/
|
|
17
|
+
export class CompanionContributor {
|
|
18
|
+
id;
|
|
19
|
+
priority;
|
|
20
|
+
basePath;
|
|
21
|
+
/**
|
|
22
|
+
* Creates a new companion contributor.
|
|
23
|
+
*
|
|
24
|
+
* @param id - Unique identifier for this contributor
|
|
25
|
+
* @param priority - Execution priority (lower = first)
|
|
26
|
+
* @param options - Configuration options
|
|
27
|
+
*/
|
|
28
|
+
constructor(id, priority, options = {}) {
|
|
29
|
+
this.id = id;
|
|
30
|
+
this.priority = priority;
|
|
31
|
+
// Default to resources/prompts directory
|
|
32
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
33
|
+
this.basePath = options.basePath ?? path.join(currentDir, '../../../../resources/prompts');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Discovers and loads companion prompts based on commandType.
|
|
37
|
+
*
|
|
38
|
+
* @param context - Contributor context with commandType
|
|
39
|
+
* @returns Concatenated companion prompt content
|
|
40
|
+
*/
|
|
41
|
+
async getContent(context) {
|
|
42
|
+
if (!context.commandType) {
|
|
43
|
+
return '';
|
|
44
|
+
}
|
|
45
|
+
const companionFiles = this.discoverCompanionPrompts(context.commandType);
|
|
46
|
+
if (companionFiles.length === 0) {
|
|
47
|
+
return '';
|
|
48
|
+
}
|
|
49
|
+
const contents = [];
|
|
50
|
+
for (const filename of companionFiles) {
|
|
51
|
+
try {
|
|
52
|
+
const content = this.loadPromptFile(filename);
|
|
53
|
+
if (content) {
|
|
54
|
+
contents.push(content);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Silently skip files that fail to load
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return contents.join('\n\n');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Discover companion prompt files for a given commandType.
|
|
65
|
+
* Looks for files matching the pattern: {commandType}-*.yml
|
|
66
|
+
*
|
|
67
|
+
* @param commandType - The command type (e.g., 'query', 'curate')
|
|
68
|
+
* @returns Array of filenames matching the pattern
|
|
69
|
+
*/
|
|
70
|
+
discoverCompanionPrompts(commandType) {
|
|
71
|
+
const companionPrompts = [];
|
|
72
|
+
try {
|
|
73
|
+
const files = fs.readdirSync(this.basePath);
|
|
74
|
+
const pattern = new RegExp(`^${commandType}-.*\\.yml$`);
|
|
75
|
+
const matchingFiles = files.filter((file) => pattern.test(file));
|
|
76
|
+
for (const file of matchingFiles) {
|
|
77
|
+
companionPrompts.push(file);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Return empty array if directory doesn't exist or can't be read
|
|
82
|
+
}
|
|
83
|
+
return companionPrompts.sort();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Load and parse a prompt YAML file.
|
|
87
|
+
*
|
|
88
|
+
* @param filename - Filename to load
|
|
89
|
+
* @returns Prompt content or null if not found
|
|
90
|
+
*/
|
|
91
|
+
loadPromptFile(filename) {
|
|
92
|
+
const fullPath = path.join(this.basePath, filename);
|
|
93
|
+
if (!fs.existsSync(fullPath)) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
let yamlContent;
|
|
97
|
+
try {
|
|
98
|
+
yamlContent = fs.readFileSync(fullPath, 'utf8');
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
102
|
+
throw SystemPromptError.fileReadFailed(fullPath, reason);
|
|
103
|
+
}
|
|
104
|
+
const config = loadYaml(yamlContent);
|
|
105
|
+
return config.prompt ?? null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { ContributorContext, SystemPromptContributor } from '../../../../core/domain/cipher/system-prompt/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Options for context tree structure contributor.
|
|
4
|
+
*/
|
|
5
|
+
export interface ContextTreeStructureContributorOptions {
|
|
6
|
+
/** Maximum depth for traversing the context tree (default: 5) */
|
|
7
|
+
maxDepth?: number;
|
|
8
|
+
/** Maximum number of entries to include (default: 200) */
|
|
9
|
+
maxEntries?: number;
|
|
10
|
+
/** Working directory path (default: process.cwd()) */
|
|
11
|
+
workingDirectory?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Context tree structure contributor that injects the .brv/context-tree structure
|
|
15
|
+
* into the system prompt for query and curate commands.
|
|
16
|
+
*
|
|
17
|
+
* This gives the plan agent and sub-agents immediate awareness of available
|
|
18
|
+
* context files before performing any search operations.
|
|
19
|
+
*
|
|
20
|
+
* Based on Anthropic's best practices for context engineering:
|
|
21
|
+
* - Pre-injecting structural context reduces search iterations
|
|
22
|
+
* - Agents can make better decisions about where to look
|
|
23
|
+
* - Reduces token waste from exploratory searches
|
|
24
|
+
*/
|
|
25
|
+
export declare class ContextTreeStructureContributor implements SystemPromptContributor {
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly priority: number;
|
|
28
|
+
private readonly maxDepth;
|
|
29
|
+
private readonly maxEntries;
|
|
30
|
+
private readonly workingDirectory;
|
|
31
|
+
/**
|
|
32
|
+
* Creates a new context tree structure contributor.
|
|
33
|
+
*
|
|
34
|
+
* @param id - Unique identifier for this contributor
|
|
35
|
+
* @param priority - Execution priority (lower = first)
|
|
36
|
+
* @param options - Configuration options
|
|
37
|
+
*/
|
|
38
|
+
constructor(id: string, priority: number, options?: ContextTreeStructureContributorOptions);
|
|
39
|
+
/**
|
|
40
|
+
* Generates the context tree structure content.
|
|
41
|
+
*
|
|
42
|
+
* Only generates content for query and curate commands where
|
|
43
|
+
* context tree awareness is important for the agent's operation.
|
|
44
|
+
*
|
|
45
|
+
* @param context - Contributor context with command type
|
|
46
|
+
* @returns Formatted context tree structure, or empty string if not applicable
|
|
47
|
+
*/
|
|
48
|
+
getContent(context: ContributorContext): Promise<string>;
|
|
49
|
+
/**
|
|
50
|
+
* Builds the context tree structure as a formatted string.
|
|
51
|
+
*
|
|
52
|
+
* @param contextTreePath - Path to the context tree directory
|
|
53
|
+
* @returns Formatted context tree structure
|
|
54
|
+
*/
|
|
55
|
+
private buildContextTreeStructure;
|
|
56
|
+
/**
|
|
57
|
+
* Builds a message when the context tree is empty.
|
|
58
|
+
*/
|
|
59
|
+
private buildEmptyContextTreeMessage;
|
|
60
|
+
/**
|
|
61
|
+
* Builds a message when no context tree exists.
|
|
62
|
+
*/
|
|
63
|
+
private buildNoContextTreeMessage;
|
|
64
|
+
/**
|
|
65
|
+
* Recursively traverses the context tree and builds the structure lines.
|
|
66
|
+
*/
|
|
67
|
+
private traverseContextTree;
|
|
68
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Context tree structure contributor that injects the .brv/context-tree structure
|
|
5
|
+
* into the system prompt for query and curate commands.
|
|
6
|
+
*
|
|
7
|
+
* This gives the plan agent and sub-agents immediate awareness of available
|
|
8
|
+
* context files before performing any search operations.
|
|
9
|
+
*
|
|
10
|
+
* Based on Anthropic's best practices for context engineering:
|
|
11
|
+
* - Pre-injecting structural context reduces search iterations
|
|
12
|
+
* - Agents can make better decisions about where to look
|
|
13
|
+
* - Reduces token waste from exploratory searches
|
|
14
|
+
*/
|
|
15
|
+
export class ContextTreeStructureContributor {
|
|
16
|
+
id;
|
|
17
|
+
priority;
|
|
18
|
+
maxDepth;
|
|
19
|
+
maxEntries;
|
|
20
|
+
workingDirectory;
|
|
21
|
+
/**
|
|
22
|
+
* Creates a new context tree structure contributor.
|
|
23
|
+
*
|
|
24
|
+
* @param id - Unique identifier for this contributor
|
|
25
|
+
* @param priority - Execution priority (lower = first)
|
|
26
|
+
* @param options - Configuration options
|
|
27
|
+
*/
|
|
28
|
+
constructor(id, priority, options = {}) {
|
|
29
|
+
this.id = id;
|
|
30
|
+
this.priority = priority;
|
|
31
|
+
this.maxDepth = options.maxDepth ?? 5;
|
|
32
|
+
this.maxEntries = options.maxEntries ?? 200;
|
|
33
|
+
this.workingDirectory = options.workingDirectory ?? process.cwd();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generates the context tree structure content.
|
|
37
|
+
*
|
|
38
|
+
* Only generates content for query and curate commands where
|
|
39
|
+
* context tree awareness is important for the agent's operation.
|
|
40
|
+
*
|
|
41
|
+
* @param context - Contributor context with command type
|
|
42
|
+
* @returns Formatted context tree structure, or empty string if not applicable
|
|
43
|
+
*/
|
|
44
|
+
async getContent(context) {
|
|
45
|
+
// Only inject for query and curate commands
|
|
46
|
+
if (context.commandType !== 'query' && context.commandType !== 'curate') {
|
|
47
|
+
return '';
|
|
48
|
+
}
|
|
49
|
+
const contextTreePath = path.join(this.workingDirectory, '.brv', 'context-tree');
|
|
50
|
+
// Check if context tree exists
|
|
51
|
+
if (!fs.existsSync(contextTreePath)) {
|
|
52
|
+
return this.buildNoContextTreeMessage();
|
|
53
|
+
}
|
|
54
|
+
return this.buildContextTreeStructure(contextTreePath);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Builds the context tree structure as a formatted string.
|
|
58
|
+
*
|
|
59
|
+
* @param contextTreePath - Path to the context tree directory
|
|
60
|
+
* @returns Formatted context tree structure
|
|
61
|
+
*/
|
|
62
|
+
buildContextTreeStructure(contextTreePath) {
|
|
63
|
+
const entriesCount = { value: 0 };
|
|
64
|
+
const truncatedCount = { value: 0 };
|
|
65
|
+
const lines = [];
|
|
66
|
+
// Build the tree
|
|
67
|
+
this.traverseContextTree({
|
|
68
|
+
currentDepth: 0,
|
|
69
|
+
dir: contextTreePath,
|
|
70
|
+
entriesCount,
|
|
71
|
+
lines,
|
|
72
|
+
maxDepth: this.maxDepth,
|
|
73
|
+
maxEntries: this.maxEntries,
|
|
74
|
+
relativePath: '',
|
|
75
|
+
truncatedCount,
|
|
76
|
+
});
|
|
77
|
+
if (lines.length === 0) {
|
|
78
|
+
return this.buildEmptyContextTreeMessage();
|
|
79
|
+
}
|
|
80
|
+
// Build the final output
|
|
81
|
+
const parts = [
|
|
82
|
+
'<context-tree-structure>',
|
|
83
|
+
'## Current Context Tree Structure',
|
|
84
|
+
'',
|
|
85
|
+
'The following is the current hierarchy of curated knowledge in `.brv/context-tree/`:',
|
|
86
|
+
'',
|
|
87
|
+
'```',
|
|
88
|
+
'.brv/context-tree/',
|
|
89
|
+
...lines,
|
|
90
|
+
'```',
|
|
91
|
+
];
|
|
92
|
+
if (truncatedCount.value > 0) {
|
|
93
|
+
parts.push('', `[${truncatedCount.value} additional entries not shown]`);
|
|
94
|
+
}
|
|
95
|
+
parts.push('', '## Structure Guide', '- Each top-level folder is a **domain** (e.g., `code_style/`, `design/`, `structure/`)', '- Inside domains are **topics** as `.md` files or subfolders with `context.md`', '- `context.md` files contain the curated knowledge content', '', '## Usage', '- **Query commands**: Search ONLY within this context tree structure', '- **Curate commands**: Check existing content here before creating new topics', '</context-tree-structure>');
|
|
96
|
+
return parts.join('\n');
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Builds a message when the context tree is empty.
|
|
100
|
+
*/
|
|
101
|
+
buildEmptyContextTreeMessage() {
|
|
102
|
+
return [
|
|
103
|
+
'<context-tree-structure>',
|
|
104
|
+
'## Context Tree Status: Empty',
|
|
105
|
+
'',
|
|
106
|
+
'The context tree at `.brv/context-tree/` exists but contains no curated content yet.',
|
|
107
|
+
'',
|
|
108
|
+
'**For curate commands**: You can create new knowledge topics in any domain.',
|
|
109
|
+
'**For query commands**: No context is available to search.',
|
|
110
|
+
'</context-tree-structure>',
|
|
111
|
+
].join('\n');
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Builds a message when no context tree exists.
|
|
115
|
+
*/
|
|
116
|
+
buildNoContextTreeMessage() {
|
|
117
|
+
return [
|
|
118
|
+
'<context-tree-structure>',
|
|
119
|
+
'## Context Tree Status: Not Initialized',
|
|
120
|
+
'',
|
|
121
|
+
'The `.brv/context-tree/` directory does not exist.',
|
|
122
|
+
'Run `/init` to initialize the ByteRover project and create the context tree.',
|
|
123
|
+
'</context-tree-structure>',
|
|
124
|
+
].join('\n');
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Recursively traverses the context tree and builds the structure lines.
|
|
128
|
+
*/
|
|
129
|
+
traverseContextTree(options) {
|
|
130
|
+
const { currentDepth, dir, entriesCount, lines, maxDepth, maxEntries, relativePath, truncatedCount } = options;
|
|
131
|
+
if (currentDepth >= maxDepth) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
let entries;
|
|
135
|
+
try {
|
|
136
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Filter and sort: directories first, then alphabetically
|
|
142
|
+
const filteredEntries = entries
|
|
143
|
+
.filter((entry) => !entry.name.startsWith('.'))
|
|
144
|
+
.sort((a, b) => {
|
|
145
|
+
if (a.isDirectory() && !b.isDirectory())
|
|
146
|
+
return -1;
|
|
147
|
+
if (!a.isDirectory() && b.isDirectory())
|
|
148
|
+
return 1;
|
|
149
|
+
return a.name.localeCompare(b.name);
|
|
150
|
+
});
|
|
151
|
+
const indent = ' '.repeat(currentDepth + 1);
|
|
152
|
+
for (const entry of filteredEntries) {
|
|
153
|
+
if (entriesCount.value >= maxEntries) {
|
|
154
|
+
truncatedCount.value += filteredEntries.length - filteredEntries.indexOf(entry);
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
entriesCount.value++;
|
|
158
|
+
const entryRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
159
|
+
if (entry.isDirectory()) {
|
|
160
|
+
lines.push(`${indent}${entry.name}/`);
|
|
161
|
+
this.traverseContextTree({
|
|
162
|
+
currentDepth: currentDepth + 1,
|
|
163
|
+
dir: path.join(dir, entry.name),
|
|
164
|
+
entriesCount,
|
|
165
|
+
lines,
|
|
166
|
+
maxDepth,
|
|
167
|
+
maxEntries,
|
|
168
|
+
relativePath: entryRelativePath,
|
|
169
|
+
truncatedCount,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// Add annotation for context.md files
|
|
174
|
+
const annotation = entry.name === 'context.md' ? ' (knowledge content)' : '';
|
|
175
|
+
lines.push(`${indent}${entry.name}${annotation}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|