byterover-cli 0.4.1 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
// TODO(v0.5.0): Remove this file. ExecutionConsumer is replaced by TaskProcessor.
|
|
1
2
|
import { randomUUID } from 'node:crypto';
|
|
2
3
|
import { getCurrentConfig } from '../../../config/environment.js';
|
|
3
4
|
import { PROJECT } from '../../../constants.js';
|
|
4
|
-
import { CipherAgent } from '../
|
|
5
|
+
import { CipherAgent } from '../agent/index.js';
|
|
5
6
|
import { closeAgentStorage, getAgentStorage, getAgentStorageSync } from '../storage/agent-storage.js';
|
|
6
7
|
// Heartbeat interval for consumer liveness detection (10 seconds)
|
|
7
8
|
const HEARTBEAT_INTERVAL_MS = 1000;
|
|
@@ -176,17 +177,23 @@ export class ExecutionConsumer {
|
|
|
176
177
|
// console.log(`[Consumer] Stopped (${this.consumerId.slice(0, 8)})`)
|
|
177
178
|
}
|
|
178
179
|
/**
|
|
179
|
-
* Execute a curate job
|
|
180
|
+
* Execute a curate job using the Plan Agent for orchestration.
|
|
181
|
+
*
|
|
182
|
+
* The Plan Agent orchestrates the curation workflow by:
|
|
183
|
+
* 1. Analyzing the user's request
|
|
184
|
+
* 2. Delegating to Query subagent to find existing context
|
|
185
|
+
* 3. Delegating to Curate subagent to create/update topics
|
|
180
186
|
*/
|
|
181
187
|
async executeCurate(execution) {
|
|
182
188
|
const storage = getAgentStorageSync();
|
|
183
|
-
// Parse input
|
|
189
|
+
// Parse input - support both JSON format (legacy/v2) and plain text
|
|
184
190
|
let input;
|
|
185
191
|
try {
|
|
186
192
|
input = JSON.parse(execution.input);
|
|
187
193
|
}
|
|
188
194
|
catch {
|
|
189
|
-
|
|
195
|
+
// Plain text format - wrap in CurateInput
|
|
196
|
+
input = { content: execution.input };
|
|
190
197
|
}
|
|
191
198
|
if (!input.content) {
|
|
192
199
|
throw new Error('Invalid curate input: missing content');
|
|
@@ -195,45 +202,76 @@ export class ExecutionConsumer {
|
|
|
195
202
|
if (!this.authToken) {
|
|
196
203
|
throw new Error('No auth token available. Consumer needs authentication.');
|
|
197
204
|
}
|
|
198
|
-
// Create LLM config
|
|
205
|
+
// Create LLM config with Plan Agent settings
|
|
206
|
+
// Plan Agent has read-only permissions and orchestrates via TaskTool
|
|
199
207
|
const model = input.flags?.model ?? (input.flags?.apiKey ? 'google/gemini-2.5-pro' : 'gemini-2.5-pro');
|
|
200
208
|
const envConfig = getCurrentConfig();
|
|
201
209
|
const llmConfig = {
|
|
202
210
|
accessToken: this.authToken.accessToken,
|
|
203
211
|
apiBaseUrl: envConfig.llmApiBaseUrl,
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
212
|
+
fileSystem: { workingDirectory: process.cwd() },
|
|
213
|
+
llm: {
|
|
214
|
+
// Plan Agent uses more iterations to coordinate subagents
|
|
215
|
+
maxIterations: 15,
|
|
216
|
+
maxTokens: 8192,
|
|
217
|
+
temperature: 0.7,
|
|
218
|
+
verbose: input.flags?.verbose ?? false,
|
|
219
|
+
},
|
|
207
220
|
model,
|
|
208
221
|
openRouterApiKey: input.flags?.apiKey,
|
|
209
222
|
projectId: PROJECT,
|
|
210
223
|
sessionKey: this.authToken.sessionKey,
|
|
211
224
|
teamId: this.brvConfig?.teamId ?? '',
|
|
212
|
-
temperature: 0.7,
|
|
213
|
-
verbose: input.flags?.verbose ?? false,
|
|
214
225
|
};
|
|
215
226
|
// Create and start CipherAgent
|
|
227
|
+
// Agent creates its default session during start() (Single-Session pattern)
|
|
228
|
+
// Create and start CipherAgent (will use Plan Agent's tools and prompt)
|
|
216
229
|
const agent = new CipherAgent(llmConfig, this.brvConfig);
|
|
217
230
|
await agent.start();
|
|
218
231
|
try {
|
|
219
|
-
const sessionId = randomUUID();
|
|
220
232
|
// Setup event listeners for tool call tracking
|
|
221
233
|
this.setupToolCallTracking(agent, execution.id);
|
|
222
|
-
//
|
|
223
|
-
|
|
224
|
-
const
|
|
234
|
+
// Build the prompt for the Plan Agent
|
|
235
|
+
// The Plan Agent will orchestrate Query and Curate subagents via TaskTool
|
|
236
|
+
const fileReferenceSection = input.fileReferenceInstructions ? `\n${input.fileReferenceInstructions}` : '';
|
|
237
|
+
const prompt = `You are the Plan Agent orchestrating a context curation workflow.
|
|
238
|
+
|
|
239
|
+
The user wants to add the following context to the context tree:
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
${input.content}
|
|
243
|
+
---
|
|
244
|
+
${fileReferenceSection}
|
|
245
|
+
|
|
246
|
+
## Your Workflow
|
|
247
|
+
|
|
248
|
+
1. **Query Phase**: Use the \`task\` tool with subagent_type="query" to search for existing related knowledge topics in the context tree. This helps avoid duplicates and understand the current context structure.
|
|
249
|
+
|
|
250
|
+
2. **Curate Phase**: Based on the query results, use the \`task\` tool with subagent_type="curate" to create or update knowledge topics with the user's context.
|
|
251
|
+
|
|
252
|
+
## Important Guidelines
|
|
253
|
+
|
|
254
|
+
- Always query first to understand existing context before curating
|
|
255
|
+
- Provide clear, detailed prompts when delegating to subagents
|
|
256
|
+
- Summarize the results of each phase before proceeding to the next
|
|
257
|
+
|
|
258
|
+
## Response Format
|
|
259
|
+
|
|
260
|
+
IMPORTANT: Your final response must be a brief summary (1-2 sentences) of what was done. Do NOT include any file paths, directory paths, or specific location details in your response. The system will automatically display the created/updated file paths separately.`;
|
|
261
|
+
const response = await agent.execute(prompt, {
|
|
225
262
|
executionContext: {
|
|
263
|
+
// Use 'plan' command type to get Plan Agent's tool set
|
|
226
264
|
commandType: 'curate',
|
|
227
265
|
fileReferenceInstructions: input.fileReferenceInstructions,
|
|
228
266
|
},
|
|
229
|
-
mode: 'autonomous',
|
|
230
267
|
});
|
|
231
268
|
// Mark completed
|
|
232
269
|
storage.updateExecutionStatus(execution.id, 'completed', response);
|
|
233
270
|
console.log(`[Consumer] Execution ${execution.id} completed`);
|
|
234
271
|
}
|
|
235
272
|
finally {
|
|
236
|
-
//
|
|
273
|
+
// Stop agent to cleanup resources
|
|
274
|
+
await agent.stop();
|
|
237
275
|
}
|
|
238
276
|
}
|
|
239
277
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Consumer Module - Public API for queue processing and UI monitoring
|
|
3
3
|
*
|
|
4
|
-
* Architecture:
|
|
4
|
+
* Architecture (legacy):
|
|
5
5
|
* - ConsumerService: Singleton background worker (start once in main)
|
|
6
6
|
* - QueuePollingService: UI subscribes here for real-time updates
|
|
7
7
|
* - Both communicate via AgentStorage (SQLite DB)
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
// TODO(v0.5.0): Remove this entire module. Replaced by CoreProcess + TaskProcessor + Transport events.
|
|
1
2
|
/**
|
|
2
3
|
* Consumer Module - Public API for queue processing and UI monitoring
|
|
3
4
|
*
|
|
4
|
-
* Architecture:
|
|
5
|
+
* Architecture (legacy):
|
|
5
6
|
* - ConsumerService: Singleton background worker (start once in main)
|
|
6
7
|
* - QueuePollingService: UI subscribes here for real-time updates
|
|
7
8
|
* - Both communicate via AgentStorage (SQLite DB)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// TODO(v0.5.0): Remove this file. QueuePollingService is replaced by Transport events.
|
|
1
2
|
import { EventEmitter } from 'node:events';
|
|
2
3
|
import { closeAgentStorage, getAgentStorage, getAgentStorageSync } from '../storage/agent-storage.js';
|
|
3
4
|
// ==================== SERVICE ====================
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks if a file is binary based on extension and content analysis.
|
|
3
|
+
*
|
|
4
|
+
* Detection strategy:
|
|
5
|
+
* 1. Fast path: Check against known binary extensions
|
|
6
|
+
* 2. Check for null bytes (definitive binary indicator)
|
|
7
|
+
* 3. Heuristic: If >30% non-printable characters, consider binary
|
|
8
|
+
*
|
|
9
|
+
* @param filePath - Path to the file (used for extension check)
|
|
10
|
+
* @param buffer - Buffer containing first N bytes of the file
|
|
11
|
+
* @returns true if the file is binary, false otherwise
|
|
12
|
+
*/
|
|
13
|
+
export declare function isBinaryFile(filePath: string, buffer: Buffer): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Checks if a file is an image based on its extension.
|
|
16
|
+
* SVG files are excluded as they are text-based.
|
|
17
|
+
*
|
|
18
|
+
* @param filePath - Path to the file
|
|
19
|
+
* @returns true if the file is an image (excluding SVG)
|
|
20
|
+
*/
|
|
21
|
+
export declare function isImageFile(filePath: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Checks if a file is a PDF based on its extension.
|
|
24
|
+
*
|
|
25
|
+
* @param filePath - Path to the file
|
|
26
|
+
* @returns true if the file is a PDF
|
|
27
|
+
*/
|
|
28
|
+
export declare function isPdfFile(filePath: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Gets the MIME type for an image or PDF file.
|
|
31
|
+
*
|
|
32
|
+
* @param filePath - Path to the file
|
|
33
|
+
* @returns MIME type string, or null if not a recognized image/PDF
|
|
34
|
+
*/
|
|
35
|
+
export declare function getMimeType(filePath: string): null | string;
|
|
36
|
+
/**
|
|
37
|
+
* Checks if a file is a media file (image or PDF) that should be
|
|
38
|
+
* returned as a base64 attachment instead of text content.
|
|
39
|
+
*
|
|
40
|
+
* @param filePath - Path to the file
|
|
41
|
+
* @returns true if the file should be returned as an attachment
|
|
42
|
+
*/
|
|
43
|
+
export declare function isMediaFile(filePath: string): boolean;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* Known binary file extensions for fast-path detection.
|
|
4
|
+
* These files are always treated as binary without content inspection.
|
|
5
|
+
* Sorted alphabetically as required by linter.
|
|
6
|
+
*/
|
|
7
|
+
const BINARY_EXTENSIONS = new Set([
|
|
8
|
+
'.7z',
|
|
9
|
+
'.a',
|
|
10
|
+
'.bin',
|
|
11
|
+
'.bz2',
|
|
12
|
+
'.class',
|
|
13
|
+
'.com',
|
|
14
|
+
'.dat',
|
|
15
|
+
'.db',
|
|
16
|
+
'.dll',
|
|
17
|
+
'.doc',
|
|
18
|
+
'.docx',
|
|
19
|
+
'.dylib',
|
|
20
|
+
'.exe',
|
|
21
|
+
'.gz',
|
|
22
|
+
'.jar',
|
|
23
|
+
'.lib',
|
|
24
|
+
'.o',
|
|
25
|
+
'.obj',
|
|
26
|
+
'.odp',
|
|
27
|
+
'.ods',
|
|
28
|
+
'.odt',
|
|
29
|
+
'.ppt',
|
|
30
|
+
'.pptx',
|
|
31
|
+
'.pyc',
|
|
32
|
+
'.pyo',
|
|
33
|
+
'.rar',
|
|
34
|
+
'.so',
|
|
35
|
+
'.sqlite',
|
|
36
|
+
'.sqlite3',
|
|
37
|
+
'.tar',
|
|
38
|
+
'.war',
|
|
39
|
+
'.wasm',
|
|
40
|
+
'.xls',
|
|
41
|
+
'.xlsx',
|
|
42
|
+
'.xz',
|
|
43
|
+
'.zip',
|
|
44
|
+
]);
|
|
45
|
+
/**
|
|
46
|
+
* Image file extensions that should be handled specially (base64 encoding).
|
|
47
|
+
* Sorted alphabetically as required by linter.
|
|
48
|
+
*/
|
|
49
|
+
const IMAGE_EXTENSIONS = new Set(['.bmp', '.gif', '.ico', '.jpeg', '.jpg', '.png', '.tif', '.tiff', '.webp']);
|
|
50
|
+
/**
|
|
51
|
+
* PDF extension for special handling.
|
|
52
|
+
*/
|
|
53
|
+
const PDF_EXTENSION = '.pdf';
|
|
54
|
+
/**
|
|
55
|
+
* SVG extension - treat as text, not image.
|
|
56
|
+
*/
|
|
57
|
+
const SVG_EXTENSION = '.svg';
|
|
58
|
+
/**
|
|
59
|
+
* MIME type mappings for image and PDF files.
|
|
60
|
+
*/
|
|
61
|
+
const MIME_TYPES = {
|
|
62
|
+
'.bmp': 'image/bmp',
|
|
63
|
+
'.gif': 'image/gif',
|
|
64
|
+
'.ico': 'image/x-icon',
|
|
65
|
+
'.jpeg': 'image/jpeg',
|
|
66
|
+
'.jpg': 'image/jpeg',
|
|
67
|
+
'.pdf': 'application/pdf',
|
|
68
|
+
'.png': 'image/png',
|
|
69
|
+
'.tif': 'image/tiff',
|
|
70
|
+
'.tiff': 'image/tiff',
|
|
71
|
+
'.webp': 'image/webp',
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Threshold for non-printable character ratio to consider a file binary.
|
|
75
|
+
* If more than 30% of sampled bytes are non-printable, the file is binary.
|
|
76
|
+
*/
|
|
77
|
+
const NON_PRINTABLE_THRESHOLD = 0.3;
|
|
78
|
+
/**
|
|
79
|
+
* Checks if a file is binary based on extension and content analysis.
|
|
80
|
+
*
|
|
81
|
+
* Detection strategy:
|
|
82
|
+
* 1. Fast path: Check against known binary extensions
|
|
83
|
+
* 2. Check for null bytes (definitive binary indicator)
|
|
84
|
+
* 3. Heuristic: If >30% non-printable characters, consider binary
|
|
85
|
+
*
|
|
86
|
+
* @param filePath - Path to the file (used for extension check)
|
|
87
|
+
* @param buffer - Buffer containing first N bytes of the file
|
|
88
|
+
* @returns true if the file is binary, false otherwise
|
|
89
|
+
*/
|
|
90
|
+
export function isBinaryFile(filePath, buffer) {
|
|
91
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
92
|
+
// Fast path: known binary extensions
|
|
93
|
+
if (BINARY_EXTENSIONS.has(ext)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
// Skip content check for known text-based formats
|
|
97
|
+
if (isImageFile(filePath) || isPdfFile(filePath)) {
|
|
98
|
+
// Images and PDFs are binary but handled specially
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
// Empty files are not binary
|
|
102
|
+
if (buffer.length === 0) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
// Content-based detection
|
|
106
|
+
let nonPrintableCount = 0;
|
|
107
|
+
for (const byte of buffer) {
|
|
108
|
+
// Null byte is a definitive binary indicator
|
|
109
|
+
if (byte === 0) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
// Count non-printable characters
|
|
113
|
+
// Printable range: tab (9), newline (10), carriage return (13), space (32) to tilde (126)
|
|
114
|
+
if (byte < 9 || (byte > 13 && byte < 32) || byte > 126) {
|
|
115
|
+
nonPrintableCount++;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// If more than 30% non-printable, consider binary
|
|
119
|
+
return nonPrintableCount / buffer.length > NON_PRINTABLE_THRESHOLD;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Checks if a file is an image based on its extension.
|
|
123
|
+
* SVG files are excluded as they are text-based.
|
|
124
|
+
*
|
|
125
|
+
* @param filePath - Path to the file
|
|
126
|
+
* @returns true if the file is an image (excluding SVG)
|
|
127
|
+
*/
|
|
128
|
+
export function isImageFile(filePath) {
|
|
129
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
130
|
+
// SVG is text-based, not a binary image
|
|
131
|
+
if (ext === SVG_EXTENSION) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
return IMAGE_EXTENSIONS.has(ext);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Checks if a file is a PDF based on its extension.
|
|
138
|
+
*
|
|
139
|
+
* @param filePath - Path to the file
|
|
140
|
+
* @returns true if the file is a PDF
|
|
141
|
+
*/
|
|
142
|
+
export function isPdfFile(filePath) {
|
|
143
|
+
return path.extname(filePath).toLowerCase() === PDF_EXTENSION;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Gets the MIME type for an image or PDF file.
|
|
147
|
+
*
|
|
148
|
+
* @param filePath - Path to the file
|
|
149
|
+
* @returns MIME type string, or null if not a recognized image/PDF
|
|
150
|
+
*/
|
|
151
|
+
export function getMimeType(filePath) {
|
|
152
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
153
|
+
return MIME_TYPES[ext] ?? null;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Checks if a file is a media file (image or PDF) that should be
|
|
157
|
+
* returned as a base64 attachment instead of text content.
|
|
158
|
+
*
|
|
159
|
+
* @param filePath - Path to the file
|
|
160
|
+
* @returns true if the file should be returned as an attachment
|
|
161
|
+
*/
|
|
162
|
+
export function isMediaFile(filePath) {
|
|
163
|
+
return isImageFile(filePath) || isPdfFile(filePath);
|
|
164
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FileSystemService } from './file-system-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a FileSystemService restricted to the context tree directory.
|
|
4
|
+
* All file operations will be confined to .brv/context-tree/.
|
|
5
|
+
*
|
|
6
|
+
* @param baseWorkingDirectory - The project root directory
|
|
7
|
+
* @returns FileSystemService instance restricted to context-tree
|
|
8
|
+
*/
|
|
9
|
+
export declare function createContextTreeFileSystem(baseWorkingDirectory: string): FileSystemService;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { FileSystemService } from './file-system-service.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a FileSystemService restricted to the context tree directory.
|
|
5
|
+
* All file operations will be confined to .brv/context-tree/.
|
|
6
|
+
*
|
|
7
|
+
* @param baseWorkingDirectory - The project root directory
|
|
8
|
+
* @returns FileSystemService instance restricted to context-tree
|
|
9
|
+
*/
|
|
10
|
+
export function createContextTreeFileSystem(baseWorkingDirectory) {
|
|
11
|
+
const contextTreePath = path.join(baseWorkingDirectory, '.brv', 'context-tree');
|
|
12
|
+
return new FileSystemService({
|
|
13
|
+
// Only allow paths within context tree (relative to working directory)
|
|
14
|
+
allowedPaths: ['.'],
|
|
15
|
+
// Use default blocked extensions
|
|
16
|
+
blockedExtensions: ['.exe', '.dll', '.so', '.dylib'],
|
|
17
|
+
// Block any attempt to escape via parent directory traversal
|
|
18
|
+
blockedPaths: ['..', '../'],
|
|
19
|
+
// Reasonable file size limit
|
|
20
|
+
maxFileSize: 10 * 1024 * 1024, // 10MB
|
|
21
|
+
// Restrict working directory to context tree
|
|
22
|
+
workingDirectory: contextTreePath,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EditFileOptions, EditOperation, EditResult, FileContent, FileSystemConfig, GlobOptions, GlobResult, ReadFileOptions, SearchOptions, SearchResult, WriteFileOptions, WriteResult } from '../../../core/domain/cipher/file-system/types.js';
|
|
1
|
+
import type { EditFileOptions, EditOperation, EditResult, FileContent, FileSystemConfig, GlobOptions, GlobResult, ListDirectoryOptions, ListDirectoryResult, ReadFileOptions, SearchOptions, SearchResult, WriteFileOptions, WriteResult } from '../../../core/domain/cipher/file-system/types.js';
|
|
2
2
|
import type { IFileSystem } from '../../../core/interfaces/cipher/i-file-system.js';
|
|
3
3
|
/**
|
|
4
4
|
* File system service implementation.
|
|
@@ -32,8 +32,20 @@ export declare class FileSystemService implements IFileSystem {
|
|
|
32
32
|
* Initialize the file system service.
|
|
33
33
|
*/
|
|
34
34
|
initialize(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* List files and directories in a path.
|
|
37
|
+
*/
|
|
38
|
+
listDirectory(dirPath: string, options?: ListDirectoryOptions): Promise<ListDirectoryResult>;
|
|
35
39
|
/**
|
|
36
40
|
* Read the contents of a file.
|
|
41
|
+
*
|
|
42
|
+
* Features:
|
|
43
|
+
* - Relative path support (resolved against working directory)
|
|
44
|
+
* - Image/PDF files returned as base64 attachments
|
|
45
|
+
* - Binary file detection and rejection
|
|
46
|
+
* - .env file blocking with whitelist for example files
|
|
47
|
+
* - XML-wrapped output for clearer LLM parsing
|
|
48
|
+
* - Preview metadata (first 20 lines)
|
|
37
49
|
*/
|
|
38
50
|
readFile(filePath: string, options?: ReadFileOptions): Promise<FileContent>;
|
|
39
51
|
/**
|
|
@@ -81,6 +93,10 @@ export declare class FileSystemService implements IFileSystem {
|
|
|
81
93
|
* Parses output from grep-like commands (filepath:lineNumber:content format).
|
|
82
94
|
*/
|
|
83
95
|
private parseGrepOutput;
|
|
96
|
+
/**
|
|
97
|
+
* Renders a directory tree as a string.
|
|
98
|
+
*/
|
|
99
|
+
private renderDirectoryTree;
|
|
84
100
|
/**
|
|
85
101
|
* JavaScript-based content search implementation.
|
|
86
102
|
* Used as fallback when native grep commands are unavailable or when context lines are needed.
|