byterover-cli 0.4.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -9
- package/dist/commands/curate.d.ts +1 -3
- package/dist/commands/curate.js +14 -51
- package/dist/commands/main.d.ts +8 -0
- package/dist/commands/main.js +29 -8
- package/dist/commands/query.d.ts +1 -3
- package/dist/commands/query.js +8 -35
- package/dist/config/context-tree-domains.d.ts +5 -0
- package/dist/config/context-tree-domains.js +6 -1
- package/dist/config/environment.js +9 -9
- package/dist/constants.d.ts +14 -0
- package/dist/constants.js +18 -0
- package/dist/core/domain/cipher/agent/agent-info.d.ts +199 -0
- package/dist/core/domain/cipher/agent/agent-info.js +143 -0
- package/dist/core/domain/cipher/agent/agent-registry.d.ts +96 -0
- package/dist/core/domain/cipher/agent/agent-registry.js +254 -0
- package/dist/core/domain/cipher/agent/index.d.ts +4 -1
- package/dist/core/domain/cipher/agent/index.js +7 -1
- package/dist/core/domain/cipher/agent-events/types.d.ts +355 -2
- package/dist/core/domain/cipher/agent-events/types.js +11 -0
- package/dist/core/domain/cipher/errors/error-normalizer.d.ts +156 -0
- package/dist/core/domain/cipher/errors/error-normalizer.js +379 -0
- package/dist/core/domain/cipher/errors/file-system-error.d.ts +2 -1
- package/dist/core/domain/cipher/errors/file-system-error.js +3 -2
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.d.ts +79 -0
- package/dist/core/domain/cipher/errors/system-prompt-error-codes.js +80 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.d.ts +114 -0
- package/dist/core/domain/cipher/errors/system-prompt-error.js +144 -0
- package/dist/core/domain/cipher/file-system/types.d.ts +57 -0
- package/dist/core/domain/cipher/llm/error-codes.d.ts +51 -0
- package/dist/core/domain/cipher/llm/error-codes.js +51 -0
- package/dist/core/domain/cipher/llm/index.d.ts +9 -0
- package/dist/core/domain/cipher/llm/index.js +13 -0
- package/dist/core/domain/cipher/llm/registry.d.ts +113 -0
- package/dist/core/domain/cipher/llm/registry.js +244 -0
- package/dist/core/domain/cipher/llm/schemas.d.ts +155 -0
- package/dist/core/domain/cipher/llm/schemas.js +151 -0
- package/dist/core/domain/cipher/llm/types.d.ts +121 -0
- package/dist/core/domain/cipher/llm/types.js +60 -0
- package/dist/core/domain/cipher/storage/message-storage-types.d.ts +114 -5
- package/dist/core/domain/cipher/streaming/types.d.ts +119 -0
- package/dist/core/domain/cipher/streaming/types.js +16 -0
- package/dist/core/domain/cipher/system-prompt/types.d.ts +44 -0
- package/dist/core/domain/cipher/todos/types.d.ts +34 -0
- package/dist/core/domain/cipher/tools/constants.d.ts +5 -2
- package/dist/core/domain/cipher/tools/constants.js +5 -2
- package/dist/core/domain/cipher/tools/types.d.ts +31 -0
- package/dist/core/domain/entities/event.d.ts +1 -1
- package/dist/core/domain/entities/event.js +3 -1
- package/dist/core/domain/errors/connection-error.d.ts +33 -0
- package/dist/core/domain/errors/connection-error.js +54 -0
- package/dist/core/domain/errors/core-process-error.d.ts +27 -0
- package/dist/core/domain/errors/core-process-error.js +43 -0
- package/dist/core/domain/errors/task-error.d.ts +64 -0
- package/dist/core/domain/errors/task-error.js +116 -0
- package/dist/core/domain/errors/transport-error.d.ts +72 -0
- package/dist/core/domain/errors/transport-error.js +114 -0
- package/dist/core/domain/instance/index.d.ts +1 -0
- package/dist/core/domain/instance/index.js +1 -0
- package/dist/core/domain/instance/types.d.ts +57 -0
- package/dist/core/domain/instance/types.js +72 -0
- package/dist/core/domain/knowledge/directory-manager.d.ts +16 -0
- package/dist/core/domain/knowledge/directory-manager.js +31 -0
- package/dist/core/domain/transport/index.d.ts +2 -0
- package/dist/core/domain/transport/index.js +2 -0
- package/dist/core/domain/transport/schemas.d.ts +1149 -0
- package/dist/core/domain/transport/schemas.js +554 -0
- package/dist/core/domain/transport/types.d.ts +67 -0
- package/dist/core/domain/transport/types.js +7 -0
- package/dist/core/interfaces/cipher/cipher-services.d.ts +15 -3
- package/dist/core/interfaces/cipher/i-chat-session.d.ts +47 -5
- package/dist/core/interfaces/cipher/i-cipher-agent.d.ts +39 -4
- package/dist/core/interfaces/cipher/i-content-generator.d.ts +3 -5
- package/dist/core/interfaces/cipher/i-file-system.d.ts +12 -1
- package/dist/core/interfaces/cipher/i-llm-service.d.ts +4 -5
- package/dist/core/interfaces/cipher/i-todo-storage.d.ts +24 -0
- package/dist/core/interfaces/cipher/i-todo-storage.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.d.ts +90 -0
- package/dist/core/interfaces/cipher/i-tool-plugin.js +1 -0
- package/dist/core/interfaces/cipher/i-tool-provider.d.ts +3 -2
- package/dist/core/interfaces/cipher/i-tool-scheduler.d.ts +4 -0
- package/dist/core/interfaces/cipher/index.d.ts +35 -0
- package/dist/core/interfaces/cipher/index.js +11 -0
- package/dist/core/interfaces/cipher/message-factory.d.ts +155 -0
- package/dist/core/interfaces/cipher/message-factory.js +252 -0
- package/dist/core/interfaces/cipher/message-type-guards.d.ts +139 -0
- package/dist/core/interfaces/cipher/message-type-guards.js +173 -0
- package/dist/core/interfaces/cipher/message-types.d.ts +279 -5
- package/dist/core/interfaces/cipher/message-types.js +6 -0
- package/dist/core/interfaces/cipher/sanitization-types.d.ts +147 -0
- package/dist/core/interfaces/cipher/sanitization-types.js +46 -0
- package/dist/core/interfaces/executor/i-curate-executor.d.ts +34 -0
- package/dist/core/interfaces/executor/i-curate-executor.js +1 -0
- package/dist/core/interfaces/executor/i-query-executor.d.ts +32 -0
- package/dist/core/interfaces/executor/i-query-executor.js +1 -0
- package/dist/core/interfaces/executor/index.d.ts +2 -0
- package/dist/core/interfaces/executor/index.js +2 -0
- package/dist/core/interfaces/instance/i-instance-discovery.d.ts +45 -0
- package/dist/core/interfaces/instance/i-instance-discovery.js +1 -0
- package/dist/core/interfaces/instance/i-instance-manager.d.ts +58 -0
- package/dist/core/interfaces/instance/i-instance-manager.js +1 -0
- package/dist/core/interfaces/instance/index.d.ts +2 -0
- package/dist/core/interfaces/instance/index.js +2 -0
- package/dist/core/interfaces/noop-implementations.d.ts +53 -0
- package/dist/core/interfaces/noop-implementations.js +62 -0
- package/dist/core/interfaces/transport/i-transport-client.d.ts +97 -0
- package/dist/core/interfaces/transport/i-transport-client.js +1 -0
- package/dist/core/interfaces/transport/i-transport-server.d.ts +93 -0
- package/dist/core/interfaces/transport/i-transport-server.js +1 -0
- package/dist/core/interfaces/transport/index.d.ts +2 -0
- package/dist/core/interfaces/transport/index.js +2 -0
- package/dist/hooks/init/welcome.js +9 -24
- package/dist/infra/cipher/agent/agent-error-codes.d.ts +16 -0
- package/dist/infra/cipher/agent/agent-error-codes.js +17 -0
- package/dist/infra/cipher/agent/agent-error.d.ts +54 -0
- package/dist/infra/cipher/agent/agent-error.js +79 -0
- package/dist/infra/cipher/agent/agent-schemas.d.ts +264 -0
- package/dist/infra/cipher/agent/agent-schemas.js +97 -0
- package/dist/infra/cipher/agent/agent-state-manager.d.ts +140 -0
- package/dist/infra/cipher/agent/agent-state-manager.js +275 -0
- package/dist/infra/cipher/agent/base-agent.d.ts +118 -0
- package/dist/infra/cipher/agent/base-agent.js +240 -0
- package/dist/infra/cipher/agent/cipher-agent.d.ts +165 -0
- package/dist/infra/cipher/agent/cipher-agent.js +546 -0
- package/dist/infra/cipher/agent/index.d.ts +22 -0
- package/dist/infra/cipher/agent/index.js +24 -0
- package/dist/infra/cipher/agent/service-initializer.d.ts +79 -0
- package/dist/infra/cipher/{agent-service-factory.js → agent/service-initializer.js} +117 -68
- package/dist/infra/cipher/agent/types.d.ts +35 -0
- package/dist/infra/cipher/agent/types.js +1 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.d.ts +107 -0
- package/dist/infra/cipher/blob/blob-reference-resolver.js +228 -0
- package/dist/infra/cipher/blob/blob-reference-utils.d.ts +117 -0
- package/dist/infra/cipher/blob/blob-reference-utils.js +230 -0
- package/dist/infra/cipher/consumer/consumer-lock.js +1 -0
- package/dist/infra/cipher/consumer/consumer-service.js +1 -0
- package/dist/infra/cipher/consumer/execution-consumer.d.ts +6 -1
- package/dist/infra/cipher/consumer/execution-consumer.js +54 -16
- package/dist/infra/cipher/consumer/index.d.ts +1 -1
- package/dist/infra/cipher/consumer/index.js +2 -1
- package/dist/infra/cipher/consumer/queue-polling-service.js +1 -0
- package/dist/infra/cipher/file-system/binary-utils.d.ts +43 -0
- package/dist/infra/cipher/file-system/binary-utils.js +164 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.d.ts +9 -0
- package/dist/infra/cipher/file-system/context-tree-file-system-factory.js +24 -0
- package/dist/infra/cipher/file-system/file-system-service.d.ts +17 -1
- package/dist/infra/cipher/file-system/file-system-service.js +327 -36
- package/dist/infra/cipher/file-system/path-validator.d.ts +32 -0
- package/dist/infra/cipher/file-system/path-validator.js +111 -6
- package/dist/infra/cipher/interactive-loop.js +41 -33
- package/dist/infra/cipher/llm/capability-cache.d.ts +87 -0
- package/dist/infra/cipher/llm/capability-cache.js +125 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.d.ts +32 -0
- package/dist/infra/cipher/llm/context/compaction/compaction-service.js +44 -3
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.d.ts +112 -0
- package/dist/infra/cipher/llm/context/compression/enhanced-compaction.js +175 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.d.ts +83 -0
- package/dist/infra/cipher/llm/context/compression/filter-compacted.js +150 -0
- package/dist/infra/cipher/llm/context/compression/index.d.ts +5 -0
- package/dist/infra/cipher/llm/context/compression/index.js +6 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.d.ts +107 -0
- package/dist/infra/cipher/llm/context/compression/reactive-overflow.js +272 -0
- package/dist/infra/cipher/llm/context/context-manager.d.ts +47 -1
- package/dist/infra/cipher/llm/context/context-manager.js +129 -0
- package/dist/infra/cipher/llm/context/utils.js +17 -4
- package/dist/infra/cipher/llm/generators/byterover-content-generator.js +4 -2
- package/dist/infra/cipher/llm/internal-llm-service.d.ts +50 -17
- package/dist/infra/cipher/llm/internal-llm-service.js +273 -50
- package/dist/infra/cipher/llm/openrouter-llm-service.d.ts +6 -8
- package/dist/infra/cipher/llm/openrouter-llm-service.js +14 -16
- package/dist/infra/cipher/llm/retry/retry-policy.d.ts +1 -0
- package/dist/infra/cipher/llm/retry/retry-policy.js +11 -0
- package/dist/infra/cipher/llm/retry/retry-with-backoff.js +3 -2
- package/dist/infra/cipher/llm/sanitization/base64-utils.d.ts +102 -0
- package/dist/infra/cipher/llm/sanitization/base64-utils.js +182 -0
- package/dist/infra/cipher/llm/sanitization/index.d.ts +12 -0
- package/dist/infra/cipher/llm/sanitization/index.js +13 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.d.ts +74 -0
- package/dist/infra/cipher/llm/sanitization/tool-sanitizer.js +398 -0
- package/dist/infra/cipher/llm/stream-processor.d.ts +158 -0
- package/dist/infra/cipher/llm/stream-processor.js +276 -0
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.d.ts +13 -20
- package/dist/infra/cipher/llm/tokenizers/claude-tokenizer.js +17 -24
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.d.ts +12 -11
- package/dist/infra/cipher/llm/tokenizers/gemini-tokenizer.js +16 -15
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.d.ts +15 -7
- package/dist/infra/cipher/llm/tokenizers/openrouter-tokenizer.js +22 -10
- package/dist/infra/cipher/llm/tool-output-processor.d.ts +51 -0
- package/dist/infra/cipher/llm/tool-output-processor.js +139 -0
- package/dist/infra/cipher/process/command-validator.d.ts +23 -0
- package/dist/infra/cipher/process/command-validator.js +75 -0
- package/dist/infra/cipher/process/path-utils.d.ts +66 -0
- package/dist/infra/cipher/process/path-utils.js +94 -0
- package/dist/infra/cipher/process/process-service.d.ts +32 -0
- package/dist/infra/cipher/process/process-service.js +98 -17
- package/dist/infra/cipher/session/chat-session.d.ts +56 -7
- package/dist/infra/cipher/session/chat-session.js +163 -13
- package/dist/infra/cipher/session/index.d.ts +1 -0
- package/dist/infra/cipher/session/index.js +2 -0
- package/dist/infra/cipher/session/message-queue.d.ts +65 -0
- package/dist/infra/cipher/session/message-queue.js +90 -0
- package/dist/infra/cipher/session/session-manager.d.ts +106 -5
- package/dist/infra/cipher/session/session-manager.js +254 -7
- package/dist/infra/cipher/session/session-status.d.ts +137 -0
- package/dist/infra/cipher/session/session-status.js +184 -0
- package/dist/infra/cipher/session/title-generator.d.ts +8 -0
- package/dist/infra/cipher/session/title-generator.js +31 -0
- package/dist/infra/cipher/storage/message-storage-service.d.ts +65 -2
- package/dist/infra/cipher/storage/message-storage-service.js +300 -54
- package/dist/infra/cipher/storage/tool-part-factory.d.ts +116 -0
- package/dist/infra/cipher/storage/tool-part-factory.js +197 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.d.ts +516 -0
- package/dist/infra/cipher/system-prompt/contributor-schemas.js +85 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.d.ts +59 -0
- package/dist/infra/cipher/system-prompt/contributors/agent-prompt-contributor.js +131 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.d.ts +54 -0
- package/dist/infra/cipher/system-prompt/contributors/companion-contributor.js +107 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.d.ts +68 -0
- package/dist/infra/cipher/system-prompt/contributors/context-tree-structure-contributor.js +179 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/datetime-contributor.js +29 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.d.ts +25 -0
- package/dist/infra/cipher/system-prompt/contributors/environment-contributor.js +54 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.d.ts +60 -0
- package/dist/infra/cipher/system-prompt/contributors/file-contributor.js +128 -0
- package/dist/infra/cipher/system-prompt/contributors/index.d.ts +13 -0
- package/dist/infra/cipher/system-prompt/contributors/index.js +8 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.d.ts +40 -0
- package/dist/infra/cipher/system-prompt/contributors/memory-contributor.js +56 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.d.ts +26 -0
- package/dist/infra/cipher/system-prompt/contributors/static-contributor.js +31 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.d.ts +112 -0
- package/dist/infra/cipher/system-prompt/environment-context-builder.js +256 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.d.ts +102 -0
- package/dist/infra/cipher/system-prompt/prompt-cache.js +156 -0
- package/dist/infra/cipher/system-prompt/schemas.d.ts +151 -0
- package/dist/infra/cipher/system-prompt/schemas.js +94 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.d.ts +136 -0
- package/dist/infra/cipher/system-prompt/system-prompt-manager.js +307 -0
- package/dist/infra/cipher/todos/todo-storage-service.d.ts +26 -0
- package/dist/infra/cipher/todos/todo-storage-service.js +28 -0
- package/dist/infra/cipher/tools/core-tool-scheduler.js +5 -1
- package/dist/infra/cipher/tools/default-policy-rules.js +1 -1
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.d.ts +1 -0
- package/dist/infra/cipher/tools/implementations/bash-exec-tool.js +27 -10
- package/dist/infra/cipher/tools/implementations/bash-output-tool.js +1 -5
- package/dist/infra/cipher/tools/implementations/batch-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/batch-tool.js +142 -0
- package/dist/infra/cipher/tools/implementations/curate-tool.js +195 -68
- package/dist/infra/cipher/tools/implementations/list-directory-tool.d.ts +12 -0
- package/dist/infra/cipher/tools/implementations/list-directory-tool.js +52 -0
- package/dist/infra/cipher/tools/implementations/read-file-tool.d.ts +8 -1
- package/dist/infra/cipher/tools/implementations/read-file-tool.js +17 -7
- package/dist/infra/cipher/tools/implementations/read-todos-tool.d.ts +11 -0
- package/dist/infra/cipher/tools/implementations/read-todos-tool.js +39 -0
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.d.ts → spec-analyze-tool.d.ts} +1 -1
- package/dist/infra/cipher/tools/implementations/{detect-domains-tool.js → spec-analyze-tool.js} +9 -7
- package/dist/infra/cipher/tools/implementations/task-tool.d.ts +34 -0
- package/dist/infra/cipher/tools/implementations/task-tool.js +207 -0
- package/dist/infra/cipher/tools/implementations/write-todos-tool.d.ts +4 -1
- package/dist/infra/cipher/tools/implementations/write-todos-tool.js +19 -63
- package/dist/infra/cipher/tools/index.d.ts +1 -1
- package/dist/infra/cipher/tools/index.js +1 -1
- package/dist/infra/cipher/tools/plugins/index.d.ts +3 -0
- package/dist/infra/cipher/tools/plugins/index.js +2 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.d.ts +28 -0
- package/dist/infra/cipher/tools/plugins/logging-plugin.js +66 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.d.ts +81 -0
- package/dist/infra/cipher/tools/plugins/plugin-manager.js +122 -0
- package/dist/infra/cipher/tools/streaming/index.d.ts +1 -0
- package/dist/infra/cipher/tools/streaming/index.js +1 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.d.ts +31 -0
- package/dist/infra/cipher/tools/streaming/metadata-handler.js +39 -0
- package/dist/infra/cipher/tools/tool-description-loader.d.ts +57 -0
- package/dist/infra/cipher/tools/tool-description-loader.js +108 -0
- package/dist/infra/cipher/tools/tool-manager.d.ts +38 -4
- package/dist/infra/cipher/tools/tool-manager.js +107 -11
- package/dist/infra/cipher/tools/tool-provider-getter.d.ts +6 -0
- package/dist/infra/cipher/tools/tool-provider-getter.js +1 -0
- package/dist/infra/cipher/tools/tool-provider.d.ts +32 -7
- package/dist/infra/cipher/tools/tool-provider.js +81 -25
- package/dist/infra/cipher/tools/tool-registry.d.ts +23 -0
- package/dist/infra/cipher/tools/tool-registry.js +58 -16
- package/dist/infra/context-tree/file-context-tree-snapshot-service.js +10 -4
- package/dist/infra/context-tree/file-context-tree-writer-service.d.ts +4 -3
- package/dist/infra/context-tree/file-context-tree-writer-service.js +6 -4
- package/dist/infra/context-tree/path-utils.d.ts +7 -0
- package/dist/infra/context-tree/path-utils.js +7 -0
- package/dist/infra/core/executors/curate-executor.d.ts +35 -0
- package/dist/infra/core/executors/curate-executor.js +123 -0
- package/dist/infra/core/executors/index.d.ts +2 -0
- package/dist/infra/core/executors/index.js +2 -0
- package/dist/infra/core/executors/query-executor.d.ts +23 -0
- package/dist/infra/core/executors/query-executor.js +51 -0
- package/dist/infra/core/task-processor.d.ts +81 -0
- package/dist/infra/core/task-processor.js +115 -0
- package/dist/infra/instance/file-instance-discovery.d.ts +31 -0
- package/dist/infra/instance/file-instance-discovery.js +84 -0
- package/dist/infra/instance/file-instance-manager.d.ts +46 -0
- package/dist/infra/instance/file-instance-manager.js +123 -0
- package/dist/infra/instance/index.d.ts +3 -0
- package/dist/infra/instance/index.js +3 -0
- package/dist/infra/instance/process-utils.d.ts +14 -0
- package/dist/infra/instance/process-utils.js +39 -0
- package/dist/infra/process/agent-worker.d.ts +20 -0
- package/dist/infra/process/agent-worker.js +602 -0
- package/dist/infra/process/index.d.ts +12 -0
- package/dist/infra/process/index.js +11 -0
- package/dist/infra/process/ipc-types.d.ts +55 -0
- package/dist/infra/process/ipc-types.js +12 -0
- package/dist/infra/process/process-manager.d.ts +154 -0
- package/dist/infra/process/process-manager.js +471 -0
- package/dist/infra/process/task-queue-manager.d.ts +123 -0
- package/dist/infra/process/task-queue-manager.js +226 -0
- package/dist/infra/process/transport-handlers.d.ts +124 -0
- package/dist/infra/process/transport-handlers.js +348 -0
- package/dist/infra/process/transport-worker.d.ts +20 -0
- package/dist/infra/process/transport-worker.js +168 -0
- package/dist/infra/repl/commands/curate-command.js +0 -5
- package/dist/infra/repl/commands/query-command.js +0 -3
- package/dist/infra/repl/repl-startup.d.ts +4 -0
- package/dist/infra/repl/repl-startup.js +10 -1
- package/dist/infra/repl/transport-client-helper.d.ts +9 -0
- package/dist/infra/repl/transport-client-helper.js +96 -0
- package/dist/infra/transport/index.d.ts +4 -0
- package/dist/infra/transport/index.js +4 -0
- package/dist/infra/transport/port-utils.d.ts +42 -0
- package/dist/infra/transport/port-utils.js +84 -0
- package/dist/infra/transport/socket-io-transport-client.d.ts +45 -0
- package/dist/infra/transport/socket-io-transport-client.js +270 -0
- package/dist/infra/transport/socket-io-transport-server.d.ts +35 -0
- package/dist/infra/transport/socket-io-transport-server.js +207 -0
- package/dist/infra/transport/transport-client-factory.d.ts +76 -0
- package/dist/infra/transport/transport-client-factory.js +168 -0
- package/dist/infra/transport/transport-factory.d.ts +33 -0
- package/dist/infra/transport/transport-factory.js +59 -0
- package/dist/infra/usecase/curate-use-case.d.ts +8 -55
- package/dist/infra/usecase/curate-use-case.js +73 -259
- package/dist/infra/usecase/init-use-case.js +19 -8
- package/dist/infra/usecase/login-use-case.js +9 -3
- package/dist/infra/usecase/query-use-case.d.ts +18 -45
- package/dist/infra/usecase/query-use-case.js +251 -326
- package/dist/infra/usecase/status-use-case.js +1 -1
- package/dist/resources/prompts/{curate-context-tree-curation.yml → curate.yml} +25 -22
- package/dist/resources/prompts/explore.yml +78 -0
- package/dist/resources/prompts/plan.yml +114 -0
- package/dist/resources/prompts/reflection.yml +1 -1
- package/dist/resources/prompts/system-prompt.yml +15 -8
- package/dist/resources/prompts/tool-outputs.yml +0 -5
- package/dist/resources/tools/bash_exec.txt +98 -0
- package/dist/resources/tools/bash_output.txt +40 -0
- package/dist/resources/tools/batch.txt +28 -0
- package/dist/resources/tools/create_knowledge_topic.txt +23 -0
- package/dist/resources/tools/curate.txt +22 -0
- package/dist/resources/tools/delete_memory.txt +1 -0
- package/dist/resources/tools/detect_domains.txt +11 -0
- package/dist/resources/tools/edit_file.txt +1 -0
- package/dist/resources/tools/edit_memory.txt +1 -0
- package/dist/resources/tools/glob_files.txt +20 -0
- package/dist/resources/tools/grep_content.txt +18 -0
- package/dist/resources/tools/kill_process.txt +16 -0
- package/dist/resources/tools/list_directory.txt +16 -0
- package/dist/resources/tools/list_memories.txt +1 -0
- package/dist/resources/tools/read_file.txt +31 -0
- package/dist/resources/tools/read_memory.txt +1 -0
- package/dist/resources/tools/read_todos.txt +17 -0
- package/dist/resources/tools/search_history.txt +1 -0
- package/dist/resources/tools/task.txt +23 -0
- package/dist/resources/tools/write_file.txt +1 -0
- package/dist/resources/tools/write_memory.txt +1 -0
- package/dist/resources/tools/write_todos.txt +29 -0
- package/dist/tui/app.js +9 -13
- package/dist/tui/components/command-details.d.ts +14 -0
- package/dist/tui/components/command-details.js +35 -0
- package/dist/tui/components/execution/execution-changes.d.ts +5 -0
- package/dist/tui/components/execution/execution-changes.js +19 -4
- package/dist/tui/components/execution/execution-content.d.ts +4 -2
- package/dist/tui/components/execution/execution-content.js +26 -13
- package/dist/tui/components/execution/execution-input.js +3 -3
- package/dist/tui/components/execution/execution-progress.d.ts +2 -2
- package/dist/tui/components/execution/execution-progress.js +8 -6
- package/dist/tui/components/execution/log-item.d.ts +3 -4
- package/dist/tui/components/execution/log-item.js +2 -5
- package/dist/tui/components/footer.js +9 -4
- package/dist/tui/components/header.d.ts +3 -3
- package/dist/tui/components/header.js +5 -3
- package/dist/tui/components/index.d.ts +1 -0
- package/dist/tui/components/index.js +1 -0
- package/dist/tui/components/onboarding/copyable-prompt.d.ts +5 -3
- package/dist/tui/components/onboarding/copyable-prompt.js +7 -8
- package/dist/tui/components/onboarding/onboarding-flow.js +35 -25
- package/dist/tui/components/scrollable-list.js +12 -10
- package/dist/tui/components/suggestions.js +39 -41
- package/dist/tui/components/tab-bar.d.ts +2 -1
- package/dist/tui/components/tab-bar.js +3 -4
- package/dist/tui/constants.d.ts +0 -5
- package/dist/tui/constants.js +0 -5
- package/dist/tui/contexts/auth-context.js +9 -2
- package/dist/tui/contexts/{use-commands.js → commands-context.js} +6 -5
- package/dist/tui/contexts/index.d.ts +6 -1
- package/dist/tui/contexts/index.js +6 -1
- package/dist/tui/contexts/onboarding-context.d.ts +1 -1
- package/dist/tui/contexts/onboarding-context.js +9 -9
- package/dist/tui/contexts/tasks-context.d.ts +84 -0
- package/dist/tui/contexts/tasks-context.js +218 -0
- package/dist/tui/contexts/transport-context.d.ts +29 -0
- package/dist/tui/contexts/transport-context.js +82 -0
- package/dist/tui/hooks/index.d.ts +10 -6
- package/dist/tui/hooks/index.js +7 -6
- package/dist/tui/hooks/use-activity-logs.d.ts +3 -11
- package/dist/tui/hooks/use-activity-logs.js +87 -34
- package/dist/tui/hooks/use-auth-polling.d.ts +24 -0
- package/dist/tui/hooks/use-auth-polling.js +104 -0
- package/dist/tui/hooks/use-slash-command-processor.js +0 -1
- package/dist/tui/hooks/use-slash-completion.js +1 -1
- package/dist/tui/hooks/use-tab-navigation.d.ts +2 -1
- package/dist/tui/hooks/use-tab-navigation.js +16 -7
- package/dist/tui/hooks/use-terminal-breakpoint.d.ts +21 -0
- package/dist/tui/hooks/use-terminal-breakpoint.js +38 -0
- package/dist/tui/hooks/use-ui-heights.d.ts +120 -0
- package/dist/tui/hooks/use-ui-heights.js +88 -0
- package/dist/tui/providers/app-providers.js +2 -6
- package/dist/tui/types/commands.d.ts +0 -26
- package/dist/tui/types/index.d.ts +1 -1
- package/dist/tui/types/ui.d.ts +9 -4
- package/dist/tui/utils/line.d.ts +11 -0
- package/dist/tui/utils/line.js +16 -0
- package/dist/tui/utils/log.d.ts +27 -0
- package/dist/tui/utils/log.js +114 -0
- package/dist/tui/views/command-view.d.ts +7 -0
- package/dist/tui/views/command-view.js +103 -80
- package/dist/tui/views/login-view.js +7 -4
- package/dist/tui/views/logs-view.d.ts +13 -0
- package/dist/tui/views/logs-view.js +27 -52
- package/dist/utils/connection-error-handler.d.ts +16 -0
- package/dist/utils/connection-error-handler.js +49 -0
- package/dist/utils/crash-log.d.ts +14 -0
- package/dist/utils/crash-log.js +19 -0
- package/dist/utils/file-helpers.d.ts +14 -0
- package/dist/utils/file-helpers.js +21 -0
- package/dist/utils/global-logs-path.d.ts +11 -0
- package/dist/utils/global-logs-path.js +37 -0
- package/dist/utils/process-logger.d.ts +53 -0
- package/dist/utils/process-logger.js +253 -0
- package/dist/utils/sandbox-detector.d.ts +31 -0
- package/dist/utils/sandbox-detector.js +122 -0
- package/oclif.manifest.json +10 -198
- package/package.json +5 -1
- package/dist/commands/cipher-agent/run.d.ts +0 -142
- package/dist/commands/cipher-agent/run.js +0 -555
- package/dist/commands/cipher-agent/set-prompt.d.ts +0 -16
- package/dist/commands/cipher-agent/set-prompt.js +0 -58
- package/dist/commands/cipher-agent/show-prompt.d.ts +0 -13
- package/dist/commands/cipher-agent/show-prompt.js +0 -53
- package/dist/commands/foo.d.ts +0 -14
- package/dist/commands/foo.js +0 -66
- package/dist/infra/cipher/agent-service-factory.d.ts +0 -93
- package/dist/infra/cipher/cipher-agent-state-manager.d.ts +0 -63
- package/dist/infra/cipher/cipher-agent-state-manager.js +0 -108
- package/dist/infra/cipher/cipher-agent.d.ts +0 -182
- package/dist/infra/cipher/cipher-agent.js +0 -317
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.d.ts +0 -106
- package/dist/infra/cipher/system-prompt/simple-prompt-factory.js +0 -297
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.d.ts +0 -7
- package/dist/infra/cipher/tools/implementations/find-knowledge-topics-tool.js +0 -424
- package/dist/resources/prompts/modes/autonomous.yml +0 -9
- package/dist/resources/prompts/query-context-tree-retrieval.yml +0 -48
- package/dist/tui/contexts/consumer.d.ts +0 -31
- package/dist/tui/contexts/consumer.js +0 -56
- package/dist/tui/hooks/use-consumer.d.ts +0 -12
- package/dist/tui/hooks/use-consumer.js +0 -50
- package/dist/tui/hooks/use-queue-polling.d.ts +0 -31
- package/dist/tui/hooks/use-queue-polling.js +0 -90
- /package/dist/tui/contexts/{use-commands.d.ts → commands-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.d.ts → mode-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-mode.js → mode-context.js} +0 -0
- /package/dist/tui/contexts/{use-theme.d.ts → theme-context.d.ts} +0 -0
- /package/dist/tui/contexts/{use-theme.js → theme-context.js} +0 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced Compaction Strategy
|
|
3
|
+
*
|
|
4
|
+
* Extends the ReactiveOverflowStrategy with additional features from OpenCode:
|
|
5
|
+
* - Creates CompactionPart to track compaction metadata
|
|
6
|
+
* - Preserves last 2 conversation turns (configurable)
|
|
7
|
+
* - Only compacts if saving > 20K tokens (configurable)
|
|
8
|
+
* - Emits compaction events for observability
|
|
9
|
+
*
|
|
10
|
+
* This is a wrapper that adds these features on top of the existing
|
|
11
|
+
* ReactiveOverflowStrategy for backward compatibility.
|
|
12
|
+
*/
|
|
13
|
+
import { ReactiveOverflowStrategy } from './reactive-overflow.js';
|
|
14
|
+
/**
|
|
15
|
+
* Default configuration values.
|
|
16
|
+
*/
|
|
17
|
+
const ENHANCED_DEFAULTS = {
|
|
18
|
+
minTokenSavings: 20_000,
|
|
19
|
+
preserveTurns: 2,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Enhanced Compaction Strategy.
|
|
23
|
+
*
|
|
24
|
+
* Wraps ReactiveOverflowStrategy with additional OpenCode-style features:
|
|
25
|
+
* - Token savings threshold
|
|
26
|
+
* - CompactionPart creation
|
|
27
|
+
* - Event emission
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const strategy = new EnhancedCompactionStrategy({
|
|
32
|
+
* llmProvider: myLlmProvider,
|
|
33
|
+
* eventBus: sessionEventBus,
|
|
34
|
+
* minTokenSavings: 20000,
|
|
35
|
+
* preserveTurns: 2,
|
|
36
|
+
* })
|
|
37
|
+
*
|
|
38
|
+
* const compactedHistory = await strategy.compress(history, maxTokens, tokenizer)
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export class EnhancedCompactionStrategy {
|
|
42
|
+
baseStrategy;
|
|
43
|
+
eventBus;
|
|
44
|
+
/** Track the last compaction result for observability */
|
|
45
|
+
lastCompactionResult;
|
|
46
|
+
minTokenSavings;
|
|
47
|
+
preserveTurns;
|
|
48
|
+
constructor(options) {
|
|
49
|
+
// Create base strategy with configured preserve turns
|
|
50
|
+
this.baseStrategy = new ReactiveOverflowStrategy({
|
|
51
|
+
...options,
|
|
52
|
+
preserveLastNTurns: options.preserveTurns ?? ENHANCED_DEFAULTS.preserveTurns,
|
|
53
|
+
});
|
|
54
|
+
this.eventBus = options.eventBus;
|
|
55
|
+
this.minTokenSavings = options.minTokenSavings ?? ENHANCED_DEFAULTS.minTokenSavings;
|
|
56
|
+
this.preserveTurns = options.preserveTurns ?? ENHANCED_DEFAULTS.preserveTurns;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Compress history with enhanced features.
|
|
60
|
+
*/
|
|
61
|
+
async compress(history, maxHistoryTokens, tokenizer) {
|
|
62
|
+
// Calculate tokens before compression
|
|
63
|
+
const tokensBefore = this.countTokens(history, tokenizer);
|
|
64
|
+
// Check if compression is needed at all
|
|
65
|
+
if (tokensBefore <= maxHistoryTokens) {
|
|
66
|
+
return history;
|
|
67
|
+
}
|
|
68
|
+
// Apply base compression strategy
|
|
69
|
+
const compressedHistory = await this.baseStrategy.compress(history, maxHistoryTokens, tokenizer);
|
|
70
|
+
// Calculate tokens after compression
|
|
71
|
+
const tokensAfter = this.countTokens(compressedHistory, tokenizer);
|
|
72
|
+
const tokensSaved = tokensBefore - tokensAfter;
|
|
73
|
+
// Check minimum savings threshold
|
|
74
|
+
if (tokensSaved < this.minTokenSavings) {
|
|
75
|
+
// Not enough savings, return original (let other strategies handle it)
|
|
76
|
+
return history;
|
|
77
|
+
}
|
|
78
|
+
// Find compacted message IDs (messages that were removed or summarized)
|
|
79
|
+
const compactedMessageIds = this.findCompactedMessageIds(history, compressedHistory);
|
|
80
|
+
// Create compaction result for tracking
|
|
81
|
+
this.lastCompactionResult = {
|
|
82
|
+
compactedAt: Date.now(),
|
|
83
|
+
compactedMessageIds,
|
|
84
|
+
messageCountAfter: compressedHistory.length,
|
|
85
|
+
messageCountBefore: history.length,
|
|
86
|
+
tokensAfter,
|
|
87
|
+
tokensBefore,
|
|
88
|
+
tokensSaved,
|
|
89
|
+
};
|
|
90
|
+
// Emit compaction event if event bus provided
|
|
91
|
+
if (this.eventBus) {
|
|
92
|
+
this.eventBus.emit('llmservice:contextCompressed', {
|
|
93
|
+
compressedTokens: tokensAfter,
|
|
94
|
+
originalTokens: tokensBefore,
|
|
95
|
+
strategy: 'summary',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return compressedHistory;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create a CompactionPart for the given compaction result.
|
|
102
|
+
* Can be used to insert into message parts for tracking.
|
|
103
|
+
*/
|
|
104
|
+
createCompactionPart(summary) {
|
|
105
|
+
if (!this.lastCompactionResult) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
compactedMessageIds: this.lastCompactionResult.compactedMessageIds,
|
|
110
|
+
id: `compaction-${Date.now()}`,
|
|
111
|
+
summary,
|
|
112
|
+
timestamp: this.lastCompactionResult.compactedAt,
|
|
113
|
+
tokensSaved: this.lastCompactionResult.tokensSaved,
|
|
114
|
+
type: 'compaction',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get the last compaction result for observability.
|
|
119
|
+
*/
|
|
120
|
+
getLastCompactionResult() {
|
|
121
|
+
return this.lastCompactionResult;
|
|
122
|
+
}
|
|
123
|
+
getName() {
|
|
124
|
+
return 'EnhancedCompaction';
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Count total tokens in history.
|
|
128
|
+
*/
|
|
129
|
+
countTokens(history, tokenizer) {
|
|
130
|
+
let total = 0;
|
|
131
|
+
for (const message of history) {
|
|
132
|
+
// Role overhead
|
|
133
|
+
total += 4;
|
|
134
|
+
if (typeof message.content === 'string') {
|
|
135
|
+
total += tokenizer.countTokens(message.content);
|
|
136
|
+
}
|
|
137
|
+
else if (Array.isArray(message.content)) {
|
|
138
|
+
for (const part of message.content) {
|
|
139
|
+
total +=
|
|
140
|
+
part.type === 'text' || part.type === 'reasoning'
|
|
141
|
+
? tokenizer.countTokens(part.text)
|
|
142
|
+
: 100; // Estimate for non-text parts
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Tool calls overhead
|
|
146
|
+
if (message.toolCalls) {
|
|
147
|
+
for (const call of message.toolCalls) {
|
|
148
|
+
total += tokenizer.countTokens(call.function.name);
|
|
149
|
+
total += tokenizer.countTokens(call.function.arguments);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return total;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Find message IDs that were compacted (removed or summarized).
|
|
157
|
+
* Since messages don't have IDs, we use indices as pseudo-IDs.
|
|
158
|
+
*/
|
|
159
|
+
findCompactedMessageIds(original, compressed) {
|
|
160
|
+
const compactedIds = [];
|
|
161
|
+
const compressedCount = compressed.filter((m) => !m.metadata?.isSummary).length;
|
|
162
|
+
// Messages from index 0 to (original.length - compressedCount) were compacted
|
|
163
|
+
const compactedCount = original.length - compressedCount;
|
|
164
|
+
for (let i = 0; i < compactedCount; i++) {
|
|
165
|
+
compactedIds.push(`msg-${i}`);
|
|
166
|
+
}
|
|
167
|
+
return compactedIds;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Create an EnhancedCompactionStrategy instance.
|
|
172
|
+
*/
|
|
173
|
+
export function createEnhancedCompactionStrategy(options) {
|
|
174
|
+
return new EnhancedCompactionStrategy(options);
|
|
175
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter compacted messages utility.
|
|
3
|
+
*
|
|
4
|
+
* This module provides read-time filtering of message history based on
|
|
5
|
+
* compression metadata. When a summary message exists (with metadata.isSummary === true),
|
|
6
|
+
* messages before it are filtered out since they've been summarized.
|
|
7
|
+
*
|
|
8
|
+
* Key design principles:
|
|
9
|
+
* - Full history preserved in storage (audit trail)
|
|
10
|
+
* - Filtering happens at read-time, not storage-time
|
|
11
|
+
* - Summary message marks the boundary
|
|
12
|
+
*
|
|
13
|
+
* Based on dexto's filterCompacted() pattern.
|
|
14
|
+
*/
|
|
15
|
+
import type { InternalMessage } from '../../../../../core/interfaces/cipher/message-types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Filter history to exclude messages before the most recent summary.
|
|
18
|
+
*
|
|
19
|
+
* When a summary message exists (metadata.isSummary === true), this function
|
|
20
|
+
* returns only the summary message and everything after it. This implements
|
|
21
|
+
* read-time compression where old messages are logically hidden but physically
|
|
22
|
+
* preserved in storage.
|
|
23
|
+
*
|
|
24
|
+
* @param history - Full message history to filter
|
|
25
|
+
* @returns Filtered history with old messages excluded
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* // Before filtering: [msg1, msg2, msg3, summaryMsg, msg4, msg5]
|
|
30
|
+
* // After filtering: [summaryMsg, msg4, msg5]
|
|
31
|
+
*
|
|
32
|
+
* const filtered = filterCompacted(history);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function filterCompacted(history: readonly InternalMessage[]): InternalMessage[];
|
|
36
|
+
/**
|
|
37
|
+
* Check if history contains a summary message.
|
|
38
|
+
*
|
|
39
|
+
* Useful for determining if filtering would have any effect.
|
|
40
|
+
*
|
|
41
|
+
* @param history - Message history to check
|
|
42
|
+
* @returns true if history contains a summary message
|
|
43
|
+
*/
|
|
44
|
+
export declare function hasSummaryMessage(history: readonly InternalMessage[]): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Find the summary message in history.
|
|
47
|
+
*
|
|
48
|
+
* @param history - Message history to search
|
|
49
|
+
* @returns The summary message or undefined if not found
|
|
50
|
+
*/
|
|
51
|
+
export declare function findSummaryMessage(history: readonly InternalMessage[]): InternalMessage | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Get the count of messages that would be filtered out.
|
|
54
|
+
*
|
|
55
|
+
* @param history - Message history to analyze
|
|
56
|
+
* @returns Number of messages before the summary that would be filtered
|
|
57
|
+
*/
|
|
58
|
+
export declare function getFilteredMessageCount(history: readonly InternalMessage[]): number;
|
|
59
|
+
/**
|
|
60
|
+
* Get summary statistics about compression state.
|
|
61
|
+
*
|
|
62
|
+
* @param history - Message history to analyze
|
|
63
|
+
* @returns Statistics about the compression state
|
|
64
|
+
*/
|
|
65
|
+
export declare function getCompressionStats(history: readonly InternalMessage[]): {
|
|
66
|
+
/** When compression occurred (from summary metadata) */
|
|
67
|
+
compactedAt?: number;
|
|
68
|
+
/** Whether history has been compressed */
|
|
69
|
+
hasCompression: boolean;
|
|
70
|
+
/** Number of messages hidden by compression */
|
|
71
|
+
hiddenMessageCount: number;
|
|
72
|
+
/** Number of messages that were summarized (from summary metadata) */
|
|
73
|
+
summarizedMessageCount: number;
|
|
74
|
+
/** Number of messages currently visible (after filtering) */
|
|
75
|
+
visibleMessageCount: number;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Check if a message is a summary message.
|
|
79
|
+
*
|
|
80
|
+
* @param message - Message to check
|
|
81
|
+
* @returns true if the message is a summary
|
|
82
|
+
*/
|
|
83
|
+
export declare function isSummaryMessage(message: InternalMessage): boolean;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter compacted messages utility.
|
|
3
|
+
*
|
|
4
|
+
* This module provides read-time filtering of message history based on
|
|
5
|
+
* compression metadata. When a summary message exists (with metadata.isSummary === true),
|
|
6
|
+
* messages before it are filtered out since they've been summarized.
|
|
7
|
+
*
|
|
8
|
+
* Key design principles:
|
|
9
|
+
* - Full history preserved in storage (audit trail)
|
|
10
|
+
* - Filtering happens at read-time, not storage-time
|
|
11
|
+
* - Summary message marks the boundary
|
|
12
|
+
*
|
|
13
|
+
* Based on dexto's filterCompacted() pattern.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Filter history to exclude messages before the most recent summary.
|
|
17
|
+
*
|
|
18
|
+
* When a summary message exists (metadata.isSummary === true), this function
|
|
19
|
+
* returns only the summary message and everything after it. This implements
|
|
20
|
+
* read-time compression where old messages are logically hidden but physically
|
|
21
|
+
* preserved in storage.
|
|
22
|
+
*
|
|
23
|
+
* @param history - Full message history to filter
|
|
24
|
+
* @returns Filtered history with old messages excluded
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* // Before filtering: [msg1, msg2, msg3, summaryMsg, msg4, msg5]
|
|
29
|
+
* // After filtering: [summaryMsg, msg4, msg5]
|
|
30
|
+
*
|
|
31
|
+
* const filtered = filterCompacted(history);
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export function filterCompacted(history) {
|
|
35
|
+
if (!history || history.length === 0) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
// Find the most recent summary message (search backwards for efficiency)
|
|
39
|
+
let summaryIndex = -1;
|
|
40
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
41
|
+
const msg = history[i];
|
|
42
|
+
if (msg?.metadata?.isSummary === true) {
|
|
43
|
+
summaryIndex = i;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// If no summary found, return full history
|
|
48
|
+
if (summaryIndex === -1) {
|
|
49
|
+
return [...history];
|
|
50
|
+
}
|
|
51
|
+
// Return summary + everything after it
|
|
52
|
+
return history.slice(summaryIndex);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if history contains a summary message.
|
|
56
|
+
*
|
|
57
|
+
* Useful for determining if filtering would have any effect.
|
|
58
|
+
*
|
|
59
|
+
* @param history - Message history to check
|
|
60
|
+
* @returns true if history contains a summary message
|
|
61
|
+
*/
|
|
62
|
+
export function hasSummaryMessage(history) {
|
|
63
|
+
if (!history || history.length === 0)
|
|
64
|
+
return false;
|
|
65
|
+
return history.some((msg) => msg?.metadata?.isSummary === true);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Find the summary message in history.
|
|
69
|
+
*
|
|
70
|
+
* @param history - Message history to search
|
|
71
|
+
* @returns The summary message or undefined if not found
|
|
72
|
+
*/
|
|
73
|
+
export function findSummaryMessage(history) {
|
|
74
|
+
if (!history || history.length === 0)
|
|
75
|
+
return undefined;
|
|
76
|
+
// Search backwards to find the most recent summary
|
|
77
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
78
|
+
const msg = history[i];
|
|
79
|
+
if (msg?.metadata?.isSummary === true) {
|
|
80
|
+
return msg;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get the count of messages that would be filtered out.
|
|
87
|
+
*
|
|
88
|
+
* @param history - Message history to analyze
|
|
89
|
+
* @returns Number of messages before the summary that would be filtered
|
|
90
|
+
*/
|
|
91
|
+
export function getFilteredMessageCount(history) {
|
|
92
|
+
if (!history || history.length === 0)
|
|
93
|
+
return 0;
|
|
94
|
+
// Find summary index
|
|
95
|
+
let summaryIndex = -1;
|
|
96
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
97
|
+
if (history[i]?.metadata?.isSummary === true) {
|
|
98
|
+
summaryIndex = i;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// No summary = nothing filtered
|
|
103
|
+
if (summaryIndex === -1)
|
|
104
|
+
return 0;
|
|
105
|
+
// Count messages before the summary
|
|
106
|
+
return summaryIndex;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get summary statistics about compression state.
|
|
110
|
+
*
|
|
111
|
+
* @param history - Message history to analyze
|
|
112
|
+
* @returns Statistics about the compression state
|
|
113
|
+
*/
|
|
114
|
+
export function getCompressionStats(history) {
|
|
115
|
+
if (!history || history.length === 0) {
|
|
116
|
+
return {
|
|
117
|
+
hasCompression: false,
|
|
118
|
+
hiddenMessageCount: 0,
|
|
119
|
+
summarizedMessageCount: 0,
|
|
120
|
+
visibleMessageCount: 0,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const summaryMessage = findSummaryMessage(history);
|
|
124
|
+
if (!summaryMessage) {
|
|
125
|
+
return {
|
|
126
|
+
hasCompression: false,
|
|
127
|
+
hiddenMessageCount: 0,
|
|
128
|
+
summarizedMessageCount: 0,
|
|
129
|
+
visibleMessageCount: history.length,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
const filtered = filterCompacted(history);
|
|
133
|
+
const hiddenCount = history.length - filtered.length;
|
|
134
|
+
return {
|
|
135
|
+
compactedAt: summaryMessage.metadata?.compactedAt,
|
|
136
|
+
hasCompression: true,
|
|
137
|
+
hiddenMessageCount: hiddenCount,
|
|
138
|
+
summarizedMessageCount: summaryMessage.metadata?.summarizedMessageCount || hiddenCount,
|
|
139
|
+
visibleMessageCount: filtered.length,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Check if a message is a summary message.
|
|
144
|
+
*
|
|
145
|
+
* @param message - Message to check
|
|
146
|
+
* @returns true if the message is a summary
|
|
147
|
+
*/
|
|
148
|
+
export function isSummaryMessage(message) {
|
|
149
|
+
return message?.metadata?.isSummary === true;
|
|
150
|
+
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Context compression strategies module
|
|
3
3
|
*/
|
|
4
|
+
export { createEnhancedCompactionStrategy, EnhancedCompactionStrategy } from './enhanced-compaction.js';
|
|
5
|
+
export type { CompactionResult, EnhancedCompactionOptions } from './enhanced-compaction.js';
|
|
6
|
+
export { filterCompacted, findSummaryMessage, getCompressionStats, getFilteredMessageCount, hasSummaryMessage, isSummaryMessage, } from './filter-compacted.js';
|
|
4
7
|
export { MiddleRemovalStrategy } from './middle-removal.js';
|
|
5
8
|
export { OldestRemovalStrategy } from './oldest-removal.js';
|
|
9
|
+
export { createReactiveOverflowStrategy, ReactiveOverflowStrategy } from './reactive-overflow.js';
|
|
10
|
+
export type { ReactiveOverflowOptions } from './reactive-overflow.js';
|
|
6
11
|
export type { CompressionStrategyOptions, ICompressionStrategy } from './types.js';
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Context compression strategies module
|
|
3
3
|
*/
|
|
4
|
+
// Compression strategies (alphabetical order)
|
|
5
|
+
export { createEnhancedCompactionStrategy, EnhancedCompactionStrategy } from './enhanced-compaction.js';
|
|
6
|
+
// Filter utilities
|
|
7
|
+
export { filterCompacted, findSummaryMessage, getCompressionStats, getFilteredMessageCount, hasSummaryMessage, isSummaryMessage, } from './filter-compacted.js';
|
|
8
|
+
// More compression strategies
|
|
4
9
|
export { MiddleRemovalStrategy } from './middle-removal.js';
|
|
5
10
|
export { OldestRemovalStrategy } from './oldest-removal.js';
|
|
11
|
+
export { createReactiveOverflowStrategy, ReactiveOverflowStrategy } from './reactive-overflow.js';
|
|
@@ -0,0 +1,107 @@
|
|
|
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 type { ILlmProvider } from '../../../../../core/interfaces/cipher/i-llm-provider.js';
|
|
23
|
+
import type { ITokenizer } from '../../../../../core/interfaces/cipher/i-tokenizer.js';
|
|
24
|
+
import type { InternalMessage } from '../../../../../core/interfaces/cipher/message-types.js';
|
|
25
|
+
import type { ICompressionStrategy } from './types.js';
|
|
26
|
+
/**
|
|
27
|
+
* Options for the ReactiveOverflowStrategy.
|
|
28
|
+
*/
|
|
29
|
+
export interface ReactiveOverflowOptions {
|
|
30
|
+
/** LLM provider for generating summaries */
|
|
31
|
+
llmProvider: ILlmProvider;
|
|
32
|
+
/**
|
|
33
|
+
* Minimum messages to consider for summarization.
|
|
34
|
+
* If fewer messages are available, compression is skipped.
|
|
35
|
+
* Default: 10
|
|
36
|
+
*/
|
|
37
|
+
minMessagesToSummarize?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Model to use for summarization.
|
|
40
|
+
* Default: uses same model as conversation (passed via generate params)
|
|
41
|
+
*/
|
|
42
|
+
model?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Number of recent turns to always preserve (not summarize).
|
|
45
|
+
* Default: 2
|
|
46
|
+
*/
|
|
47
|
+
preserveLastNTurns?: number;
|
|
48
|
+
/**
|
|
49
|
+
* Target token count for the summary.
|
|
50
|
+
* Default: 2000
|
|
51
|
+
*/
|
|
52
|
+
summaryTargetTokens?: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Reactive Overflow compression strategy.
|
|
56
|
+
*
|
|
57
|
+
* Uses an LLM to generate intelligent summaries when context overflows.
|
|
58
|
+
*/
|
|
59
|
+
export declare class ReactiveOverflowStrategy implements ICompressionStrategy {
|
|
60
|
+
private readonly llmProvider;
|
|
61
|
+
private readonly minMessagesToSummarize;
|
|
62
|
+
private readonly model?;
|
|
63
|
+
private readonly preserveLastNTurns;
|
|
64
|
+
private readonly summaryTargetTokens;
|
|
65
|
+
constructor(options: ReactiveOverflowOptions);
|
|
66
|
+
compress(history: InternalMessage[], maxHistoryTokens: number, tokenizer: ITokenizer): Promise<InternalMessage[]>;
|
|
67
|
+
getName(): string;
|
|
68
|
+
/**
|
|
69
|
+
* Count tokens in message history.
|
|
70
|
+
*/
|
|
71
|
+
private countHistoryTokens;
|
|
72
|
+
/**
|
|
73
|
+
* Count tokens in a single message.
|
|
74
|
+
*/
|
|
75
|
+
private countMessageTokens;
|
|
76
|
+
/**
|
|
77
|
+
* Extract text content from a message.
|
|
78
|
+
*/
|
|
79
|
+
private extractTextContent;
|
|
80
|
+
/**
|
|
81
|
+
* Find turn boundaries in message history.
|
|
82
|
+
*
|
|
83
|
+
* A turn boundary is the index where a user message starts.
|
|
84
|
+
* Returns indices of all user messages.
|
|
85
|
+
*/
|
|
86
|
+
private findTurnBoundaries;
|
|
87
|
+
/**
|
|
88
|
+
* Format messages for the summary prompt.
|
|
89
|
+
*/
|
|
90
|
+
private formatMessagesForSummary;
|
|
91
|
+
/**
|
|
92
|
+
* Format role for display.
|
|
93
|
+
*/
|
|
94
|
+
private formatRole;
|
|
95
|
+
/**
|
|
96
|
+
* Generate a fallback summary without LLM.
|
|
97
|
+
*/
|
|
98
|
+
private generateFallbackSummary;
|
|
99
|
+
/**
|
|
100
|
+
* Generate a summary of messages using the LLM.
|
|
101
|
+
*/
|
|
102
|
+
private generateSummary;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Create a ReactiveOverflowStrategy instance.
|
|
106
|
+
*/
|
|
107
|
+
export declare function createReactiveOverflowStrategy(options: ReactiveOverflowOptions): ReactiveOverflowStrategy;
|