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,398 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool output sanitization pipeline.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a comprehensive sanitization pipeline for tool outputs:
|
|
5
|
+
* 1. normalize() - Convert arbitrary tool output to MessagePart[]
|
|
6
|
+
* 2. persistMedia() - Store large media as blob references
|
|
7
|
+
* 3. applySanitization() - Apply final cleanup (truncation, etc.)
|
|
8
|
+
*
|
|
9
|
+
*/
|
|
10
|
+
import { DEFAULT_MAX_INLINE_MEDIA_BYTES, DEFAULT_TEXT_TRUNCATION, inferResourceKind, shouldAlwaysBlob, } from '../../../../core/interfaces/cipher/sanitization-types.js';
|
|
11
|
+
import { base64LengthToBytes, formatByteSize, isLikelyBase64String, parseDataUri, } from './base64-utils.js';
|
|
12
|
+
/**
|
|
13
|
+
* Tool output sanitizer.
|
|
14
|
+
*
|
|
15
|
+
* Provides a pipeline for sanitizing tool outputs:
|
|
16
|
+
* - Normalizes arbitrary output formats to MessagePart[]
|
|
17
|
+
* - Stores large media in blob storage with lazy references
|
|
18
|
+
* - Applies text truncation and cleanup
|
|
19
|
+
*/
|
|
20
|
+
export class ToolSanitizer {
|
|
21
|
+
blobStorage;
|
|
22
|
+
maxInlineMediaBytes;
|
|
23
|
+
maxTextLength;
|
|
24
|
+
constructor(options) {
|
|
25
|
+
this.blobStorage = options?.blobStorage;
|
|
26
|
+
this.maxInlineMediaBytes = options?.maxInlineMediaBytes ?? DEFAULT_MAX_INLINE_MEDIA_BYTES;
|
|
27
|
+
this.maxTextLength = options?.maxTextLength ?? DEFAULT_TEXT_TRUNCATION.maxLength;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Step 3: Apply final sanitization (truncation, etc.).
|
|
31
|
+
*/
|
|
32
|
+
applySanitization(parts, maxTextLength) {
|
|
33
|
+
const maxLen = maxTextLength ?? this.maxTextLength;
|
|
34
|
+
return parts.map((part) => {
|
|
35
|
+
if (part.type === 'text' && part.text.length > maxLen) {
|
|
36
|
+
return {
|
|
37
|
+
text: this.truncateText(part.text, maxLen),
|
|
38
|
+
type: 'text',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return part;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Step 1: Normalize arbitrary tool output to MessagePart array.
|
|
46
|
+
*/
|
|
47
|
+
normalize(result) {
|
|
48
|
+
const detectedMimeTypes = [];
|
|
49
|
+
let hasBinaryContent = false;
|
|
50
|
+
const parts = this.normalizeValue(result, detectedMimeTypes, (isBinary) => {
|
|
51
|
+
if (isBinary)
|
|
52
|
+
hasBinaryContent = true;
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
detectedMimeTypes: [...new Set(detectedMimeTypes)],
|
|
56
|
+
hasBinaryContent,
|
|
57
|
+
parts,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Step 2: Persist large media to blob storage.
|
|
62
|
+
*/
|
|
63
|
+
async persistMedia(parts, toolName, toolCallId, maxInlineBytes) {
|
|
64
|
+
const threshold = maxInlineBytes ?? this.maxInlineMediaBytes;
|
|
65
|
+
const resources = [];
|
|
66
|
+
const persistedParts = [];
|
|
67
|
+
let blobsCreated = 0;
|
|
68
|
+
let bytesStored = 0;
|
|
69
|
+
const persistPromises = parts.map(async (part) => {
|
|
70
|
+
if (part.type === 'image' && typeof part.image === 'string') {
|
|
71
|
+
return this.persistImageIfNeeded(part, toolName, toolCallId, threshold);
|
|
72
|
+
}
|
|
73
|
+
if (part.type === 'file' && typeof part.data === 'string') {
|
|
74
|
+
return this.persistFileIfNeeded(part, toolName, toolCallId, threshold);
|
|
75
|
+
}
|
|
76
|
+
return { part };
|
|
77
|
+
});
|
|
78
|
+
const persistedResults = await Promise.all(persistPromises);
|
|
79
|
+
for (const persisted of persistedResults) {
|
|
80
|
+
persistedParts.push(persisted.part);
|
|
81
|
+
if (persisted.resource) {
|
|
82
|
+
resources.push(persisted.resource);
|
|
83
|
+
blobsCreated++;
|
|
84
|
+
bytesStored += persisted.resource.size ?? 0;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { blobsCreated, bytesStored, parts: persistedParts, resources };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Sanitize a tool result through the full pipeline.
|
|
91
|
+
*/
|
|
92
|
+
async sanitize(result, options) {
|
|
93
|
+
// Step 1: Normalize to MessagePart[]
|
|
94
|
+
const normalized = this.normalize(result);
|
|
95
|
+
// Step 2: Persist large media to blob storage
|
|
96
|
+
const persisted = await this.persistMedia(normalized.parts, options.toolName, options.toolCallId, options.maxInlineMediaBytes);
|
|
97
|
+
// Step 3: Apply final sanitization
|
|
98
|
+
const sanitizedParts = this.applySanitization(persisted.parts, options.maxTextLength);
|
|
99
|
+
return {
|
|
100
|
+
content: sanitizedParts,
|
|
101
|
+
...(persisted.resources.length > 0 && { resources: persisted.resources }),
|
|
102
|
+
meta: {
|
|
103
|
+
success: options.success,
|
|
104
|
+
toolCallId: options.toolCallId,
|
|
105
|
+
toolName: options.toolName,
|
|
106
|
+
...(options.durationMs !== undefined && { durationMs: options.durationMs }),
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
extractData(data) {
|
|
111
|
+
if (typeof data === 'string')
|
|
112
|
+
return data;
|
|
113
|
+
if (Buffer.isBuffer(data))
|
|
114
|
+
return data.toString('base64');
|
|
115
|
+
if (data instanceof Uint8Array)
|
|
116
|
+
return Buffer.from(data).toString('base64');
|
|
117
|
+
if (data instanceof ArrayBuffer)
|
|
118
|
+
return Buffer.from(new Uint8Array(data)).toString('base64');
|
|
119
|
+
return String(data);
|
|
120
|
+
}
|
|
121
|
+
generateBlobId(toolName, toolCallId) {
|
|
122
|
+
const sanitizedTool = toolName.replaceAll(/[^a-z0-9]/gi, '_').slice(0, 20);
|
|
123
|
+
const sanitizedCall = toolCallId.replaceAll(/[^a-z0-9]/gi, '_').slice(0, 10);
|
|
124
|
+
const timestamp = Date.now().toString(36);
|
|
125
|
+
const random = Math.random().toString(36).slice(2, 6);
|
|
126
|
+
return `${sanitizedTool}_${sanitizedCall}_${timestamp}_${random}`;
|
|
127
|
+
}
|
|
128
|
+
normalizeArray(array, detectedMimeTypes, onBinary) {
|
|
129
|
+
const parts = [];
|
|
130
|
+
for (const item of array) {
|
|
131
|
+
if (!item || typeof item !== 'object')
|
|
132
|
+
continue;
|
|
133
|
+
const obj = item;
|
|
134
|
+
const itemParts = this.normalizeArrayItem(obj, detectedMimeTypes, onBinary);
|
|
135
|
+
if (itemParts.length > 0) {
|
|
136
|
+
parts.push(...itemParts);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return parts.length > 0 ? parts : [{ text: JSON.stringify(array), type: 'text' }];
|
|
140
|
+
}
|
|
141
|
+
normalizeArrayItem(obj, detectedMimeTypes, onBinary) {
|
|
142
|
+
// MCP text content
|
|
143
|
+
if (obj.type === 'text' && typeof obj.text === 'string') {
|
|
144
|
+
return [{ text: obj.text, type: 'text' }];
|
|
145
|
+
}
|
|
146
|
+
// MCP image content
|
|
147
|
+
if (obj.type === 'image' && obj.data && obj.mimeType) {
|
|
148
|
+
const mimeType = obj.mimeType;
|
|
149
|
+
detectedMimeTypes.push(mimeType);
|
|
150
|
+
onBinary(true);
|
|
151
|
+
return [{
|
|
152
|
+
image: obj.data,
|
|
153
|
+
mimeType,
|
|
154
|
+
type: 'image',
|
|
155
|
+
}];
|
|
156
|
+
}
|
|
157
|
+
// MCP resource content
|
|
158
|
+
if (obj.type === 'resource' && obj.resource) {
|
|
159
|
+
return this.normalizeResourceContent(obj.resource, detectedMimeTypes, onBinary);
|
|
160
|
+
}
|
|
161
|
+
// Nested object - recursively normalize
|
|
162
|
+
return this.normalizeValue(obj, detectedMimeTypes, onBinary);
|
|
163
|
+
}
|
|
164
|
+
normalizeObject(obj, detectedMimeTypes, onBinary) {
|
|
165
|
+
// Check for nested content array
|
|
166
|
+
if ('content' in obj && Array.isArray(obj.content)) {
|
|
167
|
+
return this.normalizeArray(obj.content, detectedMimeTypes, onBinary);
|
|
168
|
+
}
|
|
169
|
+
// { image, mimeType? }
|
|
170
|
+
if ('image' in obj) {
|
|
171
|
+
const mimeType = obj.mimeType || 'image/jpeg';
|
|
172
|
+
detectedMimeTypes.push(mimeType);
|
|
173
|
+
onBinary(true);
|
|
174
|
+
return [{
|
|
175
|
+
image: this.extractData(obj.image),
|
|
176
|
+
mimeType,
|
|
177
|
+
type: 'image',
|
|
178
|
+
}];
|
|
179
|
+
}
|
|
180
|
+
// { data, mimeType }
|
|
181
|
+
if ('data' in obj && obj.mimeType) {
|
|
182
|
+
const mimeType = obj.mimeType;
|
|
183
|
+
detectedMimeTypes.push(mimeType);
|
|
184
|
+
onBinary(true);
|
|
185
|
+
const filePart = {
|
|
186
|
+
data: this.extractData(obj.data),
|
|
187
|
+
mimeType,
|
|
188
|
+
type: 'file',
|
|
189
|
+
};
|
|
190
|
+
if (obj.filename && typeof obj.filename === 'string') {
|
|
191
|
+
filePart.filename = obj.filename;
|
|
192
|
+
}
|
|
193
|
+
return [filePart];
|
|
194
|
+
}
|
|
195
|
+
// Generic object - sanitize and stringify
|
|
196
|
+
const cleaned = this.sanitizeDeepObject(obj);
|
|
197
|
+
return [{ text: JSON.stringify(cleaned, null, 2), type: 'text' }];
|
|
198
|
+
}
|
|
199
|
+
normalizeResourceContent(resource, detectedMimeTypes, onBinary) {
|
|
200
|
+
if (!resource.text && !resource.blob) {
|
|
201
|
+
return [];
|
|
202
|
+
}
|
|
203
|
+
const mimeType = resource.mimeType || 'application/octet-stream';
|
|
204
|
+
const data = (resource.blob || resource.text);
|
|
205
|
+
detectedMimeTypes.push(mimeType);
|
|
206
|
+
if (mimeType.startsWith('image/')) {
|
|
207
|
+
onBinary(true);
|
|
208
|
+
return [{ image: data, mimeType, type: 'image' }];
|
|
209
|
+
}
|
|
210
|
+
if (resource.blob || isLikelyBase64String(data)) {
|
|
211
|
+
onBinary(true);
|
|
212
|
+
const filePart = {
|
|
213
|
+
data,
|
|
214
|
+
mimeType,
|
|
215
|
+
type: 'file',
|
|
216
|
+
};
|
|
217
|
+
if (resource.title && typeof resource.title === 'string') {
|
|
218
|
+
filePart.filename = resource.title;
|
|
219
|
+
}
|
|
220
|
+
return [filePart];
|
|
221
|
+
}
|
|
222
|
+
return [{ text: data, type: 'text' }];
|
|
223
|
+
}
|
|
224
|
+
normalizeString(value, detectedMimeTypes, onBinary) {
|
|
225
|
+
// Check for data URI
|
|
226
|
+
const dataUri = parseDataUri(value);
|
|
227
|
+
if (dataUri) {
|
|
228
|
+
detectedMimeTypes.push(dataUri.mediaType);
|
|
229
|
+
onBinary(true);
|
|
230
|
+
if (dataUri.mediaType.startsWith('image/')) {
|
|
231
|
+
return [{ image: dataUri.base64, mimeType: dataUri.mediaType, type: 'image' }];
|
|
232
|
+
}
|
|
233
|
+
return [{ data: dataUri.base64, mimeType: dataUri.mediaType, type: 'file' }];
|
|
234
|
+
}
|
|
235
|
+
// Check for likely base64 blob
|
|
236
|
+
if (isLikelyBase64String(value)) {
|
|
237
|
+
onBinary(true);
|
|
238
|
+
// Can't determine MIME type, treat as binary
|
|
239
|
+
return [{ data: value, mimeType: 'application/octet-stream', type: 'file' }];
|
|
240
|
+
}
|
|
241
|
+
// Regular text
|
|
242
|
+
return [{ text: value, type: 'text' }];
|
|
243
|
+
}
|
|
244
|
+
normalizeValue(value, detectedMimeTypes, onBinary) {
|
|
245
|
+
// Null/undefined
|
|
246
|
+
if (value === null || value === undefined) {
|
|
247
|
+
return [{ text: '', type: 'text' }];
|
|
248
|
+
}
|
|
249
|
+
// String input
|
|
250
|
+
if (typeof value === 'string') {
|
|
251
|
+
return this.normalizeString(value, detectedMimeTypes, onBinary);
|
|
252
|
+
}
|
|
253
|
+
// Array input (MCP-style content)
|
|
254
|
+
if (Array.isArray(value)) {
|
|
255
|
+
return this.normalizeArray(value, detectedMimeTypes, onBinary);
|
|
256
|
+
}
|
|
257
|
+
// Object input
|
|
258
|
+
if (typeof value === 'object') {
|
|
259
|
+
return this.normalizeObject(value, detectedMimeTypes, onBinary);
|
|
260
|
+
}
|
|
261
|
+
// Primitive fallback
|
|
262
|
+
return [{ text: String(value), type: 'text' }];
|
|
263
|
+
}
|
|
264
|
+
async persistFileIfNeeded(part, toolName, toolCallId, threshold) {
|
|
265
|
+
const { data, filename, mimeType } = part;
|
|
266
|
+
const dataString = data;
|
|
267
|
+
const approxBytes = base64LengthToBytes(dataString.length);
|
|
268
|
+
const shouldPersist = shouldAlwaysBlob(mimeType) || approxBytes >= threshold;
|
|
269
|
+
if (!shouldPersist || !this.blobStorage) {
|
|
270
|
+
return { part };
|
|
271
|
+
}
|
|
272
|
+
const blobId = await this.storeAsBlob({
|
|
273
|
+
data: dataString,
|
|
274
|
+
filename,
|
|
275
|
+
mimeType,
|
|
276
|
+
toolCallId,
|
|
277
|
+
toolName,
|
|
278
|
+
});
|
|
279
|
+
if (!blobId) {
|
|
280
|
+
return { part };
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
part: {
|
|
284
|
+
data: `@blob:${blobId}`,
|
|
285
|
+
...(filename && { filename }),
|
|
286
|
+
mimeType,
|
|
287
|
+
type: 'file',
|
|
288
|
+
},
|
|
289
|
+
resource: {
|
|
290
|
+
...(filename && { filename }),
|
|
291
|
+
kind: inferResourceKind(mimeType),
|
|
292
|
+
mimeType,
|
|
293
|
+
size: approxBytes,
|
|
294
|
+
uri: `blob:${blobId}`,
|
|
295
|
+
},
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
async persistImageIfNeeded(part, toolName, toolCallId, threshold) {
|
|
299
|
+
const data = part.image;
|
|
300
|
+
const mimeType = part.mimeType || 'image/jpeg';
|
|
301
|
+
const approxBytes = base64LengthToBytes(data.length);
|
|
302
|
+
const shouldPersist = shouldAlwaysBlob(mimeType) || approxBytes >= threshold;
|
|
303
|
+
if (!shouldPersist || !this.blobStorage) {
|
|
304
|
+
return { part };
|
|
305
|
+
}
|
|
306
|
+
const blobId = await this.storeAsBlob({
|
|
307
|
+
data,
|
|
308
|
+
mimeType,
|
|
309
|
+
toolCallId,
|
|
310
|
+
toolName,
|
|
311
|
+
});
|
|
312
|
+
if (!blobId) {
|
|
313
|
+
return { part };
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
part: {
|
|
317
|
+
image: `@blob:${blobId}`,
|
|
318
|
+
mimeType,
|
|
319
|
+
type: 'image',
|
|
320
|
+
},
|
|
321
|
+
resource: {
|
|
322
|
+
kind: 'image',
|
|
323
|
+
mimeType,
|
|
324
|
+
size: approxBytes,
|
|
325
|
+
uri: `blob:${blobId}`,
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Recursively sanitize object, replacing large base64 with placeholders.
|
|
331
|
+
*/
|
|
332
|
+
sanitizeDeepObject(obj) {
|
|
333
|
+
if (obj === null || obj === undefined)
|
|
334
|
+
return obj;
|
|
335
|
+
if (typeof obj === 'string') {
|
|
336
|
+
if (isLikelyBase64String(obj)) {
|
|
337
|
+
const approxBytes = base64LengthToBytes(obj.length);
|
|
338
|
+
return `[binary data omitted ~${formatByteSize(approxBytes)}]`;
|
|
339
|
+
}
|
|
340
|
+
return obj;
|
|
341
|
+
}
|
|
342
|
+
if (Array.isArray(obj)) {
|
|
343
|
+
return obj.map((x) => this.sanitizeDeepObject(x));
|
|
344
|
+
}
|
|
345
|
+
if (typeof obj === 'object') {
|
|
346
|
+
const out = {};
|
|
347
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
348
|
+
out[k] = this.sanitizeDeepObject(v);
|
|
349
|
+
}
|
|
350
|
+
return out;
|
|
351
|
+
}
|
|
352
|
+
return obj;
|
|
353
|
+
}
|
|
354
|
+
async storeAsBlob(options) {
|
|
355
|
+
if (!this.blobStorage)
|
|
356
|
+
return null;
|
|
357
|
+
try {
|
|
358
|
+
const blobId = this.generateBlobId(options.toolName, options.toolCallId);
|
|
359
|
+
const buffer = Buffer.from(options.data, 'base64');
|
|
360
|
+
await this.blobStorage.store(blobId, buffer, {
|
|
361
|
+
contentType: options.mimeType,
|
|
362
|
+
originalName: options.filename,
|
|
363
|
+
tags: { source: 'tool', toolCallId: options.toolCallId, toolName: options.toolName },
|
|
364
|
+
});
|
|
365
|
+
return blobId;
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
return null;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
truncateText(text, maxLength) {
|
|
372
|
+
if (text.length <= maxLength)
|
|
373
|
+
return text;
|
|
374
|
+
const { headLength, placeholder, tailLength } = DEFAULT_TEXT_TRUNCATION;
|
|
375
|
+
const omittedCount = text.length - headLength - tailLength;
|
|
376
|
+
const head = text.slice(0, headLength);
|
|
377
|
+
const tail = text.slice(-tailLength);
|
|
378
|
+
const replacedPlaceholder = placeholder.replace('{count}', String(omittedCount));
|
|
379
|
+
return `${head}${replacedPlaceholder}${tail}`;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Create a ToolSanitizer instance.
|
|
384
|
+
*/
|
|
385
|
+
export function createToolSanitizer(options) {
|
|
386
|
+
return new ToolSanitizer(options);
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Convenience function to sanitize a tool result with default options.
|
|
390
|
+
*/
|
|
391
|
+
export async function sanitizeToolResult(result, options) {
|
|
392
|
+
const sanitizer = new ToolSanitizer({
|
|
393
|
+
blobStorage: options.blobStorage,
|
|
394
|
+
maxInlineMediaBytes: options.maxInlineMediaBytes,
|
|
395
|
+
maxTextLength: options.maxTextLength,
|
|
396
|
+
});
|
|
397
|
+
return sanitizer.sanitize(result, options);
|
|
398
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stream Processor
|
|
3
|
+
*
|
|
4
|
+
* Handles granular LLM stream processing following the OpenCode pattern.
|
|
5
|
+
* Provides real-time event emission for streaming text, tool calls, and step tracking.
|
|
6
|
+
*
|
|
7
|
+
* Key features:
|
|
8
|
+
* - Delta-based text updates for responsive UI
|
|
9
|
+
* - Tool call lifecycle tracking (pending → running → completed/error)
|
|
10
|
+
* - Step-level cost and token tracking
|
|
11
|
+
* - Part creation and updates with unique IDs
|
|
12
|
+
*/
|
|
13
|
+
import type { StepTokenUsage } from '../../../core/domain/cipher/agent-events/types.js';
|
|
14
|
+
import type { CompactionPart, PatchPart, RetryPart, SnapshotPart, StepFinishPart, StepStartPart, TextPart, ToolPart } from '../../../core/interfaces/cipher/message-types.js';
|
|
15
|
+
import type { SessionEventBus } from '../events/event-emitter.js';
|
|
16
|
+
/**
|
|
17
|
+
* Stream event types that the processor can handle.
|
|
18
|
+
*/
|
|
19
|
+
export type StreamEvent = {
|
|
20
|
+
callId: string;
|
|
21
|
+
error: string;
|
|
22
|
+
type: 'tool-call-error';
|
|
23
|
+
} | {
|
|
24
|
+
callId: string;
|
|
25
|
+
input: Record<string, unknown>;
|
|
26
|
+
type: 'tool-call-input';
|
|
27
|
+
} | {
|
|
28
|
+
callId: string;
|
|
29
|
+
output: string;
|
|
30
|
+
type: 'tool-call-complete';
|
|
31
|
+
} | {
|
|
32
|
+
callId: string;
|
|
33
|
+
toolName: string;
|
|
34
|
+
type: 'tool-call-start';
|
|
35
|
+
} | {
|
|
36
|
+
callId: string;
|
|
37
|
+
type: 'tool-call-running';
|
|
38
|
+
} | {
|
|
39
|
+
cost: number;
|
|
40
|
+
finishReason: 'max_tokens' | 'stop' | 'tool_calls';
|
|
41
|
+
stepIndex: number;
|
|
42
|
+
tokens: StepTokenUsage;
|
|
43
|
+
type: 'step-finish';
|
|
44
|
+
} | {
|
|
45
|
+
delta: string;
|
|
46
|
+
type: 'reasoning-delta';
|
|
47
|
+
} | {
|
|
48
|
+
delta: string;
|
|
49
|
+
type: 'text-delta';
|
|
50
|
+
} | {
|
|
51
|
+
stepIndex: number;
|
|
52
|
+
type: 'step-start';
|
|
53
|
+
} | {
|
|
54
|
+
type: 'finish';
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Context provided to the stream processor.
|
|
58
|
+
*/
|
|
59
|
+
export interface ProcessorContext {
|
|
60
|
+
/** Event bus for emitting events */
|
|
61
|
+
eventBus: SessionEventBus;
|
|
62
|
+
/** Function to generate unique IDs */
|
|
63
|
+
generateId: () => string;
|
|
64
|
+
/** Session ID for event context */
|
|
65
|
+
sessionId: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Accumulated state during stream processing.
|
|
69
|
+
*/
|
|
70
|
+
export interface ProcessorState {
|
|
71
|
+
/** Current step index */
|
|
72
|
+
currentStepIndex: number;
|
|
73
|
+
/** Parts created during processing */
|
|
74
|
+
parts: Array<CompactionPart | PatchPart | RetryPart | SnapshotPart | StepFinishPart | StepStartPart | TextPart | ToolPart>;
|
|
75
|
+
/** Accumulated text content */
|
|
76
|
+
textContent: string;
|
|
77
|
+
/** Tool parts indexed by call ID */
|
|
78
|
+
toolParts: Map<string, ToolPart>;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Stream Processor class.
|
|
82
|
+
*
|
|
83
|
+
* Processes streaming events from LLM providers and emits granular events
|
|
84
|
+
* for real-time UI updates. Follows the OpenCode pattern of part-based
|
|
85
|
+
* message construction with delta updates.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const processor = new StreamProcessor()
|
|
90
|
+
*
|
|
91
|
+
* const state = await processor.process(streamEvents, {
|
|
92
|
+
* eventBus: sessionEventBus,
|
|
93
|
+
* generateId: () => crypto.randomUUID(),
|
|
94
|
+
* sessionId: 'session-123',
|
|
95
|
+
* })
|
|
96
|
+
*
|
|
97
|
+
* console.log('Accumulated text:', state.textContent)
|
|
98
|
+
* console.log('Parts created:', state.parts.length)
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export declare class StreamProcessor {
|
|
102
|
+
/**
|
|
103
|
+
* Process a stream of events and emit granular updates.
|
|
104
|
+
*
|
|
105
|
+
* @param stream - Async iterable of stream events
|
|
106
|
+
* @param context - Processing context with event bus and utilities
|
|
107
|
+
* @returns Final processor state with accumulated parts
|
|
108
|
+
*/
|
|
109
|
+
process(stream: AsyncIterable<StreamEvent>, context: ProcessorContext): Promise<ProcessorState>;
|
|
110
|
+
/**
|
|
111
|
+
* Finalize text part if there's accumulated content.
|
|
112
|
+
*/
|
|
113
|
+
private finalizeTextPart;
|
|
114
|
+
/**
|
|
115
|
+
* Handle a single stream event.
|
|
116
|
+
*/
|
|
117
|
+
private handleEvent;
|
|
118
|
+
/**
|
|
119
|
+
* Handle step finish event.
|
|
120
|
+
*/
|
|
121
|
+
private handleStepFinish;
|
|
122
|
+
/**
|
|
123
|
+
* Handle step start event.
|
|
124
|
+
*/
|
|
125
|
+
private handleStepStart;
|
|
126
|
+
/**
|
|
127
|
+
* Handle text delta - accumulate and emit.
|
|
128
|
+
*/
|
|
129
|
+
private handleTextDelta;
|
|
130
|
+
/**
|
|
131
|
+
* Handle tool call completion.
|
|
132
|
+
*/
|
|
133
|
+
private handleToolCallComplete;
|
|
134
|
+
/**
|
|
135
|
+
* Handle tool call error.
|
|
136
|
+
*/
|
|
137
|
+
private handleToolCallError;
|
|
138
|
+
/**
|
|
139
|
+
* Handle tool call input received.
|
|
140
|
+
*/
|
|
141
|
+
private handleToolCallInput;
|
|
142
|
+
/**
|
|
143
|
+
* Handle tool call transition to running.
|
|
144
|
+
*/
|
|
145
|
+
private handleToolCallRunning;
|
|
146
|
+
/**
|
|
147
|
+
* Handle tool call start - create pending tool part.
|
|
148
|
+
*/
|
|
149
|
+
private handleToolCallStart;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Helper to create a unique ID generator.
|
|
153
|
+
*/
|
|
154
|
+
export declare function createIdGenerator(): () => string;
|
|
155
|
+
/**
|
|
156
|
+
* Singleton stream processor instance.
|
|
157
|
+
*/
|
|
158
|
+
export declare const streamProcessor: StreamProcessor;
|