byterover-cli 0.4.0 → 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/entities/event.d.ts +1 -1
- package/dist/core/domain/entities/event.js +3 -1
- 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/hooks/init/welcome.js +9 -24
- 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 +10 -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 +73 -259
- package/dist/infra/usecase/init-use-case.js +19 -8
- package/dist/infra/usecase/login-use-case.js +9 -3
- package/dist/infra/usecase/query-use-case.d.ts +18 -45
- package/dist/infra/usecase/query-use-case.js +251 -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} +6 -5
- 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,52 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ToolName } from '../../../../core/domain/cipher/tools/constants.js';
|
|
3
|
+
/**
|
|
4
|
+
* Input schema for list directory tool.
|
|
5
|
+
*/
|
|
6
|
+
const ListDirectoryInputSchema = z
|
|
7
|
+
.object({
|
|
8
|
+
ignore: z
|
|
9
|
+
.array(z.string())
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Additional glob patterns to ignore (e.g., ["*.log", "temp/"])'),
|
|
12
|
+
maxResults: z
|
|
13
|
+
.number()
|
|
14
|
+
.int()
|
|
15
|
+
.positive()
|
|
16
|
+
.optional()
|
|
17
|
+
.default(100)
|
|
18
|
+
.describe('Maximum number of files to return (default: 100)'),
|
|
19
|
+
path: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('The absolute path to the directory to list (defaults to working directory)'),
|
|
23
|
+
})
|
|
24
|
+
.strict();
|
|
25
|
+
/**
|
|
26
|
+
* Creates the list directory tool.
|
|
27
|
+
*
|
|
28
|
+
* Lists files and directories in a tree structure.
|
|
29
|
+
* Automatically ignores common build artifacts and caches.
|
|
30
|
+
*
|
|
31
|
+
* @param fileSystemService - File system service dependency
|
|
32
|
+
* @returns Configured list directory tool
|
|
33
|
+
*/
|
|
34
|
+
export function createListDirectoryTool(fileSystemService) {
|
|
35
|
+
return {
|
|
36
|
+
description: 'Lists files and directories in a tree structure. Automatically ignores common build artifacts (node_modules, dist, .git, etc.).',
|
|
37
|
+
async execute(input, _context) {
|
|
38
|
+
const { ignore, maxResults, path } = input;
|
|
39
|
+
const result = await fileSystemService.listDirectory(path ?? '.', {
|
|
40
|
+
ignore,
|
|
41
|
+
maxResults,
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
count: result.count,
|
|
45
|
+
tree: result.tree,
|
|
46
|
+
truncated: result.truncated,
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
id: ToolName.LIST_DIRECTORY,
|
|
50
|
+
inputSchema: ListDirectoryInputSchema,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -4,7 +4,14 @@ import type { IFileSystem } from '../../../../core/interfaces/cipher/i-file-syst
|
|
|
4
4
|
* Creates the read file tool.
|
|
5
5
|
*
|
|
6
6
|
* Reads the contents of a file with optional pagination support.
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Accepts both absolute and relative paths
|
|
10
|
+
* - Image/PDF files returned as base64 attachments for multimodal LLMs
|
|
11
|
+
* - Binary file detection with clear error messages
|
|
12
|
+
* - .env file blocking with whitelist for example files
|
|
13
|
+
* - XML-wrapped output for clearer LLM parsing
|
|
14
|
+
* - Preview metadata for UI display
|
|
8
15
|
*
|
|
9
16
|
* @param fileSystemService - File system service dependency
|
|
10
17
|
* @returns Configured read file tool
|
|
@@ -5,13 +5,13 @@ import { ToolName } from '../../../../core/domain/cipher/tools/constants.js';
|
|
|
5
5
|
*/
|
|
6
6
|
const ReadFileInputSchema = z
|
|
7
7
|
.object({
|
|
8
|
-
filePath: z.string().describe('
|
|
8
|
+
filePath: z.string().describe('Path to the file to read (absolute or relative to working directory)'),
|
|
9
9
|
limit: z
|
|
10
10
|
.number()
|
|
11
11
|
.int()
|
|
12
12
|
.positive()
|
|
13
13
|
.optional()
|
|
14
|
-
.describe('Maximum number of lines to read (optional)'),
|
|
14
|
+
.describe('Maximum number of lines to read (optional, default: 2000)'),
|
|
15
15
|
offset: z
|
|
16
16
|
.number()
|
|
17
17
|
.int()
|
|
@@ -24,14 +24,21 @@ const ReadFileInputSchema = z
|
|
|
24
24
|
* Creates the read file tool.
|
|
25
25
|
*
|
|
26
26
|
* Reads the contents of a file with optional pagination support.
|
|
27
|
-
*
|
|
27
|
+
*
|
|
28
|
+
* Features:
|
|
29
|
+
* - Accepts both absolute and relative paths
|
|
30
|
+
* - Image/PDF files returned as base64 attachments for multimodal LLMs
|
|
31
|
+
* - Binary file detection with clear error messages
|
|
32
|
+
* - .env file blocking with whitelist for example files
|
|
33
|
+
* - XML-wrapped output for clearer LLM parsing
|
|
34
|
+
* - Preview metadata for UI display
|
|
28
35
|
*
|
|
29
36
|
* @param fileSystemService - File system service dependency
|
|
30
37
|
* @returns Configured read file tool
|
|
31
38
|
*/
|
|
32
39
|
export function createReadFileTool(fileSystemService) {
|
|
33
40
|
return {
|
|
34
|
-
description: 'Read the contents of a file. Supports
|
|
41
|
+
description: 'Read the contents of a file. Supports relative/absolute paths, pagination, and returns images/PDFs as base64 attachments.',
|
|
35
42
|
async execute(input, _context) {
|
|
36
43
|
const { filePath, limit, offset } = input;
|
|
37
44
|
// Call file system service
|
|
@@ -39,12 +46,15 @@ export function createReadFileTool(fileSystemService) {
|
|
|
39
46
|
limit,
|
|
40
47
|
offset,
|
|
41
48
|
});
|
|
42
|
-
// Return formatted result
|
|
49
|
+
// Return formatted result with all metadata
|
|
43
50
|
return {
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
attachment: result.attachment,
|
|
52
|
+
content: result.formattedContent,
|
|
46
53
|
lines: result.lines,
|
|
54
|
+
message: result.message,
|
|
55
|
+
preview: result.preview,
|
|
47
56
|
size: result.size,
|
|
57
|
+
totalLines: result.totalLines,
|
|
48
58
|
truncated: result.truncated,
|
|
49
59
|
};
|
|
50
60
|
},
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Tool } from '../../../../core/domain/cipher/tools/types.js';
|
|
2
|
+
import type { ITodoStorage } from '../../../../core/interfaces/cipher/i-todo-storage.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates the read todos tool.
|
|
5
|
+
*
|
|
6
|
+
* Reads the current todo list from session storage.
|
|
7
|
+
*
|
|
8
|
+
* @param todoStorage - Storage service for retrieving todos
|
|
9
|
+
* @returns Configured read todos tool
|
|
10
|
+
*/
|
|
11
|
+
export declare function createReadTodosTool(todoStorage: ITodoStorage): Tool;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ToolName } from '../../../../core/domain/cipher/tools/constants.js';
|
|
3
|
+
/**
|
|
4
|
+
* Input schema for read todos tool.
|
|
5
|
+
* No parameters required - reads todos for current session.
|
|
6
|
+
*/
|
|
7
|
+
const ReadTodosInputSchema = z.object({}).strict();
|
|
8
|
+
/**
|
|
9
|
+
* Tool description for read todos.
|
|
10
|
+
*/
|
|
11
|
+
const TOOL_DESCRIPTION = `Read the current todo list for this session.
|
|
12
|
+
|
|
13
|
+
Use this tool to check the current state of your task list before making updates.
|
|
14
|
+
Returns all todo items with their id, content, activeForm, and status.`;
|
|
15
|
+
/**
|
|
16
|
+
* Creates the read todos tool.
|
|
17
|
+
*
|
|
18
|
+
* Reads the current todo list from session storage.
|
|
19
|
+
*
|
|
20
|
+
* @param todoStorage - Storage service for retrieving todos
|
|
21
|
+
* @returns Configured read todos tool
|
|
22
|
+
*/
|
|
23
|
+
export function createReadTodosTool(todoStorage) {
|
|
24
|
+
return {
|
|
25
|
+
description: TOOL_DESCRIPTION,
|
|
26
|
+
async execute(_input, context) {
|
|
27
|
+
const sessionId = context?.sessionId ?? 'default';
|
|
28
|
+
const todos = await todoStorage.get(sessionId);
|
|
29
|
+
const incompleteCount = todos.filter((t) => t.status !== 'completed').length;
|
|
30
|
+
return {
|
|
31
|
+
content: JSON.stringify(todos, null, 2),
|
|
32
|
+
metadata: { todos },
|
|
33
|
+
title: `${incompleteCount} todos`,
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
id: ToolName.READ_TODOS,
|
|
37
|
+
inputSchema: ReadTodosInputSchema,
|
|
38
|
+
};
|
|
39
|
+
}
|
package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js}
RENAMED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { DEFAULT_CONTEXT_TREE_DOMAINS } from '../../../../config/context-tree-domains.js';
|
|
3
3
|
import { ToolName } from '../../../../core/domain/cipher/tools/constants.js';
|
|
4
4
|
/**
|
|
5
5
|
* Predefined domain category names for validation reference
|
|
6
6
|
*/
|
|
7
|
-
const PREDEFINED_DOMAIN_NAMES =
|
|
7
|
+
const PREDEFINED_DOMAIN_NAMES = DEFAULT_CONTEXT_TREE_DOMAINS.map((domain) => domain.name);
|
|
8
8
|
/**
|
|
9
9
|
* Domain category for knowledge classification.
|
|
10
10
|
*/
|
|
11
11
|
const DomainCategory = z
|
|
12
12
|
.string()
|
|
13
13
|
.min(1)
|
|
14
|
-
.describe(`Domain category name.
|
|
14
|
+
.describe(`Domain category name. Prefer using predefined domains: ${PREDEFINED_DOMAIN_NAMES.join(', ')}. Custom domains are allowed but limited to 3 maximum.`);
|
|
15
15
|
/**
|
|
16
16
|
* Text segment schema - represents a portion of the input data related to a domain
|
|
17
17
|
*/
|
|
@@ -49,8 +49,8 @@ async function executeDetectDomains(input, _context) {
|
|
|
49
49
|
*
|
|
50
50
|
* @returns Configured detect domains tool
|
|
51
51
|
*/
|
|
52
|
-
export function
|
|
53
|
-
const domainDescriptions =
|
|
52
|
+
export function createSpecAnalyzeTool() {
|
|
53
|
+
const domainDescriptions = DEFAULT_CONTEXT_TREE_DOMAINS.map((domain) => ` - ${domain.name}: ${domain.description}`).join('\n');
|
|
54
54
|
return {
|
|
55
55
|
description: `Use this tool to analyze input data and detect which predefined knowledge domains are present. For each detected domain, you must also extract the specific text segments from the input data that relate to that domain.
|
|
56
56
|
|
|
@@ -60,14 +60,16 @@ Predefined domain categories:
|
|
|
60
60
|
${domainDescriptions}
|
|
61
61
|
|
|
62
62
|
For each domain you detect:
|
|
63
|
-
1. Identify the domain category
|
|
63
|
+
1. Identify the domain category from the predefined list above. Only create a custom domain if the content clearly does not fit any predefined domain (max 3 custom domains allowed)
|
|
64
64
|
2. Extract relevant text segments from the input data that demonstrate why this domain is relevant
|
|
65
65
|
3. Each text segment should be a meaningful excerpt (not just keywords) that shows the connection to the domain
|
|
66
66
|
4. Only include domains that are actually present in the data - do not include domains just because they exist in the predefined list
|
|
67
67
|
|
|
68
|
+
**Important:** Always prefer predefined domains over custom ones to maintain query quality and ease of maintenance.
|
|
69
|
+
|
|
68
70
|
The text segments will be used later to create organized knowledge topics, so they should be substantial enough to provide context.`,
|
|
69
71
|
execute: executeDetectDomains,
|
|
70
|
-
id: ToolName.
|
|
72
|
+
id: ToolName.SPEC_ANALYZE,
|
|
71
73
|
inputSchema: DetectDomainsInputSchema,
|
|
72
74
|
};
|
|
73
75
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Tool } from '../../../../core/domain/cipher/tools/types.js';
|
|
2
|
+
import type { SessionManager } from '../../session/session-manager.js';
|
|
3
|
+
/**
|
|
4
|
+
* Tool name constant for task tool.
|
|
5
|
+
*/
|
|
6
|
+
export declare const TASK_TOOL_NAME: "task";
|
|
7
|
+
/**
|
|
8
|
+
* Lazy getter for session manager (avoids circular dependency).
|
|
9
|
+
*/
|
|
10
|
+
export type SessionManagerGetter = () => SessionManager | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Dependencies for creating the task tool.
|
|
13
|
+
*/
|
|
14
|
+
export interface TaskToolDependencies {
|
|
15
|
+
/**
|
|
16
|
+
* Lazy getter for session manager.
|
|
17
|
+
* SessionManager is created after ToolProvider, so we need a getter.
|
|
18
|
+
*/
|
|
19
|
+
getSessionManager: SessionManagerGetter;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create task tool.
|
|
23
|
+
*
|
|
24
|
+
* Delegates work to specialized subagents for complex tasks.
|
|
25
|
+
* Each subagent runs in its own session with agent-specific prompts and tool restrictions.
|
|
26
|
+
*
|
|
27
|
+
* Available subagents:
|
|
28
|
+
* - query: Search and retrieve information from the context tree
|
|
29
|
+
* - curate: Create or update knowledge topics in the context tree
|
|
30
|
+
*
|
|
31
|
+
* @param dependencies - Session manager and system prompt manager
|
|
32
|
+
* @returns task tool instance
|
|
33
|
+
*/
|
|
34
|
+
export declare function createTaskTool(dependencies: TaskToolDependencies): Tool;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getAgentRegistry } from '../../../../core/domain/cipher/agent/agent-registry.js';
|
|
3
|
+
import { createContextTreeFileSystem } from '../../file-system/context-tree-file-system-factory.js';
|
|
4
|
+
/**
|
|
5
|
+
* Tool name constant for task tool.
|
|
6
|
+
*/
|
|
7
|
+
export const TASK_TOOL_NAME = 'task';
|
|
8
|
+
/**
|
|
9
|
+
* Input schema for task tool.
|
|
10
|
+
*/
|
|
11
|
+
const TaskInputSchema = z
|
|
12
|
+
.object({
|
|
13
|
+
/**
|
|
14
|
+
* If true, restricts file operations to .brv/context-tree/ only.
|
|
15
|
+
* Use this for query commands to search only curated knowledge.
|
|
16
|
+
*/
|
|
17
|
+
contextTreeOnly: z
|
|
18
|
+
.boolean()
|
|
19
|
+
.optional()
|
|
20
|
+
.default(false)
|
|
21
|
+
.describe('If true, restricts file operations to .brv/context-tree/ only'),
|
|
22
|
+
/**
|
|
23
|
+
* Short description of the task (3-5 words).
|
|
24
|
+
* Used for display and tracking purposes.
|
|
25
|
+
*/
|
|
26
|
+
description: z.string().min(1).max(100).describe('Short description of the task (3-5 words)'),
|
|
27
|
+
/**
|
|
28
|
+
* Detailed prompt/instructions for the subagent.
|
|
29
|
+
* Should include all context needed to complete the task.
|
|
30
|
+
*/
|
|
31
|
+
prompt: z.string().min(1).describe('Detailed instructions for the subagent'),
|
|
32
|
+
/**
|
|
33
|
+
* Optional session ID to continue an existing subagent session.
|
|
34
|
+
* If not provided, a new session will be created.
|
|
35
|
+
*/
|
|
36
|
+
sessionId: z.string().optional().describe('Optional: continue existing subagent session'),
|
|
37
|
+
/**
|
|
38
|
+
* The type of subagent to use.
|
|
39
|
+
* Must be a registered subagent name (e.g., "query", "curate").
|
|
40
|
+
*/
|
|
41
|
+
subagentType: z.string().min(1).describe('Which subagent to use (e.g., "explore", "curate")'),
|
|
42
|
+
})
|
|
43
|
+
.strict();
|
|
44
|
+
/**
|
|
45
|
+
* Create task tool.
|
|
46
|
+
*
|
|
47
|
+
* Delegates work to specialized subagents for complex tasks.
|
|
48
|
+
* Each subagent runs in its own session with agent-specific prompts and tool restrictions.
|
|
49
|
+
*
|
|
50
|
+
* Available subagents:
|
|
51
|
+
* - query: Search and retrieve information from the context tree
|
|
52
|
+
* - curate: Create or update knowledge topics in the context tree
|
|
53
|
+
*
|
|
54
|
+
* @param dependencies - Session manager and system prompt manager
|
|
55
|
+
* @returns task tool instance
|
|
56
|
+
*/
|
|
57
|
+
export function createTaskTool(dependencies) {
|
|
58
|
+
const { getSessionManager } = dependencies;
|
|
59
|
+
const registry = getAgentRegistry();
|
|
60
|
+
return {
|
|
61
|
+
description: buildTaskToolDescription(registry),
|
|
62
|
+
async execute(input, context) {
|
|
63
|
+
const params = input;
|
|
64
|
+
const { contextTreeOnly, description, prompt, sessionId, subagentType } = params;
|
|
65
|
+
// Get session manager (lazy loaded)
|
|
66
|
+
const sessionManager = getSessionManager();
|
|
67
|
+
if (!sessionManager) {
|
|
68
|
+
return {
|
|
69
|
+
agent: subagentType,
|
|
70
|
+
description,
|
|
71
|
+
error: 'SessionManager is not available. Task tool requires an active agent session.',
|
|
72
|
+
output: '',
|
|
73
|
+
sessionId: '',
|
|
74
|
+
success: false,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Validate subagent exists
|
|
78
|
+
const agent = registry.get(subagentType);
|
|
79
|
+
if (!agent) {
|
|
80
|
+
const availableAgents = registry
|
|
81
|
+
.listSubagents()
|
|
82
|
+
.map((a) => a.name)
|
|
83
|
+
.join(', ');
|
|
84
|
+
return {
|
|
85
|
+
agent: subagentType,
|
|
86
|
+
description,
|
|
87
|
+
error: `Unknown subagent type '${subagentType}'. Available subagents: ${availableAgents}`,
|
|
88
|
+
output: '',
|
|
89
|
+
sessionId: '',
|
|
90
|
+
success: false,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Validate agent can be used as subagent
|
|
94
|
+
if (agent.mode === 'primary') {
|
|
95
|
+
return {
|
|
96
|
+
agent: subagentType,
|
|
97
|
+
description,
|
|
98
|
+
error: `Agent '${subagentType}' is a primary agent and cannot be used as a subagent.`,
|
|
99
|
+
output: '',
|
|
100
|
+
sessionId: '',
|
|
101
|
+
success: false,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Generate session ID for the subagent
|
|
105
|
+
const subagentSessionId = sessionId ?? `${subagentType}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
106
|
+
try {
|
|
107
|
+
// Get or create session for the subagent
|
|
108
|
+
// If contextTreeOnly is true, create a session with restricted file system
|
|
109
|
+
let session;
|
|
110
|
+
if (contextTreeOnly) {
|
|
111
|
+
// Create a restricted FileSystemService for context-tree only access
|
|
112
|
+
const restrictedFs = createContextTreeFileSystem(process.cwd());
|
|
113
|
+
await restrictedFs.initialize();
|
|
114
|
+
// Create session with restricted file system
|
|
115
|
+
session = await sessionManager.createChildSessionWithOverrides(context?.sessionId ?? 'parent', agent.name, subagentSessionId, { fileSystemService: restrictedFs });
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
session = await sessionManager.createSession(subagentSessionId);
|
|
119
|
+
}
|
|
120
|
+
// Build the system prompt for the subagent
|
|
121
|
+
// The agent's promptFile will be used by the SystemPromptManager
|
|
122
|
+
const agentPromptSection = agent.promptFile
|
|
123
|
+
? `\n\n[Agent: ${agent.name}]\nUsing prompt from: ${agent.promptFile}`
|
|
124
|
+
: agent.prompt
|
|
125
|
+
? `\n\n[Agent: ${agent.name}]\n${agent.prompt}`
|
|
126
|
+
: '';
|
|
127
|
+
// Construct the full message for the subagent
|
|
128
|
+
const fullPrompt = `${agentPromptSection}\n\n## Task\n${prompt}`;
|
|
129
|
+
// Stream progress update
|
|
130
|
+
if (context?.metadata) {
|
|
131
|
+
context.metadata({
|
|
132
|
+
description: `Running ${agent.name} subagent`,
|
|
133
|
+
output: `Task: ${description}`,
|
|
134
|
+
progress: 10,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Execute the subagent session with parent's taskId for billing tracking
|
|
138
|
+
const response = await session.run(fullPrompt, { taskId: context?.taskId });
|
|
139
|
+
// Stream completion update
|
|
140
|
+
if (context?.metadata) {
|
|
141
|
+
context.metadata({
|
|
142
|
+
description: `${agent.name} subagent completed`,
|
|
143
|
+
output: response.slice(0, 200) + (response.length > 200 ? '...' : ''),
|
|
144
|
+
progress: 100,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
agent: agent.name,
|
|
149
|
+
description,
|
|
150
|
+
output: response,
|
|
151
|
+
sessionId: subagentSessionId,
|
|
152
|
+
success: true,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
157
|
+
// Stream error update
|
|
158
|
+
if (context?.metadata) {
|
|
159
|
+
context.metadata({
|
|
160
|
+
description: `${agent.name} subagent failed`,
|
|
161
|
+
output: errorMessage,
|
|
162
|
+
progress: 100,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
agent: agent.name,
|
|
167
|
+
description,
|
|
168
|
+
error: errorMessage,
|
|
169
|
+
output: '',
|
|
170
|
+
sessionId: subagentSessionId,
|
|
171
|
+
success: false,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
id: TASK_TOOL_NAME,
|
|
176
|
+
inputSchema: TaskInputSchema,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Build the task tool description dynamically based on available subagents.
|
|
181
|
+
*
|
|
182
|
+
* @param registry - Agent registry to get subagent descriptions
|
|
183
|
+
* @returns Tool description string
|
|
184
|
+
*/
|
|
185
|
+
function buildTaskToolDescription(registry) {
|
|
186
|
+
const subagents = registry.listSubagents();
|
|
187
|
+
const subagentList = subagents.map((agent) => `- ${agent.name}: ${agent.description || 'No description'}`).join('\n');
|
|
188
|
+
return `Delegate work to a specialized subagent for complex tasks.
|
|
189
|
+
|
|
190
|
+
Available subagents:
|
|
191
|
+
${subagentList}
|
|
192
|
+
|
|
193
|
+
Use this tool when you need to:
|
|
194
|
+
- Search the context tree for existing information (use 'explore' subagent with contextTreeOnly=true)
|
|
195
|
+
- Search the codebase for information (use 'explore' subagent without contextTreeOnly)
|
|
196
|
+
- Create or update knowledge topics (use 'curate' subagent)
|
|
197
|
+
|
|
198
|
+
Each subagent runs with its own specialized configuration and tool access.
|
|
199
|
+
The subagent will execute and return its results to you.
|
|
200
|
+
|
|
201
|
+
Parameters:
|
|
202
|
+
- subagent_type: Which subagent to use (e.g., "explore", "curate")
|
|
203
|
+
- description: Short description of the task (3-5 words)
|
|
204
|
+
- prompt: Detailed instructions for the subagent
|
|
205
|
+
- context_tree_only: (Optional) If true, restricts file operations to .brv/context-tree/ only. Use this for query commands.
|
|
206
|
+
- session_id: (Optional) Continue an existing subagent session`;
|
|
207
|
+
}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { Tool } from '../../../../core/domain/cipher/tools/types.js';
|
|
2
|
+
import type { ITodoStorage } from '../../../../core/interfaces/cipher/i-todo-storage.js';
|
|
2
3
|
/**
|
|
3
4
|
* Creates the write todos tool.
|
|
4
5
|
*
|
|
5
6
|
* Manages a structured task list for planning-based execution.
|
|
6
7
|
* Validates that only one task is in_progress at any time.
|
|
8
|
+
* Stores todos in session-based storage.
|
|
7
9
|
*
|
|
10
|
+
* @param todoStorage - Storage service for persisting todos
|
|
8
11
|
* @returns Configured write todos tool
|
|
9
12
|
*/
|
|
10
|
-
export declare function createWriteTodosTool(): Tool;
|
|
13
|
+
export declare function createWriteTodosTool(todoStorage: ITodoStorage): Tool;
|
|
@@ -10,6 +10,7 @@ const TodoSchema = z.object({
|
|
|
10
10
|
.min(1)
|
|
11
11
|
.describe('Present continuous form shown during execution (e.g., "Running tests")'),
|
|
12
12
|
content: z.string().min(1).describe('Imperative description of the task (e.g., "Run tests")'),
|
|
13
|
+
id: z.string().min(1).describe('Unique identifier for the todo item'),
|
|
13
14
|
status: z
|
|
14
15
|
.enum(TODO_STATUSES)
|
|
15
16
|
.describe('Task status: pending, in_progress (only ONE at a time), completed, or cancelled'),
|
|
@@ -26,38 +27,7 @@ const WriteTodosInputSchema = z
|
|
|
26
27
|
* Tool description with detailed usage guidance.
|
|
27
28
|
* This helps the LLM understand when to use the tool and how.
|
|
28
29
|
*/
|
|
29
|
-
const TOOL_DESCRIPTION = `Use this tool to create and manage a structured task list for the current session
|
|
30
|
-
|
|
31
|
-
## When to Use This Tool
|
|
32
|
-
Use this tool proactively in these scenarios:
|
|
33
|
-
|
|
34
|
-
1. **Complex multi-step tasks** - When a task requires 3 or more distinct steps
|
|
35
|
-
2. **Non-trivial and complex tasks** - Tasks that require careful planning or multiple operations
|
|
36
|
-
3. **User explicitly requests todo list** - When the user directly asks to use the todo list
|
|
37
|
-
4. **User provides multiple tasks** - When users provide a list of things to be done
|
|
38
|
-
5. **After receiving new instructions** - Immediately capture user requirements as todos
|
|
39
|
-
6. **When you start working on a task** - Mark it as in_progress BEFORE beginning work
|
|
40
|
-
7. **After completing a task** - Mark it as completed and add any follow-up tasks
|
|
41
|
-
|
|
42
|
-
## When NOT to Use This Tool
|
|
43
|
-
Skip using this tool when:
|
|
44
|
-
1. There is only a single, straightforward task
|
|
45
|
-
2. The task is trivial and tracking provides no organizational benefit
|
|
46
|
-
3. The task can be completed in less than 3 trivial steps
|
|
47
|
-
4. The task is purely conversational or informational
|
|
48
|
-
|
|
49
|
-
## Task States
|
|
50
|
-
- **pending**: Task not yet started
|
|
51
|
-
- **in_progress**: Currently working on (limit to ONE task at a time)
|
|
52
|
-
- **completed**: Task finished successfully
|
|
53
|
-
- **cancelled**: Task no longer needed
|
|
54
|
-
|
|
55
|
-
## Important Rules
|
|
56
|
-
- ONLY ONE task can be "in_progress" at any time
|
|
57
|
-
- Mark tasks complete IMMEDIATELY after finishing (don't batch completions)
|
|
58
|
-
- Task descriptions need both forms:
|
|
59
|
-
- content: Imperative form (e.g., "Run tests")
|
|
60
|
-
- activeForm: Present continuous form (e.g., "Running tests")`;
|
|
30
|
+
const TOOL_DESCRIPTION = `Use this tool to create and manage a structured task list for the current session.`;
|
|
61
31
|
/**
|
|
62
32
|
* Validates that only one todo is in_progress.
|
|
63
33
|
*
|
|
@@ -73,6 +43,7 @@ function validateSingleInProgress(todos) {
|
|
|
73
43
|
}
|
|
74
44
|
/**
|
|
75
45
|
* Formats the todo list for LLM response.
|
|
46
|
+
* Uses opencode-style status icons: [✓] for completed, [ ] for others.
|
|
76
47
|
*
|
|
77
48
|
* @param todos - Array of todos
|
|
78
49
|
* @returns Formatted string representation
|
|
@@ -80,14 +51,12 @@ function validateSingleInProgress(todos) {
|
|
|
80
51
|
function formatTodosForLLM(todos) {
|
|
81
52
|
const lines = ['Todo list updated:'];
|
|
82
53
|
for (const todo of todos) {
|
|
83
|
-
const
|
|
84
|
-
|
|
54
|
+
const checkbox = todo.status === 'completed' ? '[✓]' : '[ ]';
|
|
55
|
+
const statusLabel = todo.status === 'in_progress' ? ' (in_progress)' : '';
|
|
56
|
+
lines.push(`${checkbox} ${todo.content}${statusLabel}`);
|
|
85
57
|
}
|
|
86
58
|
const stats = getTodoStats(todos);
|
|
87
|
-
const progressLines = [
|
|
88
|
-
'',
|
|
89
|
-
`Progress: ${stats.completed}/${stats.total} completed`,
|
|
90
|
-
];
|
|
59
|
+
const progressLines = ['', `Progress: ${stats.completed}/${stats.total} completed`];
|
|
91
60
|
if (stats.inProgress > 0) {
|
|
92
61
|
const currentTask = todos.find((t) => t.status === 'in_progress');
|
|
93
62
|
if (currentTask) {
|
|
@@ -96,28 +65,6 @@ function formatTodosForLLM(todos) {
|
|
|
96
65
|
}
|
|
97
66
|
return [...lines, ...progressLines].join('\n');
|
|
98
67
|
}
|
|
99
|
-
/**
|
|
100
|
-
* Gets icon for todo status.
|
|
101
|
-
*
|
|
102
|
-
* @param status - Todo status
|
|
103
|
-
* @returns Status icon
|
|
104
|
-
*/
|
|
105
|
-
function getStatusIcon(status) {
|
|
106
|
-
switch (status) {
|
|
107
|
-
case 'cancelled': {
|
|
108
|
-
return '⊘';
|
|
109
|
-
}
|
|
110
|
-
case 'completed': {
|
|
111
|
-
return '✓';
|
|
112
|
-
}
|
|
113
|
-
case 'in_progress': {
|
|
114
|
-
return '→';
|
|
115
|
-
}
|
|
116
|
-
case 'pending': {
|
|
117
|
-
return '○';
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
68
|
/**
|
|
122
69
|
* Gets statistics about the todo list.
|
|
123
70
|
*
|
|
@@ -138,25 +85,34 @@ function getTodoStats(todos) {
|
|
|
138
85
|
*
|
|
139
86
|
* Manages a structured task list for planning-based execution.
|
|
140
87
|
* Validates that only one task is in_progress at any time.
|
|
88
|
+
* Stores todos in session-based storage.
|
|
141
89
|
*
|
|
90
|
+
* @param todoStorage - Storage service for persisting todos
|
|
142
91
|
* @returns Configured write todos tool
|
|
143
92
|
*/
|
|
144
|
-
export function createWriteTodosTool() {
|
|
93
|
+
export function createWriteTodosTool(todoStorage) {
|
|
145
94
|
return {
|
|
146
95
|
description: TOOL_DESCRIPTION,
|
|
147
|
-
async execute(input,
|
|
96
|
+
async execute(input, context) {
|
|
148
97
|
const { todos } = input;
|
|
149
98
|
// Validate only one in_progress
|
|
150
99
|
const validationError = validateSingleInProgress(todos);
|
|
151
100
|
if (validationError) {
|
|
152
101
|
return validationError;
|
|
153
102
|
}
|
|
103
|
+
// Store todos in session storage
|
|
104
|
+
const sessionId = context?.sessionId ?? 'default';
|
|
105
|
+
await todoStorage.update(sessionId, todos);
|
|
154
106
|
// Format response for LLM
|
|
155
107
|
const llmContent = formatTodosForLLM(todos);
|
|
156
|
-
//
|
|
108
|
+
// Calculate incomplete count for smart title
|
|
109
|
+
const incompleteCount = todos.filter((t) => t.status !== 'completed').length;
|
|
110
|
+
// Return both LLM content and display content with metadata
|
|
157
111
|
return {
|
|
158
112
|
llmContent,
|
|
113
|
+
metadata: { todos },
|
|
159
114
|
returnDisplay: { todos },
|
|
115
|
+
title: `${incompleteCount} todos`,
|
|
160
116
|
};
|
|
161
117
|
},
|
|
162
118
|
id: ToolName.WRITE_TODOS,
|
|
@@ -4,12 +4,12 @@ export type { KnownTool } from '../../../core/domain/cipher/tools/constants.js';
|
|
|
4
4
|
export type { JSONSchema7, Tool, ToolExecutionContext, ToolSet } from '../../../core/domain/cipher/tools/types.js';
|
|
5
5
|
export type { IToolProvider } from '../../../core/interfaces/cipher/i-tool-provider.js';
|
|
6
6
|
export { createCreateKnowledgeTopicTool } from './implementations/create-knowledge-topic-tool.js';
|
|
7
|
-
export { createDetectDomainsTool } from './implementations/detect-domains-tool.js';
|
|
8
7
|
export { createEditFileTool } from './implementations/edit-file-tool.js';
|
|
9
8
|
export { createGlobFilesTool } from './implementations/glob-files-tool.js';
|
|
10
9
|
export { createGrepContentTool } from './implementations/grep-content-tool.js';
|
|
11
10
|
export { createReadFileTool } from './implementations/read-file-tool.js';
|
|
12
11
|
export { createSearchHistoryTool } from './implementations/search-history-tool.js';
|
|
12
|
+
export { createSpecAnalyzeTool } from './implementations/spec-analyze-tool.js';
|
|
13
13
|
export { createWriteFileTool } from './implementations/write-file-tool.js';
|
|
14
14
|
export { ToolManager } from './tool-manager.js';
|
|
15
15
|
export { ToolProvider } from './tool-provider.js';
|
|
@@ -4,12 +4,12 @@ export { ToolError, ToolExecutionError, ToolNotFoundError, ToolProviderNotInitia
|
|
|
4
4
|
export { ToolName } from '../../../core/domain/cipher/tools/constants.js';
|
|
5
5
|
// Tool implementations (for direct access if needed)
|
|
6
6
|
export { createCreateKnowledgeTopicTool } from './implementations/create-knowledge-topic-tool.js';
|
|
7
|
-
export { createDetectDomainsTool } from './implementations/detect-domains-tool.js';
|
|
8
7
|
export { createEditFileTool } from './implementations/edit-file-tool.js';
|
|
9
8
|
export { createGlobFilesTool } from './implementations/glob-files-tool.js';
|
|
10
9
|
export { createGrepContentTool } from './implementations/grep-content-tool.js';
|
|
11
10
|
export { createReadFileTool } from './implementations/read-file-tool.js';
|
|
12
11
|
export { createSearchHistoryTool } from './implementations/search-history-tool.js';
|
|
12
|
+
export { createSpecAnalyzeTool } from './implementations/spec-analyze-tool.js';
|
|
13
13
|
export { createWriteFileTool } from './implementations/write-file-tool.js';
|
|
14
14
|
// Registry and provider
|
|
15
15
|
export { ToolManager } from './tool-manager.js';
|