byterover-cli 0.4.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -9
- package/dist/commands/curate.d.ts +1 -3
- package/dist/commands/curate.js +14 -51
- package/dist/commands/main.d.ts +8 -0
- package/dist/commands/main.js +29 -8
- package/dist/commands/query.d.ts +1 -3
- package/dist/commands/query.js +8 -35
- package/dist/config/context-tree-domains.d.ts +5 -0
- package/dist/config/context-tree-domains.js +6 -1
- package/dist/config/environment.js +9 -9
- package/dist/constants.d.ts +14 -0
- package/dist/constants.js +18 -0
- package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
- package/dist/core/domain/cipher/agent/agent-info.js +143 -0
- package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
- package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
- package/dist/core/domain/cipher/agent/index.d.ts +4 -1
- package/dist/core/domain/cipher/agent/index.js +7 -1
- package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
- package/dist/core/domain/cipher/agent-events/types.js +11 -0
- package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
- package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
- package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
- package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
- package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
- package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
- package/dist/core/domain/cipher/llm/error-codes.js +51 -0
- package/dist/core/domain/cipher/llm/index.d.ts +9 -0
- package/dist/core/domain/cipher/llm/index.js +13 -0
- package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
- package/dist/core/domain/cipher/llm/registry.js +244 -0
- package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
- package/dist/core/domain/cipher/llm/schemas.js +151 -0
- package/dist/core/domain/cipher/llm/types.d.ts +121 -0
- package/dist/core/domain/cipher/llm/types.js +60 -0
- package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
- package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
- package/dist/core/domain/cipher/streaming/types.js +16 -0
- package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
- package/dist/core/domain/cipher/todos/types.d.ts +34 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
- package/dist/core/domain/cipher/tools/constants.js +5 -2
- package/dist/core/domain/cipher/tools/types.d.ts +31 -0
- package/dist/core/domain/errors/connection-error.d.ts +33 -0
- package/dist/core/domain/errors/connection-error.js +54 -0
- package/dist/core/domain/errors/core-process-error.d.ts +27 -0
- package/dist/core/domain/errors/core-process-error.js +43 -0
- package/dist/core/domain/errors/task-error.d.ts +64 -0
- package/dist/core/domain/errors/task-error.js +116 -0
- package/dist/core/domain/errors/transport-error.d.ts +72 -0
- package/dist/core/domain/errors/transport-error.js +114 -0
- package/dist/core/domain/instance/index.d.ts +1 -0
- package/dist/core/domain/instance/index.js +1 -0
- package/dist/core/domain/instance/types.d.ts +57 -0
- package/dist/core/domain/instance/types.js +72 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
- package/dist/core/domain/knowledge/directory-manager.js +31 -0
- package/dist/core/domain/transport/index.d.ts +2 -0
- package/dist/core/domain/transport/index.js +2 -0
- package/dist/core/domain/transport/schemas.d.ts +1149 -0
- package/dist/core/domain/transport/schemas.js +554 -0
- package/dist/core/domain/transport/types.d.ts +67 -0
- package/dist/core/domain/transport/types.js +7 -0
- package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
- package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
- package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
- package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
- package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
- package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
- package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
- package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
- package/dist/core/interfaces/cipher/index.d.ts +35 -0
- package/dist/core/interfaces/cipher/index.js +11 -0
- package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
- package/dist/core/interfaces/cipher/message-factory.js +252 -0
- package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
- package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
- package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
- package/dist/core/interfaces/cipher/message-types.js +6 -0
- package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
- package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
- package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
- package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
- package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
- package/dist/core/interfaces/executor/i-query-executor.js +1 -0
- package/dist/core/interfaces/executor/index.d.ts +2 -0
- package/dist/core/interfaces/executor/index.js +2 -0
- package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
- package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
- package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
- package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
- package/dist/core/interfaces/instance/index.d.ts +2 -0
- package/dist/core/interfaces/instance/index.js +2 -0
- package/dist/core/interfaces/noop-implementations.d.ts +53 -0
- package/dist/core/interfaces/noop-implementations.js +62 -0
- package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
- package/dist/core/interfaces/transport/i-transport-client.js +1 -0
- package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
- package/dist/core/interfaces/transport/i-transport-server.js +1 -0
- package/dist/core/interfaces/transport/index.d.ts +2 -0
- package/dist/core/interfaces/transport/index.js +2 -0
- package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
- package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
- package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
- package/dist/infra/cipher/agent/agent-error.js +79 -0
- package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
- package/dist/infra/cipher/agent/agent-schemas.js +97 -0
- package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
- package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
- package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
- package/dist/infra/cipher/agent/base-agent.js +240 -0
- package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
- package/dist/infra/cipher/agent/cipher-agent.js +546 -0
- package/dist/infra/cipher/agent/index.d.ts +22 -0
- package/dist/infra/cipher/agent/index.js +24 -0
- package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
- package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
- package/dist/infra/cipher/agent/types.d.ts +35 -0
- package/dist/infra/cipher/agent/types.js +1 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
- package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
- package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
- package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
- package/dist/infra/cipher/consumer/consumer-service.js +1 -0
- package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
- package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
- package/dist/infra/cipher/consumer/index.d.ts +1 -1
- package/dist/infra/cipher/consumer/index.js +2 -1
- package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
- package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
- package/dist/infra/cipher/file-system/binary-utils.js +164 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
- package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
- package/dist/infra/cipher/file-system/file-system-service.js +327 -36
- package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
- package/dist/infra/cipher/file-system/path-validator.js +111 -6
- package/dist/infra/cipher/interactive-loop.js +41 -33
- package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
- package/dist/infra/cipher/llm/capability-cache.js +125 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
- package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
- package/dist/infra/cipher/llm/context/compression/index.js +6 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
- package/dist/infra/cipher/llm/context/context-manager.js +129 -0
- package/dist/infra/cipher/llm/context/utils.js +17 -4
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
- package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
- package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
- package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
- package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
- package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
- package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
- package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
- package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
- package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
- package/dist/infra/cipher/llm/sanitization/index.js +13 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
- package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
- package/dist/infra/cipher/llm/stream-processor.js +276 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
- package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
- package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
- package/dist/infra/cipher/process/command-validator.d.ts +23 -0
- package/dist/infra/cipher/process/command-validator.js +75 -0
- package/dist/infra/cipher/process/path-utils.d.ts +66 -0
- package/dist/infra/cipher/process/path-utils.js +94 -0
- package/dist/infra/cipher/process/process-service.d.ts +32 -0
- package/dist/infra/cipher/process/process-service.js +98 -17
- package/dist/infra/cipher/session/chat-session.d.ts +56 -7
- package/dist/infra/cipher/session/chat-session.js +163 -13
- package/dist/infra/cipher/session/index.d.ts +1 -0
- package/dist/infra/cipher/session/index.js +2 -0
- package/dist/infra/cipher/session/message-queue.d.ts +65 -0
- package/dist/infra/cipher/session/message-queue.js +90 -0
- package/dist/infra/cipher/session/session-manager.d.ts +106 -5
- package/dist/infra/cipher/session/session-manager.js +254 -7
- package/dist/infra/cipher/session/session-status.d.ts +137 -0
- package/dist/infra/cipher/session/session-status.js +184 -0
- package/dist/infra/cipher/session/title-generator.d.ts +8 -0
- package/dist/infra/cipher/session/title-generator.js +31 -0
- package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
- package/dist/infra/cipher/storage/message-storage-service.js +300 -54
- package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
- package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
- package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
- package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
- package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
- package/dist/infra/cipher/system-prompt/schemas.js +94 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
- package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
- package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
- package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
- package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
- package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
- package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
- package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
- package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
- package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
- package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
- package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
- package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
- package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
- package/dist/infra/cipher/tools/index.d.ts +1 -1
- package/dist/infra/cipher/tools/index.js +1 -1
- package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
- package/dist/infra/cipher/tools/plugins/index.js +2 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
- package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
- package/dist/infra/cipher/tools/streaming/index.js +1 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
- package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
- package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
- package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
- package/dist/infra/cipher/tools/tool-manager.js +107 -11
- package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
- package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
- package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
- package/dist/infra/cipher/tools/tool-provider.js +81 -25
- package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
- package/dist/infra/cipher/tools/tool-registry.js +58 -16
- package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
- package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
- package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
- package/dist/infra/context-tree/path-utils.d.ts +7 -0
- package/dist/infra/context-tree/path-utils.js +7 -0
- package/dist/infra/core/executors/curate-executor.d.ts +35 -0
- package/dist/infra/core/executors/curate-executor.js +123 -0
- package/dist/infra/core/executors/index.d.ts +2 -0
- package/dist/infra/core/executors/index.js +2 -0
- package/dist/infra/core/executors/query-executor.d.ts +23 -0
- package/dist/infra/core/executors/query-executor.js +51 -0
- package/dist/infra/core/task-processor.d.ts +81 -0
- package/dist/infra/core/task-processor.js +115 -0
- package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
- package/dist/infra/instance/file-instance-discovery.js +84 -0
- package/dist/infra/instance/file-instance-manager.d.ts +46 -0
- package/dist/infra/instance/file-instance-manager.js +123 -0
- package/dist/infra/instance/index.d.ts +3 -0
- package/dist/infra/instance/index.js +3 -0
- package/dist/infra/instance/process-utils.d.ts +14 -0
- package/dist/infra/instance/process-utils.js +39 -0
- package/dist/infra/process/agent-worker.d.ts +20 -0
- package/dist/infra/process/agent-worker.js +602 -0
- package/dist/infra/process/index.d.ts +12 -0
- package/dist/infra/process/index.js +11 -0
- package/dist/infra/process/ipc-types.d.ts +55 -0
- package/dist/infra/process/ipc-types.js +12 -0
- package/dist/infra/process/process-manager.d.ts +154 -0
- package/dist/infra/process/process-manager.js +471 -0
- package/dist/infra/process/task-queue-manager.d.ts +123 -0
- package/dist/infra/process/task-queue-manager.js +226 -0
- package/dist/infra/process/transport-handlers.d.ts +124 -0
- package/dist/infra/process/transport-handlers.js +348 -0
- package/dist/infra/process/transport-worker.d.ts +20 -0
- package/dist/infra/process/transport-worker.js +168 -0
- package/dist/infra/repl/commands/curate-command.js +0 -5
- package/dist/infra/repl/commands/query-command.js +0 -3
- package/dist/infra/repl/repl-startup.d.ts +4 -0
- package/dist/infra/repl/repl-startup.js +8 -1
- package/dist/infra/repl/transport-client-helper.d.ts +9 -0
- package/dist/infra/repl/transport-client-helper.js +96 -0
- package/dist/infra/transport/index.d.ts +4 -0
- package/dist/infra/transport/index.js +4 -0
- package/dist/infra/transport/port-utils.d.ts +42 -0
- package/dist/infra/transport/port-utils.js +84 -0
- package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
- package/dist/infra/transport/socket-io-transport-client.js +270 -0
- package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
- package/dist/infra/transport/socket-io-transport-server.js +207 -0
- package/dist/infra/transport/transport-client-factory.d.ts +76 -0
- package/dist/infra/transport/transport-client-factory.js +168 -0
- package/dist/infra/transport/transport-factory.d.ts +33 -0
- package/dist/infra/transport/transport-factory.js +59 -0
- package/dist/infra/usecase/curate-use-case.d.ts +8 -55
- package/dist/infra/usecase/curate-use-case.js +71 -262
- package/dist/infra/usecase/init-use-case.js +3 -2
- package/dist/infra/usecase/query-use-case.d.ts +18 -45
- package/dist/infra/usecase/query-use-case.js +250 -326
- package/dist/infra/usecase/status-use-case.js +1 -1
- package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
- package/dist/resources/prompts/explore.yml +78 -0
- package/dist/resources/prompts/plan.yml +114 -0
- package/dist/resources/prompts/reflection.yml +1 -1
- package/dist/resources/prompts/system-prompt.yml +15 -8
- package/dist/resources/prompts/tool-outputs.yml +0 -5
- package/dist/resources/tools/bash_exec.txt +98 -0
- package/dist/resources/tools/bash_output.txt +40 -0
- package/dist/resources/tools/batch.txt +28 -0
- package/dist/resources/tools/create_knowledge_topic.txt +23 -0
- package/dist/resources/tools/curate.txt +22 -0
- package/dist/resources/tools/delete_memory.txt +1 -0
- package/dist/resources/tools/detect_domains.txt +11 -0
- package/dist/resources/tools/edit_file.txt +1 -0
- package/dist/resources/tools/edit_memory.txt +1 -0
- package/dist/resources/tools/glob_files.txt +20 -0
- package/dist/resources/tools/grep_content.txt +18 -0
- package/dist/resources/tools/kill_process.txt +16 -0
- package/dist/resources/tools/list_directory.txt +16 -0
- package/dist/resources/tools/list_memories.txt +1 -0
- package/dist/resources/tools/read_file.txt +31 -0
- package/dist/resources/tools/read_memory.txt +1 -0
- package/dist/resources/tools/read_todos.txt +17 -0
- package/dist/resources/tools/search_history.txt +1 -0
- package/dist/resources/tools/task.txt +23 -0
- package/dist/resources/tools/write_file.txt +1 -0
- package/dist/resources/tools/write_memory.txt +1 -0
- package/dist/resources/tools/write_todos.txt +29 -0
- package/dist/tui/app.js +9 -13
- package/dist/tui/components/command-details.d.ts +14 -0
- package/dist/tui/components/command-details.js +35 -0
- package/dist/tui/components/execution/execution-changes.d.ts +5 -0
- package/dist/tui/components/execution/execution-changes.js +19 -4
- package/dist/tui/components/execution/execution-content.d.ts +4 -2
- package/dist/tui/components/execution/execution-content.js +26 -13
- package/dist/tui/components/execution/execution-input.js +3 -3
- package/dist/tui/components/execution/execution-progress.d.ts +2 -2
- package/dist/tui/components/execution/execution-progress.js +8 -6
- package/dist/tui/components/execution/log-item.d.ts +3 -4
- package/dist/tui/components/execution/log-item.js +2 -5
- package/dist/tui/components/footer.js +9 -4
- package/dist/tui/components/header.d.ts +3 -3
- package/dist/tui/components/header.js +5 -3
- package/dist/tui/components/index.d.ts +1 -0
- package/dist/tui/components/index.js +1 -0
- package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
- package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
- package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
- package/dist/tui/components/scrollable-list.js +12 -10
- package/dist/tui/components/suggestions.js +39 -41
- package/dist/tui/components/tab-bar.d.ts +2 -1
- package/dist/tui/components/tab-bar.js +3 -4
- package/dist/tui/constants.d.ts +0 -5
- package/dist/tui/constants.js +0 -5
- package/dist/tui/contexts/auth-context.js +9 -2
- package/dist/tui/contexts/{use-commands.js → commands-context.js} +3 -3
- package/dist/tui/contexts/index.d.ts +6 -1
- package/dist/tui/contexts/index.js +6 -1
- package/dist/tui/contexts/onboarding-context.d.ts +1 -1
- package/dist/tui/contexts/onboarding-context.js +9 -9
- package/dist/tui/contexts/tasks-context.d.ts +84 -0
- package/dist/tui/contexts/tasks-context.js +218 -0
- package/dist/tui/contexts/transport-context.d.ts +29 -0
- package/dist/tui/contexts/transport-context.js +82 -0
- package/dist/tui/hooks/index.d.ts +10 -6
- package/dist/tui/hooks/index.js +7 -6
- package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
- package/dist/tui/hooks/use-activity-logs.js +87 -34
- package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
- package/dist/tui/hooks/use-auth-polling.js +104 -0
- package/dist/tui/hooks/use-slash-command-processor.js +0 -1
- package/dist/tui/hooks/use-slash-completion.js +1 -1
- package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
- package/dist/tui/hooks/use-tab-navigation.js +16 -7
- package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
- package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
- package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
- package/dist/tui/hooks/use-ui-heights.js +88 -0
- package/dist/tui/providers/app-providers.js +2 -6
- package/dist/tui/types/commands.d.ts +0 -26
- package/dist/tui/types/index.d.ts +1 -1
- package/dist/tui/types/ui.d.ts +9 -4
- package/dist/tui/utils/line.d.ts +11 -0
- package/dist/tui/utils/line.js +16 -0
- package/dist/tui/utils/log.d.ts +27 -0
- package/dist/tui/utils/log.js +114 -0
- package/dist/tui/views/command-view.d.ts +7 -0
- package/dist/tui/views/command-view.js +103 -80
- package/dist/tui/views/login-view.js +7 -4
- package/dist/tui/views/logs-view.d.ts +13 -0
- package/dist/tui/views/logs-view.js +27 -52
- package/dist/utils/connection-error-handler.d.ts +16 -0
- package/dist/utils/connection-error-handler.js +49 -0
- package/dist/utils/crash-log.d.ts +14 -0
- package/dist/utils/crash-log.js +19 -0
- package/dist/utils/file-helpers.d.ts +14 -0
- package/dist/utils/file-helpers.js +21 -0
- package/dist/utils/global-logs-path.d.ts +11 -0
- package/dist/utils/global-logs-path.js +37 -0
- package/dist/utils/process-logger.d.ts +53 -0
- package/dist/utils/process-logger.js +253 -0
- package/dist/utils/sandbox-detector.d.ts +31 -0
- package/dist/utils/sandbox-detector.js +122 -0
- package/oclif.manifest.json +10 -198
- package/package.json +5 -1
- package/dist/commands/cipher-agent/run.d.ts +0 -142
- package/dist/commands/cipher-agent/run.js +0 -555
- package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
- package/dist/commands/cipher-agent/set-prompt.js +0 -58
- package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
- package/dist/commands/cipher-agent/show-prompt.js +0 -53
- package/dist/commands/foo.d.ts +0 -14
- package/dist/commands/foo.js +0 -66
- package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
- package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
- package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
- package/dist/infra/cipher/cipher-agent.d.ts +0 -182
- package/dist/infra/cipher/cipher-agent.js +0 -317
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
- package/dist/resources/prompts/modes/autonomous.yml +0 -9
- package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
- package/dist/tui/contexts/consumer.d.ts +0 -31
- package/dist/tui/contexts/consumer.js +0 -56
- package/dist/tui/hooks/use-consumer.d.ts +0 -12
- package/dist/tui/hooks/use-consumer.js +0 -50
- package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
- package/dist/tui/hooks/use-queue-polling.js +0 -90
- /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
- /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blob reference resolver for lazy media evaluation.
|
|
3
|
+
*
|
|
4
|
+
* This service resolves @blob:id references in message content to actual data
|
|
5
|
+
* at format-time (when sending to LLM), enabling lazy evaluation of large media.
|
|
6
|
+
*
|
|
7
|
+
* Key features:
|
|
8
|
+
* - Lazy expansion: Blob references only resolved when needed
|
|
9
|
+
* - MIME type filtering: Exclude unsupported media types
|
|
10
|
+
* - Placeholder generation: Replace filtered media with descriptive placeholders
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
import { BLOB_REF_PATTERN, containsBlobReferences, extractBlobId, generateMediaPlaceholder, matchesAnyMimePattern, parseBlobReferences, } from './blob-reference-utils.js';
|
|
14
|
+
/**
|
|
15
|
+
* Blob reference resolver.
|
|
16
|
+
*
|
|
17
|
+
* Resolves @blob:id references to actual content at format-time.
|
|
18
|
+
*/
|
|
19
|
+
export class BlobReferenceResolver {
|
|
20
|
+
blobStorage;
|
|
21
|
+
constructor(blobStorage) {
|
|
22
|
+
this.blobStorage = blobStorage;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Expand blob references in message content.
|
|
26
|
+
*
|
|
27
|
+
* Processes an array of message parts and resolves any @blob:id references
|
|
28
|
+
* to actual content. Supports blob refs in:
|
|
29
|
+
* - TextPart.text (inline references)
|
|
30
|
+
* - ImagePart.image (blob ref instead of base64)
|
|
31
|
+
* - FilePart.data (blob ref instead of base64)
|
|
32
|
+
*
|
|
33
|
+
* @param content - Array of message parts to expand
|
|
34
|
+
* @param options - Resolution options
|
|
35
|
+
* @returns Array of message parts with blob refs resolved
|
|
36
|
+
*/
|
|
37
|
+
async expandBlobReferences(content, options) {
|
|
38
|
+
const expanded = [];
|
|
39
|
+
const expandedParts = await Promise.all(content.map((part) => this.expandPart(part, options)));
|
|
40
|
+
for (const parts of expandedParts) {
|
|
41
|
+
expanded.push(...parts);
|
|
42
|
+
}
|
|
43
|
+
return expanded;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get all blob IDs referenced in content.
|
|
47
|
+
*/
|
|
48
|
+
getBlobIds(content) {
|
|
49
|
+
const ids = new Set();
|
|
50
|
+
for (const part of content) {
|
|
51
|
+
if (part.type === 'text') {
|
|
52
|
+
for (const id of parseBlobReferences(part.text)) {
|
|
53
|
+
ids.add(id);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (part.type === 'image' && typeof part.image === 'string') {
|
|
57
|
+
const id = extractBlobId(part.image);
|
|
58
|
+
if (id)
|
|
59
|
+
ids.add(id);
|
|
60
|
+
}
|
|
61
|
+
if (part.type === 'file' && typeof part.data === 'string') {
|
|
62
|
+
const id = extractBlobId(part.data);
|
|
63
|
+
if (id)
|
|
64
|
+
ids.add(id);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return [...ids];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if content contains any blob references.
|
|
71
|
+
*
|
|
72
|
+
* Useful for determining if expansion is needed before calling expandBlobReferences.
|
|
73
|
+
*/
|
|
74
|
+
hasAnyBlobReferences(content) {
|
|
75
|
+
for (const part of content) {
|
|
76
|
+
if (part.type === 'text' && containsBlobReferences(part.text)) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
if (part.type === 'image' && typeof part.image === 'string' && part.image.startsWith('@blob:')) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
if (part.type === 'file' && typeof part.data === 'string' && part.data.startsWith('@blob:')) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Prefetch blobs for a set of message parts.
|
|
90
|
+
*
|
|
91
|
+
* Useful for warming the cache before expansion.
|
|
92
|
+
*/
|
|
93
|
+
async prefetchBlobs(content) {
|
|
94
|
+
const ids = this.getBlobIds(content);
|
|
95
|
+
await Promise.all(ids.map((id) => this.blobStorage.retrieve(id)));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Expand blob references embedded in text.
|
|
99
|
+
*
|
|
100
|
+
* Text like "Here is the image: @blob:abc123" will be split into
|
|
101
|
+
* multiple parts: text before, image part, text after.
|
|
102
|
+
*/
|
|
103
|
+
async expandBlobsInText(text, options) {
|
|
104
|
+
const blobIds = parseBlobReferences(text);
|
|
105
|
+
if (blobIds.length === 0) {
|
|
106
|
+
return [{ text, type: 'text' }];
|
|
107
|
+
}
|
|
108
|
+
const parts = [];
|
|
109
|
+
let lastIndex = 0;
|
|
110
|
+
const matches = [...text.matchAll(new RegExp(BLOB_REF_PATTERN.source, 'g'))];
|
|
111
|
+
const resolvedParts = await Promise.all(matches.map((match) => {
|
|
112
|
+
const blobId = match[1];
|
|
113
|
+
return this.resolveBlobToParts(blobId, options);
|
|
114
|
+
}));
|
|
115
|
+
for (const [index, match] of matches.entries()) {
|
|
116
|
+
const matchIndex = match.index;
|
|
117
|
+
// Add text before this match
|
|
118
|
+
if (matchIndex > lastIndex) {
|
|
119
|
+
const segment = text.slice(lastIndex, matchIndex);
|
|
120
|
+
if (segment.length > 0) {
|
|
121
|
+
parts.push({ text: segment, type: 'text' });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Resolve the blob
|
|
125
|
+
parts.push(...resolvedParts[index]);
|
|
126
|
+
lastIndex = matchIndex + match[0].length;
|
|
127
|
+
}
|
|
128
|
+
// Add remaining text
|
|
129
|
+
if (lastIndex < text.length) {
|
|
130
|
+
const trailing = text.slice(lastIndex);
|
|
131
|
+
if (trailing.length > 0) {
|
|
132
|
+
parts.push({ text: trailing, type: 'text' });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return parts;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Expand a single message part.
|
|
139
|
+
*/
|
|
140
|
+
async expandPart(part, options) {
|
|
141
|
+
// Text part with embedded blob refs
|
|
142
|
+
if (part.type === 'text' && containsBlobReferences(part.text)) {
|
|
143
|
+
return this.expandBlobsInText(part.text, options);
|
|
144
|
+
}
|
|
145
|
+
// Image part with blob ref
|
|
146
|
+
if (part.type === 'image' && typeof part.image === 'string' && part.image.startsWith('@blob:')) {
|
|
147
|
+
const resolved = await this.resolveImageBlob(part, options);
|
|
148
|
+
return [resolved];
|
|
149
|
+
}
|
|
150
|
+
// File part with blob ref
|
|
151
|
+
if (part.type === 'file' && typeof part.data === 'string' && part.data.startsWith('@blob:')) {
|
|
152
|
+
const resolved = await this.resolveFileBlob(part, options);
|
|
153
|
+
return [resolved];
|
|
154
|
+
}
|
|
155
|
+
// No blob refs, return as-is
|
|
156
|
+
return [part];
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Resolve a blob ID to message parts.
|
|
160
|
+
*/
|
|
161
|
+
async resolveBlobToParts(blobId, options) {
|
|
162
|
+
try {
|
|
163
|
+
const blob = await this.blobStorage.retrieve(blobId);
|
|
164
|
+
if (!blob) {
|
|
165
|
+
return [{ text: `[Attachment unavailable: @blob:${blobId}]`, type: 'text' }];
|
|
166
|
+
}
|
|
167
|
+
const mimeType = blob.metadata.contentType || 'application/octet-stream';
|
|
168
|
+
// Check MIME type filtering
|
|
169
|
+
if (options?.allowedMimeTypes && !matchesAnyMimePattern(mimeType, options.allowedMimeTypes)) {
|
|
170
|
+
const placeholder = generateMediaPlaceholder({
|
|
171
|
+
mimeType,
|
|
172
|
+
originalName: blob.metadata.originalName,
|
|
173
|
+
size: blob.metadata.size,
|
|
174
|
+
});
|
|
175
|
+
return [{ text: placeholder, type: 'text' }];
|
|
176
|
+
}
|
|
177
|
+
// Convert to appropriate part type
|
|
178
|
+
const base64Content = blob.content.toString('base64');
|
|
179
|
+
if (mimeType.startsWith('image/')) {
|
|
180
|
+
return [{
|
|
181
|
+
image: base64Content,
|
|
182
|
+
mimeType,
|
|
183
|
+
type: 'image',
|
|
184
|
+
}];
|
|
185
|
+
}
|
|
186
|
+
return [{
|
|
187
|
+
data: base64Content,
|
|
188
|
+
mimeType,
|
|
189
|
+
type: 'file',
|
|
190
|
+
...(blob.metadata.originalName && { filename: blob.metadata.originalName }),
|
|
191
|
+
}];
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
195
|
+
return [{ text: `[Attachment unavailable: @blob:${blobId} - ${message}]`, type: 'text' }];
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Resolve a file part with blob reference.
|
|
200
|
+
*/
|
|
201
|
+
async resolveFileBlob(part, options) {
|
|
202
|
+
const blobId = extractBlobId(part.data);
|
|
203
|
+
if (!blobId)
|
|
204
|
+
return part;
|
|
205
|
+
const resolved = await this.resolveBlobToParts(blobId, options);
|
|
206
|
+
// If resolved to a file part, preserve the original filename
|
|
207
|
+
if (resolved[0]?.type === 'file' && part.filename && !resolved[0].filename) {
|
|
208
|
+
return { ...resolved[0], filename: part.filename };
|
|
209
|
+
}
|
|
210
|
+
return resolved[0] || part;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Resolve an image part with blob reference.
|
|
214
|
+
*/
|
|
215
|
+
async resolveImageBlob(part, options) {
|
|
216
|
+
const blobId = extractBlobId(part.image);
|
|
217
|
+
if (!blobId)
|
|
218
|
+
return part;
|
|
219
|
+
const resolved = await this.resolveBlobToParts(blobId, options);
|
|
220
|
+
return resolved[0] || part;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Create a BlobReferenceResolver instance.
|
|
225
|
+
*/
|
|
226
|
+
export function createBlobReferenceResolver(blobStorage) {
|
|
227
|
+
return new BlobReferenceResolver(blobStorage);
|
|
228
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blob reference utilities for lazy media evaluation.
|
|
3
|
+
*
|
|
4
|
+
* Blob references are URIs that point to data stored in blob storage.
|
|
5
|
+
* Format: @blob:{id}
|
|
6
|
+
*
|
|
7
|
+
* This allows messages to reference large media without embedding the
|
|
8
|
+
* actual data, deferring resolution to format-time when needed.
|
|
9
|
+
*
|
|
10
|
+
* Based on dexto's @blob: reference pattern.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Regular expression for matching blob references.
|
|
14
|
+
* Captures the blob ID from @blob:{id} format.
|
|
15
|
+
*/
|
|
16
|
+
export declare const BLOB_REF_PATTERN: RegExp;
|
|
17
|
+
/**
|
|
18
|
+
* Prefix for blob references.
|
|
19
|
+
*/
|
|
20
|
+
export declare const BLOB_REF_PREFIX = "@blob:";
|
|
21
|
+
/**
|
|
22
|
+
* Check if a string contains any blob references.
|
|
23
|
+
*
|
|
24
|
+
* @param content - String to check
|
|
25
|
+
* @returns true if content contains @blob: references
|
|
26
|
+
*/
|
|
27
|
+
export declare function containsBlobReferences(content: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Parse all blob references from a string.
|
|
30
|
+
*
|
|
31
|
+
* @param content - String containing blob references
|
|
32
|
+
* @returns Array of blob IDs (without @blob: prefix)
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseBlobReferences(content: string): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Create a blob reference string from a blob ID.
|
|
37
|
+
*
|
|
38
|
+
* @param blobId - The blob storage key
|
|
39
|
+
* @returns Blob reference string (@blob:{id})
|
|
40
|
+
*/
|
|
41
|
+
export declare function createBlobRef(blobId: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Extract blob ID from a reference string.
|
|
44
|
+
*
|
|
45
|
+
* @param ref - Blob reference string (@blob:{id})
|
|
46
|
+
* @returns Blob ID or null if not a valid reference
|
|
47
|
+
*/
|
|
48
|
+
export declare function extractBlobId(ref: string): null | string;
|
|
49
|
+
/**
|
|
50
|
+
* Check if a string is a blob reference.
|
|
51
|
+
*
|
|
52
|
+
* @param value - String to check
|
|
53
|
+
* @returns true if the string is a blob reference
|
|
54
|
+
*/
|
|
55
|
+
export declare function isBlobReference(value: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Check if a MIME type matches a pattern.
|
|
58
|
+
*
|
|
59
|
+
* Supports exact match, wildcard subtype (image/*), and wildcard all.
|
|
60
|
+
*
|
|
61
|
+
* @param mimeType - MIME type to check
|
|
62
|
+
* @param pattern - Pattern to match against
|
|
63
|
+
* @returns true if the MIME type matches the pattern
|
|
64
|
+
*/
|
|
65
|
+
export declare function matchesMimePattern(mimeType: string | undefined, pattern: string): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Check if a MIME type matches any pattern in an array.
|
|
68
|
+
*
|
|
69
|
+
* @param mimeType - MIME type to check
|
|
70
|
+
* @param patterns - Array of patterns to match against
|
|
71
|
+
* @returns true if the MIME type matches any pattern
|
|
72
|
+
*/
|
|
73
|
+
export declare function matchesAnyMimePattern(mimeType: string | undefined, patterns: string[]): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Format byte size as human-readable string.
|
|
76
|
+
*
|
|
77
|
+
* @param bytes - Number of bytes
|
|
78
|
+
* @returns Formatted string like "1.5 KB" or "2.3 MB"
|
|
79
|
+
*/
|
|
80
|
+
export declare function formatByteSize(bytes: number): string;
|
|
81
|
+
/**
|
|
82
|
+
* Generate a placeholder string for filtered/unavailable media.
|
|
83
|
+
*
|
|
84
|
+
* @param metadata - Media metadata
|
|
85
|
+
* @param metadata.mimeType - MIME type of the media
|
|
86
|
+
* @param metadata.originalName - Original filename if available
|
|
87
|
+
* @param metadata.size - Size in bytes
|
|
88
|
+
* @returns Placeholder string like "[Video: demo.mp4 (5.2 MB)]"
|
|
89
|
+
*/
|
|
90
|
+
export declare function generateMediaPlaceholder(metadata: {
|
|
91
|
+
mimeType: string;
|
|
92
|
+
originalName?: string;
|
|
93
|
+
size: number;
|
|
94
|
+
}): string;
|
|
95
|
+
/**
|
|
96
|
+
* Replace a blob reference in a string with resolved content.
|
|
97
|
+
*
|
|
98
|
+
* @param content - String containing blob reference
|
|
99
|
+
* @param blobId - Blob ID to replace
|
|
100
|
+
* @param replacement - Replacement string
|
|
101
|
+
* @returns String with blob reference replaced
|
|
102
|
+
*/
|
|
103
|
+
export declare function replaceBlobReference(content: string, blobId: string, replacement: string): string;
|
|
104
|
+
/**
|
|
105
|
+
* Get MIME type category for display purposes.
|
|
106
|
+
*
|
|
107
|
+
* @param mimeType - MIME type
|
|
108
|
+
* @returns Category label
|
|
109
|
+
*/
|
|
110
|
+
export declare function getMimeTypeCategory(mimeType: string): string;
|
|
111
|
+
/**
|
|
112
|
+
* Infer MIME type from filename extension.
|
|
113
|
+
*
|
|
114
|
+
* @param filename - Filename with extension
|
|
115
|
+
* @returns MIME type or undefined if not recognized
|
|
116
|
+
*/
|
|
117
|
+
export declare function inferMimeTypeFromFilename(filename: string): string | undefined;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blob reference utilities for lazy media evaluation.
|
|
3
|
+
*
|
|
4
|
+
* Blob references are URIs that point to data stored in blob storage.
|
|
5
|
+
* Format: @blob:{id}
|
|
6
|
+
*
|
|
7
|
+
* This allows messages to reference large media without embedding the
|
|
8
|
+
* actual data, deferring resolution to format-time when needed.
|
|
9
|
+
*
|
|
10
|
+
* Based on dexto's @blob: reference pattern.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Regular expression for matching blob references.
|
|
14
|
+
* Captures the blob ID from @blob:{id} format.
|
|
15
|
+
*/
|
|
16
|
+
export const BLOB_REF_PATTERN = /@blob:([a-zA-Z0-9_-]+)/g;
|
|
17
|
+
/**
|
|
18
|
+
* Prefix for blob references.
|
|
19
|
+
*/
|
|
20
|
+
export const BLOB_REF_PREFIX = '@blob:';
|
|
21
|
+
/**
|
|
22
|
+
* Check if a string contains any blob references.
|
|
23
|
+
*
|
|
24
|
+
* @param content - String to check
|
|
25
|
+
* @returns true if content contains @blob: references
|
|
26
|
+
*/
|
|
27
|
+
export function containsBlobReferences(content) {
|
|
28
|
+
if (!content || typeof content !== 'string')
|
|
29
|
+
return false;
|
|
30
|
+
return content.includes(BLOB_REF_PREFIX);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parse all blob references from a string.
|
|
34
|
+
*
|
|
35
|
+
* @param content - String containing blob references
|
|
36
|
+
* @returns Array of blob IDs (without @blob: prefix)
|
|
37
|
+
*/
|
|
38
|
+
export function parseBlobReferences(content) {
|
|
39
|
+
if (!content || typeof content !== 'string')
|
|
40
|
+
return [];
|
|
41
|
+
const matches = [...content.matchAll(new RegExp(BLOB_REF_PATTERN.source, 'g'))];
|
|
42
|
+
return matches.map((m) => m[1]);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create a blob reference string from a blob ID.
|
|
46
|
+
*
|
|
47
|
+
* @param blobId - The blob storage key
|
|
48
|
+
* @returns Blob reference string (@blob:{id})
|
|
49
|
+
*/
|
|
50
|
+
export function createBlobRef(blobId) {
|
|
51
|
+
return `${BLOB_REF_PREFIX}${blobId}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Extract blob ID from a reference string.
|
|
55
|
+
*
|
|
56
|
+
* @param ref - Blob reference string (@blob:{id})
|
|
57
|
+
* @returns Blob ID or null if not a valid reference
|
|
58
|
+
*/
|
|
59
|
+
export function extractBlobId(ref) {
|
|
60
|
+
if (!ref || typeof ref !== 'string')
|
|
61
|
+
return null;
|
|
62
|
+
if (!ref.startsWith(BLOB_REF_PREFIX))
|
|
63
|
+
return null;
|
|
64
|
+
return ref.slice(BLOB_REF_PREFIX.length);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if a string is a blob reference.
|
|
68
|
+
*
|
|
69
|
+
* @param value - String to check
|
|
70
|
+
* @returns true if the string is a blob reference
|
|
71
|
+
*/
|
|
72
|
+
export function isBlobReference(value) {
|
|
73
|
+
if (!value || typeof value !== 'string')
|
|
74
|
+
return false;
|
|
75
|
+
return value.startsWith(BLOB_REF_PREFIX) && extractBlobId(value) !== null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if a MIME type matches a pattern.
|
|
79
|
+
*
|
|
80
|
+
* Supports exact match, wildcard subtype (image/*), and wildcard all.
|
|
81
|
+
*
|
|
82
|
+
* @param mimeType - MIME type to check
|
|
83
|
+
* @param pattern - Pattern to match against
|
|
84
|
+
* @returns true if the MIME type matches the pattern
|
|
85
|
+
*/
|
|
86
|
+
export function matchesMimePattern(mimeType, pattern) {
|
|
87
|
+
if (!mimeType)
|
|
88
|
+
return false;
|
|
89
|
+
const normalizedMime = mimeType.toLowerCase().trim();
|
|
90
|
+
const normalizedPattern = pattern.toLowerCase().trim();
|
|
91
|
+
// Any type
|
|
92
|
+
if (normalizedPattern === '*' || normalizedPattern === '*/*')
|
|
93
|
+
return true;
|
|
94
|
+
// Exact match
|
|
95
|
+
if (normalizedMime === normalizedPattern)
|
|
96
|
+
return true;
|
|
97
|
+
// Wildcard subtype (e.g., "image/*")
|
|
98
|
+
if (normalizedPattern.endsWith('/*')) {
|
|
99
|
+
const patternType = normalizedPattern.slice(0, -2);
|
|
100
|
+
const mimeTypePrefix = normalizedMime.split('/')[0];
|
|
101
|
+
return mimeTypePrefix === patternType;
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if a MIME type matches any pattern in an array.
|
|
107
|
+
*
|
|
108
|
+
* @param mimeType - MIME type to check
|
|
109
|
+
* @param patterns - Array of patterns to match against
|
|
110
|
+
* @returns true if the MIME type matches any pattern
|
|
111
|
+
*/
|
|
112
|
+
export function matchesAnyMimePattern(mimeType, patterns) {
|
|
113
|
+
if (!patterns || patterns.length === 0)
|
|
114
|
+
return true; // No filter = allow all
|
|
115
|
+
return patterns.some((pattern) => matchesMimePattern(mimeType, pattern));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Format byte size as human-readable string.
|
|
119
|
+
*
|
|
120
|
+
* @param bytes - Number of bytes
|
|
121
|
+
* @returns Formatted string like "1.5 KB" or "2.3 MB"
|
|
122
|
+
*/
|
|
123
|
+
export function formatByteSize(bytes) {
|
|
124
|
+
if (bytes === 0)
|
|
125
|
+
return '0 B';
|
|
126
|
+
const k = 1024;
|
|
127
|
+
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
128
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
129
|
+
return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Generate a placeholder string for filtered/unavailable media.
|
|
133
|
+
*
|
|
134
|
+
* @param metadata - Media metadata
|
|
135
|
+
* @param metadata.mimeType - MIME type of the media
|
|
136
|
+
* @param metadata.originalName - Original filename if available
|
|
137
|
+
* @param metadata.size - Size in bytes
|
|
138
|
+
* @returns Placeholder string like "[Video: demo.mp4 (5.2 MB)]"
|
|
139
|
+
*/
|
|
140
|
+
export function generateMediaPlaceholder(metadata) {
|
|
141
|
+
let typeLabel = 'File';
|
|
142
|
+
if (metadata.mimeType.startsWith('video/'))
|
|
143
|
+
typeLabel = 'Video';
|
|
144
|
+
else if (metadata.mimeType.startsWith('audio/'))
|
|
145
|
+
typeLabel = 'Audio';
|
|
146
|
+
else if (metadata.mimeType.startsWith('image/'))
|
|
147
|
+
typeLabel = 'Image';
|
|
148
|
+
else if (metadata.mimeType === 'application/pdf')
|
|
149
|
+
typeLabel = 'PDF';
|
|
150
|
+
const size = formatByteSize(metadata.size);
|
|
151
|
+
const name = metadata.originalName || 'unnamed';
|
|
152
|
+
return `[${typeLabel}: ${name} (${size})]`;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Replace a blob reference in a string with resolved content.
|
|
156
|
+
*
|
|
157
|
+
* @param content - String containing blob reference
|
|
158
|
+
* @param blobId - Blob ID to replace
|
|
159
|
+
* @param replacement - Replacement string
|
|
160
|
+
* @returns String with blob reference replaced
|
|
161
|
+
*/
|
|
162
|
+
export function replaceBlobReference(content, blobId, replacement) {
|
|
163
|
+
const ref = createBlobRef(blobId);
|
|
164
|
+
return content.replace(ref, replacement);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get MIME type category for display purposes.
|
|
168
|
+
*
|
|
169
|
+
* @param mimeType - MIME type
|
|
170
|
+
* @returns Category label
|
|
171
|
+
*/
|
|
172
|
+
export function getMimeTypeCategory(mimeType) {
|
|
173
|
+
const lower = mimeType.toLowerCase();
|
|
174
|
+
if (lower.startsWith('image/'))
|
|
175
|
+
return 'Image';
|
|
176
|
+
if (lower.startsWith('video/'))
|
|
177
|
+
return 'Video';
|
|
178
|
+
if (lower.startsWith('audio/'))
|
|
179
|
+
return 'Audio';
|
|
180
|
+
if (lower === 'application/pdf')
|
|
181
|
+
return 'PDF';
|
|
182
|
+
if (lower.startsWith('text/'))
|
|
183
|
+
return 'Text';
|
|
184
|
+
return 'File';
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* File extension to MIME type mapping for common types.
|
|
188
|
+
*/
|
|
189
|
+
const EXTENSION_TO_MIME = {
|
|
190
|
+
'.avi': 'video/x-msvideo',
|
|
191
|
+
'.bmp': 'image/bmp',
|
|
192
|
+
'.css': 'text/css',
|
|
193
|
+
'.flac': 'audio/flac',
|
|
194
|
+
'.gif': 'image/gif',
|
|
195
|
+
'.gz': 'application/gzip',
|
|
196
|
+
'.html': 'text/html',
|
|
197
|
+
'.ico': 'image/x-icon',
|
|
198
|
+
'.jpeg': 'image/jpeg',
|
|
199
|
+
'.jpg': 'image/jpeg',
|
|
200
|
+
'.js': 'text/javascript',
|
|
201
|
+
'.json': 'application/json',
|
|
202
|
+
'.m4a': 'audio/mp4',
|
|
203
|
+
'.mkv': 'video/x-matroska',
|
|
204
|
+
'.mov': 'video/quicktime',
|
|
205
|
+
'.mp3': 'audio/mpeg',
|
|
206
|
+
'.mp4': 'video/mp4',
|
|
207
|
+
'.ogg': 'audio/ogg',
|
|
208
|
+
'.pdf': 'application/pdf',
|
|
209
|
+
'.png': 'image/png',
|
|
210
|
+
'.svg': 'image/svg+xml',
|
|
211
|
+
'.tar': 'application/x-tar',
|
|
212
|
+
'.txt': 'text/plain',
|
|
213
|
+
'.wav': 'audio/wav',
|
|
214
|
+
'.webm': 'video/webm',
|
|
215
|
+
'.webp': 'image/webp',
|
|
216
|
+
'.xml': 'application/xml',
|
|
217
|
+
'.zip': 'application/zip',
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
220
|
+
* Infer MIME type from filename extension.
|
|
221
|
+
*
|
|
222
|
+
* @param filename - Filename with extension
|
|
223
|
+
* @returns MIME type or undefined if not recognized
|
|
224
|
+
*/
|
|
225
|
+
export function inferMimeTypeFromFilename(filename) {
|
|
226
|
+
if (!filename)
|
|
227
|
+
return undefined;
|
|
228
|
+
const ext = filename.slice(filename.lastIndexOf('.')).toLowerCase();
|
|
229
|
+
return EXTENSION_TO_MIME[ext];
|
|
230
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// TODO(v0.5.0): Remove this file. Consumer locking is no longer needed (one CoreProcess per TUI).
|
|
1
2
|
import { getAgentStorage, getAgentStorageSync } from '../storage/agent-storage.js';
|
|
2
3
|
// Consumer is considered stale after 30 seconds without heartbeat
|
|
3
4
|
const STALE_TIMEOUT_MS = 30_000;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// TODO(v0.5.0): Remove this file. ConsumerService is replaced by CoreProcess → TaskProcessor.
|
|
1
2
|
import { ProjectConfigStore } from '../../config/file-config-store.js';
|
|
2
3
|
import { KeychainTokenStore } from '../../storage/keychain-token-store.js';
|
|
3
4
|
import { closeAgentStorage } from '../storage/agent-storage.js';
|
|
@@ -54,7 +54,12 @@ export declare class ExecutionConsumer {
|
|
|
54
54
|
*/
|
|
55
55
|
stop(): void;
|
|
56
56
|
/**
|
|
57
|
-
* Execute a curate job
|
|
57
|
+
* Execute a curate job using the Plan Agent for orchestration.
|
|
58
|
+
*
|
|
59
|
+
* The Plan Agent orchestrates the curation workflow by:
|
|
60
|
+
* 1. Analyzing the user's request
|
|
61
|
+
* 2. Delegating to Query subagent to find existing context
|
|
62
|
+
* 3. Delegating to Curate subagent to create/update topics
|
|
58
63
|
*/
|
|
59
64
|
private executeCurate;
|
|
60
65
|
/**
|