byterover-cli 0.4.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -9
- package/dist/commands/curate.d.ts +1 -3
- package/dist/commands/curate.js +14 -51
- package/dist/commands/main.d.ts +8 -0
- package/dist/commands/main.js +29 -8
- package/dist/commands/query.d.ts +1 -3
- package/dist/commands/query.js +8 -35
- package/dist/config/context-tree-domains.d.ts +5 -0
- package/dist/config/context-tree-domains.js +6 -1
- package/dist/config/environment.js +9 -9
- package/dist/constants.d.ts +14 -0
- package/dist/constants.js +18 -0
- package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
- package/dist/core/domain/cipher/agent/agent-info.js +143 -0
- package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
- package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
- package/dist/core/domain/cipher/agent/index.d.ts +4 -1
- package/dist/core/domain/cipher/agent/index.js +7 -1
- package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
- package/dist/core/domain/cipher/agent-events/types.js +11 -0
- package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
- package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
- package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
- package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
- package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
- package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
- package/dist/core/domain/cipher/llm/error-codes.js +51 -0
- package/dist/core/domain/cipher/llm/index.d.ts +9 -0
- package/dist/core/domain/cipher/llm/index.js +13 -0
- package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
- package/dist/core/domain/cipher/llm/registry.js +244 -0
- package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
- package/dist/core/domain/cipher/llm/schemas.js +151 -0
- package/dist/core/domain/cipher/llm/types.d.ts +121 -0
- package/dist/core/domain/cipher/llm/types.js +60 -0
- package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
- package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
- package/dist/core/domain/cipher/streaming/types.js +16 -0
- package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
- package/dist/core/domain/cipher/todos/types.d.ts +34 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
- package/dist/core/domain/cipher/tools/constants.js +5 -2
- package/dist/core/domain/cipher/tools/types.d.ts +31 -0
- package/dist/core/domain/entities/event.d.ts +1 -1
- package/dist/core/domain/entities/event.js +3 -1
- package/dist/core/domain/errors/connection-error.d.ts +33 -0
- package/dist/core/domain/errors/connection-error.js +54 -0
- package/dist/core/domain/errors/core-process-error.d.ts +27 -0
- package/dist/core/domain/errors/core-process-error.js +43 -0
- package/dist/core/domain/errors/task-error.d.ts +64 -0
- package/dist/core/domain/errors/task-error.js +116 -0
- package/dist/core/domain/errors/transport-error.d.ts +72 -0
- package/dist/core/domain/errors/transport-error.js +114 -0
- package/dist/core/domain/instance/index.d.ts +1 -0
- package/dist/core/domain/instance/index.js +1 -0
- package/dist/core/domain/instance/types.d.ts +57 -0
- package/dist/core/domain/instance/types.js +72 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
- package/dist/core/domain/knowledge/directory-manager.js +31 -0
- package/dist/core/domain/transport/index.d.ts +2 -0
- package/dist/core/domain/transport/index.js +2 -0
- package/dist/core/domain/transport/schemas.d.ts +1149 -0
- package/dist/core/domain/transport/schemas.js +554 -0
- package/dist/core/domain/transport/types.d.ts +67 -0
- package/dist/core/domain/transport/types.js +7 -0
- package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
- package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
- package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
- package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
- package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
- package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
- package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
- package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
- package/dist/core/interfaces/cipher/index.d.ts +35 -0
- package/dist/core/interfaces/cipher/index.js +11 -0
- package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
- package/dist/core/interfaces/cipher/message-factory.js +252 -0
- package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
- package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
- package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
- package/dist/core/interfaces/cipher/message-types.js +6 -0
- package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
- package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
- package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
- package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
- package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
- package/dist/core/interfaces/executor/i-query-executor.js +1 -0
- package/dist/core/interfaces/executor/index.d.ts +2 -0
- package/dist/core/interfaces/executor/index.js +2 -0
- package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
- package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
- package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
- package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
- package/dist/core/interfaces/instance/index.d.ts +2 -0
- package/dist/core/interfaces/instance/index.js +2 -0
- package/dist/core/interfaces/noop-implementations.d.ts +53 -0
- package/dist/core/interfaces/noop-implementations.js +62 -0
- package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
- package/dist/core/interfaces/transport/i-transport-client.js +1 -0
- package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
- package/dist/core/interfaces/transport/i-transport-server.js +1 -0
- package/dist/core/interfaces/transport/index.d.ts +2 -0
- package/dist/core/interfaces/transport/index.js +2 -0
- package/dist/hooks/init/welcome.js +9 -24
- package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
- package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
- package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
- package/dist/infra/cipher/agent/agent-error.js +79 -0
- package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
- package/dist/infra/cipher/agent/agent-schemas.js +97 -0
- package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
- package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
- package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
- package/dist/infra/cipher/agent/base-agent.js +240 -0
- package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
- package/dist/infra/cipher/agent/cipher-agent.js +546 -0
- package/dist/infra/cipher/agent/index.d.ts +22 -0
- package/dist/infra/cipher/agent/index.js +24 -0
- package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
- package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
- package/dist/infra/cipher/agent/types.d.ts +35 -0
- package/dist/infra/cipher/agent/types.js +1 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
- package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
- package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
- package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
- package/dist/infra/cipher/consumer/consumer-service.js +1 -0
- package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
- package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
- package/dist/infra/cipher/consumer/index.d.ts +1 -1
- package/dist/infra/cipher/consumer/index.js +2 -1
- package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
- package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
- package/dist/infra/cipher/file-system/binary-utils.js +164 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
- package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
- package/dist/infra/cipher/file-system/file-system-service.js +327 -36
- package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
- package/dist/infra/cipher/file-system/path-validator.js +111 -6
- package/dist/infra/cipher/interactive-loop.js +41 -33
- package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
- package/dist/infra/cipher/llm/capability-cache.js +125 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
- package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
- package/dist/infra/cipher/llm/context/compression/index.js +6 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
- package/dist/infra/cipher/llm/context/context-manager.js +129 -0
- package/dist/infra/cipher/llm/context/utils.js +17 -4
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
- package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
- package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
- package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
- package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
- package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
- package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
- package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
- package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
- package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
- package/dist/infra/cipher/llm/sanitization/index.js +13 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
- package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
- package/dist/infra/cipher/llm/stream-processor.js +276 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
- package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
- package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
- package/dist/infra/cipher/process/command-validator.d.ts +23 -0
- package/dist/infra/cipher/process/command-validator.js +75 -0
- package/dist/infra/cipher/process/path-utils.d.ts +66 -0
- package/dist/infra/cipher/process/path-utils.js +94 -0
- package/dist/infra/cipher/process/process-service.d.ts +32 -0
- package/dist/infra/cipher/process/process-service.js +98 -17
- package/dist/infra/cipher/session/chat-session.d.ts +56 -7
- package/dist/infra/cipher/session/chat-session.js +163 -13
- package/dist/infra/cipher/session/index.d.ts +1 -0
- package/dist/infra/cipher/session/index.js +2 -0
- package/dist/infra/cipher/session/message-queue.d.ts +65 -0
- package/dist/infra/cipher/session/message-queue.js +90 -0
- package/dist/infra/cipher/session/session-manager.d.ts +106 -5
- package/dist/infra/cipher/session/session-manager.js +254 -7
- package/dist/infra/cipher/session/session-status.d.ts +137 -0
- package/dist/infra/cipher/session/session-status.js +184 -0
- package/dist/infra/cipher/session/title-generator.d.ts +8 -0
- package/dist/infra/cipher/session/title-generator.js +31 -0
- package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
- package/dist/infra/cipher/storage/message-storage-service.js +300 -54
- package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
- package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
- package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
- package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
- package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
- package/dist/infra/cipher/system-prompt/schemas.js +94 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
- package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
- package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
- package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
- package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
- package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
- package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
- package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
- package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
- package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
- package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
- package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
- package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
- package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
- package/dist/infra/cipher/tools/index.d.ts +1 -1
- package/dist/infra/cipher/tools/index.js +1 -1
- package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
- package/dist/infra/cipher/tools/plugins/index.js +2 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
- package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
- package/dist/infra/cipher/tools/streaming/index.js +1 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
- package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
- package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
- package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
- package/dist/infra/cipher/tools/tool-manager.js +107 -11
- package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
- package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
- package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
- package/dist/infra/cipher/tools/tool-provider.js +81 -25
- package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
- package/dist/infra/cipher/tools/tool-registry.js +58 -16
- package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
- package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
- package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
- package/dist/infra/context-tree/path-utils.d.ts +7 -0
- package/dist/infra/context-tree/path-utils.js +7 -0
- package/dist/infra/core/executors/curate-executor.d.ts +35 -0
- package/dist/infra/core/executors/curate-executor.js +123 -0
- package/dist/infra/core/executors/index.d.ts +2 -0
- package/dist/infra/core/executors/index.js +2 -0
- package/dist/infra/core/executors/query-executor.d.ts +23 -0
- package/dist/infra/core/executors/query-executor.js +51 -0
- package/dist/infra/core/task-processor.d.ts +81 -0
- package/dist/infra/core/task-processor.js +115 -0
- package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
- package/dist/infra/instance/file-instance-discovery.js +84 -0
- package/dist/infra/instance/file-instance-manager.d.ts +46 -0
- package/dist/infra/instance/file-instance-manager.js +123 -0
- package/dist/infra/instance/index.d.ts +3 -0
- package/dist/infra/instance/index.js +3 -0
- package/dist/infra/instance/process-utils.d.ts +14 -0
- package/dist/infra/instance/process-utils.js +39 -0
- package/dist/infra/process/agent-worker.d.ts +20 -0
- package/dist/infra/process/agent-worker.js +602 -0
- package/dist/infra/process/index.d.ts +12 -0
- package/dist/infra/process/index.js +11 -0
- package/dist/infra/process/ipc-types.d.ts +55 -0
- package/dist/infra/process/ipc-types.js +12 -0
- package/dist/infra/process/process-manager.d.ts +154 -0
- package/dist/infra/process/process-manager.js +471 -0
- package/dist/infra/process/task-queue-manager.d.ts +123 -0
- package/dist/infra/process/task-queue-manager.js +226 -0
- package/dist/infra/process/transport-handlers.d.ts +124 -0
- package/dist/infra/process/transport-handlers.js +348 -0
- package/dist/infra/process/transport-worker.d.ts +20 -0
- package/dist/infra/process/transport-worker.js +168 -0
- package/dist/infra/repl/commands/curate-command.js +0 -5
- package/dist/infra/repl/commands/query-command.js +0 -3
- package/dist/infra/repl/repl-startup.d.ts +4 -0
- package/dist/infra/repl/repl-startup.js +10 -1
- package/dist/infra/repl/transport-client-helper.d.ts +9 -0
- package/dist/infra/repl/transport-client-helper.js +96 -0
- package/dist/infra/transport/index.d.ts +4 -0
- package/dist/infra/transport/index.js +4 -0
- package/dist/infra/transport/port-utils.d.ts +42 -0
- package/dist/infra/transport/port-utils.js +84 -0
- package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
- package/dist/infra/transport/socket-io-transport-client.js +270 -0
- package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
- package/dist/infra/transport/socket-io-transport-server.js +207 -0
- package/dist/infra/transport/transport-client-factory.d.ts +76 -0
- package/dist/infra/transport/transport-client-factory.js +168 -0
- package/dist/infra/transport/transport-factory.d.ts +33 -0
- package/dist/infra/transport/transport-factory.js +59 -0
- package/dist/infra/usecase/curate-use-case.d.ts +8 -55
- package/dist/infra/usecase/curate-use-case.js +73 -259
- package/dist/infra/usecase/init-use-case.js +19 -8
- package/dist/infra/usecase/login-use-case.js +9 -3
- package/dist/infra/usecase/query-use-case.d.ts +18 -45
- package/dist/infra/usecase/query-use-case.js +251 -326
- package/dist/infra/usecase/status-use-case.js +1 -1
- package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
- package/dist/resources/prompts/explore.yml +78 -0
- package/dist/resources/prompts/plan.yml +114 -0
- package/dist/resources/prompts/reflection.yml +1 -1
- package/dist/resources/prompts/system-prompt.yml +15 -8
- package/dist/resources/prompts/tool-outputs.yml +0 -5
- package/dist/resources/tools/bash_exec.txt +98 -0
- package/dist/resources/tools/bash_output.txt +40 -0
- package/dist/resources/tools/batch.txt +28 -0
- package/dist/resources/tools/create_knowledge_topic.txt +23 -0
- package/dist/resources/tools/curate.txt +22 -0
- package/dist/resources/tools/delete_memory.txt +1 -0
- package/dist/resources/tools/detect_domains.txt +11 -0
- package/dist/resources/tools/edit_file.txt +1 -0
- package/dist/resources/tools/edit_memory.txt +1 -0
- package/dist/resources/tools/glob_files.txt +20 -0
- package/dist/resources/tools/grep_content.txt +18 -0
- package/dist/resources/tools/kill_process.txt +16 -0
- package/dist/resources/tools/list_directory.txt +16 -0
- package/dist/resources/tools/list_memories.txt +1 -0
- package/dist/resources/tools/read_file.txt +31 -0
- package/dist/resources/tools/read_memory.txt +1 -0
- package/dist/resources/tools/read_todos.txt +17 -0
- package/dist/resources/tools/search_history.txt +1 -0
- package/dist/resources/tools/task.txt +23 -0
- package/dist/resources/tools/write_file.txt +1 -0
- package/dist/resources/tools/write_memory.txt +1 -0
- package/dist/resources/tools/write_todos.txt +29 -0
- package/dist/tui/app.js +9 -13
- package/dist/tui/components/command-details.d.ts +14 -0
- package/dist/tui/components/command-details.js +35 -0
- package/dist/tui/components/execution/execution-changes.d.ts +5 -0
- package/dist/tui/components/execution/execution-changes.js +19 -4
- package/dist/tui/components/execution/execution-content.d.ts +4 -2
- package/dist/tui/components/execution/execution-content.js +26 -13
- package/dist/tui/components/execution/execution-input.js +3 -3
- package/dist/tui/components/execution/execution-progress.d.ts +2 -2
- package/dist/tui/components/execution/execution-progress.js +8 -6
- package/dist/tui/components/execution/log-item.d.ts +3 -4
- package/dist/tui/components/execution/log-item.js +2 -5
- package/dist/tui/components/footer.js +9 -4
- package/dist/tui/components/header.d.ts +3 -3
- package/dist/tui/components/header.js +5 -3
- package/dist/tui/components/index.d.ts +1 -0
- package/dist/tui/components/index.js +1 -0
- package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
- package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
- package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
- package/dist/tui/components/scrollable-list.js +12 -10
- package/dist/tui/components/suggestions.js +39 -41
- package/dist/tui/components/tab-bar.d.ts +2 -1
- package/dist/tui/components/tab-bar.js +3 -4
- package/dist/tui/constants.d.ts +0 -5
- package/dist/tui/constants.js +0 -5
- package/dist/tui/contexts/auth-context.js +9 -2
- package/dist/tui/contexts/{use-commands.js → commands-context.js} +6 -5
- package/dist/tui/contexts/index.d.ts +6 -1
- package/dist/tui/contexts/index.js +6 -1
- package/dist/tui/contexts/onboarding-context.d.ts +1 -1
- package/dist/tui/contexts/onboarding-context.js +9 -9
- package/dist/tui/contexts/tasks-context.d.ts +84 -0
- package/dist/tui/contexts/tasks-context.js +218 -0
- package/dist/tui/contexts/transport-context.d.ts +29 -0
- package/dist/tui/contexts/transport-context.js +82 -0
- package/dist/tui/hooks/index.d.ts +10 -6
- package/dist/tui/hooks/index.js +7 -6
- package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
- package/dist/tui/hooks/use-activity-logs.js +87 -34
- package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
- package/dist/tui/hooks/use-auth-polling.js +104 -0
- package/dist/tui/hooks/use-slash-command-processor.js +0 -1
- package/dist/tui/hooks/use-slash-completion.js +1 -1
- package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
- package/dist/tui/hooks/use-tab-navigation.js +16 -7
- package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
- package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
- package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
- package/dist/tui/hooks/use-ui-heights.js +88 -0
- package/dist/tui/providers/app-providers.js +2 -6
- package/dist/tui/types/commands.d.ts +0 -26
- package/dist/tui/types/index.d.ts +1 -1
- package/dist/tui/types/ui.d.ts +9 -4
- package/dist/tui/utils/line.d.ts +11 -0
- package/dist/tui/utils/line.js +16 -0
- package/dist/tui/utils/log.d.ts +27 -0
- package/dist/tui/utils/log.js +114 -0
- package/dist/tui/views/command-view.d.ts +7 -0
- package/dist/tui/views/command-view.js +103 -80
- package/dist/tui/views/login-view.js +7 -4
- package/dist/tui/views/logs-view.d.ts +13 -0
- package/dist/tui/views/logs-view.js +27 -52
- package/dist/utils/connection-error-handler.d.ts +16 -0
- package/dist/utils/connection-error-handler.js +49 -0
- package/dist/utils/crash-log.d.ts +14 -0
- package/dist/utils/crash-log.js +19 -0
- package/dist/utils/file-helpers.d.ts +14 -0
- package/dist/utils/file-helpers.js +21 -0
- package/dist/utils/global-logs-path.d.ts +11 -0
- package/dist/utils/global-logs-path.js +37 -0
- package/dist/utils/process-logger.d.ts +53 -0
- package/dist/utils/process-logger.js +253 -0
- package/dist/utils/sandbox-detector.d.ts +31 -0
- package/dist/utils/sandbox-detector.js +122 -0
- package/oclif.manifest.json +10 -198
- package/package.json +5 -1
- package/dist/commands/cipher-agent/run.d.ts +0 -142
- package/dist/commands/cipher-agent/run.js +0 -555
- package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
- package/dist/commands/cipher-agent/set-prompt.js +0 -58
- package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
- package/dist/commands/cipher-agent/show-prompt.js +0 -53
- package/dist/commands/foo.d.ts +0 -14
- package/dist/commands/foo.js +0 -66
- package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
- package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
- package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
- package/dist/infra/cipher/cipher-agent.d.ts +0 -182
- package/dist/infra/cipher/cipher-agent.js +0 -317
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
- package/dist/resources/prompts/modes/autonomous.yml +0 -9
- package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
- package/dist/tui/contexts/consumer.d.ts +0 -31
- package/dist/tui/contexts/consumer.js +0 -56
- package/dist/tui/hooks/use-consumer.d.ts +0 -12
- package/dist/tui/hooks/use-consumer.js +0 -50
- package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
- package/dist/tui/hooks/use-queue-polling.js +0 -90
- /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
- /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Terminate a background process started by bash_exec.
|
|
2
|
+
|
|
3
|
+
Features:
|
|
4
|
+
- Graceful shutdown: Sends SIGTERM first to allow cleanup
|
|
5
|
+
- Force kill: Escalates to SIGKILL after 5 seconds if still running
|
|
6
|
+
- Idempotent: Safe to call on already-terminated processes
|
|
7
|
+
|
|
8
|
+
Signal handling:
|
|
9
|
+
1. Sends SIGTERM (allows process to cleanup gracefully)
|
|
10
|
+
2. Waits 5 seconds
|
|
11
|
+
3. Sends SIGKILL if process still running (force terminate)
|
|
12
|
+
|
|
13
|
+
Use cases:
|
|
14
|
+
- Stop long-running commands that are no longer needed
|
|
15
|
+
- Cancel background processes that are taking too long
|
|
16
|
+
- Clean up processes before starting new ones
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Lists files and directories in a given path with a tree structure.
|
|
2
|
+
|
|
3
|
+
- The path parameter must be absolute; omit it to use the current workspace directory
|
|
4
|
+
- Automatically ignores common build artifacts: node_modules, dist, .git, __pycache__, etc.
|
|
5
|
+
- You can provide additional ignore patterns via the `ignore` parameter
|
|
6
|
+
- Returns up to 100 files by default (adjustable via `maxResults`)
|
|
7
|
+
- You should generally prefer the glob_files and grep_content tools if you know which directories to search
|
|
8
|
+
- Use this tool to get an overview of a directory structure
|
|
9
|
+
|
|
10
|
+
Default ignored patterns:
|
|
11
|
+
- node_modules/, dist/, build/, target/, vendor/
|
|
12
|
+
- .git/, .idea/, .vscode/
|
|
13
|
+
- __pycache__/, .venv/, venv/, env/
|
|
14
|
+
- coverage/, .cache/, cache/, logs/, tmp/, temp/
|
|
15
|
+
|
|
16
|
+
If results are truncated, consider using glob_files with a specific pattern instead.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
List and filter memories from the scratch pad. Returns memories sorted by most recent first. Use this to discover what context has been stored.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
Reads a file from the local filesystem.
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
- Accepts both absolute and relative paths (relative paths resolved against working directory)
|
|
5
|
+
- By default, reads up to 2000 lines starting from the beginning of the file
|
|
6
|
+
- You can specify offset (1-based line number) and limit to read specific sections
|
|
7
|
+
- Any lines longer than 2000 characters will be truncated with "..."
|
|
8
|
+
- Results include line numbers in "00001| content" format wrapped in <file> tags
|
|
9
|
+
- If the file is not found, similar filenames will be suggested
|
|
10
|
+
|
|
11
|
+
Special file handling:
|
|
12
|
+
- Image files (PNG, JPG, GIF, WebP, BMP, ICO): Returned as base64 attachment for multimodal processing
|
|
13
|
+
- PDF files: Returned as base64 attachment
|
|
14
|
+
- Binary files: Rejected with clear error message
|
|
15
|
+
- .env files: Blocked for security (except .env.sample, .env.example, .env.template)
|
|
16
|
+
|
|
17
|
+
Output:
|
|
18
|
+
- content: File content with line numbers (00001| format) wrapped in <file> tags
|
|
19
|
+
- lines: Number of lines returned
|
|
20
|
+
- totalLines: Total lines in the file
|
|
21
|
+
- truncated: Whether more content is available
|
|
22
|
+
- message: Human-readable status with guidance on how to read more
|
|
23
|
+
- preview: First 20 lines of content (for UI display)
|
|
24
|
+
- attachment: Base64 data for images/PDFs (with mimeType and fileName)
|
|
25
|
+
|
|
26
|
+
For large files, use offset and limit parameters:
|
|
27
|
+
- First read: offset=1, limit=2000 (default)
|
|
28
|
+
- Continue: offset=2001, limit=2000
|
|
29
|
+
- Read specific section: offset=500, limit=100
|
|
30
|
+
|
|
31
|
+
If results are truncated, the message will tell you which offset to use next.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Read a specific memory by ID. Use this to retrieve previously stored context, findings, or intermediate results from the scratch pad.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Read the current todo list for this session.
|
|
2
|
+
|
|
3
|
+
This tool should be used proactively and frequently to ensure that you are aware of
|
|
4
|
+
the status of the current task list
|
|
5
|
+
|
|
6
|
+
## Output
|
|
7
|
+
|
|
8
|
+
- **title**: Count of incomplete todos (e.g., "3 todos")
|
|
9
|
+
- **content**: JSON formatted list of all todos
|
|
10
|
+
- **metadata**: Structured todo data for programmatic access
|
|
11
|
+
|
|
12
|
+
## Each todo item contains
|
|
13
|
+
|
|
14
|
+
- **id**: Unique identifier
|
|
15
|
+
- **content**: Task description (imperative form, e.g., "Run tests")
|
|
16
|
+
- **activeForm**: Present continuous form for display (e.g., "Running tests")
|
|
17
|
+
- **status**: pending, in_progress, completed, or cancelled
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Search conversation history. Supports searching messages or sessions. Can filter by role and session.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
Delegates work to a specialized subagent for complex tasks.
|
|
2
|
+
|
|
3
|
+
Available Subagents:
|
|
4
|
+
- explore: Fast codebase exploration. Searches files, reads code, finds patterns.
|
|
5
|
+
Use for: finding implementations, understanding code structure, locating files
|
|
6
|
+
- curate: Creates/updates knowledge topics in the context tree.
|
|
7
|
+
Use for: storing knowledge after gathering information
|
|
8
|
+
|
|
9
|
+
Parameters:
|
|
10
|
+
- subagent_type: "explore" or "curate"
|
|
11
|
+
- description: Short task description (3-5 words)
|
|
12
|
+
- prompt: Detailed instructions for the subagent
|
|
13
|
+
- contextTreeOnly: (Optional) If true, restricts to .brv/context-tree/ only
|
|
14
|
+
- session_id: (Optional) Continue existing session
|
|
15
|
+
|
|
16
|
+
Workflow:
|
|
17
|
+
1. Use explore to find/understand code
|
|
18
|
+
2. Use curate to store findings in context tree
|
|
19
|
+
|
|
20
|
+
Rules:
|
|
21
|
+
- Provide clear, detailed prompts
|
|
22
|
+
- Subagents cannot call task (no recursion)
|
|
23
|
+
- For context tree queries, use contextTreeOnly=true
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Write content to a file. Overwrites existing files. Can optionally create parent directories.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Write content to agent memory as a scratch pad. Use this to store intermediate results, findings, or context that should persist across tool calls. Memories can be tagged and pinned for easy retrieval.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Use this tool to create and manage a structured task list for the current session. This helps track progress, organize complex tasks, and demonstrate thoroughness to the user.
|
|
2
|
+
|
|
3
|
+
## When to Use This Tool
|
|
4
|
+
Always use this tool proactively when curating the context tree:
|
|
5
|
+
1. Based on the context that needs to be queried, create a plan
|
|
6
|
+
2. Start with the `glob_files` and `grep_content` tools to examine the current tree structure located at `.brv/context-tree/ related to the context that needs to be curated, such as domains, topics, and subtopics
|
|
7
|
+
3. Read to understand important context if necessary using the `read_file` tool
|
|
8
|
+
4. Run the `curator` tool to determine the necessary operations
|
|
9
|
+
5. Curate using the tools: `write_file` to add, `edit_file` to update or merge, and `bash_exec` to remove context (delete operations)
|
|
10
|
+
|
|
11
|
+
## Task States
|
|
12
|
+
- **pending**: Task not yet started
|
|
13
|
+
- **in_progress**: Currently working on (limit to ONE task at a time)
|
|
14
|
+
- **completed**: Task finished successfully
|
|
15
|
+
- **cancelled**: Task no longer needed
|
|
16
|
+
|
|
17
|
+
## Important Rules
|
|
18
|
+
- ONLY ONE task can be "in_progress" at any time
|
|
19
|
+
- Mark tasks complete IMMEDIATELY after finishing (don't batch completions)
|
|
20
|
+
- Each todo must have a unique **id** for tracking
|
|
21
|
+
- Task descriptions need both forms:
|
|
22
|
+
- content: Imperative form (e.g., "Run tests")
|
|
23
|
+
- activeForm: Present continuous form (e.g., "Running tests")
|
|
24
|
+
|
|
25
|
+
## Todo Item Fields
|
|
26
|
+
- **id**: Unique identifier for the todo item (required)
|
|
27
|
+
- **content**: Imperative description (e.g., "Run tests")
|
|
28
|
+
- **activeForm**: Present continuous form (e.g., "Running tests")
|
|
29
|
+
- **status**: pending, in_progress, completed, or cancelled
|
package/dist/tui/app.js
CHANGED
|
@@ -6,21 +6,17 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
6
6
|
* - Unauthorized: Show login prompt
|
|
7
7
|
* - Authorized: Show main app with tabs
|
|
8
8
|
*/
|
|
9
|
-
import { Box
|
|
9
|
+
import { Box } from 'ink';
|
|
10
10
|
import { Footer, Header, TabBar } from './components/index.js';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { useTabNavigation } from './hooks/index.js';
|
|
11
|
+
import { useAuth, useTasks } from './contexts/index.js';
|
|
12
|
+
import { useTabNavigation, useTerminalBreakpoint, useUIHeights } from './hooks/index.js';
|
|
14
13
|
import { CommandView, LoginView, LogsView } from './views/index.js';
|
|
15
14
|
export const App = () => {
|
|
16
|
-
const {
|
|
17
|
-
const
|
|
18
|
-
const terminalWidth = stdout?.columns ?? 80;
|
|
19
|
-
// Get auth state from context
|
|
15
|
+
const { columns: terminalWidth, rows: terminalHeight } = useTerminalBreakpoint();
|
|
16
|
+
const { appBottomPadding, footer, header, tab } = useUIHeights();
|
|
20
17
|
const { isAuthorized } = useAuth();
|
|
21
|
-
|
|
22
|
-
const {
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, paddingBottom: 1, width: terminalWidth, children: [_jsx(Box, { flexShrink: 0, children: _jsx(Header, { compact: isAuthorized, queueStats: stats ? { pending: stats.queued, processing: stats.running } : undefined, showQueueStats: isAuthorized }) }), isAuthorized ? (_jsxs(_Fragment, { children: [_jsx(Box, { flexShrink: 0, children: _jsx(TabBar, { activeTab: activeTab }) }), _jsxs(Box, { flexGrow: 1, height: contentHeight, paddingX: 1, children: [_jsx(Box, { display: activeTab === 'activity' ? 'flex' : 'none', height: "100%", width: "100%", children: _jsx(LogsView, { availableHeight: contentHeight }) }), _jsx(Box, { display: activeTab === 'console' ? 'flex' : 'none', height: "100%", width: "100%", children: _jsx(CommandView, { availableHeight: contentHeight }) })] }), _jsx(Box, { flexShrink: 0, children: _jsx(Footer, {}) })] })) : (_jsx(Box, { flexGrow: 1, paddingX: 1, children: _jsx(LoginView, {}) }))] }));
|
|
18
|
+
const { activeTab, tabs } = useTabNavigation();
|
|
19
|
+
const { stats: taskStats } = useTasks();
|
|
20
|
+
const contentHeight = Math.max(1, terminalHeight - header - tab - footer);
|
|
21
|
+
return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, paddingBottom: appBottomPadding, width: terminalWidth, children: [_jsx(Box, { flexShrink: 0, children: _jsx(Header, { compact: isAuthorized, showTransportStats: isAuthorized, taskStats: taskStats }) }), isAuthorized ? (_jsxs(_Fragment, { children: [_jsx(Box, { flexShrink: 0, children: _jsx(TabBar, { activeTab: activeTab, tabs: tabs }) }), _jsxs(Box, { flexGrow: 1, paddingX: 1, children: [_jsx(Box, { display: activeTab === 'activity' ? 'flex' : 'none', height: "100%", width: "100%", children: _jsx(LogsView, { availableHeight: contentHeight }) }), _jsx(Box, { display: activeTab === 'console' ? 'flex' : 'none', height: "100%", width: "100%", children: _jsx(CommandView, { availableHeight: contentHeight }) })] }), _jsx(Box, { flexShrink: 0, children: _jsx(Footer, {}) })] })) : (_jsx(Box, { flexGrow: 1, paddingX: 1, children: _jsx(LoginView, {}) }))] }));
|
|
26
22
|
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Details Component
|
|
3
|
+
*
|
|
4
|
+
* Displays detailed information about a selected command suggestion,
|
|
5
|
+
* including description, usage, subcommands, arguments, and flags.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import type { CommandSuggestion } from '../types.js';
|
|
9
|
+
interface CommandDetailsProps {
|
|
10
|
+
labelWidth: number;
|
|
11
|
+
selectedSuggestion: CommandSuggestion | null;
|
|
12
|
+
}
|
|
13
|
+
export declare const CommandDetails: React.FC<CommandDetailsProps>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Command Details Component
|
|
4
|
+
*
|
|
5
|
+
* Displays detailed information about a selected command suggestion,
|
|
6
|
+
* including description, usage, subcommands, arguments, and flags.
|
|
7
|
+
*/
|
|
8
|
+
import { Box, Text } from 'ink';
|
|
9
|
+
import { useTheme } from '../contexts/theme-context.js';
|
|
10
|
+
/**
|
|
11
|
+
* Format usage string from args, flags, and subcommands
|
|
12
|
+
*/
|
|
13
|
+
function formatUsage(label, args, flags, subCommands) {
|
|
14
|
+
let usage = label;
|
|
15
|
+
if (subCommands?.length) {
|
|
16
|
+
usage += ' <subcommand>';
|
|
17
|
+
}
|
|
18
|
+
if (args?.length) {
|
|
19
|
+
const argsStr = args.map((a) => (a.required ? `<${a.name}>` : `[${a.name}]`)).join(' ');
|
|
20
|
+
usage += ` ${argsStr}`;
|
|
21
|
+
}
|
|
22
|
+
if (flags?.length) {
|
|
23
|
+
const flagsStr = flags.map((f) => `[--${f.name}]`).join(' ');
|
|
24
|
+
usage += ` ${flagsStr}`;
|
|
25
|
+
}
|
|
26
|
+
return usage;
|
|
27
|
+
}
|
|
28
|
+
export const CommandDetails = ({ labelWidth, selectedSuggestion }) => {
|
|
29
|
+
const { theme: { colors }, } = useTheme();
|
|
30
|
+
const hasDetails = selectedSuggestion &&
|
|
31
|
+
(selectedSuggestion.args?.length || selectedSuggestion.flags?.length || selectedSuggestion.subCommands?.length);
|
|
32
|
+
return (_jsxs(Box, { borderBottom: false, borderColor: colors.border, borderRight: false, borderStyle: "single", borderTop: false, flexDirection: "column", paddingLeft: 1, children: [_jsx(Text, { color: colors.dimText, children: selectedSuggestion?.description || '' }), hasDetails && (_jsxs(_Fragment, { children: [_jsxs(Text, { color: colors.text, children: ["Usage:", ' ', formatUsage(selectedSuggestion.label, selectedSuggestion.args, selectedSuggestion.flags, selectedSuggestion.subCommands)] }), selectedSuggestion.subCommands?.map((sub) => (_jsxs(Text, { color: colors.dimText, children: [' ', _jsx(Text, { color: colors.text, children: sub.name.padEnd(labelWidth + 2) }), ' ', sub.description] }, sub.name))), selectedSuggestion.args?.map((arg) => (_jsxs(Text, { color: colors.dimText, children: [' ', _jsx(Text, { color: colors.text, children: (arg.required ? `<${arg.name}>` : `[${arg.name}]`).padEnd(labelWidth + 2) }), ' ', arg.description] }, arg.name))), selectedSuggestion.flags?.map((flag) => (_jsxs(Text, { color: colors.dimText, children: [' ', _jsx(Text, { color: colors.text, children: (flag.type === 'file'
|
|
33
|
+
? `${flag.char || '@'}file`
|
|
34
|
+
: (flag.char ? `-${flag.char}, ` : '') + `--${flag.name}`).padEnd(labelWidth + 2) }), ' ', flag.description, flag.default !== undefined && _jsxs(Text, { children: [" (default: ", String(flag.default), ")"] })] }, flag.name)))] }))] }));
|
|
35
|
+
};
|
|
@@ -7,6 +7,11 @@ import React from 'react';
|
|
|
7
7
|
interface ExecutionChangesProps {
|
|
8
8
|
/** List of created file paths */
|
|
9
9
|
created: string[];
|
|
10
|
+
/** Maximum changes configuration */
|
|
11
|
+
maxChanges?: {
|
|
12
|
+
created: number;
|
|
13
|
+
updated: number;
|
|
14
|
+
};
|
|
10
15
|
/** List of updated file paths */
|
|
11
16
|
updated: string[];
|
|
12
17
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* Execution Changes Component
|
|
4
4
|
*
|
|
@@ -6,10 +6,25 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
6
6
|
*/
|
|
7
7
|
import { Box, Text } from 'ink';
|
|
8
8
|
import { useTheme } from '../../hooks/index.js';
|
|
9
|
-
export const ExecutionChanges = ({ created, updated }) => {
|
|
9
|
+
export const ExecutionChanges = ({ created, updated, maxChanges = { created: Infinity, updated: Infinity }, }) => {
|
|
10
10
|
const { theme: { colors }, } = useTheme();
|
|
11
|
-
|
|
11
|
+
const totalChanges = created.length + updated.length;
|
|
12
|
+
if (totalChanges === 0) {
|
|
12
13
|
return null;
|
|
13
14
|
}
|
|
14
|
-
|
|
15
|
+
const hasCreated = created.length > 0;
|
|
16
|
+
const hasUpdated = updated.length > 0;
|
|
17
|
+
// Calculate overflow for each section
|
|
18
|
+
// maxChanges represents total lines (items + indicator if overflow)
|
|
19
|
+
const createdOverflow = created.length > maxChanges.created;
|
|
20
|
+
const updatedOverflow = updated.length > maxChanges.updated;
|
|
21
|
+
// Calculate visible items per section
|
|
22
|
+
// If overflow, reserve 1 line for indicator, show (maxChanges - 1) items
|
|
23
|
+
const createdItemsMax = createdOverflow ? maxChanges.created - 1 : maxChanges.created;
|
|
24
|
+
const updatedItemsMax = updatedOverflow ? maxChanges.updated - 1 : maxChanges.updated;
|
|
25
|
+
const visibleCreated = created.slice(0, Math.max(0, createdItemsMax));
|
|
26
|
+
const visibleUpdated = updated.slice(0, Math.max(0, updatedItemsMax));
|
|
27
|
+
const createdRemaining = created.length - visibleCreated.length;
|
|
28
|
+
const updatedRemaining = updated.length - visibleUpdated.length;
|
|
29
|
+
return (_jsxs(Box, { flexDirection: "column", children: [hasCreated && (_jsxs(Box, { columnGap: 1, children: [_jsx(Text, { color: colors.secondary, children: "created at:" }), _jsxs(Box, { flexDirection: "column", children: [visibleCreated.map((path) => (_jsx(Text, { children: path }, path))), createdRemaining > 0 && _jsxs(Text, { color: colors.dimText, children: ["... and ", createdRemaining, " more created"] })] })] })), hasUpdated && (_jsxs(Box, { columnGap: 1, children: [_jsx(Text, { color: colors.secondary, children: "updated at:" }), _jsxs(Box, { flexDirection: "column", children: [visibleUpdated.map((path) => (_jsx(Text, { children: path }, path))), updatedRemaining > 0 && _jsxs(Text, { color: colors.dimText, children: ["... and ", updatedRemaining, " more updated"] })] })] }))] }));
|
|
15
30
|
};
|
|
@@ -14,12 +14,14 @@ export declare function truncateContent(content: string, maxLines: number, maxCh
|
|
|
14
14
|
truncatedContent: string;
|
|
15
15
|
};
|
|
16
16
|
interface ExecutionContentProps {
|
|
17
|
+
/** Bottom margin for this content section */
|
|
18
|
+
bottomMargin?: number;
|
|
17
19
|
/** The content to display */
|
|
18
20
|
content: string;
|
|
19
21
|
/** Whether this is error content */
|
|
20
22
|
isError?: boolean;
|
|
21
|
-
/** Maximum number of lines
|
|
22
|
-
maxLines
|
|
23
|
+
/** Maximum number of lines (rows) this component can use, including the "more lines" indicator */
|
|
24
|
+
maxLines?: number;
|
|
23
25
|
}
|
|
24
26
|
export declare const ExecutionContent: React.FC<ExecutionContentProps>;
|
|
25
27
|
export {};
|
|
@@ -6,15 +6,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
*/
|
|
7
7
|
import { Box, Text, useStdout } from 'ink';
|
|
8
8
|
import { useTheme } from '../../hooks/index.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*/
|
|
12
|
-
function getVisualLineCount(line, maxCharsPerLine) {
|
|
13
|
-
if (maxCharsPerLine <= 0 || line.length === 0) {
|
|
14
|
-
return 1;
|
|
15
|
-
}
|
|
16
|
-
return Math.ceil(line.length / maxCharsPerLine) || 1;
|
|
17
|
-
}
|
|
9
|
+
import { getVisualLineCount } from '../../utils/line.js';
|
|
10
|
+
const DEFAULT_MAX_LINES = 5;
|
|
18
11
|
/**
|
|
19
12
|
* Truncate content string to maxLines, returning truncated content and remaining line count.
|
|
20
13
|
* Accounts for line wrapping when maxCharsPerLine is provided.
|
|
@@ -49,19 +42,39 @@ export function truncateContent(content, maxLines, maxCharsPerLine) {
|
|
|
49
42
|
break;
|
|
50
43
|
}
|
|
51
44
|
}
|
|
45
|
+
// Replace last 3 characters of last line with "..." if truncated
|
|
46
|
+
let finalContent = truncatedLines.join('\n');
|
|
47
|
+
if (truncatedLines.length > 0 && totalVisualLines > visualLineCount) {
|
|
48
|
+
const lastLineIndex = truncatedLines.length - 1;
|
|
49
|
+
const lastLine = truncatedLines[lastLineIndex];
|
|
50
|
+
if (lastLine.length >= 3) {
|
|
51
|
+
truncatedLines[lastLineIndex] = lastLine.slice(0, -3) + '...';
|
|
52
|
+
finalContent = truncatedLines.join('\n');
|
|
53
|
+
}
|
|
54
|
+
else if (lastLine.length > 0) {
|
|
55
|
+
// If last line is shorter than 3 chars, just replace entirely with "..."
|
|
56
|
+
truncatedLines[lastLineIndex] = '...';
|
|
57
|
+
finalContent = truncatedLines.join('\n');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
52
60
|
return {
|
|
53
61
|
remainingLines: totalVisualLines - visualLineCount,
|
|
54
62
|
totalLines: totalVisualLines,
|
|
55
|
-
truncatedContent:
|
|
63
|
+
truncatedContent: finalContent,
|
|
56
64
|
};
|
|
57
65
|
}
|
|
58
|
-
export const ExecutionContent = ({ content, isError = false, maxLines }) => {
|
|
66
|
+
export const ExecutionContent = ({ bottomMargin = 1, content, isError = false, maxLines = DEFAULT_MAX_LINES, }) => {
|
|
59
67
|
const { theme: { colors }, } = useTheme();
|
|
60
68
|
const { stdout } = useStdout();
|
|
61
69
|
const contentWidth = (stdout?.columns ?? 80) - 4; // 4 is for padding
|
|
62
70
|
if (!content) {
|
|
63
71
|
return null;
|
|
64
72
|
}
|
|
65
|
-
|
|
66
|
-
|
|
73
|
+
// First check if content would overflow
|
|
74
|
+
const { totalLines } = truncateContent(content, maxLines, contentWidth);
|
|
75
|
+
const hasOverflow = totalLines > maxLines;
|
|
76
|
+
// If overflow, reserve 1 line for indicator, show (maxLines - 1) lines of content
|
|
77
|
+
const effectiveMaxLines = hasOverflow ? maxLines - 1 : maxLines;
|
|
78
|
+
const { remainingLines, truncatedContent } = truncateContent(content, effectiveMaxLines, contentWidth);
|
|
79
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: bottomMargin, children: [_jsx(Text, { color: isError ? colors.errorText : colors.text, children: truncatedContent }), remainingLines > 0 && _jsxs(Text, { color: colors.dimText, children: ["\u2195 ", remainingLines, " more lines"] })] }));
|
|
67
80
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* Execution Input Component
|
|
4
4
|
*
|
|
@@ -11,6 +11,6 @@ export const ExecutionInput = ({ input }) => {
|
|
|
11
11
|
const { theme: { colors }, } = useTheme();
|
|
12
12
|
const { stdout } = useStdout();
|
|
13
13
|
const contentWidth = (stdout?.columns ?? 80) - 8; // 8 is for padding
|
|
14
|
-
const {
|
|
15
|
-
return (_jsx(Box, { borderColor: colors.border, borderStyle: "single", flexDirection: "column", children:
|
|
14
|
+
const { truncatedContent } = truncateContent(input, 1, contentWidth);
|
|
15
|
+
return (_jsx(Box, { borderColor: colors.border, borderStyle: "single", flexDirection: "column", children: _jsx(Text, { children: truncatedContent }) }));
|
|
16
16
|
};
|
|
@@ -12,8 +12,8 @@ interface ProgressItem {
|
|
|
12
12
|
toolCallName: string;
|
|
13
13
|
}
|
|
14
14
|
interface ExecutionProgressProps {
|
|
15
|
-
/** Maximum number of
|
|
16
|
-
|
|
15
|
+
/** Maximum number of lines (rows) this component can use, including hint line (default: 3) */
|
|
16
|
+
maxLines?: number;
|
|
17
17
|
/** Array of progress items */
|
|
18
18
|
progress: ProgressItem[];
|
|
19
19
|
}
|
|
@@ -8,14 +8,16 @@ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
|
8
8
|
import { Box, Text } from 'ink';
|
|
9
9
|
import Spinner from 'ink-spinner';
|
|
10
10
|
import { useTheme } from '../../hooks/index.js';
|
|
11
|
-
/** Default maximum number of
|
|
12
|
-
const
|
|
13
|
-
export const ExecutionProgress = ({
|
|
11
|
+
/** Default maximum number of lines (rows) for progress display */
|
|
12
|
+
const DEFAULT_MAX_LINES = 3;
|
|
13
|
+
export const ExecutionProgress = ({ maxLines = DEFAULT_MAX_LINES, progress }) => {
|
|
14
14
|
const { theme: { colors }, } = useTheme();
|
|
15
15
|
if (!progress || progress.length === 0) {
|
|
16
16
|
return null;
|
|
17
17
|
}
|
|
18
|
-
const hasMore = progress.length >
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const hasMore = progress.length > maxLines;
|
|
19
|
+
// If there's overflow, reserve 1 line for hint, show (maxLines - 1) items
|
|
20
|
+
const visibleCount = hasMore ? maxLines - 1 : maxLines;
|
|
21
|
+
const visibleItems = progress.slice(-visibleCount);
|
|
22
|
+
return (_jsxs(Box, { flexDirection: "column", children: [hasMore && _jsxs(Text, { color: colors.dimText, children: ["... and ", progress.length - visibleCount, " more tools used"] }), visibleItems.map((item) => (_jsxs(Box, { children: [item.status === 'completed' && _jsx(Text, { color: colors.primary, children: "\u2713 " }), item.status === 'running' && (_jsxs(Text, { color: colors.dimText, children: [_jsx(Spinner, { type: "dots" }), ' '] })), item.status === 'failed' && _jsx(Text, { color: colors.errorText, children: "\u2717 " }), _jsx(Text, { color: colors.dimText, children: item.toolCallName })] }, item.id)))] }));
|
|
21
23
|
};
|
|
@@ -4,14 +4,13 @@
|
|
|
4
4
|
* Displays a single activity log entry with header, input, progress, content, and changes.
|
|
5
5
|
*/
|
|
6
6
|
import React from 'react';
|
|
7
|
+
import type { MessageItemHeights } from '../../hooks/index.js';
|
|
7
8
|
import type { ActivityLog } from '../../types.js';
|
|
8
9
|
interface LogItemProps {
|
|
10
|
+
/** Dynamic heights based on terminal breakpoint */
|
|
11
|
+
heights: MessageItemHeights;
|
|
9
12
|
/** The activity log to display */
|
|
10
13
|
log: ActivityLog;
|
|
11
|
-
/** Maximum number of content lines before truncation */
|
|
12
|
-
maxContentLines: number;
|
|
13
|
-
/** Maximum number of progress items to show (default: 3) */
|
|
14
|
-
maxProgressItems?: number;
|
|
15
14
|
}
|
|
16
15
|
export declare const LogItem: React.FC<LogItemProps>;
|
|
17
16
|
export {};
|
|
@@ -11,15 +11,12 @@ import { ExecutionContent } from './execution-content.js';
|
|
|
11
11
|
import { ExecutionInput } from './execution-input.js';
|
|
12
12
|
import { ExecutionProgress } from './execution-progress.js';
|
|
13
13
|
import { ExecutionStatus } from './execution-status.js';
|
|
14
|
-
|
|
15
|
-
const DEFAULT_MAX_PROGRESS_ITEMS = 3;
|
|
16
|
-
export const LogItem = ({ log, maxContentLines, maxProgressItems = DEFAULT_MAX_PROGRESS_ITEMS, }) => {
|
|
14
|
+
export const LogItem = ({ heights, log }) => {
|
|
17
15
|
const { theme: { colors }, } = useTheme();
|
|
18
16
|
// Format timestamp as local time HH:MM:SS
|
|
19
17
|
const hours = log.timestamp.getHours().toString().padStart(2, '0');
|
|
20
18
|
const minutes = log.timestamp.getMinutes().toString().padStart(2, '0');
|
|
21
19
|
const seconds = log.timestamp.getSeconds().toString().padStart(2, '0');
|
|
22
20
|
const displayTime = `${hours}:${minutes}:${seconds}`;
|
|
23
|
-
|
|
24
|
-
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, width: "100%", children: [_jsxs(Box, { children: [_jsxs(Text, { color: log.type === 'curate' ? colors.curateCommand : colors.queryCommand, children: ["[", log.type, "] "] }), _jsxs(Text, { color: colors.dimText, children: ["@", log.source ?? 'system'] }), _jsx(Spacer, {}), _jsxs(Text, { color: colors.dimText, children: ["[", displayTime, "]"] })] }), _jsx(ExecutionInput, { input: log.input }), _jsxs(Box, { flexDirection: "column", children: [log.progress && _jsx(ExecutionProgress, { maxItems: maxProgressItems, progress: log.progress }), _jsx(ExecutionStatus, { status: log.status })] }), (log.status === 'failed' || log.status === 'completed') && (_jsx(ExecutionContent, { content: log.content ?? '', isError: log.status === 'failed', maxLines: maxContentLines - displayTools })), log.status === 'completed' && _jsx(ExecutionChanges, { created: log.changes.created, updated: log.changes.updated })] }));
|
|
21
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, width: "100%", children: [_jsxs(Box, { children: [_jsxs(Text, { color: log.type === 'curate' ? colors.curateCommand : colors.queryCommand, children: ["[", log.type, "] "] }), _jsxs(Text, { color: colors.dimText, children: ["@", log.source ?? 'system'] }), _jsx(Spacer, {}), _jsxs(Text, { color: colors.dimText, children: ["[", displayTime, "]"] })] }), _jsx(ExecutionInput, { input: log.input }), _jsxs(Box, { flexDirection: "column", children: [log.progress && _jsx(ExecutionProgress, { maxLines: heights.maxProgressItems, progress: log.progress }), _jsx(ExecutionStatus, { status: log.status })] }), (log.status === 'failed' || log.status === 'completed') && (_jsx(ExecutionContent, { bottomMargin: heights.contentBottomMargin, content: log.content ?? '', isError: log.status === 'failed', maxLines: heights.maxContentLines })), log.status === 'completed' && (_jsx(ExecutionChanges, { created: log.changes.created, maxChanges: heights.maxChanges, updated: log.changes.updated }))] }));
|
|
25
22
|
};
|
|
@@ -3,10 +3,15 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
* Footer Component - Dynamic based on active tab
|
|
4
4
|
*/
|
|
5
5
|
import { Box, Text } from 'ink';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { useMemo } from 'react';
|
|
7
|
+
import { useMode } from '../contexts/mode-context.js';
|
|
8
|
+
import { useOnboarding } from '../contexts/onboarding-context.js';
|
|
9
|
+
import { useTheme } from '../contexts/theme-context.js';
|
|
8
10
|
export const Footer = () => {
|
|
9
11
|
const { shortcuts } = useMode();
|
|
10
|
-
const {
|
|
11
|
-
|
|
12
|
+
const { shouldShowOnboarding } = useOnboarding();
|
|
13
|
+
const { theme: { colors }, } = useTheme();
|
|
14
|
+
// Filter out 'tab' shortcut during onboarding (tab switching is disabled)
|
|
15
|
+
const visibleShortcuts = useMemo(() => (shouldShowOnboarding ? shortcuts.filter((s) => s.key !== 'tab') : shortcuts), [shortcuts, shouldShowOnboarding]);
|
|
16
|
+
return (_jsx(Box, { gap: 1, paddingX: 1, width: "100%", children: visibleShortcuts.map((shortcut, index) => (_jsxs(Box, { children: [index > 0 && _jsx(Text, { color: colors.dimText, children: " \u2022 " }), _jsx(Text, { color: colors.text, children: shortcut.key }), _jsxs(Text, { color: colors.dimText, children: [" ", shortcut.description] })] }, shortcut.key))) }));
|
|
12
17
|
};
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
* - Queue stats (pending/processing)
|
|
8
8
|
*/
|
|
9
9
|
import React from 'react';
|
|
10
|
-
import
|
|
10
|
+
import { TaskStats } from '../types/ui.js';
|
|
11
11
|
interface HeaderProps {
|
|
12
12
|
compact?: boolean;
|
|
13
13
|
connectedAgent?: string;
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
showTransportStats?: boolean;
|
|
15
|
+
taskStats?: TaskStats;
|
|
16
16
|
}
|
|
17
17
|
export declare const Header: React.FC<HeaderProps>;
|
|
18
18
|
export {};
|
|
@@ -9,10 +9,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
*/
|
|
10
10
|
import { Box, Spacer, Text } from 'ink';
|
|
11
11
|
import { useServices } from '../contexts/index.js';
|
|
12
|
-
import { useTheme } from '../contexts/
|
|
12
|
+
import { useTheme } from '../contexts/theme-context.js';
|
|
13
|
+
import { useTerminalBreakpoint } from '../hooks/use-terminal-breakpoint.js';
|
|
13
14
|
import { Logo } from './logo.js';
|
|
14
|
-
export const Header = ({ compact, connectedAgent,
|
|
15
|
+
export const Header = ({ compact, connectedAgent, showTransportStats, taskStats: transportStats }) => {
|
|
15
16
|
const { version } = useServices();
|
|
16
17
|
const { theme } = useTheme();
|
|
17
|
-
|
|
18
|
+
const { breakpoint } = useTerminalBreakpoint();
|
|
19
|
+
return (_jsxs(Box, { flexDirection: "column", width: "100%", children: [_jsx(Logo, { compact: compact, version: version }), _jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Box, { gap: 2, children: [connectedAgent && (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: "\u25CF " }), _jsx(Text, { color: "gray", children: connectedAgent })] })), breakpoint === "compact" && (_jsx(Text, { color: theme.colors.warning, children: "Terminal too small - expand for better experience" }))] }), showTransportStats && (_jsxs(Box, { paddingRight: 1, children: [_jsx(Spacer, {}), _jsx(Text, { children: "~ in queue: " }), _jsx(Text, { color: theme.colors.warning, children: transportStats?.created ?? 0 }), _jsx(Text, { children: " | running: " }), _jsx(Text, { color: theme.colors.primary, children: transportStats?.started ?? 0 })] }))] })] }));
|
|
18
20
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TUI Components
|
|
3
3
|
*/
|
|
4
|
+
export { CommandDetails } from './command-details.js';
|
|
4
5
|
export { EnterPrompt } from './enter-prompt.js';
|
|
5
6
|
export { ExecutionChanges, ExecutionContent, ExecutionInput, ExecutionProgress, ExecutionStatus, LogItem, truncateContent, } from './execution/index.js';
|
|
6
7
|
export { Footer } from './footer.js';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TUI Components
|
|
3
3
|
*/
|
|
4
|
+
export { CommandDetails } from './command-details.js';
|
|
4
5
|
export { EnterPrompt } from './enter-prompt.js';
|
|
5
6
|
export { ExecutionChanges, ExecutionContent, ExecutionInput, ExecutionProgress, ExecutionStatus, LogItem, truncateContent, } from './execution/index.js';
|
|
6
7
|
export { Footer } from './footer.js';
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyable Prompt Component
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Renders a customizable button that copies text to clipboard on ctrl+y.
|
|
5
5
|
* Shows visual feedback when copied.
|
|
6
6
|
*/
|
|
7
7
|
import React from 'react';
|
|
8
8
|
interface CopyablePromptProps {
|
|
9
|
+
/** Button label/content to display */
|
|
10
|
+
buttonLabel?: string;
|
|
9
11
|
/** Whether keyboard input is active for this component */
|
|
10
12
|
isActive?: boolean;
|
|
11
|
-
/** The
|
|
12
|
-
|
|
13
|
+
/** The text to copy to clipboard */
|
|
14
|
+
textToCopy: string;
|
|
13
15
|
}
|
|
14
16
|
export declare const CopyablePrompt: React.FC<CopyablePromptProps>;
|
|
15
17
|
export {};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { jsx as _jsx
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* Copyable Prompt Component
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Renders a customizable button that copies text to clipboard on ctrl+y.
|
|
6
6
|
* Shows visual feedback when copied.
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
8
|
+
import { Text, useInput } from 'ink';
|
|
9
9
|
import { execSync } from 'node:child_process';
|
|
10
10
|
import { platform } from 'node:os';
|
|
11
11
|
import { useCallback, useEffect, useState } from 'react';
|
|
@@ -37,10 +37,9 @@ function copyToClipboard(text) {
|
|
|
37
37
|
return false;
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
export const CopyablePrompt = ({ isActive = true,
|
|
40
|
+
export const CopyablePrompt = ({ buttonLabel = 'Press ctrl+y to copy', isActive = true, textToCopy, }) => {
|
|
41
41
|
const { theme: { colors }, } = useTheme();
|
|
42
42
|
const [copied, setCopied] = useState(false);
|
|
43
|
-
// Reset copied state after 2 seconds
|
|
44
43
|
useEffect(() => {
|
|
45
44
|
if (copied) {
|
|
46
45
|
const timer = setTimeout(() => {
|
|
@@ -50,16 +49,16 @@ export const CopyablePrompt = ({ isActive = true, prompt }) => {
|
|
|
50
49
|
}
|
|
51
50
|
}, [copied]);
|
|
52
51
|
const handleCopy = useCallback(() => {
|
|
53
|
-
const success = copyToClipboard(
|
|
52
|
+
const success = copyToClipboard(textToCopy);
|
|
54
53
|
if (success) {
|
|
55
54
|
setCopied(true);
|
|
56
55
|
}
|
|
57
|
-
}, [
|
|
56
|
+
}, [textToCopy]);
|
|
58
57
|
useInput((input, key) => {
|
|
59
58
|
// ctrl+y to copy
|
|
60
59
|
if (key.ctrl && input === 'y') {
|
|
61
60
|
handleCopy();
|
|
62
61
|
}
|
|
63
62
|
}, { isActive });
|
|
64
|
-
return (
|
|
63
|
+
return (_jsx(Text, { color: copied ? colors.primary : colors.dimText, children: copied ? "Copied!" : buttonLabel }));
|
|
65
64
|
};
|