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
|
@@ -29,8 +29,8 @@ export class OpenRouterLLMService {
|
|
|
29
29
|
formatter;
|
|
30
30
|
logger;
|
|
31
31
|
memoryManager;
|
|
32
|
-
promptFactory;
|
|
33
32
|
sessionEventBus;
|
|
33
|
+
systemPromptManager;
|
|
34
34
|
tokenizer;
|
|
35
35
|
toolManager;
|
|
36
36
|
/**
|
|
@@ -48,7 +48,7 @@ export class OpenRouterLLMService {
|
|
|
48
48
|
*/
|
|
49
49
|
constructor(sessionId, config, options) {
|
|
50
50
|
this.toolManager = options.toolManager;
|
|
51
|
-
this.
|
|
51
|
+
this.systemPromptManager = options.systemPromptManager;
|
|
52
52
|
this.memoryManager = options.memoryManager;
|
|
53
53
|
this.sessionEventBus = options.sessionEventBus;
|
|
54
54
|
this.logger = options.logger ?? new NoOpLogger();
|
|
@@ -97,23 +97,22 @@ export class OpenRouterLLMService {
|
|
|
97
97
|
* 3. Returning final response when no more tool calls
|
|
98
98
|
*
|
|
99
99
|
* @param textInput - User input text
|
|
100
|
-
* @param sessionId - Session ID for tracking the conversation
|
|
101
100
|
* @param options - Execution options
|
|
102
101
|
* @param options.signal - Optional abort signal for cancellation
|
|
103
102
|
* @param options.imageData - Optional image data
|
|
104
103
|
* @param options.fileData - Optional file data
|
|
105
104
|
* @param options.stream - Whether to stream response (not implemented yet)
|
|
106
105
|
* @param options.executionContext - Optional execution context (for JSON input mode, etc.)
|
|
107
|
-
* @param options.
|
|
106
|
+
* @param options.taskId - Task ID for billing tracking
|
|
108
107
|
* @returns Final assistant response
|
|
109
108
|
*/
|
|
110
|
-
async completeTask(textInput,
|
|
109
|
+
async completeTask(textInput, options) {
|
|
111
110
|
// Extract options with defaults
|
|
112
|
-
const { executionContext, fileData, imageData,
|
|
111
|
+
const { executionContext, fileData, imageData, signal } = options ?? {};
|
|
113
112
|
// Add user message to context
|
|
114
113
|
await this.contextManager.addUserMessage(textInput, imageData, fileData);
|
|
115
|
-
// Get
|
|
116
|
-
const toolSet = this.toolManager.
|
|
114
|
+
// Get filtered tools based on command type (e.g., only read-only tools for 'query')
|
|
115
|
+
const toolSet = this.toolManager.getToolsForCommand(executionContext?.commandType);
|
|
117
116
|
const tools = Object.entries(toolSet).map(([name, schema]) => ({
|
|
118
117
|
function: {
|
|
119
118
|
description: schema.description ?? '',
|
|
@@ -131,7 +130,7 @@ export class OpenRouterLLMService {
|
|
|
131
130
|
}
|
|
132
131
|
try {
|
|
133
132
|
// eslint-disable-next-line no-await-in-loop -- Sequential iterations required for agentic loop
|
|
134
|
-
const result = await this.executeAgenticIteration(iterationCount, tools, executionContext
|
|
133
|
+
const result = await this.executeAgenticIteration(iterationCount, tools, executionContext);
|
|
135
134
|
if (result !== null) {
|
|
136
135
|
return result;
|
|
137
136
|
}
|
|
@@ -211,25 +210,24 @@ export class OpenRouterLLMService {
|
|
|
211
210
|
* @param iterationCount - Current iteration number
|
|
212
211
|
* @param tools - Available tools for this iteration
|
|
213
212
|
* @param executionContext - Optional execution context
|
|
214
|
-
* @param mode - Optional mode for system prompt
|
|
215
213
|
* @returns Final response string if complete, null if more iterations needed
|
|
216
214
|
*/
|
|
217
|
-
async executeAgenticIteration(iterationCount, tools, executionContext
|
|
218
|
-
// Build system prompt using
|
|
219
|
-
|
|
215
|
+
async executeAgenticIteration(iterationCount, tools, executionContext) {
|
|
216
|
+
// Build system prompt using SystemPromptManager (before compression for correct token accounting)
|
|
217
|
+
// Use filtered tool names based on command type (e.g., only read-only tools for 'query')
|
|
218
|
+
const availableTools = this.toolManager.getToolNamesForCommand(executionContext?.commandType);
|
|
220
219
|
const markersSet = this.toolManager.getAvailableMarkers();
|
|
221
|
-
// Convert Set<string> to Record<string, string> for
|
|
220
|
+
// Convert Set<string> to Record<string, string> for SystemPromptManager
|
|
222
221
|
const availableMarkers = {};
|
|
223
222
|
for (const marker of markersSet) {
|
|
224
223
|
availableMarkers[marker] = marker;
|
|
225
224
|
}
|
|
226
|
-
const systemPrompt = await this.
|
|
225
|
+
const systemPrompt = await this.systemPromptManager.build({
|
|
227
226
|
availableMarkers,
|
|
228
227
|
availableTools,
|
|
229
228
|
commandType: executionContext?.commandType,
|
|
230
229
|
conversationMetadata: executionContext?.conversationMetadata,
|
|
231
230
|
memoryManager: this.memoryManager,
|
|
232
|
-
mode,
|
|
233
231
|
});
|
|
234
232
|
// Verbose debug: Show complete system prompt
|
|
235
233
|
if (this.config.verbose) {
|
|
@@ -31,6 +31,7 @@ export interface RetryPolicy {
|
|
|
31
31
|
* - 2x exponential backoff
|
|
32
32
|
* - 25% jitter
|
|
33
33
|
* - Retries on common transient errors (429, 500, 502, 503, 504)
|
|
34
|
+
* - Retries on empty/incomplete LLM responses (transient API issues)
|
|
34
35
|
*/
|
|
35
36
|
export declare const DEFAULT_RETRY_POLICY: RetryPolicy;
|
|
36
37
|
/**
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* - 2x exponential backoff
|
|
13
13
|
* - 25% jitter
|
|
14
14
|
* - Retries on common transient errors (429, 500, 502, 503, 504)
|
|
15
|
+
* - Retries on empty/incomplete LLM responses (transient API issues)
|
|
15
16
|
*/
|
|
16
17
|
export const DEFAULT_RETRY_POLICY = {
|
|
17
18
|
backoffMultiplier: 2,
|
|
@@ -29,6 +30,11 @@ export const DEFAULT_RETRY_POLICY = {
|
|
|
29
30
|
'capacity',
|
|
30
31
|
'timeout',
|
|
31
32
|
'temporarily unavailable',
|
|
33
|
+
// LLM empty/incomplete response errors (transient API issues)
|
|
34
|
+
'neither content nor tool calls',
|
|
35
|
+
'no content',
|
|
36
|
+
'empty response',
|
|
37
|
+
'no messages',
|
|
32
38
|
],
|
|
33
39
|
retryableStatusCodes: [429, 500, 502, 503, 504],
|
|
34
40
|
};
|
|
@@ -53,6 +59,11 @@ export const AGGRESSIVE_RETRY_POLICY = {
|
|
|
53
59
|
'capacity',
|
|
54
60
|
'timeout',
|
|
55
61
|
'temporarily unavailable',
|
|
62
|
+
// LLM empty/incomplete response errors (transient API issues)
|
|
63
|
+
'neither content nor tool calls',
|
|
64
|
+
'no content',
|
|
65
|
+
'empty response',
|
|
66
|
+
'no messages',
|
|
56
67
|
],
|
|
57
68
|
retryableStatusCodes: [429, 500, 502, 503, 504],
|
|
58
69
|
};
|
|
@@ -19,10 +19,11 @@ async function sleep(ms, signal) {
|
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
21
21
|
const timeout = setTimeout(resolve, ms);
|
|
22
|
-
|
|
22
|
+
const abortHandler = () => {
|
|
23
23
|
clearTimeout(timeout);
|
|
24
24
|
reject(new Error('Retry aborted'));
|
|
25
|
-
}
|
|
25
|
+
};
|
|
26
|
+
signal?.addEventListener('abort', abortHandler, { once: true });
|
|
26
27
|
});
|
|
27
28
|
}
|
|
28
29
|
/**
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base64 detection and parsing utilities for tool output sanitization.
|
|
3
|
+
*
|
|
4
|
+
* These utilities help identify and process base64-encoded content in tool outputs,
|
|
5
|
+
* enabling the sanitization pipeline to detect and handle binary data appropriately.
|
|
6
|
+
*
|
|
7
|
+
* Based on dexto's isLikelyBase64String() and parseDataUri() patterns.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Check if a string is likely a Base64-encoded binary blob.
|
|
11
|
+
*
|
|
12
|
+
* Uses heuristics to detect base64 content:
|
|
13
|
+
* 1. Length threshold (default 512 chars)
|
|
14
|
+
* 2. Character set matching (base64 alphabet only)
|
|
15
|
+
* 3. Low non-base64 character ratio
|
|
16
|
+
*
|
|
17
|
+
* This is intentionally conservative to avoid false positives on
|
|
18
|
+
* normal text that happens to look like base64.
|
|
19
|
+
*
|
|
20
|
+
* @param value - The string to check
|
|
21
|
+
* @param minLength - Minimum length threshold (default: 512)
|
|
22
|
+
* @returns true if the string is likely base64-encoded binary data
|
|
23
|
+
*/
|
|
24
|
+
export declare function isLikelyBase64String(value: string, minLength?: number): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Result of parsing a data URI.
|
|
27
|
+
*/
|
|
28
|
+
export interface ParsedDataUri {
|
|
29
|
+
/** The base64-encoded content */
|
|
30
|
+
base64: string;
|
|
31
|
+
/** The MIME type from the data URI */
|
|
32
|
+
mediaType: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parse a data URI and extract media type and base64 content.
|
|
36
|
+
*
|
|
37
|
+
* Supports the standard data URI format:
|
|
38
|
+
* data:[<mediatype>][;base64],<data>
|
|
39
|
+
*
|
|
40
|
+
* @param value - The data URI string to parse
|
|
41
|
+
* @returns Parsed components or null if not a valid base64 data URI
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseDataUri(value: string): null | ParsedDataUri;
|
|
44
|
+
/**
|
|
45
|
+
* Estimate byte length from base64 string length.
|
|
46
|
+
*
|
|
47
|
+
* Base64 encoding uses 4 characters to represent 3 bytes.
|
|
48
|
+
* This approximation is useful for size threshold checks.
|
|
49
|
+
*
|
|
50
|
+
* @param charLength - Length of the base64 string
|
|
51
|
+
* @returns Approximate byte count of the decoded data
|
|
52
|
+
*/
|
|
53
|
+
export declare function base64LengthToBytes(charLength: number): number;
|
|
54
|
+
/**
|
|
55
|
+
* Format byte size as human-readable string.
|
|
56
|
+
*
|
|
57
|
+
* @param bytes - Number of bytes
|
|
58
|
+
* @returns Formatted string like "1.5 KB" or "2.3 MB"
|
|
59
|
+
*/
|
|
60
|
+
export declare function formatByteSize(bytes: number): string;
|
|
61
|
+
/**
|
|
62
|
+
* Check if a value is a valid base64 string (strict check).
|
|
63
|
+
*
|
|
64
|
+
* Unlike isLikelyBase64String which uses heuristics, this performs
|
|
65
|
+
* a stricter validation that the string is valid base64 format.
|
|
66
|
+
*
|
|
67
|
+
* @param value - The string to validate
|
|
68
|
+
* @returns true if valid base64 format
|
|
69
|
+
*/
|
|
70
|
+
export declare function isValidBase64(value: string): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Safely decode base64 string to Buffer.
|
|
73
|
+
*
|
|
74
|
+
* @param base64 - Base64 encoded string
|
|
75
|
+
* @returns Decoded Buffer or null if invalid
|
|
76
|
+
*/
|
|
77
|
+
export declare function safeBase64Decode(base64: string): Buffer | null;
|
|
78
|
+
/**
|
|
79
|
+
* Encode data to base64 string.
|
|
80
|
+
*
|
|
81
|
+
* @param data - Data to encode (Buffer, Uint8Array, or string)
|
|
82
|
+
* @returns Base64 encoded string
|
|
83
|
+
*/
|
|
84
|
+
export declare function encodeToBase64(data: Buffer | string | Uint8Array): string;
|
|
85
|
+
/**
|
|
86
|
+
* Create a data URI from base64 content and MIME type.
|
|
87
|
+
*
|
|
88
|
+
* @param base64 - Base64 encoded content
|
|
89
|
+
* @param mimeType - MIME type of the content
|
|
90
|
+
* @returns Data URI string
|
|
91
|
+
*/
|
|
92
|
+
export declare function createDataUri(base64: string, mimeType: string): string;
|
|
93
|
+
/**
|
|
94
|
+
* Extract base64 content from a data URI or return the original if not a data URI.
|
|
95
|
+
*
|
|
96
|
+
* @param value - Data URI or raw base64 string
|
|
97
|
+
* @returns Object with base64 content and optional MIME type
|
|
98
|
+
*/
|
|
99
|
+
export declare function extractBase64Content(value: string): {
|
|
100
|
+
base64: string;
|
|
101
|
+
mimeType?: string;
|
|
102
|
+
};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base64 detection and parsing utilities for tool output sanitization.
|
|
3
|
+
*
|
|
4
|
+
* These utilities help identify and process base64-encoded content in tool outputs,
|
|
5
|
+
* enabling the sanitization pipeline to detect and handle binary data appropriately.
|
|
6
|
+
*
|
|
7
|
+
* Based on dexto's isLikelyBase64String() and parseDataUri() patterns.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default minimum length for base64 heuristic detection.
|
|
11
|
+
* Strings shorter than this are unlikely to be meaningful base64 blobs.
|
|
12
|
+
*/
|
|
13
|
+
const MIN_BASE64_HEURISTIC_LENGTH = 512;
|
|
14
|
+
/**
|
|
15
|
+
* Regular expression for valid base64 characters.
|
|
16
|
+
* Includes standard base64 alphabet plus padding and optional whitespace.
|
|
17
|
+
*/
|
|
18
|
+
const BASE64_CHARSET_REGEX = /^[A-Za-z0-9+/=\r\n\s]+$/;
|
|
19
|
+
/**
|
|
20
|
+
* Check if a string is likely a Base64-encoded binary blob.
|
|
21
|
+
*
|
|
22
|
+
* Uses heuristics to detect base64 content:
|
|
23
|
+
* 1. Length threshold (default 512 chars)
|
|
24
|
+
* 2. Character set matching (base64 alphabet only)
|
|
25
|
+
* 3. Low non-base64 character ratio
|
|
26
|
+
*
|
|
27
|
+
* This is intentionally conservative to avoid false positives on
|
|
28
|
+
* normal text that happens to look like base64.
|
|
29
|
+
*
|
|
30
|
+
* @param value - The string to check
|
|
31
|
+
* @param minLength - Minimum length threshold (default: 512)
|
|
32
|
+
* @returns true if the string is likely base64-encoded binary data
|
|
33
|
+
*/
|
|
34
|
+
export function isLikelyBase64String(value, minLength = MIN_BASE64_HEURISTIC_LENGTH) {
|
|
35
|
+
if (!value || typeof value !== 'string')
|
|
36
|
+
return false;
|
|
37
|
+
if (value.length < minLength)
|
|
38
|
+
return false;
|
|
39
|
+
// Fast-path for data URIs which explicitly declare base64
|
|
40
|
+
if (value.startsWith('data:') && value.includes(';base64,'))
|
|
41
|
+
return true;
|
|
42
|
+
// Check character set - must be valid base64 characters
|
|
43
|
+
if (!BASE64_CHARSET_REGEX.test(value))
|
|
44
|
+
return false;
|
|
45
|
+
// Calculate non-base64 character ratio (whitespace excluded)
|
|
46
|
+
const strippedValue = value.replaceAll(/[\r\n\s]/g, '');
|
|
47
|
+
const nonBase64Count = (strippedValue.match(/[^A-Za-z0-9+/=]/g) || []).length;
|
|
48
|
+
const nonBase64Ratio = nonBase64Count / strippedValue.length;
|
|
49
|
+
// Very low ratio of non-base64 chars suggests actual base64
|
|
50
|
+
return nonBase64Ratio < 0.01;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Parse a data URI and extract media type and base64 content.
|
|
54
|
+
*
|
|
55
|
+
* Supports the standard data URI format:
|
|
56
|
+
* data:[<mediatype>][;base64],<data>
|
|
57
|
+
*
|
|
58
|
+
* @param value - The data URI string to parse
|
|
59
|
+
* @returns Parsed components or null if not a valid base64 data URI
|
|
60
|
+
*/
|
|
61
|
+
export function parseDataUri(value) {
|
|
62
|
+
if (!value || typeof value !== 'string')
|
|
63
|
+
return null;
|
|
64
|
+
if (!value.startsWith('data:'))
|
|
65
|
+
return null;
|
|
66
|
+
const commaIndex = value.indexOf(',');
|
|
67
|
+
if (commaIndex === -1)
|
|
68
|
+
return null;
|
|
69
|
+
const meta = value.slice(5, commaIndex); // Skip 'data:'
|
|
70
|
+
// Must be base64 encoded
|
|
71
|
+
if (!/;base64$/i.test(meta))
|
|
72
|
+
return null;
|
|
73
|
+
const mediaType = meta.replace(/;base64$/i, '') || 'application/octet-stream';
|
|
74
|
+
const base64 = value.slice(commaIndex + 1);
|
|
75
|
+
return { base64, mediaType };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Estimate byte length from base64 string length.
|
|
79
|
+
*
|
|
80
|
+
* Base64 encoding uses 4 characters to represent 3 bytes.
|
|
81
|
+
* This approximation is useful for size threshold checks.
|
|
82
|
+
*
|
|
83
|
+
* @param charLength - Length of the base64 string
|
|
84
|
+
* @returns Approximate byte count of the decoded data
|
|
85
|
+
*/
|
|
86
|
+
export function base64LengthToBytes(charLength) {
|
|
87
|
+
// Remove padding chars from calculation for accuracy
|
|
88
|
+
const paddingChars = charLength > 0 ? (charLength % 4 === 0 ? 0 : 4 - (charLength % 4)) : 0;
|
|
89
|
+
return Math.floor(((charLength - paddingChars) * 3) / 4);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Format byte size as human-readable string.
|
|
93
|
+
*
|
|
94
|
+
* @param bytes - Number of bytes
|
|
95
|
+
* @returns Formatted string like "1.5 KB" or "2.3 MB"
|
|
96
|
+
*/
|
|
97
|
+
export function formatByteSize(bytes) {
|
|
98
|
+
if (bytes === 0)
|
|
99
|
+
return '0 B';
|
|
100
|
+
const k = 1024;
|
|
101
|
+
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
102
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
103
|
+
return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if a value is a valid base64 string (strict check).
|
|
107
|
+
*
|
|
108
|
+
* Unlike isLikelyBase64String which uses heuristics, this performs
|
|
109
|
+
* a stricter validation that the string is valid base64 format.
|
|
110
|
+
*
|
|
111
|
+
* @param value - The string to validate
|
|
112
|
+
* @returns true if valid base64 format
|
|
113
|
+
*/
|
|
114
|
+
export function isValidBase64(value) {
|
|
115
|
+
if (!value || typeof value !== 'string')
|
|
116
|
+
return false;
|
|
117
|
+
// Remove whitespace
|
|
118
|
+
const cleaned = value.replaceAll(/[\r\n\s]/g, '');
|
|
119
|
+
// Check length is multiple of 4
|
|
120
|
+
if (cleaned.length % 4 !== 0)
|
|
121
|
+
return false;
|
|
122
|
+
// Check character set
|
|
123
|
+
return /^[A-Za-z0-9+/]*={0,2}$/.test(cleaned);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Safely decode base64 string to Buffer.
|
|
127
|
+
*
|
|
128
|
+
* @param base64 - Base64 encoded string
|
|
129
|
+
* @returns Decoded Buffer or null if invalid
|
|
130
|
+
*/
|
|
131
|
+
export function safeBase64Decode(base64) {
|
|
132
|
+
try {
|
|
133
|
+
// Remove whitespace
|
|
134
|
+
const cleaned = base64.replaceAll(/[\r\n\s]/g, '');
|
|
135
|
+
// Validate before decoding
|
|
136
|
+
if (!isValidBase64(cleaned))
|
|
137
|
+
return null;
|
|
138
|
+
return Buffer.from(cleaned, 'base64');
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Encode data to base64 string.
|
|
146
|
+
*
|
|
147
|
+
* @param data - Data to encode (Buffer, Uint8Array, or string)
|
|
148
|
+
* @returns Base64 encoded string
|
|
149
|
+
*/
|
|
150
|
+
export function encodeToBase64(data) {
|
|
151
|
+
if (typeof data === 'string') {
|
|
152
|
+
return Buffer.from(data, 'utf8').toString('base64');
|
|
153
|
+
}
|
|
154
|
+
if (Buffer.isBuffer(data)) {
|
|
155
|
+
return data.toString('base64');
|
|
156
|
+
}
|
|
157
|
+
// At this point, data must be Uint8Array
|
|
158
|
+
return Buffer.from(data).toString('base64');
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Create a data URI from base64 content and MIME type.
|
|
162
|
+
*
|
|
163
|
+
* @param base64 - Base64 encoded content
|
|
164
|
+
* @param mimeType - MIME type of the content
|
|
165
|
+
* @returns Data URI string
|
|
166
|
+
*/
|
|
167
|
+
export function createDataUri(base64, mimeType) {
|
|
168
|
+
return `data:${mimeType};base64,${base64}`;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Extract base64 content from a data URI or return the original if not a data URI.
|
|
172
|
+
*
|
|
173
|
+
* @param value - Data URI or raw base64 string
|
|
174
|
+
* @returns Object with base64 content and optional MIME type
|
|
175
|
+
*/
|
|
176
|
+
export function extractBase64Content(value) {
|
|
177
|
+
const parsed = parseDataUri(value);
|
|
178
|
+
if (parsed) {
|
|
179
|
+
return { base64: parsed.base64, mimeType: parsed.mediaType };
|
|
180
|
+
}
|
|
181
|
+
return { base64: value };
|
|
182
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool output sanitization module.
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for sanitizing tool outputs:
|
|
5
|
+
* - Base64 detection and parsing
|
|
6
|
+
* - Media persistence to blob storage
|
|
7
|
+
* - Text truncation
|
|
8
|
+
* - Consistent tool result formatting
|
|
9
|
+
*/
|
|
10
|
+
export { base64LengthToBytes, createDataUri, encodeToBase64, extractBase64Content, formatByteSize, isLikelyBase64String, isValidBase64, parseDataUri, safeBase64Decode, } from './base64-utils.js';
|
|
11
|
+
export type { ParsedDataUri } from './base64-utils.js';
|
|
12
|
+
export { createToolSanitizer, sanitizeToolResult, ToolSanitizer, } from './tool-sanitizer.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool output sanitization module.
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for sanitizing tool outputs:
|
|
5
|
+
* - Base64 detection and parsing
|
|
6
|
+
* - Media persistence to blob storage
|
|
7
|
+
* - Text truncation
|
|
8
|
+
* - Consistent tool result formatting
|
|
9
|
+
*/
|
|
10
|
+
// Base64 utilities
|
|
11
|
+
export { base64LengthToBytes, createDataUri, encodeToBase64, extractBase64Content, formatByteSize, isLikelyBase64String, isValidBase64, parseDataUri, safeBase64Decode, } from './base64-utils.js';
|
|
12
|
+
// Tool sanitizer
|
|
13
|
+
export { createToolSanitizer, sanitizeToolResult, ToolSanitizer, } from './tool-sanitizer.js';
|
|
@@ -0,0 +1,74 @@
|
|
|
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 type { IBlobStorage } from '../../../../core/interfaces/cipher/i-blob-storage.js';
|
|
11
|
+
import type { MessagePart } from '../../../../core/interfaces/cipher/message-types.js';
|
|
12
|
+
import type { NormalizedToolOutput, PersistMediaResult, SanitizedToolResult, SanitizeToolResultOptions } from '../../../../core/interfaces/cipher/sanitization-types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Tool output sanitizer.
|
|
15
|
+
*
|
|
16
|
+
* Provides a pipeline for sanitizing tool outputs:
|
|
17
|
+
* - Normalizes arbitrary output formats to MessagePart[]
|
|
18
|
+
* - Stores large media in blob storage with lazy references
|
|
19
|
+
* - Applies text truncation and cleanup
|
|
20
|
+
*/
|
|
21
|
+
export declare class ToolSanitizer {
|
|
22
|
+
private readonly blobStorage?;
|
|
23
|
+
private readonly maxInlineMediaBytes;
|
|
24
|
+
private readonly maxTextLength;
|
|
25
|
+
constructor(options?: {
|
|
26
|
+
blobStorage?: IBlobStorage;
|
|
27
|
+
maxInlineMediaBytes?: number;
|
|
28
|
+
maxTextLength?: number;
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Step 3: Apply final sanitization (truncation, etc.).
|
|
32
|
+
*/
|
|
33
|
+
applySanitization(parts: MessagePart[], maxTextLength?: number): MessagePart[];
|
|
34
|
+
/**
|
|
35
|
+
* Step 1: Normalize arbitrary tool output to MessagePart array.
|
|
36
|
+
*/
|
|
37
|
+
normalize(result: unknown): NormalizedToolOutput;
|
|
38
|
+
/**
|
|
39
|
+
* Step 2: Persist large media to blob storage.
|
|
40
|
+
*/
|
|
41
|
+
persistMedia(parts: MessagePart[], toolName: string, toolCallId: string, maxInlineBytes?: number): Promise<PersistMediaResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Sanitize a tool result through the full pipeline.
|
|
44
|
+
*/
|
|
45
|
+
sanitize(result: unknown, options: SanitizeToolResultOptions): Promise<SanitizedToolResult>;
|
|
46
|
+
private extractData;
|
|
47
|
+
private generateBlobId;
|
|
48
|
+
private normalizeArray;
|
|
49
|
+
private normalizeArrayItem;
|
|
50
|
+
private normalizeObject;
|
|
51
|
+
private normalizeResourceContent;
|
|
52
|
+
private normalizeString;
|
|
53
|
+
private normalizeValue;
|
|
54
|
+
private persistFileIfNeeded;
|
|
55
|
+
private persistImageIfNeeded;
|
|
56
|
+
/**
|
|
57
|
+
* Recursively sanitize object, replacing large base64 with placeholders.
|
|
58
|
+
*/
|
|
59
|
+
private sanitizeDeepObject;
|
|
60
|
+
private storeAsBlob;
|
|
61
|
+
private truncateText;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create a ToolSanitizer instance.
|
|
65
|
+
*/
|
|
66
|
+
export declare function createToolSanitizer(options?: {
|
|
67
|
+
blobStorage?: IBlobStorage;
|
|
68
|
+
maxInlineMediaBytes?: number;
|
|
69
|
+
maxTextLength?: number;
|
|
70
|
+
}): ToolSanitizer;
|
|
71
|
+
/**
|
|
72
|
+
* Convenience function to sanitize a tool result with default options.
|
|
73
|
+
*/
|
|
74
|
+
export declare function sanitizeToolResult(result: unknown, options: SanitizeToolResultOptions): Promise<SanitizedToolResult>;
|