byterover-cli 0.4.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -9
- package/dist/commands/curate.d.ts +1 -3
- package/dist/commands/curate.js +14 -51
- package/dist/commands/main.d.ts +8 -0
- package/dist/commands/main.js +29 -8
- package/dist/commands/query.d.ts +1 -3
- package/dist/commands/query.js +8 -35
- package/dist/config/context-tree-domains.d.ts +5 -0
- package/dist/config/context-tree-domains.js +6 -1
- package/dist/config/environment.js +9 -9
- package/dist/constants.d.ts +14 -0
- package/dist/constants.js +18 -0
- package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
- package/dist/core/domain/cipher/agent/agent-info.js +143 -0
- package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
- package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
- package/dist/core/domain/cipher/agent/index.d.ts +4 -1
- package/dist/core/domain/cipher/agent/index.js +7 -1
- package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
- package/dist/core/domain/cipher/agent-events/types.js +11 -0
- package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
- package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
- package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
- package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
- package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
- package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
- package/dist/core/domain/cipher/llm/error-codes.js +51 -0
- package/dist/core/domain/cipher/llm/index.d.ts +9 -0
- package/dist/core/domain/cipher/llm/index.js +13 -0
- package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
- package/dist/core/domain/cipher/llm/registry.js +244 -0
- package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
- package/dist/core/domain/cipher/llm/schemas.js +151 -0
- package/dist/core/domain/cipher/llm/types.d.ts +121 -0
- package/dist/core/domain/cipher/llm/types.js +60 -0
- package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
- package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
- package/dist/core/domain/cipher/streaming/types.js +16 -0
- package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
- package/dist/core/domain/cipher/todos/types.d.ts +34 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
- package/dist/core/domain/cipher/tools/constants.js +5 -2
- package/dist/core/domain/cipher/tools/types.d.ts +31 -0
- package/dist/core/domain/errors/connection-error.d.ts +33 -0
- package/dist/core/domain/errors/connection-error.js +54 -0
- package/dist/core/domain/errors/core-process-error.d.ts +27 -0
- package/dist/core/domain/errors/core-process-error.js +43 -0
- package/dist/core/domain/errors/task-error.d.ts +64 -0
- package/dist/core/domain/errors/task-error.js +116 -0
- package/dist/core/domain/errors/transport-error.d.ts +72 -0
- package/dist/core/domain/errors/transport-error.js +114 -0
- package/dist/core/domain/instance/index.d.ts +1 -0
- package/dist/core/domain/instance/index.js +1 -0
- package/dist/core/domain/instance/types.d.ts +57 -0
- package/dist/core/domain/instance/types.js +72 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
- package/dist/core/domain/knowledge/directory-manager.js +31 -0
- package/dist/core/domain/transport/index.d.ts +2 -0
- package/dist/core/domain/transport/index.js +2 -0
- package/dist/core/domain/transport/schemas.d.ts +1149 -0
- package/dist/core/domain/transport/schemas.js +554 -0
- package/dist/core/domain/transport/types.d.ts +67 -0
- package/dist/core/domain/transport/types.js +7 -0
- package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
- package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
- package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
- package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
- package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
- package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
- package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
- package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
- package/dist/core/interfaces/cipher/index.d.ts +35 -0
- package/dist/core/interfaces/cipher/index.js +11 -0
- package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
- package/dist/core/interfaces/cipher/message-factory.js +252 -0
- package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
- package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
- package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
- package/dist/core/interfaces/cipher/message-types.js +6 -0
- package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
- package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
- package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
- package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
- package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
- package/dist/core/interfaces/executor/i-query-executor.js +1 -0
- package/dist/core/interfaces/executor/index.d.ts +2 -0
- package/dist/core/interfaces/executor/index.js +2 -0
- package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
- package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
- package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
- package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
- package/dist/core/interfaces/instance/index.d.ts +2 -0
- package/dist/core/interfaces/instance/index.js +2 -0
- package/dist/core/interfaces/noop-implementations.d.ts +53 -0
- package/dist/core/interfaces/noop-implementations.js +62 -0
- package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
- package/dist/core/interfaces/transport/i-transport-client.js +1 -0
- package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
- package/dist/core/interfaces/transport/i-transport-server.js +1 -0
- package/dist/core/interfaces/transport/index.d.ts +2 -0
- package/dist/core/interfaces/transport/index.js +2 -0
- package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
- package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
- package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
- package/dist/infra/cipher/agent/agent-error.js +79 -0
- package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
- package/dist/infra/cipher/agent/agent-schemas.js +97 -0
- package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
- package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
- package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
- package/dist/infra/cipher/agent/base-agent.js +240 -0
- package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
- package/dist/infra/cipher/agent/cipher-agent.js +546 -0
- package/dist/infra/cipher/agent/index.d.ts +22 -0
- package/dist/infra/cipher/agent/index.js +24 -0
- package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
- package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
- package/dist/infra/cipher/agent/types.d.ts +35 -0
- package/dist/infra/cipher/agent/types.js +1 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
- package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
- package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
- package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
- package/dist/infra/cipher/consumer/consumer-service.js +1 -0
- package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
- package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
- package/dist/infra/cipher/consumer/index.d.ts +1 -1
- package/dist/infra/cipher/consumer/index.js +2 -1
- package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
- package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
- package/dist/infra/cipher/file-system/binary-utils.js +164 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
- package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
- package/dist/infra/cipher/file-system/file-system-service.js +327 -36
- package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
- package/dist/infra/cipher/file-system/path-validator.js +111 -6
- package/dist/infra/cipher/interactive-loop.js +41 -33
- package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
- package/dist/infra/cipher/llm/capability-cache.js +125 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
- package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
- package/dist/infra/cipher/llm/context/compression/index.js +6 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
- package/dist/infra/cipher/llm/context/context-manager.js +129 -0
- package/dist/infra/cipher/llm/context/utils.js +17 -4
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
- package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
- package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
- package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
- package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
- package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
- package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
- package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
- package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
- package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
- package/dist/infra/cipher/llm/sanitization/index.js +13 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
- package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
- package/dist/infra/cipher/llm/stream-processor.js +276 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
- package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
- package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
- package/dist/infra/cipher/process/command-validator.d.ts +23 -0
- package/dist/infra/cipher/process/command-validator.js +75 -0
- package/dist/infra/cipher/process/path-utils.d.ts +66 -0
- package/dist/infra/cipher/process/path-utils.js +94 -0
- package/dist/infra/cipher/process/process-service.d.ts +32 -0
- package/dist/infra/cipher/process/process-service.js +98 -17
- package/dist/infra/cipher/session/chat-session.d.ts +56 -7
- package/dist/infra/cipher/session/chat-session.js +163 -13
- package/dist/infra/cipher/session/index.d.ts +1 -0
- package/dist/infra/cipher/session/index.js +2 -0
- package/dist/infra/cipher/session/message-queue.d.ts +65 -0
- package/dist/infra/cipher/session/message-queue.js +90 -0
- package/dist/infra/cipher/session/session-manager.d.ts +106 -5
- package/dist/infra/cipher/session/session-manager.js +254 -7
- package/dist/infra/cipher/session/session-status.d.ts +137 -0
- package/dist/infra/cipher/session/session-status.js +184 -0
- package/dist/infra/cipher/session/title-generator.d.ts +8 -0
- package/dist/infra/cipher/session/title-generator.js +31 -0
- package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
- package/dist/infra/cipher/storage/message-storage-service.js +300 -54
- package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
- package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
- package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
- package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
- package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
- package/dist/infra/cipher/system-prompt/schemas.js +94 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
- package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
- package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
- package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
- package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
- package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
- package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
- package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
- package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
- package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
- package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
- package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
- package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
- package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
- package/dist/infra/cipher/tools/index.d.ts +1 -1
- package/dist/infra/cipher/tools/index.js +1 -1
- package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
- package/dist/infra/cipher/tools/plugins/index.js +2 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
- package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
- package/dist/infra/cipher/tools/streaming/index.js +1 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
- package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
- package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
- package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
- package/dist/infra/cipher/tools/tool-manager.js +107 -11
- package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
- package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
- package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
- package/dist/infra/cipher/tools/tool-provider.js +81 -25
- package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
- package/dist/infra/cipher/tools/tool-registry.js +58 -16
- package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
- package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
- package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
- package/dist/infra/context-tree/path-utils.d.ts +7 -0
- package/dist/infra/context-tree/path-utils.js +7 -0
- package/dist/infra/core/executors/curate-executor.d.ts +35 -0
- package/dist/infra/core/executors/curate-executor.js +123 -0
- package/dist/infra/core/executors/index.d.ts +2 -0
- package/dist/infra/core/executors/index.js +2 -0
- package/dist/infra/core/executors/query-executor.d.ts +23 -0
- package/dist/infra/core/executors/query-executor.js +51 -0
- package/dist/infra/core/task-processor.d.ts +81 -0
- package/dist/infra/core/task-processor.js +115 -0
- package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
- package/dist/infra/instance/file-instance-discovery.js +84 -0
- package/dist/infra/instance/file-instance-manager.d.ts +46 -0
- package/dist/infra/instance/file-instance-manager.js +123 -0
- package/dist/infra/instance/index.d.ts +3 -0
- package/dist/infra/instance/index.js +3 -0
- package/dist/infra/instance/process-utils.d.ts +14 -0
- package/dist/infra/instance/process-utils.js +39 -0
- package/dist/infra/process/agent-worker.d.ts +20 -0
- package/dist/infra/process/agent-worker.js +602 -0
- package/dist/infra/process/index.d.ts +12 -0
- package/dist/infra/process/index.js +11 -0
- package/dist/infra/process/ipc-types.d.ts +55 -0
- package/dist/infra/process/ipc-types.js +12 -0
- package/dist/infra/process/process-manager.d.ts +154 -0
- package/dist/infra/process/process-manager.js +471 -0
- package/dist/infra/process/task-queue-manager.d.ts +123 -0
- package/dist/infra/process/task-queue-manager.js +226 -0
- package/dist/infra/process/transport-handlers.d.ts +124 -0
- package/dist/infra/process/transport-handlers.js +348 -0
- package/dist/infra/process/transport-worker.d.ts +20 -0
- package/dist/infra/process/transport-worker.js +168 -0
- package/dist/infra/repl/commands/curate-command.js +0 -5
- package/dist/infra/repl/commands/query-command.js +0 -3
- package/dist/infra/repl/repl-startup.d.ts +4 -0
- package/dist/infra/repl/repl-startup.js +8 -1
- package/dist/infra/repl/transport-client-helper.d.ts +9 -0
- package/dist/infra/repl/transport-client-helper.js +96 -0
- package/dist/infra/transport/index.d.ts +4 -0
- package/dist/infra/transport/index.js +4 -0
- package/dist/infra/transport/port-utils.d.ts +42 -0
- package/dist/infra/transport/port-utils.js +84 -0
- package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
- package/dist/infra/transport/socket-io-transport-client.js +270 -0
- package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
- package/dist/infra/transport/socket-io-transport-server.js +207 -0
- package/dist/infra/transport/transport-client-factory.d.ts +76 -0
- package/dist/infra/transport/transport-client-factory.js +168 -0
- package/dist/infra/transport/transport-factory.d.ts +33 -0
- package/dist/infra/transport/transport-factory.js +59 -0
- package/dist/infra/usecase/curate-use-case.d.ts +8 -55
- package/dist/infra/usecase/curate-use-case.js +71 -262
- package/dist/infra/usecase/init-use-case.js +3 -2
- package/dist/infra/usecase/query-use-case.d.ts +18 -45
- package/dist/infra/usecase/query-use-case.js +250 -326
- package/dist/infra/usecase/status-use-case.js +1 -1
- package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
- package/dist/resources/prompts/explore.yml +78 -0
- package/dist/resources/prompts/plan.yml +114 -0
- package/dist/resources/prompts/reflection.yml +1 -1
- package/dist/resources/prompts/system-prompt.yml +15 -8
- package/dist/resources/prompts/tool-outputs.yml +0 -5
- package/dist/resources/tools/bash_exec.txt +98 -0
- package/dist/resources/tools/bash_output.txt +40 -0
- package/dist/resources/tools/batch.txt +28 -0
- package/dist/resources/tools/create_knowledge_topic.txt +23 -0
- package/dist/resources/tools/curate.txt +22 -0
- package/dist/resources/tools/delete_memory.txt +1 -0
- package/dist/resources/tools/detect_domains.txt +11 -0
- package/dist/resources/tools/edit_file.txt +1 -0
- package/dist/resources/tools/edit_memory.txt +1 -0
- package/dist/resources/tools/glob_files.txt +20 -0
- package/dist/resources/tools/grep_content.txt +18 -0
- package/dist/resources/tools/kill_process.txt +16 -0
- package/dist/resources/tools/list_directory.txt +16 -0
- package/dist/resources/tools/list_memories.txt +1 -0
- package/dist/resources/tools/read_file.txt +31 -0
- package/dist/resources/tools/read_memory.txt +1 -0
- package/dist/resources/tools/read_todos.txt +17 -0
- package/dist/resources/tools/search_history.txt +1 -0
- package/dist/resources/tools/task.txt +23 -0
- package/dist/resources/tools/write_file.txt +1 -0
- package/dist/resources/tools/write_memory.txt +1 -0
- package/dist/resources/tools/write_todos.txt +29 -0
- package/dist/tui/app.js +9 -13
- package/dist/tui/components/command-details.d.ts +14 -0
- package/dist/tui/components/command-details.js +35 -0
- package/dist/tui/components/execution/execution-changes.d.ts +5 -0
- package/dist/tui/components/execution/execution-changes.js +19 -4
- package/dist/tui/components/execution/execution-content.d.ts +4 -2
- package/dist/tui/components/execution/execution-content.js +26 -13
- package/dist/tui/components/execution/execution-input.js +3 -3
- package/dist/tui/components/execution/execution-progress.d.ts +2 -2
- package/dist/tui/components/execution/execution-progress.js +8 -6
- package/dist/tui/components/execution/log-item.d.ts +3 -4
- package/dist/tui/components/execution/log-item.js +2 -5
- package/dist/tui/components/footer.js +9 -4
- package/dist/tui/components/header.d.ts +3 -3
- package/dist/tui/components/header.js +5 -3
- package/dist/tui/components/index.d.ts +1 -0
- package/dist/tui/components/index.js +1 -0
- package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
- package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
- package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
- package/dist/tui/components/scrollable-list.js +12 -10
- package/dist/tui/components/suggestions.js +39 -41
- package/dist/tui/components/tab-bar.d.ts +2 -1
- package/dist/tui/components/tab-bar.js +3 -4
- package/dist/tui/constants.d.ts +0 -5
- package/dist/tui/constants.js +0 -5
- package/dist/tui/contexts/auth-context.js +9 -2
- package/dist/tui/contexts/{use-commands.js → commands-context.js} +3 -3
- package/dist/tui/contexts/index.d.ts +6 -1
- package/dist/tui/contexts/index.js +6 -1
- package/dist/tui/contexts/onboarding-context.d.ts +1 -1
- package/dist/tui/contexts/onboarding-context.js +9 -9
- package/dist/tui/contexts/tasks-context.d.ts +84 -0
- package/dist/tui/contexts/tasks-context.js +218 -0
- package/dist/tui/contexts/transport-context.d.ts +29 -0
- package/dist/tui/contexts/transport-context.js +82 -0
- package/dist/tui/hooks/index.d.ts +10 -6
- package/dist/tui/hooks/index.js +7 -6
- package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
- package/dist/tui/hooks/use-activity-logs.js +87 -34
- package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
- package/dist/tui/hooks/use-auth-polling.js +104 -0
- package/dist/tui/hooks/use-slash-command-processor.js +0 -1
- package/dist/tui/hooks/use-slash-completion.js +1 -1
- package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
- package/dist/tui/hooks/use-tab-navigation.js +16 -7
- package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
- package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
- package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
- package/dist/tui/hooks/use-ui-heights.js +88 -0
- package/dist/tui/providers/app-providers.js +2 -6
- package/dist/tui/types/commands.d.ts +0 -26
- package/dist/tui/types/index.d.ts +1 -1
- package/dist/tui/types/ui.d.ts +9 -4
- package/dist/tui/utils/line.d.ts +11 -0
- package/dist/tui/utils/line.js +16 -0
- package/dist/tui/utils/log.d.ts +27 -0
- package/dist/tui/utils/log.js +114 -0
- package/dist/tui/views/command-view.d.ts +7 -0
- package/dist/tui/views/command-view.js +103 -80
- package/dist/tui/views/login-view.js +7 -4
- package/dist/tui/views/logs-view.d.ts +13 -0
- package/dist/tui/views/logs-view.js +27 -52
- package/dist/utils/connection-error-handler.d.ts +16 -0
- package/dist/utils/connection-error-handler.js +49 -0
- package/dist/utils/crash-log.d.ts +14 -0
- package/dist/utils/crash-log.js +19 -0
- package/dist/utils/file-helpers.d.ts +14 -0
- package/dist/utils/file-helpers.js +21 -0
- package/dist/utils/global-logs-path.d.ts +11 -0
- package/dist/utils/global-logs-path.js +37 -0
- package/dist/utils/process-logger.d.ts +53 -0
- package/dist/utils/process-logger.js +253 -0
- package/dist/utils/sandbox-detector.d.ts +31 -0
- package/dist/utils/sandbox-detector.js +122 -0
- package/oclif.manifest.json +10 -198
- package/package.json +5 -1
- package/dist/commands/cipher-agent/run.d.ts +0 -142
- package/dist/commands/cipher-agent/run.js +0 -555
- package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
- package/dist/commands/cipher-agent/set-prompt.js +0 -58
- package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
- package/dist/commands/cipher-agent/show-prompt.js +0 -53
- package/dist/commands/foo.d.ts +0 -14
- package/dist/commands/foo.js +0 -66
- package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
- package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
- package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
- package/dist/infra/cipher/cipher-agent.d.ts +0 -182
- package/dist/infra/cipher/cipher-agent.js +0 -317
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
- package/dist/resources/prompts/modes/autonomous.yml +0 -9
- package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
- package/dist/tui/contexts/consumer.d.ts +0 -31
- package/dist/tui/contexts/consumer.js +0 -56
- package/dist/tui/hooks/use-consumer.d.ts +0 -12
- package/dist/tui/hooks/use-consumer.js +0 -50
- package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
- package/dist/tui/hooks/use-queue-polling.js +0 -90
- /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
- /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reactive Overflow compression strategy.
|
|
3
|
+
*
|
|
4
|
+
* This strategy uses an LLM to generate intelligent summaries of older messages
|
|
5
|
+
* when the context window overflows. Unlike simple truncation strategies, it
|
|
6
|
+
* preserves the semantic meaning of the conversation.
|
|
7
|
+
*
|
|
8
|
+
* Algorithm:
|
|
9
|
+
* 1. Check if overflow (currentTokens > maxHistoryTokens)
|
|
10
|
+
* 2. Select oldest non-system messages to summarize
|
|
11
|
+
* 3. Generate LLM summary of selected messages
|
|
12
|
+
* 4. Return: systemMessages + summaryMessage + remainingMessages
|
|
13
|
+
* 5. Summary message has metadata.isSummary = true
|
|
14
|
+
*
|
|
15
|
+
* Key design principles:
|
|
16
|
+
* - Uses same model as conversation (per user configuration)
|
|
17
|
+
* - Summary message marks compaction boundary
|
|
18
|
+
* - filterCompacted() excludes old messages at read-time
|
|
19
|
+
* - Full history preserved in storage for audit
|
|
20
|
+
*
|
|
21
|
+
*/
|
|
22
|
+
import { isTextPart } from '../../../../../core/interfaces/cipher/message-type-guards.js';
|
|
23
|
+
/**
|
|
24
|
+
* Default configuration values.
|
|
25
|
+
*/
|
|
26
|
+
const DEFAULTS = {
|
|
27
|
+
minMessagesToSummarize: 10,
|
|
28
|
+
preserveLastNTurns: 2,
|
|
29
|
+
summaryTargetTokens: 2000,
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Reactive Overflow compression strategy.
|
|
33
|
+
*
|
|
34
|
+
* Uses an LLM to generate intelligent summaries when context overflows.
|
|
35
|
+
*/
|
|
36
|
+
export class ReactiveOverflowStrategy {
|
|
37
|
+
llmProvider;
|
|
38
|
+
minMessagesToSummarize;
|
|
39
|
+
model;
|
|
40
|
+
preserveLastNTurns;
|
|
41
|
+
summaryTargetTokens;
|
|
42
|
+
constructor(options) {
|
|
43
|
+
this.llmProvider = options.llmProvider;
|
|
44
|
+
this.model = options.model;
|
|
45
|
+
this.summaryTargetTokens = options.summaryTargetTokens ?? DEFAULTS.summaryTargetTokens;
|
|
46
|
+
this.minMessagesToSummarize = options.minMessagesToSummarize ?? DEFAULTS.minMessagesToSummarize;
|
|
47
|
+
this.preserveLastNTurns = options.preserveLastNTurns ?? DEFAULTS.preserveLastNTurns;
|
|
48
|
+
}
|
|
49
|
+
async compress(history, maxHistoryTokens, tokenizer) {
|
|
50
|
+
// Calculate current token count
|
|
51
|
+
const currentTokens = this.countHistoryTokens(history, tokenizer);
|
|
52
|
+
// Check if compression is needed
|
|
53
|
+
if (currentTokens <= maxHistoryTokens) {
|
|
54
|
+
return history;
|
|
55
|
+
}
|
|
56
|
+
// Separate system messages from non-system messages
|
|
57
|
+
const systemMessages = history.filter((m) => m.role === 'system');
|
|
58
|
+
const nonSystemMessages = history.filter((m) => m.role !== 'system');
|
|
59
|
+
// Check if we have enough messages to summarize
|
|
60
|
+
if (nonSystemMessages.length < this.minMessagesToSummarize) {
|
|
61
|
+
// Not enough messages, can't use this strategy
|
|
62
|
+
return history;
|
|
63
|
+
}
|
|
64
|
+
// Calculate how many messages to keep (preserve last N turns)
|
|
65
|
+
const turnBoundaries = this.findTurnBoundaries(nonSystemMessages);
|
|
66
|
+
const turnsToPreserve = Math.min(this.preserveLastNTurns, turnBoundaries.length);
|
|
67
|
+
const preserveFromIndex = turnsToPreserve > 0
|
|
68
|
+
? turnBoundaries[turnBoundaries.length - turnsToPreserve]
|
|
69
|
+
: nonSystemMessages.length;
|
|
70
|
+
// Split messages into "to summarize" and "to keep"
|
|
71
|
+
const messagesToSummarize = nonSystemMessages.slice(0, preserveFromIndex);
|
|
72
|
+
const messagesToKeep = nonSystemMessages.slice(preserveFromIndex);
|
|
73
|
+
// Need enough messages to summarize
|
|
74
|
+
if (messagesToSummarize.length < this.minMessagesToSummarize) {
|
|
75
|
+
return history;
|
|
76
|
+
}
|
|
77
|
+
// Generate summary using LLM
|
|
78
|
+
const summaryContent = await this.generateSummary(messagesToSummarize);
|
|
79
|
+
// Create summary message with metadata
|
|
80
|
+
const summaryMessage = {
|
|
81
|
+
content: `[Conversation Summary]\n${summaryContent}`,
|
|
82
|
+
metadata: {
|
|
83
|
+
compactedAt: Date.now(),
|
|
84
|
+
isSummary: true,
|
|
85
|
+
summarizedMessageCount: messagesToSummarize.length,
|
|
86
|
+
},
|
|
87
|
+
role: 'system',
|
|
88
|
+
};
|
|
89
|
+
// Return: system messages + summary + kept messages
|
|
90
|
+
return [...systemMessages, summaryMessage, ...messagesToKeep];
|
|
91
|
+
}
|
|
92
|
+
getName() {
|
|
93
|
+
return 'ReactiveOverflow';
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Count tokens in message history.
|
|
97
|
+
*/
|
|
98
|
+
countHistoryTokens(history, tokenizer) {
|
|
99
|
+
let total = 0;
|
|
100
|
+
for (const message of history) {
|
|
101
|
+
total += this.countMessageTokens(message, tokenizer);
|
|
102
|
+
}
|
|
103
|
+
return total;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Count tokens in a single message.
|
|
107
|
+
*/
|
|
108
|
+
countMessageTokens(message, tokenizer) {
|
|
109
|
+
// Role overhead (approximately 4 tokens)
|
|
110
|
+
let tokens = 4;
|
|
111
|
+
if (typeof message.content === 'string') {
|
|
112
|
+
tokens += tokenizer.countTokens(message.content);
|
|
113
|
+
}
|
|
114
|
+
else if (Array.isArray(message.content)) {
|
|
115
|
+
for (const part of message.content) {
|
|
116
|
+
tokens += isTextPart(part) ? tokenizer.countTokens(part.text) : 100;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Tool calls overhead
|
|
120
|
+
if (message.toolCalls) {
|
|
121
|
+
for (const call of message.toolCalls) {
|
|
122
|
+
tokens += tokenizer.countTokens(call.function.name);
|
|
123
|
+
tokens += tokenizer.countTokens(call.function.arguments);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return tokens;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Extract text content from a message.
|
|
130
|
+
*/
|
|
131
|
+
extractTextContent(message) {
|
|
132
|
+
if (typeof message.content === 'string') {
|
|
133
|
+
return message.content;
|
|
134
|
+
}
|
|
135
|
+
if (Array.isArray(message.content)) {
|
|
136
|
+
return message.content
|
|
137
|
+
.filter((p) => isTextPart(p))
|
|
138
|
+
.map((p) => p.text)
|
|
139
|
+
.join('\n');
|
|
140
|
+
}
|
|
141
|
+
return '';
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Find turn boundaries in message history.
|
|
145
|
+
*
|
|
146
|
+
* A turn boundary is the index where a user message starts.
|
|
147
|
+
* Returns indices of all user messages.
|
|
148
|
+
*/
|
|
149
|
+
findTurnBoundaries(messages) {
|
|
150
|
+
const boundaries = [];
|
|
151
|
+
for (const [index, message] of messages.entries()) {
|
|
152
|
+
if (message.role === 'user') {
|
|
153
|
+
boundaries.push(index);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return boundaries;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Format messages for the summary prompt.
|
|
160
|
+
*/
|
|
161
|
+
formatMessagesForSummary(messages) {
|
|
162
|
+
const lines = [];
|
|
163
|
+
for (const message of messages) {
|
|
164
|
+
const role = this.formatRole(message.role);
|
|
165
|
+
const content = this.extractTextContent(message);
|
|
166
|
+
// Truncate very long messages
|
|
167
|
+
const truncatedContent = content.length > 2000
|
|
168
|
+
? `${content.slice(0, 2000)}... [truncated]`
|
|
169
|
+
: content;
|
|
170
|
+
if (truncatedContent) {
|
|
171
|
+
lines.push(`${role}: ${truncatedContent}`);
|
|
172
|
+
}
|
|
173
|
+
// Include tool call information
|
|
174
|
+
if (message.toolCalls && message.toolCalls.length > 0) {
|
|
175
|
+
const toolNames = message.toolCalls.map((tc) => tc.function.name).join(', ');
|
|
176
|
+
lines.push(`[Used tools: ${toolNames}]`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return lines.join('\n\n');
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Format role for display.
|
|
183
|
+
*/
|
|
184
|
+
formatRole(role) {
|
|
185
|
+
switch (role) {
|
|
186
|
+
case 'assistant': {
|
|
187
|
+
return 'Assistant';
|
|
188
|
+
}
|
|
189
|
+
case 'system': {
|
|
190
|
+
return 'System';
|
|
191
|
+
}
|
|
192
|
+
case 'tool': {
|
|
193
|
+
return 'Tool Result';
|
|
194
|
+
}
|
|
195
|
+
case 'user': {
|
|
196
|
+
return 'User';
|
|
197
|
+
}
|
|
198
|
+
default: {
|
|
199
|
+
return role.charAt(0).toUpperCase() + role.slice(1);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Generate a fallback summary without LLM.
|
|
205
|
+
*/
|
|
206
|
+
generateFallbackSummary(messages) {
|
|
207
|
+
const userMessages = messages.filter((m) => m.role === 'user');
|
|
208
|
+
const assistantMessages = messages.filter((m) => m.role === 'assistant');
|
|
209
|
+
const toolMessages = messages.filter((m) => m.role === 'tool');
|
|
210
|
+
const lines = [
|
|
211
|
+
`Summarized ${messages.length} messages:`,
|
|
212
|
+
`- ${userMessages.length} user messages`,
|
|
213
|
+
`- ${assistantMessages.length} assistant responses`,
|
|
214
|
+
`- ${toolMessages.length} tool results`,
|
|
215
|
+
];
|
|
216
|
+
// Extract key topics from user messages
|
|
217
|
+
const topics = new Set();
|
|
218
|
+
for (const msg of userMessages.slice(0, 5)) {
|
|
219
|
+
const content = this.extractTextContent(msg);
|
|
220
|
+
const words = content.split(/\s+/).slice(0, 10).join(' ');
|
|
221
|
+
if (words) {
|
|
222
|
+
topics.add(words);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (topics.size > 0) {
|
|
226
|
+
const topicLines = ['', 'Key topics discussed:'];
|
|
227
|
+
for (const topic of topics) {
|
|
228
|
+
topicLines.push(`- ${topic}...`);
|
|
229
|
+
}
|
|
230
|
+
lines.push(...topicLines);
|
|
231
|
+
}
|
|
232
|
+
return lines.join('\n');
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Generate a summary of messages using the LLM.
|
|
236
|
+
*/
|
|
237
|
+
async generateSummary(messages) {
|
|
238
|
+
const conversationText = this.formatMessagesForSummary(messages);
|
|
239
|
+
const prompt = `You are a conversation summarizer. Summarize the following conversation concisely, preserving:
|
|
240
|
+
- Key decisions made
|
|
241
|
+
- Important actions taken
|
|
242
|
+
- Critical context for continuing the conversation
|
|
243
|
+
- Any unresolved questions or tasks
|
|
244
|
+
|
|
245
|
+
Keep the summary focused and actionable. Do not include unnecessary details.
|
|
246
|
+
|
|
247
|
+
Conversation:
|
|
248
|
+
${conversationText}
|
|
249
|
+
|
|
250
|
+
Summary:`;
|
|
251
|
+
try {
|
|
252
|
+
const summary = await this.llmProvider.generate({
|
|
253
|
+
maxTokens: this.summaryTargetTokens,
|
|
254
|
+
prompt,
|
|
255
|
+
...(this.model && { model: this.model }),
|
|
256
|
+
temperature: 0.3, // Lower temperature for more consistent summaries
|
|
257
|
+
});
|
|
258
|
+
return summary.trim() || 'Unable to generate summary.';
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
// Fallback if LLM fails
|
|
262
|
+
const fallbackSummary = this.generateFallbackSummary(messages);
|
|
263
|
+
return fallbackSummary;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Create a ReactiveOverflowStrategy instance.
|
|
269
|
+
*/
|
|
270
|
+
export function createReactiveOverflowStrategy(options) {
|
|
271
|
+
return new ReactiveOverflowStrategy(options);
|
|
272
|
+
}
|
|
@@ -2,7 +2,7 @@ import type { IHistoryStorage } from '../../../../core/interfaces/cipher/i-histo
|
|
|
2
2
|
import type { ILogger } from '../../../../core/interfaces/cipher/i-logger.js';
|
|
3
3
|
import type { IMessageFormatter } from '../../../../core/interfaces/cipher/i-message-formatter.js';
|
|
4
4
|
import type { ITokenizer } from '../../../../core/interfaces/cipher/i-tokenizer.js';
|
|
5
|
-
import type { InternalMessage } from '../../../../core/interfaces/cipher/message-types.js';
|
|
5
|
+
import type { InternalMessage, ToolPart, ToolState } from '../../../../core/interfaces/cipher/message-types.js';
|
|
6
6
|
import type { ICompressionStrategy } from './compression/types.js';
|
|
7
7
|
/**
|
|
8
8
|
* Configuration for persistence retry behavior.
|
|
@@ -138,6 +138,15 @@ export declare class ContextManager<T> {
|
|
|
138
138
|
* @param content - System message content
|
|
139
139
|
*/
|
|
140
140
|
addSystemMessage(content: string): Promise<void>;
|
|
141
|
+
/**
|
|
142
|
+
* Add a pending tool call to the current assistant message.
|
|
143
|
+
* Creates a ToolPart in pending state and adds it to the last assistant message's content.
|
|
144
|
+
*
|
|
145
|
+
* @param callId - Unique identifier for this tool call
|
|
146
|
+
* @param toolName - Name of the tool being called
|
|
147
|
+
* @param input - Parsed input arguments
|
|
148
|
+
*/
|
|
149
|
+
addToolCallPending(callId: string, toolName: string, input: Record<string, unknown>): void;
|
|
141
150
|
/**
|
|
142
151
|
* Add a tool result message to the conversation.
|
|
143
152
|
* Thread-safe: Uses mutex to protect shared state during parallel tool execution.
|
|
@@ -169,6 +178,18 @@ export declare class ContextManager<T> {
|
|
|
169
178
|
* Also clears persisted history if storage is enabled.
|
|
170
179
|
*/
|
|
171
180
|
clearHistory(): Promise<void>;
|
|
181
|
+
/**
|
|
182
|
+
* Flush any pending history writes to storage.
|
|
183
|
+
* Provides explicit durability guarantee - ensures all messages
|
|
184
|
+
* are persisted before the promise resolves.
|
|
185
|
+
*
|
|
186
|
+
* Call at turn boundaries, before session cleanup, or when
|
|
187
|
+
* explicit persistence confirmation is needed.
|
|
188
|
+
*
|
|
189
|
+
* @returns Promise that resolves when history is persisted
|
|
190
|
+
* @throws Error if persistence fails after all retries
|
|
191
|
+
*/
|
|
192
|
+
flush(): Promise<void>;
|
|
172
193
|
/**
|
|
173
194
|
* Get comprehensive messages (all messages, for persistence/debugging).
|
|
174
195
|
* This includes all messages including invalid ones.
|
|
@@ -203,6 +224,13 @@ export declare class ContextManager<T> {
|
|
|
203
224
|
* Get the session ID.
|
|
204
225
|
*/
|
|
205
226
|
getSessionId(): string;
|
|
227
|
+
/**
|
|
228
|
+
* Get a tool part by its call ID.
|
|
229
|
+
*
|
|
230
|
+
* @param callId - ID of the tool call to find
|
|
231
|
+
* @returns The tool part if found, undefined otherwise
|
|
232
|
+
*/
|
|
233
|
+
getToolPart(callId: string): ToolPart | undefined;
|
|
206
234
|
/**
|
|
207
235
|
* Initialize the context manager by loading persisted history.
|
|
208
236
|
* Should be called after construction to restore previous conversation.
|
|
@@ -210,6 +238,18 @@ export declare class ContextManager<T> {
|
|
|
210
238
|
* @returns True if history was loaded, false otherwise
|
|
211
239
|
*/
|
|
212
240
|
initialize(): Promise<boolean>;
|
|
241
|
+
/**
|
|
242
|
+
* Update a tool call's state.
|
|
243
|
+
* Used for transitioning through pending → running → completed/error.
|
|
244
|
+
*
|
|
245
|
+
* @param callId - ID of the tool call to update
|
|
246
|
+
* @param stateUpdate - New state
|
|
247
|
+
*/
|
|
248
|
+
updateToolCallState(callId: string, stateUpdate: ToolState): void;
|
|
249
|
+
/**
|
|
250
|
+
* Add a ToolPart to a message at the given index.
|
|
251
|
+
*/
|
|
252
|
+
private addToolPartToMessage;
|
|
213
253
|
/**
|
|
214
254
|
* Compress conversation history if needed to fit within token limits.
|
|
215
255
|
*
|
|
@@ -228,6 +268,12 @@ export declare class ContextManager<T> {
|
|
|
228
268
|
* @returns Token count
|
|
229
269
|
*/
|
|
230
270
|
private countTokens;
|
|
271
|
+
/**
|
|
272
|
+
* Find the index of the last assistant message.
|
|
273
|
+
*
|
|
274
|
+
* @returns Index of last assistant message, or -1 if not found
|
|
275
|
+
*/
|
|
276
|
+
private findLastAssistantMessageIndex;
|
|
231
277
|
/**
|
|
232
278
|
* Check if a system message is noise (empty or whitespace only).
|
|
233
279
|
*
|
|
@@ -101,6 +101,29 @@ export class ContextManager {
|
|
|
101
101
|
this.logger.error('Failed to persist history after system message', { error, sessionId: this.sessionId });
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Add a pending tool call to the current assistant message.
|
|
106
|
+
* Creates a ToolPart in pending state and adds it to the last assistant message's content.
|
|
107
|
+
*
|
|
108
|
+
* @param callId - Unique identifier for this tool call
|
|
109
|
+
* @param toolName - Name of the tool being called
|
|
110
|
+
* @param input - Parsed input arguments
|
|
111
|
+
*/
|
|
112
|
+
addToolCallPending(callId, toolName, input) {
|
|
113
|
+
const toolPart = {
|
|
114
|
+
callId,
|
|
115
|
+
state: { input, status: 'pending' },
|
|
116
|
+
toolName,
|
|
117
|
+
type: 'tool',
|
|
118
|
+
};
|
|
119
|
+
// Find the last assistant message and add the tool part
|
|
120
|
+
const lastAssistantIdx = this.findLastAssistantMessageIndex();
|
|
121
|
+
if (lastAssistantIdx === -1) {
|
|
122
|
+
this.logger.warn('No assistant message found to add tool call', { callId, sessionId: this.sessionId });
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.addToolPartToMessage(lastAssistantIdx, toolPart);
|
|
126
|
+
}
|
|
104
127
|
/**
|
|
105
128
|
* Add a tool result message to the conversation.
|
|
106
129
|
* Thread-safe: Uses mutex to protect shared state during parallel tool execution.
|
|
@@ -173,6 +196,22 @@ export class ContextManager {
|
|
|
173
196
|
}
|
|
174
197
|
}
|
|
175
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Flush any pending history writes to storage.
|
|
201
|
+
* Provides explicit durability guarantee - ensures all messages
|
|
202
|
+
* are persisted before the promise resolves.
|
|
203
|
+
*
|
|
204
|
+
* Call at turn boundaries, before session cleanup, or when
|
|
205
|
+
* explicit persistence confirmation is needed.
|
|
206
|
+
*
|
|
207
|
+
* @returns Promise that resolves when history is persisted
|
|
208
|
+
* @throws Error if persistence fails after all retries
|
|
209
|
+
*/
|
|
210
|
+
async flush() {
|
|
211
|
+
if (this.historyStorage) {
|
|
212
|
+
await this.persistHistory();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
176
215
|
/**
|
|
177
216
|
* Get comprehensive messages (all messages, for persistence/debugging).
|
|
178
217
|
* This includes all messages including invalid ones.
|
|
@@ -236,6 +275,25 @@ export class ContextManager {
|
|
|
236
275
|
getSessionId() {
|
|
237
276
|
return this.sessionId;
|
|
238
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
* Get a tool part by its call ID.
|
|
280
|
+
*
|
|
281
|
+
* @param callId - ID of the tool call to find
|
|
282
|
+
* @returns The tool part if found, undefined otherwise
|
|
283
|
+
*/
|
|
284
|
+
getToolPart(callId) {
|
|
285
|
+
for (let msgIdx = this.messages.length - 1; msgIdx >= 0; msgIdx--) {
|
|
286
|
+
const message = this.messages[msgIdx];
|
|
287
|
+
if (!Array.isArray(message.content))
|
|
288
|
+
continue;
|
|
289
|
+
for (const part of message.content) {
|
|
290
|
+
if (part.type === 'tool' && part.callId === callId) {
|
|
291
|
+
return part;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
239
297
|
/**
|
|
240
298
|
* Initialize the context manager by loading persisted history.
|
|
241
299
|
* Should be called after construction to restore previous conversation.
|
|
@@ -269,6 +327,64 @@ export class ContextManager {
|
|
|
269
327
|
return false;
|
|
270
328
|
}
|
|
271
329
|
}
|
|
330
|
+
/**
|
|
331
|
+
* Update a tool call's state.
|
|
332
|
+
* Used for transitioning through pending → running → completed/error.
|
|
333
|
+
*
|
|
334
|
+
* @param callId - ID of the tool call to update
|
|
335
|
+
* @param stateUpdate - New state
|
|
336
|
+
*/
|
|
337
|
+
updateToolCallState(callId, stateUpdate) {
|
|
338
|
+
// Find the tool part with this callId
|
|
339
|
+
for (let msgIdx = this.messages.length - 1; msgIdx >= 0; msgIdx--) {
|
|
340
|
+
const message = this.messages[msgIdx];
|
|
341
|
+
if (!Array.isArray(message.content))
|
|
342
|
+
continue;
|
|
343
|
+
for (let partIdx = 0; partIdx < message.content.length; partIdx++) {
|
|
344
|
+
const part = message.content[partIdx];
|
|
345
|
+
if (part.type === 'tool' && part.callId === callId) {
|
|
346
|
+
// Update the tool part state
|
|
347
|
+
const updatedPart = {
|
|
348
|
+
...part,
|
|
349
|
+
state: stateUpdate,
|
|
350
|
+
};
|
|
351
|
+
// Create new content array with updated part
|
|
352
|
+
const newContent = [...message.content];
|
|
353
|
+
newContent[partIdx] = updatedPart;
|
|
354
|
+
// Update the message
|
|
355
|
+
this.messages[msgIdx] = {
|
|
356
|
+
...message,
|
|
357
|
+
content: newContent,
|
|
358
|
+
};
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
this.logger.warn('Tool call not found for state update', { callId, sessionId: this.sessionId });
|
|
364
|
+
}
|
|
365
|
+
// ==================== PRIVATE METHODS ====================
|
|
366
|
+
/**
|
|
367
|
+
* Add a ToolPart to a message at the given index.
|
|
368
|
+
*/
|
|
369
|
+
addToolPartToMessage(messageIdx, toolPart) {
|
|
370
|
+
const message = this.messages[messageIdx];
|
|
371
|
+
let newContent;
|
|
372
|
+
if (Array.isArray(message.content)) {
|
|
373
|
+
newContent = [...message.content, toolPart];
|
|
374
|
+
}
|
|
375
|
+
else if (typeof message.content === 'string') {
|
|
376
|
+
// Convert string content to array with text part + tool part
|
|
377
|
+
newContent = [{ text: message.content, type: 'text' }, toolPart];
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
// null content - just add tool part
|
|
381
|
+
newContent = [toolPart];
|
|
382
|
+
}
|
|
383
|
+
this.messages[messageIdx] = {
|
|
384
|
+
...message,
|
|
385
|
+
content: newContent,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
272
388
|
/**
|
|
273
389
|
* Compress conversation history if needed to fit within token limits.
|
|
274
390
|
*
|
|
@@ -352,6 +468,19 @@ export class ContextManager {
|
|
|
352
468
|
.join('\n');
|
|
353
469
|
return this.tokenizer.countTokens(text);
|
|
354
470
|
}
|
|
471
|
+
/**
|
|
472
|
+
* Find the index of the last assistant message.
|
|
473
|
+
*
|
|
474
|
+
* @returns Index of last assistant message, or -1 if not found
|
|
475
|
+
*/
|
|
476
|
+
findLastAssistantMessageIndex() {
|
|
477
|
+
for (let i = this.messages.length - 1; i >= 0; i--) {
|
|
478
|
+
if (this.messages[i].role === 'assistant') {
|
|
479
|
+
return i;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return -1;
|
|
483
|
+
}
|
|
355
484
|
/**
|
|
356
485
|
* Check if a system message is noise (empty or whitespace only).
|
|
357
486
|
*
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Count tokens for a single content part
|
|
3
3
|
*
|
|
4
|
-
* @param part - Content part
|
|
5
|
-
* @param part.text - Text content (for text type)
|
|
6
|
-
* @param part.type - Type of content part
|
|
4
|
+
* @param part - Content part (text, image, file, reasoning, or tool)
|
|
7
5
|
* @param tokenizer - Tokenizer for counting
|
|
8
6
|
* @returns Token count for the part
|
|
9
7
|
*/
|
|
@@ -20,9 +18,24 @@ function countPartTokens(part, tokenizer) {
|
|
|
20
18
|
// Conservative estimate: ~100 tokens per image
|
|
21
19
|
return 100;
|
|
22
20
|
}
|
|
21
|
+
case 'reasoning': {
|
|
22
|
+
// Reasoning/thinking content - use tokenizer
|
|
23
|
+
return tokenizer.countTokens(part.text);
|
|
24
|
+
}
|
|
23
25
|
case 'text': {
|
|
24
26
|
// Text content - use tokenizer
|
|
25
|
-
return tokenizer.countTokens(part.text
|
|
27
|
+
return tokenizer.countTokens(part.text);
|
|
28
|
+
}
|
|
29
|
+
case 'tool': {
|
|
30
|
+
// Tool call part - count input + output tokens
|
|
31
|
+
let tokens = tokenizer.countTokens(JSON.stringify(part.state.input));
|
|
32
|
+
if (part.state.status === 'completed') {
|
|
33
|
+
tokens += tokenizer.countTokens(part.state.output);
|
|
34
|
+
}
|
|
35
|
+
else if (part.state.status === 'error') {
|
|
36
|
+
tokens += tokenizer.countTokens(part.state.error);
|
|
37
|
+
}
|
|
38
|
+
return tokens;
|
|
26
39
|
}
|
|
27
40
|
default: {
|
|
28
41
|
return 0;
|
|
@@ -77,10 +77,12 @@ export class ByteRoverContentGenerator {
|
|
|
77
77
|
const config = this.providerType === 'claude' ? {} : genConfig;
|
|
78
78
|
// Build execution metadata from request
|
|
79
79
|
const executionMetadata = {
|
|
80
|
-
sessionId: request.
|
|
81
|
-
|
|
80
|
+
sessionId: request.taskId,
|
|
81
|
+
taskId: request.taskId,
|
|
82
82
|
...(request.executionContext && { executionContext: request.executionContext }),
|
|
83
83
|
};
|
|
84
|
+
// // Debug: Log taskId for tracking
|
|
85
|
+
// appendFileSync('debug-taskid.log', `[${new Date().toISOString()}] taskId from request: "${request.taskId}"\n`)
|
|
84
86
|
const rawResponse = await this.httpService.generateContent(contents, config, this.config.model, executionMetadata);
|
|
85
87
|
// Parse response to internal format
|
|
86
88
|
const messages = this.formatter.parseResponse(rawResponse);
|