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
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles truncation and file saving for large tool outputs.
|
|
5
5
|
* Prevents context overflow by truncating outputs while preserving critical information.
|
|
6
|
+
*
|
|
7
|
+
* Enhanced with:
|
|
8
|
+
* - Attachment extraction from structured/MCP-style outputs
|
|
9
|
+
* - Title extraction for display
|
|
10
|
+
* - Support for image and file attachments
|
|
6
11
|
*/
|
|
12
|
+
import type { AttachmentPart } from '../../../core/interfaces/cipher/message-types.js';
|
|
7
13
|
/**
|
|
8
14
|
* Configuration for output truncation behavior
|
|
9
15
|
*/
|
|
@@ -33,6 +39,10 @@ export interface TruncationConfig {
|
|
|
33
39
|
* Result of output processing
|
|
34
40
|
*/
|
|
35
41
|
export interface ProcessedOutput {
|
|
42
|
+
/**
|
|
43
|
+
* Attachments extracted from tool output (images, files)
|
|
44
|
+
*/
|
|
45
|
+
attachments?: AttachmentPart[];
|
|
36
46
|
/**
|
|
37
47
|
* Processed content (truncated if necessary)
|
|
38
48
|
*/
|
|
@@ -54,6 +64,10 @@ export interface ProcessedOutput {
|
|
|
54
64
|
*/
|
|
55
65
|
truncated?: boolean;
|
|
56
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* Human-readable title for display
|
|
69
|
+
*/
|
|
70
|
+
title?: string;
|
|
57
71
|
}
|
|
58
72
|
/**
|
|
59
73
|
* Default truncation configuration
|
|
@@ -83,6 +97,43 @@ export declare class ToolOutputProcessor {
|
|
|
83
97
|
* @returns Processed output with metadata
|
|
84
98
|
*/
|
|
85
99
|
processOutput(toolName: string, output: unknown): Promise<ProcessedOutput>;
|
|
100
|
+
/**
|
|
101
|
+
* Process structured tool output that may contain attachments.
|
|
102
|
+
*
|
|
103
|
+
* Handles:
|
|
104
|
+
* - MCP-style responses with content array (text + image items)
|
|
105
|
+
* - Structured outputs with explicit attachments array
|
|
106
|
+
* - Title extraction for display
|
|
107
|
+
*
|
|
108
|
+
* @param toolName - Name of the tool that produced the output
|
|
109
|
+
* @param output - Raw tool output (structured or plain)
|
|
110
|
+
* @returns Processed output with attachments and title
|
|
111
|
+
*/
|
|
112
|
+
processStructuredOutput(toolName: string, output: unknown): Promise<ProcessedOutput>;
|
|
113
|
+
/**
|
|
114
|
+
* Extract attachments from structured output.
|
|
115
|
+
*/
|
|
116
|
+
private extractAttachments;
|
|
117
|
+
/**
|
|
118
|
+
* Extract attachments from MCP-style content array.
|
|
119
|
+
*/
|
|
120
|
+
private extractMcpAttachments;
|
|
121
|
+
/**
|
|
122
|
+
* Extract text content from MCP-style content array.
|
|
123
|
+
*/
|
|
124
|
+
private extractMcpTextContent;
|
|
125
|
+
/**
|
|
126
|
+
* Extract text content from structured output.
|
|
127
|
+
*/
|
|
128
|
+
private extractTextContent;
|
|
129
|
+
/**
|
|
130
|
+
* Check if output is an MCP-style content array.
|
|
131
|
+
*/
|
|
132
|
+
private isMcpContentArray;
|
|
133
|
+
/**
|
|
134
|
+
* Check if output is a structured output with potential attachments.
|
|
135
|
+
*/
|
|
136
|
+
private isStructuredOutput;
|
|
86
137
|
/**
|
|
87
138
|
* Save content to a temporary file
|
|
88
139
|
*
|
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles truncation and file saving for large tool outputs.
|
|
5
5
|
* Prevents context overflow by truncating outputs while preserving critical information.
|
|
6
|
+
*
|
|
7
|
+
* Enhanced with:
|
|
8
|
+
* - Attachment extraction from structured/MCP-style outputs
|
|
9
|
+
* - Title extraction for display
|
|
10
|
+
* - Support for image and file attachments
|
|
6
11
|
*/
|
|
7
12
|
import { existsSync, promises as fsPromises, mkdirSync } from 'node:fs';
|
|
8
13
|
import { tmpdir } from 'node:os';
|
|
@@ -32,6 +37,7 @@ export class ToolOutputProcessor {
|
|
|
32
37
|
...config,
|
|
33
38
|
};
|
|
34
39
|
}
|
|
40
|
+
// ==================== PUBLIC METHODS ====================
|
|
35
41
|
/**
|
|
36
42
|
* Process tool output with truncation and file saving
|
|
37
43
|
*
|
|
@@ -67,6 +73,139 @@ export class ToolOutputProcessor {
|
|
|
67
73
|
},
|
|
68
74
|
};
|
|
69
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Process structured tool output that may contain attachments.
|
|
78
|
+
*
|
|
79
|
+
* Handles:
|
|
80
|
+
* - MCP-style responses with content array (text + image items)
|
|
81
|
+
* - Structured outputs with explicit attachments array
|
|
82
|
+
* - Title extraction for display
|
|
83
|
+
*
|
|
84
|
+
* @param toolName - Name of the tool that produced the output
|
|
85
|
+
* @param output - Raw tool output (structured or plain)
|
|
86
|
+
* @returns Processed output with attachments and title
|
|
87
|
+
*/
|
|
88
|
+
async processStructuredOutput(toolName, output) {
|
|
89
|
+
// Try to detect structured output
|
|
90
|
+
if (this.isStructuredOutput(output)) {
|
|
91
|
+
const structured = output;
|
|
92
|
+
const attachments = this.extractAttachments(structured);
|
|
93
|
+
const textContent = this.extractTextContent(structured);
|
|
94
|
+
// Process the text content with truncation
|
|
95
|
+
const processed = await this.processOutput(toolName, textContent);
|
|
96
|
+
return {
|
|
97
|
+
...processed,
|
|
98
|
+
attachments: attachments.length > 0 ? attachments : undefined,
|
|
99
|
+
title: structured.title,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// Try to detect MCP-style content array
|
|
103
|
+
if (this.isMcpContentArray(output)) {
|
|
104
|
+
const contentArray = output;
|
|
105
|
+
const attachments = this.extractMcpAttachments(contentArray);
|
|
106
|
+
const textContent = this.extractMcpTextContent(contentArray);
|
|
107
|
+
// Process the text content with truncation
|
|
108
|
+
const processed = await this.processOutput(toolName, textContent);
|
|
109
|
+
return {
|
|
110
|
+
...processed,
|
|
111
|
+
attachments: attachments.length > 0 ? attachments : undefined,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// Fall back to regular processing
|
|
115
|
+
return this.processOutput(toolName, output);
|
|
116
|
+
}
|
|
117
|
+
// ==================== PRIVATE METHODS (alphabetical order) ====================
|
|
118
|
+
/**
|
|
119
|
+
* Extract attachments from structured output.
|
|
120
|
+
*/
|
|
121
|
+
extractAttachments(structured) {
|
|
122
|
+
const attachments = [];
|
|
123
|
+
// Extract from explicit attachments array
|
|
124
|
+
if (structured.attachments) {
|
|
125
|
+
for (const att of structured.attachments) {
|
|
126
|
+
attachments.push({
|
|
127
|
+
data: att.data,
|
|
128
|
+
filename: att.filename,
|
|
129
|
+
mime: att.mimeType,
|
|
130
|
+
type: att.type,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Extract images from MCP-style content array
|
|
135
|
+
if (Array.isArray(structured.content)) {
|
|
136
|
+
for (const item of structured.content) {
|
|
137
|
+
if (item.type === 'image' && item.data && item.mimeType) {
|
|
138
|
+
attachments.push({
|
|
139
|
+
data: `data:${item.mimeType};base64,${item.data}`,
|
|
140
|
+
mime: item.mimeType,
|
|
141
|
+
type: 'image',
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return attachments;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Extract attachments from MCP-style content array.
|
|
150
|
+
*/
|
|
151
|
+
extractMcpAttachments(content) {
|
|
152
|
+
const attachments = [];
|
|
153
|
+
for (const item of content) {
|
|
154
|
+
if (item.type === 'image' && item.data && item.mimeType) {
|
|
155
|
+
attachments.push({
|
|
156
|
+
data: `data:${item.mimeType};base64,${item.data}`,
|
|
157
|
+
mime: item.mimeType,
|
|
158
|
+
type: 'image',
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return attachments;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Extract text content from MCP-style content array.
|
|
166
|
+
*/
|
|
167
|
+
extractMcpTextContent(content) {
|
|
168
|
+
return content
|
|
169
|
+
.filter((item) => item.type === 'text' && item.text)
|
|
170
|
+
.map((item) => item.text)
|
|
171
|
+
.join('\n');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Extract text content from structured output.
|
|
175
|
+
*/
|
|
176
|
+
extractTextContent(structured) {
|
|
177
|
+
if (typeof structured.content === 'string') {
|
|
178
|
+
return structured.content;
|
|
179
|
+
}
|
|
180
|
+
if (Array.isArray(structured.content)) {
|
|
181
|
+
return structured.content
|
|
182
|
+
.filter((item) => item.type === 'text' && item.text)
|
|
183
|
+
.map((item) => item.text)
|
|
184
|
+
.join('\n');
|
|
185
|
+
}
|
|
186
|
+
return '';
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check if output is an MCP-style content array.
|
|
190
|
+
*/
|
|
191
|
+
isMcpContentArray(output) {
|
|
192
|
+
if (!Array.isArray(output)) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
// Check if all items have a type field
|
|
196
|
+
return output.every((item) => typeof item === 'object' && item !== null && 'type' in item && (item.type === 'text' || item.type === 'image'));
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Check if output is a structured output with potential attachments.
|
|
200
|
+
*/
|
|
201
|
+
isStructuredOutput(output) {
|
|
202
|
+
if (typeof output !== 'object' || output === null) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
const obj = output;
|
|
206
|
+
// Must have at least one of: content, attachments, or title
|
|
207
|
+
return 'content' in obj || 'attachments' in obj || 'title' in obj;
|
|
208
|
+
}
|
|
70
209
|
/**
|
|
71
210
|
* Save content to a temporary file
|
|
72
211
|
*
|
|
@@ -13,6 +13,29 @@ export declare class CommandValidator {
|
|
|
13
13
|
* @param config - Process configuration for security settings
|
|
14
14
|
*/
|
|
15
15
|
constructor(config: Pick<ProcessConfig, 'allowedCommands' | 'blockedCommands' | 'securityLevel'>);
|
|
16
|
+
/**
|
|
17
|
+
* Extract file path arguments from a command.
|
|
18
|
+
*
|
|
19
|
+
* Identifies commands that operate on file paths and extracts
|
|
20
|
+
* the path arguments for validation. Filters out flags (arguments
|
|
21
|
+
* starting with -) and special arguments like chmod modes.
|
|
22
|
+
*
|
|
23
|
+
* @param command - Command string to parse
|
|
24
|
+
* @returns Array of path arguments (normalized for the current platform)
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* extractPathArguments('rm -rf /home/user/file.txt')
|
|
28
|
+
* // Returns ['/home/user/file.txt']
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* extractPathArguments('cp src/file.txt dest/file.txt')
|
|
32
|
+
* // Returns ['src/file.txt', 'dest/file.txt']
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* extractPathArguments('chmod 755 script.sh')
|
|
36
|
+
* // Returns ['script.sh'] (755 is filtered as chmod mode)
|
|
37
|
+
*/
|
|
38
|
+
extractPathArguments(command: string): string[];
|
|
16
39
|
/**
|
|
17
40
|
* Get the list of allowed commands.
|
|
18
41
|
*
|
|
@@ -1,7 +1,29 @@
|
|
|
1
|
+
import { normalizePath } from './path-utils.js';
|
|
1
2
|
/**
|
|
2
3
|
* Maximum allowed command length (characters).
|
|
3
4
|
*/
|
|
4
5
|
const MAX_COMMAND_LENGTH = 10_000;
|
|
6
|
+
/**
|
|
7
|
+
* Commands that operate on file paths and need path validation.
|
|
8
|
+
* These commands take file/directory paths as arguments.
|
|
9
|
+
*/
|
|
10
|
+
const PATH_SENSITIVE_COMMANDS = new Set([
|
|
11
|
+
'cat',
|
|
12
|
+
'cd',
|
|
13
|
+
'chmod',
|
|
14
|
+
'chown',
|
|
15
|
+
'cp',
|
|
16
|
+
'head',
|
|
17
|
+
'less',
|
|
18
|
+
'ln',
|
|
19
|
+
'mkdir',
|
|
20
|
+
'more',
|
|
21
|
+
'mv',
|
|
22
|
+
'rm',
|
|
23
|
+
'rmdir',
|
|
24
|
+
'tail',
|
|
25
|
+
'touch',
|
|
26
|
+
]);
|
|
5
27
|
/**
|
|
6
28
|
* Dangerous patterns that should always be blocked or require approval.
|
|
7
29
|
*
|
|
@@ -132,6 +154,59 @@ export class CommandValidator {
|
|
|
132
154
|
constructor(config) {
|
|
133
155
|
this.config = config;
|
|
134
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Extract file path arguments from a command.
|
|
159
|
+
*
|
|
160
|
+
* Identifies commands that operate on file paths and extracts
|
|
161
|
+
* the path arguments for validation. Filters out flags (arguments
|
|
162
|
+
* starting with -) and special arguments like chmod modes.
|
|
163
|
+
*
|
|
164
|
+
* @param command - Command string to parse
|
|
165
|
+
* @returns Array of path arguments (normalized for the current platform)
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* extractPathArguments('rm -rf /home/user/file.txt')
|
|
169
|
+
* // Returns ['/home/user/file.txt']
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* extractPathArguments('cp src/file.txt dest/file.txt')
|
|
173
|
+
* // Returns ['src/file.txt', 'dest/file.txt']
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* extractPathArguments('chmod 755 script.sh')
|
|
177
|
+
* // Returns ['script.sh'] (755 is filtered as chmod mode)
|
|
178
|
+
*/
|
|
179
|
+
extractPathArguments(command) {
|
|
180
|
+
const trimmed = command.trim();
|
|
181
|
+
const parts = trimmed.split(/\s+/);
|
|
182
|
+
const commandName = parts[0];
|
|
183
|
+
// Only extract paths from path-sensitive commands
|
|
184
|
+
if (!PATH_SENSITIVE_COMMANDS.has(commandName)) {
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
return parts.slice(1).filter((arg) => {
|
|
188
|
+
// Skip flags (arguments starting with -)
|
|
189
|
+
if (arg.startsWith('-')) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
// Skip chmod numeric modes (e.g., 755, 0644) and symbolic modes (e.g., +x, u+rwx)
|
|
193
|
+
if (commandName === 'chmod') {
|
|
194
|
+
// Numeric mode: 3-4 octal digits
|
|
195
|
+
if (/^[0-7]{3,4}$/.test(arg)) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
// Symbolic mode: starts with +, -, or contains = with permission letters
|
|
199
|
+
if (/^[ugoa]*[+-=][rwxXstugo]+$/.test(arg)) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Skip chown user:group specifiers (contains : but not a path separator pattern)
|
|
204
|
+
if (commandName === 'chown' && /^[^/]+:[^/]*$/.test(arg) && !arg.includes('/')) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
return true;
|
|
208
|
+
}).map((path) => normalizePath(path));
|
|
209
|
+
}
|
|
135
210
|
/**
|
|
136
211
|
* Get the list of allowed commands.
|
|
137
212
|
*
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path utilities for cross-platform compatibility.
|
|
3
|
+
*
|
|
4
|
+
* Provides functions for normalizing paths across different environments,
|
|
5
|
+
* particularly handling Git Bash and MSYS/Cygwin Unix-style paths on Windows.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Normalize paths for cross-platform compatibility.
|
|
9
|
+
* Handles Git Bash Unix-style paths on Windows (e.g., /c/Users/... -> C:\Users\...)
|
|
10
|
+
*
|
|
11
|
+
* @param inputPath - Path to normalize
|
|
12
|
+
* @returns Normalized path for the current platform
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // On Windows with Git Bash path
|
|
16
|
+
* normalizePath('/c/Users/name') // Returns 'C:\\Users\\name'
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // On Unix, returns unchanged
|
|
20
|
+
* normalizePath('/home/user') // Returns '/home/user'
|
|
21
|
+
*/
|
|
22
|
+
export declare function normalizePath(inputPath: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Check if a path is a Windows absolute path.
|
|
25
|
+
*
|
|
26
|
+
* @param inputPath - Path to check
|
|
27
|
+
* @returns True if the path is a Windows absolute path (e.g., C:\ or C:/)
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* isWindowsAbsolute('C:\\Users') // Returns true
|
|
31
|
+
* isWindowsAbsolute('C:/Users') // Returns true
|
|
32
|
+
* isWindowsAbsolute('/home/user') // Returns false
|
|
33
|
+
*/
|
|
34
|
+
export declare function isWindowsAbsolute(inputPath: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Normalize path for comparison (lowercase drive letter on Windows, forward slashes on all platforms).
|
|
37
|
+
* Useful when comparing paths that may have different separator styles.
|
|
38
|
+
*
|
|
39
|
+
* Always converts backslashes to forward slashes regardless of platform,
|
|
40
|
+
* since paths from external sources (APIs, configs) may contain Windows-style
|
|
41
|
+
* separators even when running on Unix.
|
|
42
|
+
*
|
|
43
|
+
* @param inputPath - Path to normalize for comparison
|
|
44
|
+
* @returns Normalized path with forward slashes (and lowercase drive on Windows)
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* // On Windows
|
|
48
|
+
* normalizeForComparison('C:\\Users\\Name') // Returns 'c:/Users/Name'
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* // On Unix (also converts backslashes)
|
|
52
|
+
* normalizeForComparison('auth\\jwt\\context.md') // Returns 'auth/jwt/context.md'
|
|
53
|
+
*/
|
|
54
|
+
export declare function normalizeForComparison(inputPath: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Check if a path appears to be a Git Bash or MSYS/Cygwin Unix-style path on Windows.
|
|
57
|
+
*
|
|
58
|
+
* @param inputPath - Path to check
|
|
59
|
+
* @returns True if the path looks like a Unix-style path that needs normalization on Windows
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* isUnixStyleWindowsPath('/c/Users') // Returns true
|
|
63
|
+
* isUnixStyleWindowsPath('/cygdrive/c/Users') // Returns true
|
|
64
|
+
* isUnixStyleWindowsPath('/home/user') // Returns false (no drive letter pattern)
|
|
65
|
+
*/
|
|
66
|
+
export declare function isUnixStyleWindowsPath(inputPath: string): boolean;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path utilities for cross-platform compatibility.
|
|
3
|
+
*
|
|
4
|
+
* Provides functions for normalizing paths across different environments,
|
|
5
|
+
* particularly handling Git Bash and MSYS/Cygwin Unix-style paths on Windows.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Normalize paths for cross-platform compatibility.
|
|
9
|
+
* Handles Git Bash Unix-style paths on Windows (e.g., /c/Users/... -> C:\Users\...)
|
|
10
|
+
*
|
|
11
|
+
* @param inputPath - Path to normalize
|
|
12
|
+
* @returns Normalized path for the current platform
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // On Windows with Git Bash path
|
|
16
|
+
* normalizePath('/c/Users/name') // Returns 'C:\\Users\\name'
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // On Unix, returns unchanged
|
|
20
|
+
* normalizePath('/home/user') // Returns '/home/user'
|
|
21
|
+
*/
|
|
22
|
+
export function normalizePath(inputPath) {
|
|
23
|
+
if (process.platform !== 'win32') {
|
|
24
|
+
return inputPath;
|
|
25
|
+
}
|
|
26
|
+
// Git Bash on Windows returns Unix-style paths like /c/Users/...
|
|
27
|
+
if (/^\/[a-z]\//i.test(inputPath)) {
|
|
28
|
+
return inputPath
|
|
29
|
+
.replace(/^\/([a-z])\//i, (_, drive) => `${drive.toUpperCase()}:\\`)
|
|
30
|
+
.replaceAll('/', '\\');
|
|
31
|
+
}
|
|
32
|
+
// MSYS/Cygwin style: /cygdrive/c/...
|
|
33
|
+
if (/^\/cygdrive\/[a-z]\//i.test(inputPath)) {
|
|
34
|
+
return inputPath
|
|
35
|
+
.replace(/^\/cygdrive\/([a-z])\//i, (_, drive) => `${drive.toUpperCase()}:\\`)
|
|
36
|
+
.replaceAll('/', '\\');
|
|
37
|
+
}
|
|
38
|
+
return inputPath;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if a path is a Windows absolute path.
|
|
42
|
+
*
|
|
43
|
+
* @param inputPath - Path to check
|
|
44
|
+
* @returns True if the path is a Windows absolute path (e.g., C:\ or C:/)
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* isWindowsAbsolute('C:\\Users') // Returns true
|
|
48
|
+
* isWindowsAbsolute('C:/Users') // Returns true
|
|
49
|
+
* isWindowsAbsolute('/home/user') // Returns false
|
|
50
|
+
*/
|
|
51
|
+
export function isWindowsAbsolute(inputPath) {
|
|
52
|
+
return /^[a-z]:\\/i.test(inputPath) || /^[a-z]:\//i.test(inputPath);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Normalize path for comparison (lowercase drive letter on Windows, forward slashes on all platforms).
|
|
56
|
+
* Useful when comparing paths that may have different separator styles.
|
|
57
|
+
*
|
|
58
|
+
* Always converts backslashes to forward slashes regardless of platform,
|
|
59
|
+
* since paths from external sources (APIs, configs) may contain Windows-style
|
|
60
|
+
* separators even when running on Unix.
|
|
61
|
+
*
|
|
62
|
+
* @param inputPath - Path to normalize for comparison
|
|
63
|
+
* @returns Normalized path with forward slashes (and lowercase drive on Windows)
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* // On Windows
|
|
67
|
+
* normalizeForComparison('C:\\Users\\Name') // Returns 'c:/Users/Name'
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* // On Unix (also converts backslashes)
|
|
71
|
+
* normalizeForComparison('auth\\jwt\\context.md') // Returns 'auth/jwt/context.md'
|
|
72
|
+
*/
|
|
73
|
+
export function normalizeForComparison(inputPath) {
|
|
74
|
+
let result = inputPath.replaceAll('\\', '/');
|
|
75
|
+
// Lowercase drive letter on Windows only
|
|
76
|
+
if (process.platform === 'win32') {
|
|
77
|
+
result = result.replace(/^([A-Z]):/, (_, drive) => `${drive.toLowerCase()}:`);
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Check if a path appears to be a Git Bash or MSYS/Cygwin Unix-style path on Windows.
|
|
83
|
+
*
|
|
84
|
+
* @param inputPath - Path to check
|
|
85
|
+
* @returns True if the path looks like a Unix-style path that needs normalization on Windows
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* isUnixStyleWindowsPath('/c/Users') // Returns true
|
|
89
|
+
* isUnixStyleWindowsPath('/cygdrive/c/Users') // Returns true
|
|
90
|
+
* isUnixStyleWindowsPath('/home/user') // Returns false (no drive letter pattern)
|
|
91
|
+
*/
|
|
92
|
+
export function isUnixStyleWindowsPath(inputPath) {
|
|
93
|
+
return /^\/[a-z]\//i.test(inputPath) || /^\/cygdrive\/[a-z]\//i.test(inputPath);
|
|
94
|
+
}
|
|
@@ -52,6 +52,8 @@ export declare class ProcessService implements IProcessService {
|
|
|
52
52
|
/**
|
|
53
53
|
* Terminate a background process.
|
|
54
54
|
*
|
|
55
|
+
* Uses process tree killing to ensure all child processes are terminated.
|
|
56
|
+
*
|
|
55
57
|
* @param processId - Unique process identifier
|
|
56
58
|
*/
|
|
57
59
|
killProcess(processId: string): Promise<void>;
|
|
@@ -82,6 +84,18 @@ export declare class ProcessService implements IProcessService {
|
|
|
82
84
|
* @returns Process handle with processId
|
|
83
85
|
*/
|
|
84
86
|
private executeInBackground;
|
|
87
|
+
/**
|
|
88
|
+
* Kill a process and all its children (process tree).
|
|
89
|
+
*
|
|
90
|
+
* On Unix, uses process groups (-pid) to kill all descendants.
|
|
91
|
+
* On Windows, uses taskkill with /t flag for tree kill.
|
|
92
|
+
* Falls back to direct kill if process group kill fails.
|
|
93
|
+
*
|
|
94
|
+
* @param child - Child process to kill
|
|
95
|
+
* @param pid - Process ID (optional, extracted from child if not provided)
|
|
96
|
+
* @returns Promise that resolves when kill attempt completes
|
|
97
|
+
*/
|
|
98
|
+
private killProcessTree;
|
|
85
99
|
/**
|
|
86
100
|
* Resolve and validate working directory.
|
|
87
101
|
*
|
|
@@ -92,4 +106,22 @@ export declare class ProcessService implements IProcessService {
|
|
|
92
106
|
* @returns Safe absolute working directory
|
|
93
107
|
*/
|
|
94
108
|
private resolveSafeCwd;
|
|
109
|
+
/**
|
|
110
|
+
* Sleep for specified milliseconds.
|
|
111
|
+
*
|
|
112
|
+
* @param ms - Milliseconds to sleep
|
|
113
|
+
* @returns Promise that resolves after the delay
|
|
114
|
+
*/
|
|
115
|
+
private sleep;
|
|
116
|
+
/**
|
|
117
|
+
* Validate file path arguments in a command.
|
|
118
|
+
*
|
|
119
|
+
* Extracts path arguments from path-sensitive commands and validates
|
|
120
|
+
* that they are within the configured base directory.
|
|
121
|
+
*
|
|
122
|
+
* @param command - Command string to validate
|
|
123
|
+
* @param baseDir - Base directory for confinement
|
|
124
|
+
* @throws ProcessError if any path argument is outside the base directory
|
|
125
|
+
*/
|
|
126
|
+
private validatePathArguments;
|
|
95
127
|
}
|